diff options
author | Tony Lin <tony.lin@freescale.com> | 2011-12-26 13:44:20 +0800 |
---|---|---|
committer | Tony Lin <tony.lin@freescale.com> | 2011-12-27 10:31:43 +0800 |
commit | 39a65a579133a441c554faa8f6369d4f42d1ff45 (patch) | |
tree | 5ba0be70ac1e25e47b1c19af41a3c5b37ad950da | |
parent | 0940a83dbd2769f1606d5f9b5ce750c63aee8c8d (diff) |
ENGR00170929 [MX6Q MMC]might sleep in atomic context
call clk_enable/clk_disable in atomic is forbidden.
move all the calls out of atomic context.
Signed-off-by: Tony Lin <tony.lin@freescale.com>
-rw-r--r-- | drivers/mmc/host/sdhci.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index adb732d01d60..ab111843f5f1 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -54,10 +54,8 @@ static void sdhci_clk_worker(struct work_struct *work) struct sdhci_host *host = container_of(work, struct sdhci_host, clk_worker.work); - spin_lock_irqsave(&host->lock, flags); if (host->ops->platform_clk_ctrl && host->clk_status) host->ops->platform_clk_ctrl(host, false); - spin_unlock_irqrestore(&host->lock, flags); } static inline bool sdhci_is_sdio_attached(struct sdhci_host *host) @@ -281,16 +279,16 @@ static void sdhci_led_control(struct led_classdev *led, struct sdhci_host *host = container_of(led, struct sdhci_host, led); unsigned long flags; - spin_lock_irqsave(&host->lock, flags); sdhci_enable_clk(host); + spin_lock_irqsave(&host->lock, flags); if (brightness == LED_OFF) sdhci_deactivate_led(host); else sdhci_activate_led(host); - sdhci_disable_clk(host, CLK_TIMEOUT); spin_unlock_irqrestore(&host->lock, flags); + sdhci_disable_clk(host, CLK_TIMEOUT); } #endif @@ -1173,6 +1171,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) host = mmc_priv(mmc); + sdhci_enable_clk(host); spin_lock_irqsave(&host->lock, flags); WARN_ON(host->mrq != NULL); @@ -1188,7 +1187,6 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) } host->mrq = mrq; - sdhci_enable_clk(host); /* If polling, assume that the card is always present. */ if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) @@ -1215,8 +1213,8 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) host = mmc_priv(mmc); - spin_lock_irqsave(&host->lock, flags); sdhci_enable_clk(host); + spin_lock_irqsave(&host->lock, flags); if (host->flags & SDHCI_DEVICE_DEAD) goto out; @@ -1292,10 +1290,10 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) out: mmiowb(); + spin_unlock_irqrestore(&host->lock, flags); + if (ios->power_mode == MMC_POWER_OFF) sdhci_disable_clk(host, 0); - - spin_unlock_irqrestore(&host->lock, flags); } static int sdhci_get_ro(struct mmc_host *mmc) @@ -1306,8 +1304,8 @@ static int sdhci_get_ro(struct mmc_host *mmc) host = mmc_priv(mmc); - spin_lock_irqsave(&host->lock, flags); sdhci_enable_clk(host); + spin_lock_irqsave(&host->lock, flags); if (host->flags & SDHCI_DEVICE_DEAD) is_readonly = 0; @@ -1318,6 +1316,7 @@ static int sdhci_get_ro(struct mmc_host *mmc) & SDHCI_WRITE_PROTECT); spin_unlock_irqrestore(&host->lock, flags); + sdhci_disable_clk(host, CLK_TIMEOUT); /* This quirk needs to be replaced by a callback-function later */ return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ? @@ -1331,8 +1330,8 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable) host = mmc_priv(mmc); - spin_lock_irqsave(&host->lock, flags); sdhci_enable_clk(host); + spin_lock_irqsave(&host->lock, flags); if (host->flags & SDHCI_DEVICE_DEAD) goto out; @@ -1441,8 +1440,8 @@ static void sdhci_tasklet_finish(unsigned long param) #endif mmiowb(); - sdhci_disable_clk(host, CLK_TIMEOUT); spin_unlock_irqrestore(&host->lock, flags); + sdhci_disable_clk(host, CLK_TIMEOUT); mmc_request_done(host->mmc, mrq); } @@ -2148,6 +2147,8 @@ void sdhci_remove_host(struct sdhci_host *host, int dead) { unsigned long flags; + sdhci_enable_clk(host); + if (dead) { spin_lock_irqsave(&host->lock, flags); @@ -2158,7 +2159,6 @@ void sdhci_remove_host(struct sdhci_host *host, int dead) " transfer!\n", mmc_hostname(host->mmc)); host->mrq->cmd->error = -ENOMEDIUM; - sdhci_enable_clk(host); tasklet_schedule(&host->finish_tasklet); } |