]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread
authorFu Zhonghui <zhonghui.fu@linux.intel.com>
Mon, 18 Aug 2014 02:48:14 +0000 (10:48 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 9 Sep 2014 11:59:04 +0000 (13:59 +0200)
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>
drivers/mmc/core/sdio.c
drivers/mmc/core/sdio_irq.c

index e636d9e99e4ae7faa698bb77a33285b301a33523..3fc40a7140a8426f3d70ee43cbdf692e88049aa0 100644 (file)
@@ -992,8 +992,16 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               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);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
index 5cc13c8d35bbf3b2c60c8bc68054e05bec0e62fc..696eca4938448097ff093ee327b6502af8f553e0 100644 (file)
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } 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);
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);