]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: dwc3: imx: avoid calling imx suspend/resume callbacks twice
authorXu Yang <xu.yang_2@nxp.com>
Tue, 17 Mar 2026 03:05:46 +0000 (11:05 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Mar 2026 15:22:18 +0000 (16:22 +0100)
If a runtime suspend is executed followed by a system suspend, the driver
may invoke dwc3_imx_suspend() twice, which causes enable_irq() to be
called twice as well. This leads to an unbalanced IRQ state and may
trigger warnings or malfunction. Prevent this by checking the pm_suspended
flag before running the imx suspend/resume path.

Fixes: 76fc9452a6bf ("usb: dwc3: introduce flatten model driver of i.MX Soc")
Signed-off-by: Xu Yang <xu.yang_2@nxp.com>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://patch.msgid.link/20260317030546.1665206-1-xu.yang_2@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/dwc3-imx.c

index 303708f7d79aa3678bd557208513015c555a2a28..973a486b544d5e2293cecc12dba843a5610c6137 100644 (file)
@@ -288,6 +288,9 @@ static void dwc3_imx_remove(struct platform_device *pdev)
 
 static void dwc3_imx_suspend(struct dwc3_imx *dwc_imx, pm_message_t msg)
 {
+       if (dwc_imx->pm_suspended)
+               return;
+
        if (PMSG_IS_AUTO(msg) || device_may_wakeup(dwc_imx->dev))
                dwc3_imx_wakeup_enable(dwc_imx, msg);
 
@@ -299,6 +302,9 @@ static void dwc3_imx_resume(struct dwc3_imx *dwc_imx, pm_message_t msg)
 {
        struct dwc3     *dwc = &dwc_imx->dwc;
 
+       if (!dwc_imx->pm_suspended)
+               return;
+
        dwc_imx->pm_suspended = false;
        if (!dwc_imx->wakeup_pending)
                disable_irq_nosync(dwc_imx->irq);