Re: [PATCH 11/14] mmc: sdhci-esdhc-imx: optimize the strobe dll setting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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)
> 




[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux