MLK-22851-1 mmc: fsl_esdhc: reduce unnecessary clock change
authorYe Li <ye.li@nxp.com>
Thu, 24 Oct 2019 02:27:48 +0000 (19:27 -0700)
committerYe Li <ye.li@nxp.com>
Mon, 28 Oct 2019 08:14:24 +0000 (01:14 -0700)
In mmc initial state, the mmc framework sets clock to 0, so the fsl_esdhc
driver converts to use min clock 400Khz. But the priv->clock is logged
400Khz not 0, and cause following calls to set_ios to set clock again.

Each set to clock has 10ms delay for stable, then the problem accumulates
some unnecessary delay.

Signed-off-by: Ye Li <ye.li@nxp.com>
(cherry picked from commit 151ab3bef2b1ec1c142c31048f3005ebce2a7a18)

drivers/mmc/fsl_esdhc.c

index 5d09b3f..78e1a60 100644 (file)
@@ -636,9 +636,6 @@ static void set_sysctl(struct fsl_esdhc_priv *priv, struct mmc *mmc, uint clock)
                sdhc_clk >>= 1;
        }
 
-       if (clock < mmc->cfg->f_min)
-               clock = mmc->cfg->f_min;
-
        if (sdhc_clk / 16 > clock) {
                for (; pre_div < 256; pre_div *= 2)
                        if ((sdhc_clk / pre_div) <= (clock * 16))
@@ -971,6 +968,7 @@ static int esdhc_set_ios_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)
 {
        struct fsl_esdhc *regs = priv->esdhc_regs;
        int ret __maybe_unused;
+       uint clock;
 
 #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
        /* Select to use peripheral clock */
@@ -979,8 +977,12 @@ static int esdhc_set_ios_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)
        esdhc_clock_control(priv, true);
 #endif
        /* Set the clock speed */
-       if (priv->clock != mmc->clock)
-               set_sysctl(priv, mmc, mmc->clock);
+       clock = mmc->clock;
+       if (clock < mmc->cfg->f_min)
+               clock = mmc->cfg->f_min;
+
+       if (priv->clock != clock)
+               set_sysctl(priv, mmc, clock);
 
 #ifdef MMC_SUPPORTS_TUNING
        if (mmc->clk_disable) {