MLK-13366 mmc: sdhci-esdhc-imx: no need busfreq for imx6qdl
authorHaibo Chen <haibo.chen@nxp.com>
Tue, 25 Oct 2016 02:15:01 +0000 (10:15 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 19:52:29 +0000 (14:52 -0500)
This reverts commit 2c01452f4d7c0f65553b365adc27a1b7b6ba8644.
Besides, add other SoC request high bus freq. This is because
only imx6qdl do not implement low bus idle, so imx6qdl can work
well under low power mode without request high bus freq which
also can save power. For other SoC, need to request high bus
freq when usdhc is active.

Also can refer to commit 312979d1fcbd.

drivers/mmc/host/sdhci-esdhc-imx.c

index 38a05f5..966de7b 100644 (file)
  * exceed 150MHz, for DDR mode, SD card clock can't exceed 45MHz.
  */
 #define ESDHC_FLAG_ERR010450           BIT(11)
+/* need request bus freq during low power */
+#define ESDHC_FLAG_BUSFREQ             BIT(12)
 
 /* A higher clock ferquency than this rate requires strobell dll control */
 #define ESDHC_STROBE_DLL_CLK_FREQ      100000000
@@ -195,26 +197,29 @@ static struct esdhc_soc_data usdhc_imx6q_data = {
 static struct esdhc_soc_data usdhc_imx6sl_data = {
        .flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING
                        | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_ERR004536
-                       | ESDHC_FLAG_HS200,
+                       | ESDHC_FLAG_HS200 | ESDHC_FLAG_BUSFREQ,
 };
 
 static struct esdhc_soc_data usdhc_imx6sx_data = {
        .flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING
                        | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_HS200
-                       | ESDHC_FLAG_STATE_LOST_IN_LPMODE,
+                       | ESDHC_FLAG_STATE_LOST_IN_LPMODE
+                       | ESDHC_FLAG_BUSFREQ,
 };
 
 static struct esdhc_soc_data usdhc_imx6ull_data = {
        .flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING
                        | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_HS200
                        | ESDHC_FLAG_STATE_LOST_IN_LPMODE
-                       | ESDHC_FLAG_ERR010450,
+                       | ESDHC_FLAG_ERR010450
+                       | ESDHC_FLAG_BUSFREQ,
 };
 
 static struct esdhc_soc_data usdhc_imx7d_data = {
        .flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING
                        | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_HS200
-                       | ESDHC_FLAG_HS400 | ESDHC_FLAG_STATE_LOST_IN_LPMODE,
+                       | ESDHC_FLAG_HS400 | ESDHC_FLAG_STATE_LOST_IN_LPMODE
+                       | ESDHC_FLAG_BUSFREQ,
 };
 
 struct pltfm_imx_data {
@@ -1304,7 +1309,8 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
        pltfm_host->clk = imx_data->clk_per;
        pltfm_host->clock = clk_get_rate(pltfm_host->clk);
 
-       request_bus_freq(BUS_FREQ_HIGH);
+       if (imx_data->socdata->flags & ESDHC_FLAG_BUSFREQ)
+               request_bus_freq(BUS_FREQ_HIGH);
 
        clk_prepare_enable(imx_data->clk_per);
        clk_prepare_enable(imx_data->clk_ipg);
@@ -1376,7 +1382,8 @@ disable_clk:
        clk_disable_unprepare(imx_data->clk_per);
        clk_disable_unprepare(imx_data->clk_ipg);
        clk_disable_unprepare(imx_data->clk_ahb);
-       release_bus_freq(BUS_FREQ_HIGH);
+       if (imx_data->socdata->flags & ESDHC_FLAG_BUSFREQ)
+               release_bus_freq(BUS_FREQ_HIGH);
 free_sdhci:
        sdhci_pltfm_free(pdev);
        return err;
@@ -1447,7 +1454,8 @@ static int sdhci_esdhc_runtime_suspend(struct device *dev)
        }
        clk_disable_unprepare(imx_data->clk_ahb);
 
-       release_bus_freq(BUS_FREQ_HIGH);
+       if (imx_data->socdata->flags & ESDHC_FLAG_BUSFREQ)
+               release_bus_freq(BUS_FREQ_HIGH);
 
        return ret;
 }
@@ -1458,7 +1466,8 @@ static int sdhci_esdhc_runtime_resume(struct device *dev)
        struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
        struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);
 
-       request_bus_freq(BUS_FREQ_HIGH);
+       if (imx_data->socdata->flags & ESDHC_FLAG_BUSFREQ)
+               request_bus_freq(BUS_FREQ_HIGH);
 
        if (!sdhci_sdio_irq_enabled(host)) {
                clk_prepare_enable(imx_data->clk_per);