]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mmc: sdhci-esdhc-imx: disable irq during suspend to fix unhandled interrupt
authorLuke Wang <ziniu.wang_1@nxp.com>
Wed, 15 Jul 2026 07:18:15 +0000 (15:18 +0800)
committerUlf Hansson <ulfh@kernel.org>
Wed, 15 Jul 2026 08:59:44 +0000 (10:59 +0200)
When using WIFI out-of-band wakeup, an "irq xxx: nobody cared" warning
occurs. This happens because the usdhc interrupt is not disabled during
system suspend when device_may_wakeup() returns false.

The sequence of events leading to this issue:
1. System enters suspend without disabling usdhc interrupt
(because device_may_wakeup() returns false for usdhc device)
2. WIFI out-of-band wakeup triggers system resume via GPIO interrupt
3. WIFI sends a Card interrupt before usdhc has fully resumed
4. usdhc is still in runtime suspend state and cannot handle the
interrupt properly
5. The unhandled interrupt triggers "nobody cared" warning

Fix this by unconditionally disabling the usdhc interrupt during suspend
and re-enabling it during resume, regardless of the wakeup capability.
This ensures no interrupts are processed during the suspend/resume
transition.

Fixes: 676a83855614 ("mmc: host: sdhci-esdhc-imx: refactor the system PM logic")
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Haibo Chen <haibo.chen@nxp.com>
Signed-off-by: Luke Wang <ziniu.wang_1@nxp.com>
Cc: stable@vger.kernel.org
Signed-off-by: Ulf Hansson <ulfh@kernel.org>
drivers/mmc/host/sdhci-esdhc-imx.c

index a54da5757acc1e67ffccfa6543543500516acf37..d980dea9cad1f13906bea46a17e7a71d4762a655 100644 (file)
@@ -2077,9 +2077,10 @@ static int sdhci_esdhc_suspend(struct device *dev)
        if (mmc_card_keep_power(host->mmc) && esdhc_is_usdhc(imx_data))
                sdhc_esdhc_tuning_save(host);
 
+       /* The irqs of imx are not shared. It is safe to disable */
+       disable_irq(host->irq);
+
        if (device_may_wakeup(dev)) {
-               /* The irqs of imx are not shared. It is safe to disable */
-               disable_irq(host->irq);
                ret = sdhci_enable_irq_wakeups(host);
                if (!ret)
                        dev_warn(dev, "Failed to enable irq wakeup\n");
@@ -2130,10 +2131,10 @@ static int sdhci_esdhc_resume(struct device *dev)
        /* re-initialize hw state in case it's lost in low power mode */
        sdhci_esdhc_imx_hwinit(host);
 
-       if (host->irq_wake_enabled) {
+       if (host->irq_wake_enabled)
                sdhci_disable_irq_wakeups(host);
-               enable_irq(host->irq);
-       }
+
+       enable_irq(host->irq);
 
        /*
         * restore the saved tuning delay value for the device which keep