On 6/7/21 4:38 PM, Yifeng Zhao wrote:
> This patch adds support for the RK3568 platform to this driver.
> 
> Signed-off-by: Yifeng Zhao <yifeng.z...@rock-chips.com>
> ---
> 
>  drivers/mmc/rockchip_sdhci.c | 103 +++++++++++++++++++++++++++++++++++
>  1 file changed, 103 insertions(+)
> 
> diff --git a/drivers/mmc/rockchip_sdhci.c b/drivers/mmc/rockchip_sdhci.c
> index 05ed998eca..befe48e061 100644
> --- a/drivers/mmc/rockchip_sdhci.c
> +++ b/drivers/mmc/rockchip_sdhci.c
> @@ -36,6 +36,31 @@
>  #define PHYCTRL_FREQSEL_100M         0x2
>  #define PHYCTRL_FREQSEL_150M         0x3
>  
> +/* Rockchip specific Registers */
> +#define DWCMSHC_EMMC_DLL_CTRL                0x800
> +#define DWCMSHC_EMMC_DLL_RXCLK               0x804
> +#define DWCMSHC_EMMC_DLL_TXCLK               0x808
> +#define DWCMSHC_EMMC_DLL_STRBIN              0x80c
> +#define DWCMSHC_EMMC_DLL_STATUS0     0x840
> +#define DWCMSHC_EMMC_DLL_STATUS1     0x844
> +#define DWCMSHC_EMMC_DLL_START               BIT(0)
> +#define DWCMSHC_EMMC_DLL_RXCLK_SRCSEL        29
> +#define DWCMSHC_EMMC_DLL_START_POINT 16
> +#define DWCMSHC_EMMC_DLL_INC         8
> +#define DWCMSHC_EMMC_DLL_DLYENA              BIT(27)
> +#define DLL_TXCLK_TAPNUM_DEFAULT     0x10
> +#define DLL_STRBIN_TAPNUM_DEFAULT    0x3
> +#define DLL_TXCLK_TAPNUM_FROM_SW     BIT(24)
> +#define DWCMSHC_EMMC_DLL_LOCKED              BIT(8)
> +#define DWCMSHC_EMMC_DLL_TIMEOUT     BIT(9)
> +#define DLL_RXCLK_NO_INVERTER                1
> +#define DLL_RXCLK_INVERTER           0
> +#define DWCMSHC_ENHANCED_STROBE              BIT(8)
> +#define DLL_LOCK_WO_TMOUT(x) \
> +     ((((x) & DWCMSHC_EMMC_DLL_LOCKED) == DWCMSHC_EMMC_DLL_LOCKED) && \
> +     (((x) & DWCMSHC_EMMC_DLL_TIMEOUT) == 0))
> +#define ROCKCHIP_MAX_CLKS            3
> +
>  struct rockchip_sdhc_plat {
>       struct mmc_config cfg;
>       struct mmc mmc;
> @@ -267,6 +292,74 @@ static int rk3399_sdhci_emmc_set_clock(struct sdhci_host 
> *host, unsigned int clo
>       return 0;
>  }
>  
> +static int rk3568_emmc_phy_init(struct udevice *dev)
> +{
> +     struct rockchip_sdhc *prv = dev_get_priv(dev);
> +     struct sdhci_host *host = &prv->host;
> +     u32 extra;
> +
> +     extra = DLL_RXCLK_NO_INVERTER << DWCMSHC_EMMC_DLL_RXCLK_SRCSEL;
> +     sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_RXCLK);
> +     return 0;
> +}
> +
> +static int rk3568_sdhci_emmc_set_clock(struct sdhci_host *host, unsigned int 
> clock)
> +{
> +     u32 extra;
> +     int timeout = 500, ret;
> +
> +     ret = rockchip_emmc_set_clock(host, clock);

If set_clock is failed, is below codes meaningful?

> +
> +     if (clock >= 50 * 1000000) {> +         sdhci_writel(host, BIT(1), 
> DWCMSHC_EMMC_DLL_CTRL);
> +             udelay(1);

Add comment why put udelay(1).

> +             sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL);
> +             /* Init DLL settings */
> +             extra = 0x5 << DWCMSHC_EMMC_DLL_START_POINT |
> +                     0x2 << DWCMSHC_EMMC_DLL_INC |
> +                     DWCMSHC_EMMC_DLL_START;

What means 0x5 and 0x2? 

> +             sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_CTRL);
> +
> +             while (1) {
> +                     if (timeout < 0)
> +                             return -ETIMEDOUT;
> +                     if (DLL_LOCK_WO_TMOUT((sdhci_readl(host, 
> DWCMSHC_EMMC_DLL_STATUS0))))
> +                             break;
> +                     udelay(1);
> +                     timeout--;
> +             }

use poll_timeout macro.

> +
> +             extra = DWCMSHC_EMMC_DLL_DLYENA |
> +                     DLL_RXCLK_NO_INVERTER << DWCMSHC_EMMC_DLL_RXCLK_SRCSEL;
> +             sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_RXCLK);
> +
> +             extra = DWCMSHC_EMMC_DLL_DLYENA |
> +                     DLL_TXCLK_TAPNUM_DEFAULT |
> +                     DLL_TXCLK_TAPNUM_FROM_SW;
> +             sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_TXCLK);
> +
> +             extra = DWCMSHC_EMMC_DLL_DLYENA |
> +                     DLL_STRBIN_TAPNUM_DEFAULT;
> +             sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN);
> +             udelay(1);

ditto.

> +     } else {
> +             /* reset the clock phase when the frequency is lower than 52MHz 
> */
> +             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);
> +             sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK);
> +             sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_STRBIN);
> +             udelay(1);

ditto.

> +     }


It seems that can be put udelay(1) at here.


Best Regards,
Jaehoon Chung

> +
> +     return ret;
> +}
> +
> +static int rk3568_emmc_get_phy(struct udevice *dev)
> +{
> +     return 0;
> +}
> +
>  static int sdhci_set_ios_post(struct sdhci_host *host)
>  {
>       struct mmc *mmc = host->mmc;
> @@ -370,11 +463,21 @@ static const struct sdhci_data rk3399_data = {
>       .emmc_phy_init = rk3399_emmc_phy_init,
>  };
>  
> +static const struct sdhci_data rk3568_data = {
> +     .emmc_set_clock = rk3568_sdhci_emmc_set_clock,
> +     .get_phy = rk3568_emmc_get_phy,
> +     .emmc_phy_init = rk3568_emmc_phy_init,
> +};
> +
>  static const struct udevice_id sdhci_ids[] = {
>       {
>               .compatible = "arasan,sdhci-5.1",
>               .data = (ulong)&rk3399_data,
>       },
> +     {
> +             .compatible = "rockchip,rk3568-dwcmshc",
> +             .data = (ulong)&rk3568_data,
> +     },
>       { }
>  };
>  
> 

Reply via email to