omap_hsmmc: consider MMC_PM_KEEP_POWER on suspend/resume
authorEliad Peller <eliad@wizery.com>
Tue, 22 Nov 2011 14:02:17 +0000 (16:02 +0200)
committerTony Lindgren <tony@atomide.com>
Fri, 9 Dec 2011 00:24:09 +0000 (16:24 -0800)
When an mmc card has the MMC_PM_KEEP_POWER flag, it shouldn't
be powered off on suspend (and thus doesn't have to be powered-on
on resume)

While on it, change the suspend flow a bit, to make it a bit
easier to follow.

Signed-off-by: Eliad Peller <eliad@wizery.com>
Acked-by: Chris Ball <cjb@laptop.org>
Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/mmc/host/omap_hsmmc.c

index 101cd31..6784fbb 100644 (file)
@@ -2176,13 +2176,7 @@ static int omap_hsmmc_suspend(struct device *dev)
                cancel_work_sync(&host->mmc_carddetect_work);
                ret = mmc_suspend_host(host->mmc);
 
-               if (ret == 0) {
-                       omap_hsmmc_disable_irq(host);
-                       OMAP_HSMMC_WRITE(host->base, HCTL,
-                               OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
-                       if (host->got_dbclk)
-                               clk_disable(host->dbclk);
-               } else {
+               if (ret) {
                        host->suspended = 0;
                        if (host->pdata->resume) {
                                ret = host->pdata->resume(&pdev->dev,
@@ -2191,9 +2185,20 @@ static int omap_hsmmc_suspend(struct device *dev)
                                        dev_dbg(mmc_dev(host->mmc),
                                                "Unmask interrupt failed\n");
                        }
+                       goto err;
                }
-               pm_runtime_put_sync(host->dev);
+
+               if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) {
+                       omap_hsmmc_disable_irq(host);
+                       OMAP_HSMMC_WRITE(host->base, HCTL,
+                               OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
+               }
+               if (host->got_dbclk)
+                       clk_disable(host->dbclk);
+
        }
+err:
+       pm_runtime_put_sync(host->dev);
        return ret;
 }
 
@@ -2213,7 +2218,8 @@ static int omap_hsmmc_resume(struct device *dev)
                if (host->got_dbclk)
                        clk_enable(host->dbclk);
 
-               omap_hsmmc_conf_bus_power(host);
+               if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
+                       omap_hsmmc_conf_bus_power(host);
 
                if (host->pdata->resume) {
                        ret = host->pdata->resume(&pdev->dev, host->slot_id);