From 318e19ba6755105bb6cc19937d8fff26cbd2cc6f Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 9 Aug 2018 15:59:41 +0200 Subject: ar71xx: add v4.14 support adds v4.14 patches for testing but leaves v4.9 as default for now. Signed-off-by: John Crispin --- .../ar71xx/patches-4.14/930-chipidea-pullup.patch | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 target/linux/ar71xx/patches-4.14/930-chipidea-pullup.patch (limited to 'target/linux/ar71xx/patches-4.14/930-chipidea-pullup.patch') diff --git a/target/linux/ar71xx/patches-4.14/930-chipidea-pullup.patch b/target/linux/ar71xx/patches-4.14/930-chipidea-pullup.patch new file mode 100644 index 0000000000..ee1e84bdd9 --- /dev/null +++ b/target/linux/ar71xx/patches-4.14/930-chipidea-pullup.patch @@ -0,0 +1,80 @@ +Index: linux-4.14.61/drivers/usb/chipidea/ci.h +=================================================================== +--- linux-4.14.61.orig/drivers/usb/chipidea/ci.h ++++ linux-4.14.61/drivers/usb/chipidea/ci.h +@@ -205,6 +205,7 @@ struct hw_bank { + * @in_lpm: if the core in low power mode + * @wakeup_int: if wakeup interrupt occur + * @rev: The revision number for controller ++ * @dp_always_pullup: keep dp always pullup at device mode + */ + struct ci_hdrc { + struct device *dev; +@@ -259,6 +260,7 @@ struct ci_hdrc { + bool in_lpm; + bool wakeup_int; + enum ci_revision rev; ++ bool dp_always_pullup; + }; + + static inline struct ci_role_driver *ci_role(struct ci_hdrc *ci) +Index: linux-4.14.61/drivers/usb/chipidea/core.c +=================================================================== +--- linux-4.14.61.orig/drivers/usb/chipidea/core.c ++++ linux-4.14.61/drivers/usb/chipidea/core.c +@@ -818,7 +818,7 @@ static inline void ci_role_destroy(struc + { + ci_hdrc_gadget_destroy(ci); + ci_hdrc_host_destroy(ci); +- if (ci->is_otg && ci->roles[CI_ROLE_GADGET]) ++ if (!ci->dp_always_pullup && ci->roles[CI_ROLE_GADGET]) + ci_hdrc_otg_destroy(ci); + } + +@@ -923,6 +923,9 @@ static int ci_hdrc_probe(struct platform + CI_HDRC_SUPPORTS_RUNTIME_PM); + platform_set_drvdata(pdev, ci); + ++ ci->dp_always_pullup = !!(ci->platdata->flags & ++ CI_HDRC_DP_ALWAYS_PULLUP); ++ + ret = hw_device_init(ci, base); + if (ret < 0) { + dev_err(dev, "can't initialize hardware\n"); +@@ -1004,7 +1007,7 @@ static int ci_hdrc_probe(struct platform + goto deinit_gadget; + } + +- if (ci->is_otg && ci->roles[CI_ROLE_GADGET]) { ++ if (!ci->dp_always_pullup && ci->roles[CI_ROLE_GADGET]) { + ret = ci_hdrc_otg_init(ci); + if (ret) { + dev_err(dev, "init otg fails, ret = %d\n", ret); +Index: linux-4.14.61/drivers/usb/chipidea/otg.c +=================================================================== +--- linux-4.14.61.orig/drivers/usb/chipidea/otg.c ++++ linux-4.14.61/drivers/usb/chipidea/otg.c +@@ -131,8 +131,10 @@ enum ci_role ci_otg_role(struct ci_hdrc + + void ci_handle_vbus_change(struct ci_hdrc *ci) + { +- if (!ci->is_otg) ++ if (ci->dp_always_pullup) { ++ usb_gadget_vbus_connect(&ci->gadget); + return; ++ } + + if (hw_read_otgsc(ci, OTGSC_BSV) && !ci->vbus_active) + usb_gadget_vbus_connect(&ci->gadget); +Index: linux-4.14.61/include/linux/usb/chipidea.h +=================================================================== +--- linux-4.14.61.orig/include/linux/usb/chipidea.h ++++ linux-4.14.61/include/linux/usb/chipidea.h +@@ -60,6 +60,7 @@ struct ci_hdrc_platform_data { + #define CI_HDRC_OVERRIDE_RX_BURST BIT(11) + #define CI_HDRC_OVERRIDE_PHY_CONTROL BIT(12) /* Glue layer manages phy */ + #define CI_HDRC_REQUIRES_ALIGNED_DMA BIT(13) ++#define CI_HDRC_DP_ALWAYS_PULLUP BIT(14) + enum usb_dr_mode dr_mode; + #define CI_HDRC_CONTROLLER_RESET_EVENT 0 + #define CI_HDRC_CONTROLLER_STOPPED_EVENT 1 -- cgit v1.2.3