]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
mmc: sdhci: MMC_RTPM sdcard fix
authorBitan Biswas <bbiswas@nvidia.com>
Wed, 4 Mar 2015 08:53:38 +0000 (14:23 +0530)
committerBitan Biswas <bbiswas@nvidia.com>
Fri, 13 Mar 2015 11:08:31 +0000 (04:08 -0700)
Problems:
MMC_RTPM runtime pm implementation
when enabled for SD card shows below
problems -
1. Boot without SD card does not disable
   controller clocks.
2. When card is inserted/removed we see
   warning as follows:
"BUG: sleeping function called from invalid
context at
kernel/drivers/base/power/runtime.c:972"

bug 200023075

Change-Id: I7a9dede458082e5c65bd600c13d8cf7b213baebf
Signed-off-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-on: http://git-master/r/713703
Reviewed-by: Pavan Kunapuli <pkunapuli@nvidia.com>
Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>
drivers/mmc/host/sdhci.c

index 588c0d3b20ec2dcfeb272af422c1d634e0ccf8d3..3c0f52aaaf204744f17338e0a11c8c2530caa686 100644 (file)
@@ -2721,11 +2721,17 @@ static void sdhci_card_event(struct mmc_host *mmc)
        struct sdhci_host *host = mmc_priv(mmc);
        unsigned long flags;
 
-       sdhci_runtime_pm_get(host);
+       /* sdhci_runtime_pm_get cannot be called here since
+        * tasklet/softirq context cannot call
+        * sleeping function like __pm_runtime_resume
+         */
        spin_lock_irqsave(&host->lock, flags);
 
        /* Check host->mrq_cmd first in case we are runtime suspended */
        if ((host->mrq_cmd || host->mrq_dat) &&
+               /* TODO: check if clocks are already ON when
+                * mrq_cmd or mrq_dat are enabled
+                */
            !(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) {
                pr_err("%s: Card removed during transfer!\n",
                        mmc_hostname(host->mmc));
@@ -2751,7 +2757,6 @@ static void sdhci_card_event(struct mmc_host *mmc)
        }
 
        spin_unlock_irqrestore(&host->lock, flags);
-       sdhci_runtime_pm_put(host);
 }
 
 int sdhci_enable(struct mmc_host *mmc)
@@ -3763,12 +3768,10 @@ int sdhci_runtime_suspend_host(struct sdhci_host *host)
                host->runtime_suspended = true;
                spin_unlock_irqrestore(&host->lock, flags);
 
-               if (host->mmc->ios.clock) {
-                       sdhci_set_clock(host, 0);
-                       if (host->ops->set_clock)
-                               host->ops->set_clock(host, 0);
-                       sysedp_set_state(host->sysedpc, 0);
-               }
+               sdhci_set_clock(host, 0);
+               if (host->ops->set_clock)
+                       host->ops->set_clock(host, 0);
+               sysedp_set_state(host->sysedpc, 0);
                goto lbl_end;
        }