[PATCH v2 08/17] mmc: rockchip_sdhci: Update speed mode controls in set_ios_post

Kever Yang kever.yang at rock-chips.com
Thu Apr 20 12:01:05 CEST 2023


On 2023/4/19 00:46, Jonas Karlman wrote:
> Refactor set_ios_post ops to correctly set UHS Speed Select field values
> according to TRM. Also set or unset Enhanced Strobe Enable bit and
> eMMC Card present bit in set_ios_post, the Enhanced Strobe Enable bit
> was never unset after switching to HS400ES mode.
>
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever

> ---
> v2:
> - No change
>
>   drivers/mmc/rockchip_sdhci.c | 68 ++++++++++++++++++++++--------------
>   1 file changed, 42 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/mmc/rockchip_sdhci.c b/drivers/mmc/rockchip_sdhci.c
> index e56043fce88e..8e29430a483e 100644
> --- a/drivers/mmc/rockchip_sdhci.c
> +++ b/drivers/mmc/rockchip_sdhci.c
> @@ -372,20 +372,6 @@ static int rk3568_emmc_get_phy(struct udevice *dev)
>   
>   static int rk3568_sdhci_set_enhanced_strobe(struct sdhci_host *host)
>   {
> -	struct mmc *mmc = host->mmc;
> -	u32 vendor;
> -	int reg;
> -
> -	reg = (sdhci_readl(host, DWCMSHC_P_VENDOR_AREA1) & DWCMSHC_AREA1_MASK)
> -	      + DWCMSHC_EMMC_CONTROL;
> -
> -	vendor = sdhci_readl(host, reg);
> -	if (mmc->selected_mode == MMC_HS_400_ES)
> -		vendor |= DWCMSHC_ENHANCED_STROBE;
> -	else
> -		vendor &= ~DWCMSHC_ENHANCED_STROBE;
> -	sdhci_writel(host, vendor, reg);
> -
>   	return 0;
>   }
>   
> @@ -394,21 +380,51 @@ static int rk3568_sdhci_set_ios_post(struct sdhci_host *host)
>   	struct mmc *mmc = host->mmc;
>   	u32 reg, vendor_reg;
>   
> -	if (mmc->selected_mode == MMC_HS_400 || mmc->selected_mode == MMC_HS_400_ES) {
> -		reg = sdhci_readw(host, SDHCI_HOST_CONTROL2);
> -		reg &= ~SDHCI_CTRL_UHS_MASK;
> +	reg = sdhci_readw(host, SDHCI_HOST_CONTROL2);
> +	reg &= ~SDHCI_CTRL_UHS_MASK;
> +
> +	switch (mmc->selected_mode) {
> +	case UHS_SDR25:
> +	case MMC_HS:
> +	case MMC_HS_52:
> +		reg |= SDHCI_CTRL_UHS_SDR25;
> +		break;
> +	case UHS_SDR50:
> +		reg |= SDHCI_CTRL_UHS_SDR50;
> +		break;
> +	case UHS_DDR50:
> +	case MMC_DDR_52:
> +		reg |= SDHCI_CTRL_UHS_DDR50;
> +		break;
> +	case UHS_SDR104:
> +	case MMC_HS_200:
> +		reg |= SDHCI_CTRL_UHS_SDR104;
> +		break;
> +	case MMC_HS_400:
> +	case MMC_HS_400_ES:
>   		reg |= DWCMSHC_CTRL_HS400;
> -		sdhci_writew(host, reg, SDHCI_HOST_CONTROL2);
> +		break;
> +	default:
> +		reg |= SDHCI_CTRL_UHS_SDR12;
> +	}
> +
> +	sdhci_writew(host, reg, SDHCI_HOST_CONTROL2);
>   
> -		vendor_reg = (sdhci_readl(host, DWCMSHC_P_VENDOR_AREA1) & DWCMSHC_AREA1_MASK)
> -			     + DWCMSHC_EMMC_CONTROL;
> -		/* set CARD_IS_EMMC bit to enable Data Strobe for HS400 */
> -		reg = sdhci_readw(host, vendor_reg);
> +	vendor_reg = (sdhci_readl(host, DWCMSHC_P_VENDOR_AREA1) & DWCMSHC_AREA1_MASK)
> +		     + DWCMSHC_EMMC_CONTROL;
> +	reg = sdhci_readw(host, vendor_reg);
> +
> +	if (IS_MMC(mmc))
>   		reg |= DWCMSHC_CARD_IS_EMMC;
> -		sdhci_writew(host, reg, vendor_reg);
> -	} else {
> -		sdhci_set_uhs_timing(host);
> -	}
> +	else
> +		reg &= ~DWCMSHC_CARD_IS_EMMC;
> +
> +	if (mmc->selected_mode == MMC_HS_400_ES)
> +		reg |= DWCMSHC_ENHANCED_STROBE;
> +	else
> +		reg &= ~DWCMSHC_ENHANCED_STROBE;
> +
> +	sdhci_writew(host, reg, vendor_reg);
>   
>   	return 0;
>   }


More information about the U-Boot mailing list