Commit dea67c4e authored by Fu Zhonghui's avatar Fu Zhonghui Committed by Ulf Hansson

mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989c ("mmc: sdhci: convert to new SDIO IRQ handling") and
bf3b5ec6 ("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: default avatarJaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: default avatarChris Ball <chris@printf.net>
Signed-off-by: default avatarFu Zhonghui <zhonghui.fu@linux.intel.com>
Cc: <stable@vger.kernel.org> # v3.16+
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent b1dec120
...@@ -992,8 +992,16 @@ static int mmc_sdio_resume(struct mmc_host *host) ...@@ -992,8 +992,16 @@ static int mmc_sdio_resume(struct mmc_host *host)
} }
} }
if (!err && host->sdio_irqs) if (!err && host->sdio_irqs) {
wake_up_process(host->sdio_irq_thread); if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
wake_up_process(host->sdio_irq_thread);
} else if (host->caps & MMC_CAP_SDIO_IRQ) {
mmc_host_clk_hold(host);
host->ops->enable_sdio_irq(host, 1);
mmc_host_clk_release(host);
}
}
mmc_release_host(host); mmc_release_host(host);
host->pm_flags &= ~MMC_PM_KEEP_POWER; host->pm_flags &= ~MMC_PM_KEEP_POWER;
......
...@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card) ...@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
host->sdio_irqs--; host->sdio_irqs--;
return err; return err;
} }
} else { } else if (host->caps & MMC_CAP_SDIO_IRQ) {
mmc_host_clk_hold(host); mmc_host_clk_hold(host);
host->ops->enable_sdio_irq(host, 1); host->ops->enable_sdio_irq(host, 1);
mmc_host_clk_release(host); mmc_host_clk_release(host);
...@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card) ...@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) { if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
atomic_set(&host->sdio_irq_thread_abort, 1); atomic_set(&host->sdio_irq_thread_abort, 1);
kthread_stop(host->sdio_irq_thread); kthread_stop(host->sdio_irq_thread);
} else { } else if (host->caps & MMC_CAP_SDIO_IRQ) {
mmc_host_clk_hold(host); mmc_host_clk_hold(host);
host->ops->enable_sdio_irq(host, 0); host->ops->enable_sdio_irq(host, 0);
mmc_host_clk_release(host); mmc_host_clk_release(host);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment