]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
usb: dwc3: imx8mp: disable SS_CON and U3 wakeup for system sleep
authorLi Jun <jun.li@nxp.com>
Fri, 6 Sep 2024 16:30:39 +0000 (12:30 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 11 Sep 2024 13:37:52 +0000 (15:37 +0200)
SS_CON and U3 wakeup need 'ref_clk' on. iMX8MP turn off it while system
sleep, So disable these wakeup source and only enable DP/DM wakeup source
for host mode.

Reviewed-by: Xu Yang <xu.yang_2@nxp.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
Link: https://lore.kernel.org/r/20240906-dwc-mp-v5-3-ea8ec6774e7b@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/dwc3-imx8mp.c

index cfb59f6bf5dde7b8744e7f64e638b18a0565dca9..64c0cd1995aa066364170990f4a92c89ff947f0f 100644 (file)
@@ -97,7 +97,8 @@ static void imx8mp_configure_glue(struct dwc3_imx8mp *dwc3_imx)
        writel(value, dwc3_imx->glue_base + USB_CTRL1);
 }
 
-static void dwc3_imx8mp_wakeup_enable(struct dwc3_imx8mp *dwc3_imx)
+static void dwc3_imx8mp_wakeup_enable(struct dwc3_imx8mp *dwc3_imx,
+                                     pm_message_t msg)
 {
        struct dwc3     *dwc3 = platform_get_drvdata(dwc3_imx->dwc3);
        u32             val;
@@ -107,12 +108,14 @@ static void dwc3_imx8mp_wakeup_enable(struct dwc3_imx8mp *dwc3_imx)
 
        val = readl(dwc3_imx->hsio_blk_base + USB_WAKEUP_CTRL);
 
-       if ((dwc3->current_dr_role == DWC3_GCTL_PRTCAP_HOST) && dwc3->xhci)
-               val |= USB_WAKEUP_EN | USB_WAKEUP_SS_CONN |
-                      USB_WAKEUP_U3_EN | USB_WAKEUP_DPDM_EN;
-       else if (dwc3->current_dr_role == DWC3_GCTL_PRTCAP_DEVICE)
+       if ((dwc3->current_dr_role == DWC3_GCTL_PRTCAP_HOST) && dwc3->xhci) {
+               val |= USB_WAKEUP_EN | USB_WAKEUP_DPDM_EN;
+               if (PMSG_IS_AUTO(msg))
+                       val |= USB_WAKEUP_SS_CONN | USB_WAKEUP_U3_EN;
+       } else {
                val |= USB_WAKEUP_EN | USB_WAKEUP_VBUS_EN |
                       USB_WAKEUP_VBUS_SRC_SESS_VAL;
+       }
 
        writel(val, dwc3_imx->hsio_blk_base + USB_WAKEUP_CTRL);
 }
@@ -277,7 +280,7 @@ static int dwc3_imx8mp_suspend(struct dwc3_imx8mp *dwc3_imx, pm_message_t msg)
 
        /* Wakeup enable */
        if (PMSG_IS_AUTO(msg) || device_may_wakeup(dwc3_imx->dev))
-               dwc3_imx8mp_wakeup_enable(dwc3_imx);
+               dwc3_imx8mp_wakeup_enable(dwc3_imx, msg);
 
        dwc3_imx->pm_suspended = true;