aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJonas Karlman2023-04-18 16:46:33 +0000
committerKever Yang2023-04-21 15:55:29 +0800
commit6de4438576ed5c8e099b52f5ee6ad549dca6aa9d (patch)
treeca4a5eed0a2b499071eccd44fac416d6848cd8dd /drivers
parentba9f5e541d78b7200fc7fa56e4e056c3b92ea451 (diff)
mmc: rockchip_sdhci: Update speed mode controls in set_ios_post
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@kwiboo.se> Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/rockchip_sdhci.c68
1 files changed, 42 insertions, 26 deletions
diff --git a/drivers/mmc/rockchip_sdhci.c b/drivers/mmc/rockchip_sdhci.c
index e56043fce88..8e29430a483 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;
}