Message ID | 1573816712-26841-3-git-send-email-haibo.chen@nxp.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | None | expand |
On 15/11/19 1:18 PM, haibo.chen@nxp.com wrote: > From: Haibo Chen <haibo.chen@nxp.com> > > After set the STROBE SLV delay target value, it need to wait some > time to let the usdhc lock the REF and SLV clock. In normal case, > 1~2us is enough for imx8/imx6 and imx7d, and 4~5us is enough for > imx7ulp, but when do reboot stress test or do the bind/unbind stress > test, sometimes need to wait about 10us to get the status lock. > > This patch optimize delay handle method, only print the warning > message if the status is still not lock after 1ms delay. > > Signed-off-by: Haibo Chen <haibo.chen@nxp.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> > --- > drivers/mmc/host/sdhci-esdhc-imx.c | 15 +++++++-------- > 1 file changed, 7 insertions(+), 8 deletions(-) > > diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c > index 0667b6903708..80a148f8009e 100644 > --- a/drivers/mmc/host/sdhci-esdhc-imx.c > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c > @@ -1021,6 +1021,7 @@ static void esdhc_set_strobe_dll(struct sdhci_host *host) > struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host); > u32 strobe_delay; > u32 v; > + int ret; > > /* disable clock before enabling strobe dll */ > writel(readl(host->ioaddr + ESDHC_VENDOR_SPEC) & > @@ -1046,15 +1047,13 @@ static void esdhc_set_strobe_dll(struct sdhci_host *host) > ESDHC_STROBE_DLL_CTRL_SLV_UPDATE_INT_DEFAULT | > (strobe_delay << ESDHC_STROBE_DLL_CTRL_SLV_DLY_TARGET_SHIFT); > writel(v, host->ioaddr + ESDHC_STROBE_DLL_CTRL); > - /* wait 5us to make sure strobe dll status register stable */ > - udelay(5); > - v = readl(host->ioaddr + ESDHC_STROBE_DLL_STATUS); > - if (!(v & ESDHC_STROBE_DLL_STS_REF_LOCK)) > - dev_warn(mmc_dev(host->mmc), > - "warning! HS400 strobe DLL status REF not lock!\n"); > - if (!(v & ESDHC_STROBE_DLL_STS_SLV_LOCK)) > + > + /* wait max 50us to get the REF/SLV lock */ > + ret = readl_poll_timeout(host->ioaddr + ESDHC_STROBE_DLL_STATUS, v, > + ((v & ESDHC_STROBE_DLL_STS_REF_LOCK) && (v & ESDHC_STROBE_DLL_STS_SLV_LOCK)), 1, 50); > + if (ret == -ETIMEDOUT) > dev_warn(mmc_dev(host->mmc), > - "warning! HS400 strobe DLL status SLV not lock!\n"); > + "warning! HS400 strobe DLL status REF/SLV not lock in 50us, STROBE DLL status is %x!\n", v); > } > > static void esdhc_reset_tuning(struct sdhci_host *host) >
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index 0667b6903708..80a148f8009e 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c @@ -1021,6 +1021,7 @@ static void esdhc_set_strobe_dll(struct sdhci_host *host) struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host); u32 strobe_delay; u32 v; + int ret; /* disable clock before enabling strobe dll */ writel(readl(host->ioaddr + ESDHC_VENDOR_SPEC) & @@ -1046,15 +1047,13 @@ static void esdhc_set_strobe_dll(struct sdhci_host *host) ESDHC_STROBE_DLL_CTRL_SLV_UPDATE_INT_DEFAULT | (strobe_delay << ESDHC_STROBE_DLL_CTRL_SLV_DLY_TARGET_SHIFT); writel(v, host->ioaddr + ESDHC_STROBE_DLL_CTRL); - /* wait 5us to make sure strobe dll status register stable */ - udelay(5); - v = readl(host->ioaddr + ESDHC_STROBE_DLL_STATUS); - if (!(v & ESDHC_STROBE_DLL_STS_REF_LOCK)) - dev_warn(mmc_dev(host->mmc), - "warning! HS400 strobe DLL status REF not lock!\n"); - if (!(v & ESDHC_STROBE_DLL_STS_SLV_LOCK)) + + /* wait max 50us to get the REF/SLV lock */ + ret = readl_poll_timeout(host->ioaddr + ESDHC_STROBE_DLL_STATUS, v, + ((v & ESDHC_STROBE_DLL_STS_REF_LOCK) && (v & ESDHC_STROBE_DLL_STS_SLV_LOCK)), 1, 50); + if (ret == -ETIMEDOUT) dev_warn(mmc_dev(host->mmc), - "warning! HS400 strobe DLL status SLV not lock!\n"); + "warning! HS400 strobe DLL status REF/SLV not lock in 50us, STROBE DLL status is %x!\n", v); } static void esdhc_reset_tuning(struct sdhci_host *host)