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 <el...@wizery.com>
---
 drivers/mmc/host/omap_hsmmc.c |   24 +++++++++++++++---------
 1 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 21e4a79..ec7c83c 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -2174,13 +2174,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,
@@ -2189,9 +2183,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;
 }
 
@@ -2211,7 +2216,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);
-- 
1.7.6.401.g6a319

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to