]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
usb: dwc3: fix fault at system suspend if device was already runtime suspended
authorRoger Quadros <rogerq@kernel.org>
Mon, 4 Nov 2024 14:00:11 +0000 (16:00 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 5 Nov 2024 12:55:06 +0000 (13:55 +0100)
If the device was already runtime suspended then during system suspend
we cannot access the device registers else it will crash.

Also we cannot access any registers after dwc3_core_exit() on some
platforms so move the dwc3_enable_susphy() call to the top.

Cc: stable@vger.kernel.org # v5.15+
Reported-by: William McVicker <willmcvicker@google.com>
Closes: https://lore.kernel.org/all/ZyVfcUuPq56R2m1Y@google.com
Fixes: 705e3ce37bcc ("usb: dwc3: core: Fix system suspend on TI AM62 platforms")
Signed-off-by: Roger Quadros <rogerq@kernel.org>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Tested-by: Will McVicker <willmcvicker@google.com>
Link: https://lore.kernel.org/r/20241104-am62-lpm-usb-fix-v1-1-e93df73a4f0d@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/core.c

index 427e5660f87c248572fbe7f4424e9613ae5909c3..98114c2827c09889e63b340450804f7a6d0907d2 100644 (file)
@@ -2342,10 +2342,18 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
        u32 reg;
        int i;
 
-       dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) &
-                           DWC3_GUSB2PHYCFG_SUSPHY) ||
-                           (dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)) &
-                           DWC3_GUSB3PIPECTL_SUSPHY);
+       if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) {
+               dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) &
+                                   DWC3_GUSB2PHYCFG_SUSPHY) ||
+                                   (dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)) &
+                                   DWC3_GUSB3PIPECTL_SUSPHY);
+               /*
+                * TI AM62 platform requires SUSPHY to be
+                * enabled for system suspend to work.
+                */
+               if (!dwc->susphy_state)
+                       dwc3_enable_susphy(dwc, true);
+       }
 
        switch (dwc->current_dr_role) {
        case DWC3_GCTL_PRTCAP_DEVICE:
@@ -2398,15 +2406,6 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
                break;
        }
 
-       if (!PMSG_IS_AUTO(msg)) {
-               /*
-                * TI AM62 platform requires SUSPHY to be
-                * enabled for system suspend to work.
-                */
-               if (!dwc->susphy_state)
-                       dwc3_enable_susphy(dwc, true);
-       }
-
        return 0;
 }