usb: chipidea: imx: get available runtime dr mode for wakeup setting
authorPeter Chen <peter.chen@nxp.com>
Tue, 28 Jul 2020 06:12:11 +0000 (14:12 +0800)
committerPeter Chen <peter.chen@nxp.com>
Tue, 28 Jul 2020 06:12:11 +0000 (14:12 +0800)
If runtime dr_mode is not dual-role, it doesn't need to enable ID
wakeup interrupt.
If runtime dr_mode is host, it doesn't need to enable VBUS
wakeup interrupt.
With these changes, the user will not get the unexpected wakeup
for single role use case. For example, the host-only use case at
Micro-AB port, the controller should not be waken up by only
plug in Micro-AB cable or the Micro-B cable with host.
Signed-off-by: Peter Chen <peter.chen@nxp.com>
drivers/usb/chipidea/ci_hdrc_imx.c
drivers/usb/chipidea/ci_hdrc_imx.h
drivers/usb/chipidea/usbmisc_imx.c

index 5ae16368a0c75a06588b0ae3fa97ac7a71d5e274..c39e2b615ac6d179c822250e7bc33b8c1b41f64b 100644 (file)
@@ -462,6 +462,10 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
                if (!IS_ERR(pdata.vbus_extcon.edev) ||
                    of_property_read_bool(np, "usb-role-switch"))
                        data->usbmisc_data->ext_vbus = 1;
+
+               /* usbmisc needs to know dr mode to choose wakeup setting */
+               data->usbmisc_data->available_role =
+                       ci_hdrc_query_available_role(data->ci_pdev);
        }
 
        ret = imx_usbmisc_init_post(data->usbmisc_data);
index 727d02b6dbd3192ccec2db8e0d76a3bf4fd1a50d..99f846119c00418eb3383f4bee91e8a864f9bd7e 100644 (file)
@@ -25,6 +25,7 @@ struct imx_usbmisc_data {
        unsigned int ext_id:1; /* ID from exteranl event */
        unsigned int ext_vbus:1; /* Vbus from exteranl event */
        struct usb_phy *usb_phy;
+       enum usb_dr_mode available_role; /* runtime usb dr mode */
 };
 
 int imx_usbmisc_init(struct imx_usbmisc_data *data);
index f136876cb4a308005c56216f059160d3cfe3a6e3..ae8f0f37e79990ece007c02e9e08a1f00b2ab6b2 100644 (file)
@@ -367,10 +367,10 @@ static u32 usbmisc_wakeup_setting(struct imx_usbmisc_data *data)
 {
        u32 wakeup_setting = MX6_USB_OTG_WAKEUP_BITS;
 
-       if (data->ext_id)
+       if (data->ext_id || data->available_role != USB_DR_MODE_OTG)
                wakeup_setting &= ~MX6_BM_ID_WAKEUP;
 
-       if (data->ext_vbus)
+       if (data->ext_vbus || data->available_role == USB_DR_MODE_HOST)
                wakeup_setting &= ~MX6_BM_VBUS_WAKEUP;
 
        return wakeup_setting;