mmc: sdhci-esdhc-imx: Enable/Disable mmc clock during runtime suspend
authorMichael Trimarchi <michael@amarulasolutions.com>
Thu, 4 Jan 2018 15:30:59 +0000 (16:30 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 9 Jan 2018 08:21:49 +0000 (09:21 +0100)
mmc clock can be stopped during runtime suspend and restart during runtime
resume if the sdio irq is not enabled. Stop sdio clock reduce EMI of
the device when the bus is not in use.

Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-esdhc-imx.c

index 6d4e3233a920bb5e1bbdbd9f95fd2956c97e01fc..53cc1b6caf8ff6abeb74a981e86038691ff7cf37 100644 (file)
@@ -193,6 +193,7 @@ struct pltfm_imx_data {
        struct clk *clk_ipg;
        struct clk *clk_ahb;
        struct clk *clk_per;
+       unsigned int actual_clock;
        enum {
                NO_CMD_PENDING,      /* no multiblock command pending */
                MULTIBLK_IN_PROCESS, /* exact multiblock cmd in process */
@@ -1396,6 +1397,8 @@ static int sdhci_esdhc_runtime_suspend(struct device *dev)
                mmc_retune_needed(host->mmc);
 
        if (!sdhci_sdio_irq_enabled(host)) {
+               imx_data->actual_clock = host->mmc->actual_clock;
+               esdhc_pltfm_set_clock(host, 0);
                clk_disable_unprepare(imx_data->clk_per);
                clk_disable_unprepare(imx_data->clk_ipg);
        }
@@ -1422,6 +1425,7 @@ static int sdhci_esdhc_runtime_resume(struct device *dev)
                err = clk_prepare_enable(imx_data->clk_ipg);
                if (err)
                        goto disable_per_clk;
+               esdhc_pltfm_set_clock(host, imx_data->actual_clock);
        }
 
        err = sdhci_runtime_resume_host(host);