diff options
author | Ye Li <ye.li@nxp.com> | 2019-10-23 19:27:48 -0700 |
---|---|---|
committer | Ye Li <ye.li@nxp.com> | 2019-10-27 20:11:40 -0700 |
commit | e1e30fe327ec8a242e3e8b0f6a04645f142d9e8f (patch) | |
tree | f740d96748c905a33df0449bc5afee0ffa41372d /drivers | |
parent | 9d944032008fb37850aeb3d83f7de4e659fad319 (diff) |
MLK-22851-1 mmc: fsl_esdhc: reduce unnecessary clock change
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mmc/fsl_esdhc.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c index 08c1cdb027..cae692ba01 100644 --- a/drivers/mmc/fsl_esdhc.c +++ b/drivers/mmc/fsl_esdhc.c @@ -606,9 +606,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)) @@ -941,6 +938,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 */ @@ -949,8 +947,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) { |