mmc: sdhci: Skip mmc suspend/resume ops for SDIO device,
authorDmitry Shmidt <dimitrysh@google.com>
Fri, 13 Aug 2010 01:08:40 +0000 (18:08 -0700)
committerColin Cross <ccross@android.com>
Wed, 6 Oct 2010 23:28:03 +0000 (16:28 -0700)
enable/disable sdc irq instead of request/free,
mask all sdc interrupts on suspend

Change-Id: I3fb137363c6e639882b796aff8b80784c5256a71
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/mmc/host/sdhci.c

index 4d441d2194e9bc4d46d89105427054abeac1371e..0a544d79252e82d19f7a77167b93dd6df1d9a3d6 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/leds.h>
 
 #include <linux/mmc/host.h>
+#include <linux/mmc/card.h>
 
 #include "sdhci.h"
 
@@ -1633,19 +1634,22 @@ out:
 
 int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state)
 {
-       int ret;
+       int ret = 0;
+       struct mmc_host *mmc = host->mmc;
 
        sdhci_disable_card_detection(host);
 
-       ret = mmc_suspend_host(host->mmc);
-       if (ret)
-               return ret;
+       if (mmc->card && (mmc->card->type != MMC_TYPE_SDIO))
+               ret = mmc_suspend_host(host->mmc);
 
-       free_irq(host->irq, host);
+       sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK);
 
        if (host->vmmc)
                ret = regulator_disable(host->vmmc);
 
+       if (host->irq)
+               disable_irq(host->irq);
+
        return ret;
 }
 
@@ -1653,7 +1657,8 @@ EXPORT_SYMBOL_GPL(sdhci_suspend_host);
 
 int sdhci_resume_host(struct sdhci_host *host)
 {
-       int ret;
+       int ret = 0;
+       struct mmc_host *mmc = host->mmc;
 
        if (host->vmmc) {
                int ret = regulator_enable(host->vmmc);
@@ -1667,15 +1672,15 @@ int sdhci_resume_host(struct sdhci_host *host)
                        host->ops->enable_dma(host);
        }
 
-       ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED,
-                         mmc_hostname(host->mmc), host);
-       if (ret)
-               return ret;
+       if (host->irq)
+               enable_irq(host->irq);
 
        sdhci_init(host, (host->mmc->pm_flags & MMC_PM_KEEP_POWER));
        mmiowb();
 
-       ret = mmc_resume_host(host->mmc);
+       if (mmc->card && (mmc->card->type != MMC_TYPE_SDIO))
+               ret = mmc_resume_host(host->mmc);
+
        sdhci_enable_card_detection(host);
 
        return ret;