mmc: tegra: add sdhci tegra suspend and resume
authorSowjanya Komatineni <skomatineni@nvidia.com>
Thu, 11 Apr 2019 19:18:19 +0000 (12:18 -0700)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 15 Apr 2019 10:04:09 +0000 (12:04 +0200)
This patch adds suspend and resume PM ops for tegra SDHCI.

Acked-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Sowjanya Komatineni <skomatineni@nvidia.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-tegra.c

index eafaaefab4a6dbedcceefa38d75d33827d1fe70d..f608417ae96780783f1d0f901fa4c4ed1901ff40 100644 (file)
@@ -1611,11 +1611,67 @@ static int sdhci_tegra_remove(struct platform_device *pdev)
        return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int __maybe_unused sdhci_tegra_suspend(struct device *dev)
+{
+       struct sdhci_host *host = dev_get_drvdata(dev);
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       int ret;
+
+       if (host->mmc->caps2 & MMC_CAP2_CQE) {
+               ret = cqhci_suspend(host->mmc);
+               if (ret)
+                       return ret;
+       }
+
+       ret = sdhci_suspend_host(host);
+       if (ret) {
+               cqhci_resume(host->mmc);
+               return ret;
+       }
+
+       clk_disable_unprepare(pltfm_host->clk);
+       return 0;
+}
+
+static int __maybe_unused sdhci_tegra_resume(struct device *dev)
+{
+       struct sdhci_host *host = dev_get_drvdata(dev);
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       int ret;
+
+       ret = clk_prepare_enable(pltfm_host->clk);
+       if (ret)
+               return ret;
+
+       ret = sdhci_resume_host(host);
+       if (ret)
+               goto disable_clk;
+
+       if (host->mmc->caps2 & MMC_CAP2_CQE) {
+               ret = cqhci_resume(host->mmc);
+               if (ret)
+                       goto suspend_host;
+       }
+
+       return 0;
+
+suspend_host:
+       sdhci_suspend_host(host);
+disable_clk:
+       clk_disable_unprepare(pltfm_host->clk);
+       return ret;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(sdhci_tegra_dev_pm_ops, sdhci_tegra_suspend,
+                        sdhci_tegra_resume);
+
 static struct platform_driver sdhci_tegra_driver = {
        .driver         = {
                .name   = "sdhci-tegra",
                .of_match_table = sdhci_tegra_dt_match,
-               .pm     = &sdhci_pltfm_pmops,
+               .pm     = &sdhci_tegra_dev_pm_ops,
        },
        .probe          = sdhci_tegra_probe,
        .remove         = sdhci_tegra_remove,