Suspend/resume is working always enable regulator after resuming. 
(if there is host->vmmc)
I assume that if regulator is enabled, card is inserted.
Then We need to restore "vmmc".

Signed-off-by: Jaehoon Chung <[email protected]>
Signed-off-by: Kyungmin Park <[email protected]>
---
 drivers/mmc/host/sdhci.c  |    8 +++++---
 include/linux/mmc/sdhci.h |    1 +
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 9e15f41..70cbbd6 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1663,8 +1663,10 @@ int sdhci_suspend_host(struct sdhci_host *host, 
pm_message_t state)
 
        free_irq(host->irq, host);
 
-       if (host->vmmc)
+       if (host->vmmc && regulator_is_enabled(host->vmmc)) {
                ret = regulator_disable(host->vmmc);
+               host->restore_vmmc = true;
+       }
 
        return ret;
 }
@@ -1675,8 +1677,8 @@ int sdhci_resume_host(struct sdhci_host *host)
 {
        int ret;
 
-       if (host->vmmc) {
-               int ret = regulator_enable(host->vmmc);
+       if (host->vmmc && host->restore_vmmc) {
+               ret = regulator_enable(host->vmmc);
                if (ret)
                        return ret;
        }
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index 83bd9f7..1c38261 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -92,6 +92,7 @@ struct sdhci_host {
        const struct sdhci_ops *ops;    /* Low level hw interface */
 
        struct regulator *vmmc; /* Power regulator */
+       bool restore_vmmc;      /* Restore vmmc */
 
        /* Internal data */
        struct mmc_host *mmc;   /* MMC structure */
-- 
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to