aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/core
diff options
context:
space:
mode:
authorFu Zhonghui <zhonghui.fu@linux.intel.com>2014-08-17 22:48:14 -0400
committerUlf Hansson <ulf.hansson@linaro.org>2014-09-09 07:59:04 -0400
commitdea67c4ec8218b301d7cac7ee6e63dac0bc566cb (patch)
treeeffaa882b9c5fb831c41b7d369e8b797871b369b /drivers/mmc/core
parentb1dec12032af3a5239171c76cd43a4d372d8829b (diff)
mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread
781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time. Link: https://bugzilla.kernel.org/show_bug.cgi?id=80151 In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ. Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Chris Ball <chris@printf.net> Signed-off-by: Fu Zhonghui <zhonghui.fu@linux.intel.com> Cc: <stable@vger.kernel.org> # v3.16+ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc/core')
-rw-r--r--drivers/mmc/core/sdio.c12
-rw-r--r--drivers/mmc/core/sdio_irq.c4
2 files changed, 12 insertions, 4 deletions
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
index e636d9e99e4a..3fc40a7140a8 100644
--- a/drivers/mmc/core/sdio.c
+++ b/drivers/mmc/core/sdio.c
@@ -992,8 +992,16 @@ static int mmc_sdio_resume(struct mmc_host *host)
992 } 992 }
993 } 993 }
994 994
995 if (!err && host->sdio_irqs) 995 if (!err && host->sdio_irqs) {
996 wake_up_process(host->sdio_irq_thread); 996 if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
997 wake_up_process(host->sdio_irq_thread);
998 } else if (host->caps & MMC_CAP_SDIO_IRQ) {
999 mmc_host_clk_hold(host);
1000 host->ops->enable_sdio_irq(host, 1);
1001 mmc_host_clk_release(host);
1002 }
1003 }
1004
997 mmc_release_host(host); 1005 mmc_release_host(host);
998 1006
999 host->pm_flags &= ~MMC_PM_KEEP_POWER; 1007 host->pm_flags &= ~MMC_PM_KEEP_POWER;
diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c
index 5cc13c8d35bb..696eca493844 100644
--- a/drivers/mmc/core/sdio_irq.c
+++ b/drivers/mmc/core/sdio_irq.c
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
208 host->sdio_irqs--; 208 host->sdio_irqs--;
209 return err; 209 return err;
210 } 210 }
211 } else { 211 } else if (host->caps & MMC_CAP_SDIO_IRQ) {
212 mmc_host_clk_hold(host); 212 mmc_host_clk_hold(host);
213 host->ops->enable_sdio_irq(host, 1); 213 host->ops->enable_sdio_irq(host, 1);
214 mmc_host_clk_release(host); 214 mmc_host_clk_release(host);
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
229 if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) { 229 if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
230 atomic_set(&host->sdio_irq_thread_abort, 1); 230 atomic_set(&host->sdio_irq_thread_abort, 1);
231 kthread_stop(host->sdio_irq_thread); 231 kthread_stop(host->sdio_irq_thread);
232 } else { 232 } else if (host->caps & MMC_CAP_SDIO_IRQ) {
233 mmc_host_clk_hold(host); 233 mmc_host_clk_hold(host);
234 host->ops->enable_sdio_irq(host, 0); 234 host->ops->enable_sdio_irq(host, 0);
235 mmc_host_clk_release(host); 235 mmc_host_clk_release(host);