On 15/11/19 1:18 PM, haibo.chen@xxxxxxx wrote: > From: Haibo Chen <haibo.chen@xxxxxxx> > > 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@xxxxxxx> Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> > --- > 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) >