Hi,

On 1/18/23 02:07, John Keeping wrote:
> The RK3288 TRM states that, for 8-bit DDR modes:
> 
>       The CLKDIV register should always be programmed with a value
>       higher than zero (0); that is, a clock divider should always be
>       used for 8-bit DDR mode.
> 
> In Linux, the driver applies this logic for all SoCs using the driver
> and does not distinguish RK3288, so presumably this requirement is the
> same for all other Rockchip SoCs using this IP.
> 
> Add the necessary code to double the clock frequency when 8-bit DDR is
> selected.  The dw_mmc core already handles setting CLKDIV correctly
> given the input clock and desired bus clock.
> 
> Signed-off-by: John Keeping <j...@metanate.com>

Reviewed-by: Jaehoon Chung <jh80.ch...@samsung.com>

Best Regards,
Jaehoon Chung

> ---
>  drivers/mmc/rockchip_dw_mmc.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/mmc/rockchip_dw_mmc.c b/drivers/mmc/rockchip_dw_mmc.c
> index 573bf16c87..3661ce3314 100644
> --- a/drivers/mmc/rockchip_dw_mmc.c
> +++ b/drivers/mmc/rockchip_dw_mmc.c
> @@ -41,6 +41,14 @@ static uint rockchip_dwmmc_get_mmc_clk(struct dwmci_host 
> *host, uint freq)
>       struct rockchip_dwmmc_priv *priv = dev_get_priv(dev);
>       int ret;
>  
> +     /*
> +      * The clock frequency chosen here affects CLKDIV in the dw_mmc core.
> +      * That can be either 0 or 1, but it must be set to 1 for eMMC DDR52
> +      * 8-bit mode.  It will be set to 0 for all other modes.
> +      */
> +     if (host->mmc->selected_mode == MMC_DDR_52 && host->mmc->bus_width == 8)
> +             freq *= 2;
> +
>       ret = clk_set_rate(&priv->clk, freq);
>       if (ret < 0) {
>               debug("%s: err=%d\n", __func__, ret);

Reply via email to