[PATCH] rockchip: sdhci: rk3568: bypass DLL when clk <= 52 MHz

Kever Yang kever.yang at rock-chips.com
Tue Mar 14 04:10:00 CET 2023


On 2023/3/9 09:28, Vasily Khoruzhick wrote:
> For Rockchip platform, DLL bypass bit and start bit need to be set if
> DLL is not locked.
>
> With this change applied eMMC in my NanoPi R5S can run at 52 MHz.
>
> Based on linux commit b75a52b0dda3 ("mmc: sdhci-of-dwcmshc: Update DLL
> and pre-change delay for rockchip platform")
>
> Signed-off-by: Vasily Khoruzhick <anarsoul at gmail.com>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever
> ---
>   drivers/mmc/rockchip_sdhci.c | 15 +++++++++++----
>   1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mmc/rockchip_sdhci.c b/drivers/mmc/rockchip_sdhci.c
> index 1ac95f32b3..fef23f593e 100644
> --- a/drivers/mmc/rockchip_sdhci.c
> +++ b/drivers/mmc/rockchip_sdhci.c
> @@ -61,6 +61,7 @@
>   #define DWCMSHC_EMMC_DLL_RXCLK		0x804
>   #define DWCMSHC_EMMC_DLL_TXCLK		0x808
>   #define DWCMSHC_EMMC_DLL_STRBIN		0x80c
> +#define DECMSHC_EMMC_DLL_CMDOUT		0x810
>   #define DWCMSHC_EMMC_DLL_STATUS0	0x840
>   #define DWCMSHC_EMMC_DLL_STATUS1	0x844
>   #define DWCMSHC_EMMC_DLL_START		BIT(0)
> @@ -69,6 +70,7 @@
>   #define DWCMSHC_EMMC_DLL_START_DEFAULT	5
>   #define DWCMSHC_EMMC_DLL_INC_VALUE	2
>   #define DWCMSHC_EMMC_DLL_INC		8
> +#define DWCMSHC_EMMC_DLL_BYPASS		BIT(24)
>   #define DWCMSHC_EMMC_DLL_DLYENA		BIT(27)
>   #define DLL_TXCLK_TAPNUM_DEFAULT	0xA
>   
> @@ -83,6 +85,7 @@
>   #define DWCMSHC_EMMC_DLL_TIMEOUT	BIT(9)
>   #define DLL_RXCLK_NO_INVERTER		1
>   #define DLL_RXCLK_INVERTER		0
> +#define DLL_RXCLK_ORI_GATE		BIT(31)
>   #define DWCMSHC_ENHANCED_STROBE		BIT(8)
>   #define DLL_LOCK_WO_TMOUT(x) \
>   	((((x) & DWCMSHC_EMMC_DLL_LOCKED) == DWCMSHC_EMMC_DLL_LOCKED) && \
> @@ -348,10 +351,14 @@ static int rk3568_sdhci_emmc_set_clock(struct sdhci_host *host, unsigned int clo
>   			DLL_STRBIN_TAPNUM_FROM_SW;
>   		sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN);
>   	} else {
> -		/* reset the clock phase when the frequency is lower than 100MHz */
> -		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL);
> -		extra = DLL_RXCLK_NO_INVERTER << DWCMSHC_EMMC_DLL_RXCLK_SRCSEL;
> -		sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_RXCLK);
> +		/*
> +		 * Disable DLL and reset both of sample and drive clock.
> +		 * The bypass bit and start bit need to be set if DLL is not locked.
> +		 */
> +		sdhci_writel(host, DWCMSHC_EMMC_DLL_BYPASS | DWCMSHC_EMMC_DLL_START,
> +			     DWCMSHC_EMMC_DLL_CTRL);
> +		sdhci_writel(host, DLL_RXCLK_ORI_GATE, DWCMSHC_EMMC_DLL_RXCLK);
> +		sdhci_writel(host, 0, DECMSHC_EMMC_DLL_CMDOUT);
>   		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK);
>   		/*
>   		 * Before switching to hs400es mode, the driver will enable


More information about the U-Boot mailing list