summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorJonas Karlman <jonas@kwiboo.se>2023-04-20 15:55:15 +0000
committerKever Yang <kever.yang@rock-chips.com>2023-04-21 15:54:19 +0800
commitb8a63c869cafc1509193b6b7544c03fcdd0265ca (patch)
tree92d2e936272978d0d4cd5965c191cdc7c368ce93 /drivers/mmc
parent7e74522d5fbf2409974300d5de3e67e9c536a181 (diff)
mmc: rockchip_sdhci: Use set_clock and config_dll sdhci_ops
Change to configure clock and DLL in set_clock and config_dll ops instead of in the set_ios_post ops. With this change the output clock is turned off while configuring DLL parameters, according to the design recommendations. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/rockchip_sdhci.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/mmc/rockchip_sdhci.c b/drivers/mmc/rockchip_sdhci.c
index 4a41e727017..fdf48f4066c 100644
--- a/drivers/mmc/rockchip_sdhci.c
+++ b/drivers/mmc/rockchip_sdhci.c
@@ -291,18 +291,24 @@ static int rk3399_sdhci_set_ios_post(struct sdhci_host *host)
return 0;
}
-static int rk3568_sdhci_emmc_set_clock(struct sdhci_host *host, unsigned int clock)
+static void rk3568_sdhci_set_clock(struct sdhci_host *host, u32 div)
{
struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host);
+ struct mmc *mmc = host->mmc;
+ ulong rate;
+
+ rate = clk_set_rate(&priv->emmc_clk, mmc->clock);
+ if (IS_ERR_VALUE(rate))
+ printf("%s: Set clock rate failed: %ld\n", __func__, (long)rate);
+}
+
+static int rk3568_sdhci_config_dll(struct sdhci_host *host, u32 clock, bool enable)
+{
int val, ret;
u32 extra;
- if (clock > host->max_clk)
- clock = host->max_clk;
- if (clock)
- clk_set_rate(&priv->emmc_clk, clock);
-
- sdhci_set_clock(host->mmc, clock);
+ if (!enable)
+ return 0;
if (clock >= 100 * MHz) {
/* reset DLL */
@@ -386,14 +392,8 @@ static int rk3568_sdhci_set_enhanced_strobe(struct sdhci_host *host)
static int rk3568_sdhci_set_ios_post(struct sdhci_host *host)
{
struct mmc *mmc = host->mmc;
- uint clock = mmc->clock;
u32 reg, vendor_reg;
- if (mmc->tran_speed && mmc->clock > mmc->tran_speed)
- clock = mmc->tran_speed;
-
- rk3568_sdhci_emmc_set_clock(host, clock);
-
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;
@@ -614,6 +614,8 @@ static const struct sdhci_data rk3399_data = {
static const struct sdhci_data rk3568_data = {
.get_phy = rk3568_emmc_get_phy,
.set_ios_post = rk3568_sdhci_set_ios_post,
+ .set_clock = rk3568_sdhci_set_clock,
+ .config_dll = rk3568_sdhci_config_dll,
.set_enhanced_strobe = rk3568_sdhci_set_enhanced_strobe,
};