mmc: sdhci: push card_tasklet into threaded irq handler
authorRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 25 Apr 2014 11:55:51 +0000 (12:55 +0100)
committerChris Ball <chris@printf.net>
Thu, 22 May 2014 11:26:25 +0000 (07:26 -0400)
There's no requirement to have the card tasklet separate now that we
have a threaded interrupt handler, so kill this and move the called
code into the threaded part of the handler.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Tested-by: Markus Pargmann <mpa@pengutronix.de>
Tested-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Chris Ball <chris@printf.net>
drivers/mmc/host/sdhci.c
include/linux/mmc/sdhci.h

index 4a0622d52ae57775b027f660d2cf06e18900bf3a..8def3919b32c7deb975e20fbef3cb56c5c452799 100644 (file)
@@ -2128,15 +2128,6 @@ static const struct mmc_host_ops sdhci_ops = {
  *                                                                           *
 \*****************************************************************************/
 
-static void sdhci_tasklet_card(unsigned long param)
-{
-       struct sdhci_host *host = (struct sdhci_host*)param;
-
-       sdhci_card_event(host->mmc);
-
-       mmc_detect_change(host->mmc, msecs_to_jiffies(200));
-}
-
 static void sdhci_tasklet_finish(unsigned long param)
 {
        struct sdhci_host *host;
@@ -2477,7 +2468,10 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
 
                        sdhci_writel(host, intmask & (SDHCI_INT_CARD_INSERT |
                                     SDHCI_INT_CARD_REMOVE), SDHCI_INT_STATUS);
-                       tasklet_schedule(&host->card_tasklet);
+
+                       host->thread_isr |= intmask & (SDHCI_INT_CARD_INSERT |
+                                                      SDHCI_INT_CARD_REMOVE);
+                       result = IRQ_WAKE_THREAD;
                }
 
                if (intmask & SDHCI_INT_CMD_MASK)
@@ -2534,6 +2528,11 @@ static irqreturn_t sdhci_thread_irq(int irq, void *dev_id)
        host->thread_isr = 0;
        spin_unlock_irqrestore(&host->lock, flags);
 
+       if (isr & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) {
+               sdhci_card_event(host->mmc);
+               mmc_detect_change(host->mmc, msecs_to_jiffies(200));
+       }
+
        if (isr & SDHCI_INT_CARD_INT) {
                sdio_run_irqs(host->mmc);
 
@@ -3224,8 +3223,6 @@ int sdhci_add_host(struct sdhci_host *host)
        /*
         * Init tasklets.
         */
-       tasklet_init(&host->card_tasklet,
-               sdhci_tasklet_card, (unsigned long)host);
        tasklet_init(&host->finish_tasklet,
                sdhci_tasklet_finish, (unsigned long)host);
 
@@ -3290,7 +3287,6 @@ reset:
        free_irq(host->irq, host);
 #endif
 untasklet:
-       tasklet_kill(&host->card_tasklet);
        tasklet_kill(&host->finish_tasklet);
 
        return ret;
@@ -3334,7 +3330,6 @@ void sdhci_remove_host(struct sdhci_host *host, int dead)
 
        del_timer_sync(&host->timer);
 
-       tasklet_kill(&host->card_tasklet);
        tasklet_kill(&host->finish_tasklet);
 
        if (host->vmmc) {
index d1aa97b77dd916e430c4a2dfbb765be538715ff7..f1c8e14e8751839cf76bc0d923d71f3aad1b9300 100644 (file)
@@ -164,8 +164,7 @@ struct sdhci_host {
        dma_addr_t adma_addr;   /* Mapped ADMA descr. table */
        dma_addr_t align_addr;  /* Mapped bounce buffer */
 
-       struct tasklet_struct card_tasklet;     /* Tasklet structures */
-       struct tasklet_struct finish_tasklet;
+       struct tasklet_struct finish_tasklet;   /* Tasklet structures */
 
        struct timer_list timer;        /* Timer for timeouts */