| From ca66017a6555e2506ff59950e019dfd7fda2ca08 Mon Sep 17 00:00:00 2001 |
| From: Tony Lindgren <tony@atomide.com> |
| Date: Sun, 22 Dec 2019 10:17:02 -0800 |
| Subject: [PATCH] phy: cpcap-usb: Prevent USB line glitches from waking up |
| modem |
| |
| commit 63078b6ba09e842f09df052c5728857389fddcd2 upstream. |
| |
| The micro-USB connector on Motorola Mapphone devices can be muxed between |
| the SoC and the mdm6600 modem. But even when used for the SoC, configuring |
| the PHY with ID pin grounded will wake up the modem from idle state. Looks |
| like the issue is probably caused by line glitches. |
| |
| We can prevent the glitches by using a previously unknown mode of the |
| GPIO mux to prevent the USB lines from being connected to the moden while |
| configuring the USB PHY, and enable the USB lines after configuring the |
| PHY. |
| |
| Note that this only prevents waking up mdm6600 as regular USB A-host mode, |
| and does not help when connected to a lapdock. The lapdock specific issue |
| still needs to be debugged separately. |
| |
| Cc: Merlijn Wajer <merlijn@wizzup.org> |
| Cc: Pavel Machek <pavel@ucw.cz> |
| Cc: Sebastian Reichel <sre@kernel.org> |
| Acked-by: Pavel Machek <pavel@ucw.cz> |
| Signed-off-by: Tony Lindgren <tony@atomide.com> |
| Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/phy/motorola/phy-cpcap-usb.c b/drivers/phy/motorola/phy-cpcap-usb.c |
| index 4ba3634009af..593c77dbde2e 100644 |
| --- a/drivers/phy/motorola/phy-cpcap-usb.c |
| +++ b/drivers/phy/motorola/phy-cpcap-usb.c |
| @@ -115,7 +115,7 @@ struct cpcap_usb_ints_state { |
| enum cpcap_gpio_mode { |
| CPCAP_DM_DP, |
| CPCAP_MDM_RX_TX, |
| - CPCAP_UNKNOWN, |
| + CPCAP_UNKNOWN_DISABLED, /* Seems to disable USB lines */ |
| CPCAP_OTG_DM_DP, |
| }; |
| |
| @@ -379,7 +379,8 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) |
| { |
| int error; |
| |
| - error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); |
| + /* Disable lines to prevent glitches from waking up mdm6600 */ |
| + error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); |
| if (error) |
| goto out_err; |
| |
| @@ -406,6 +407,11 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) |
| if (error) |
| goto out_err; |
| |
| + /* Enable UART mode */ |
| + error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); |
| + if (error) |
| + goto out_err; |
| + |
| return 0; |
| |
| out_err: |
| @@ -418,7 +424,8 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) |
| { |
| int error; |
| |
| - error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); |
| + /* Disable lines to prevent glitches from waking up mdm6600 */ |
| + error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); |
| if (error) |
| return error; |
| |
| @@ -458,6 +465,11 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) |
| if (error) |
| goto out_err; |
| |
| + /* Enable USB mode */ |
| + error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); |
| + if (error) |
| + goto out_err; |
| + |
| return 0; |
| |
| out_err: |
| -- |
| 2.7.4 |
| |