mmc: sdhci: add spin lock for sdhci_set_default_irqs in sdhci_init
authorHaibo Chen <haibo.chen@nxp.com>
Wed, 15 Apr 2020 09:00:55 +0000 (17:00 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Thu, 28 May 2020 09:20:59 +0000 (11:20 +0200)
When use one SDIO wifi which enable the runtime PM feature on i.MX6SX,
we meet system hang. This hang happened during the usdhc runtime resume,
in sdhci_init(), when call the sdhci_set_default_irqs. One interrupt
(SDHCI_INT_CARD_INT) triggered just after the host->ier update and before
the write of register SDHCI_SIGNAL_ENABLE. So in sdhci_irq, it will skip
the call of sdio_signal_irq() because current host->ier do not set the
SDHCI_INT_CARD_INT. So this SDIO wifi interrupt always keep triggered,
let the system stuck in irq handle, can't response any other thread.

This patch add spin lock for the sdhci_set_default_irqs to fix this issue.

Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/1586941255-9237-1-git-send-email-haibo.chen@nxp.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci.c

index 6cc72177f85388b4e0c50007dba93b51c53e8bfd..1bb6b679631836b0e6705a5d95fe1c744ebda9d5 100644 (file)
@@ -317,6 +317,7 @@ out:
 static void sdhci_init(struct sdhci_host *host, int soft)
 {
        struct mmc_host *mmc = host->mmc;
+       unsigned long flags;
 
        if (soft)
                sdhci_do_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
@@ -326,7 +327,9 @@ static void sdhci_init(struct sdhci_host *host, int soft)
        if (host->v4_mode)
                sdhci_do_enable_v4_mode(host);
 
+       spin_lock_irqsave(&host->lock, flags);
        sdhci_set_default_irqs(host);
+       spin_unlock_irqrestore(&host->lock, flags);
 
        host->cqe_on = false;