summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorDong Aisheng <b29396@freescale.com>2013-12-16 14:42:14 +0800
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 08:47:29 -0500
commite2ff3a65d3cb87b4a1f443fec4309f6663f96380 (patch)
tree2cce21a486f73d6948d40869db06c1e291f6a8f2 /drivers/mmc
parent10f6b42056dffe2f73a6ff486770b9df08949c0d (diff)
ENGR00292140 mmc: sdhci: fix possible sleep in atomic in sdio_irq enable function
The sdhci_runtime_pm_get API is able to sleep, so should not call it in sdhci_enable_sdio_irq_nolock which is executed with spin_lock_irqsave in sdhci_enable_sdio_irq. Move it out of spin lock to fix this issue. Signed-off-by: Dong Aisheng <b29396@freescale.com>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/sdhci.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 7b008675d7fc..dfa71b32c8e0 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1697,9 +1697,6 @@ static int sdhci_get_ro(struct mmc_host *mmc)
static void sdhci_enable_sdio_irq_nolock(struct sdhci_host *host, int enable)
{
- if (enable)
- sdhci_runtime_pm_get(host);
-
if (host->flags & SDHCI_DEVICE_DEAD)
goto out;
@@ -1718,9 +1715,6 @@ static void sdhci_enable_sdio_irq_nolock(struct sdhci_host *host, int enable)
sdhci_mask_irqs(host, SDHCI_INT_CARD_INT);
out:
mmiowb();
-
- if (!enable)
- sdhci_runtime_pm_put(host);
}
static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
@@ -1728,9 +1722,15 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
struct sdhci_host *host = mmc_priv(mmc);
unsigned long flags;
+ if (enable)
+ sdhci_runtime_pm_get(host);
+
spin_lock_irqsave(&host->lock, flags);
sdhci_enable_sdio_irq_nolock(host, enable);
spin_unlock_irqrestore(&host->lock, flags);
+
+ if (!enable)
+ sdhci_runtime_pm_put(host);
}
static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host,