[U-Boot] [PATCH v2 0/3] rk3399: enable dwmmc controller for sdcard

rk3399 using dwmmc controller for sdcard, let's enable it. this patch set has been test on rk3399 evb.
Changes in v2: - add commit message - move the SCLK_SDMMC and its name to the first place - add commit message
Kever Yang (3): clock: rk3399: add support for dwmmc 400K dts: rk3399: enable dwmmc for sdcard config: rk3399: enable dwmmc controller
arch/arm/dts/rk3399-evb.dts | 4 ++++ arch/arm/dts/rk3399.dtsi | 4 ++-- configs/evb-rk3399_defconfig | 1 + drivers/clk/clk_rk3399.c | 29 +++++++++++++++++++++-------- include/configs/rk3399_common.h | 1 + 5 files changed, 29 insertions(+), 10 deletions(-)

MMC core will use 400KHz for card initialize first and then switch to higher frequency like 50MHz, we need to support both 400KHz and about 50MHz for dwmmc controller.
Signed-off-by: Kever Yang kever.yang@rock-chips.com Acked-by: Simon Glass sjg@chromium.org ---
Changes in v2: None
drivers/clk/clk_rk3399.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/drivers/clk/clk_rk3399.c b/drivers/clk/clk_rk3399.c index 5d9bce0..802b8a1 100644 --- a/drivers/clk/clk_rk3399.c +++ b/drivers/clk/clk_rk3399.c @@ -142,6 +142,7 @@ enum { CLK_EMMC_PLL_SHIFT = 8, CLK_EMMC_PLL_MASK = 0x7 << CLK_EMMC_PLL_SHIFT, CLK_EMMC_PLL_SEL_GPLL = 0x1, + CLK_EMMC_PLL_SEL_24M = 0x5, CLK_EMMC_DIV_CON_SHIFT = 0, CLK_EMMC_DIV_CON_MASK = 0x7f << CLK_EMMC_DIV_CON_SHIFT,
@@ -640,9 +641,13 @@ static ulong rk3399_mmc_get_clk(struct rk3399_cru *cru, uint clk_id) default: return -EINVAL; } - div = (con>>CLK_EMMC_DIV_CON_SHIFT) & CLK_EMMC_DIV_CON_MASK; + div = (con & CLK_EMMC_DIV_CON_MASK) >> CLK_EMMC_DIV_CON_SHIFT;
- return DIV_TO_RATE(GPLL_HZ, div); + if ((con & CLK_EMMC_PLL_MASK) >> CLK_EMMC_PLL_SHIFT + == CLK_EMMC_PLL_SEL_24M) + return DIV_TO_RATE(24*1024*1024, div); + else + return DIV_TO_RATE(GPLL_HZ, div); }
static ulong rk3399_mmc_set_clk(struct rk3399_cru *cru, @@ -653,14 +658,22 @@ static ulong rk3399_mmc_set_clk(struct rk3399_cru *cru,
switch (clk_id) { case SCLK_SDMMC: - /* Select clk_sdmmc source from GPLL too */ + /* Select clk_sdmmc source from GPLL by default */ src_clk_div = GPLL_HZ / set_rate; - assert(src_clk_div - 1 < 127);
- rk_clrsetreg(&cru->clksel_con[16], - CLK_EMMC_PLL_MASK | CLK_EMMC_DIV_CON_MASK, - CLK_EMMC_PLL_SEL_GPLL << CLK_EMMC_PLL_SHIFT | - (src_clk_div - 1) << CLK_EMMC_DIV_CON_SHIFT); + if (src_clk_div > 127) { + /* use 24MHz source for 400KHz clock */ + src_clk_div = 24*1024*1024 / set_rate; + rk_clrsetreg(&cru->clksel_con[16], + CLK_EMMC_PLL_MASK | CLK_EMMC_DIV_CON_MASK, + CLK_EMMC_PLL_SEL_24M << CLK_EMMC_PLL_SHIFT | + (src_clk_div - 1) << CLK_EMMC_DIV_CON_SHIFT); + } else { + rk_clrsetreg(&cru->clksel_con[16], + CLK_EMMC_PLL_MASK | CLK_EMMC_DIV_CON_MASK, + CLK_EMMC_PLL_SEL_GPLL << CLK_EMMC_PLL_SHIFT | + (src_clk_div - 1) << CLK_EMMC_DIV_CON_SHIFT); + } break; case SCLK_EMMC: /* Select aclk_emmc source from GPLL */

On 3 August 2016 at 21:44, Kever Yang kever.yang@rock-chips.com wrote:
MMC core will use 400KHz for card initialize first and then switch to higher frequency like 50MHz, we need to support both 400KHz and about 50MHz for dwmmc controller.
Signed-off-by: Kever Yang kever.yang@rock-chips.com Acked-by: Simon Glass sjg@chromium.org
Changes in v2: None
drivers/clk/clk_rk3399.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-)
Applied to u-boot-rockchip, thanks!

rk3399 sdcard is using dwmmc controller, enable it for sdcard. SCLK_SDMMC is the clock for controller operation clock, move it to the first place.
Signed-off-by: Kever Yang kever.yang@rock-chips.com Acked-by: Simon Glass sjg@chromium.org ---
Changes in v2: - add commit message - move the SCLK_SDMMC and its name to the first place
arch/arm/dts/rk3399-evb.dts | 4 ++++ arch/arm/dts/rk3399.dtsi | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/arch/arm/dts/rk3399-evb.dts b/arch/arm/dts/rk3399-evb.dts index bbcfcd0..e92a492 100644 --- a/arch/arm/dts/rk3399-evb.dts +++ b/arch/arm/dts/rk3399-evb.dts @@ -61,6 +61,10 @@ status = "okay"; };
+&sdmmc { + status = "okay"; +}; + &sdhci { bus-width = <8>; mmc-hs400-1_8v; diff --git a/arch/arm/dts/rk3399.dtsi b/arch/arm/dts/rk3399.dtsi index fb5af54..a4c6e27 100644 --- a/arch/arm/dts/rk3399.dtsi +++ b/arch/arm/dts/rk3399.dtsi @@ -172,9 +172,9 @@ reg = <0x0 0xfe320000 0x0 0x4000>; interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>; clock-freq-min-max = <400000 150000000>; - clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>, + clocks = <&cru SCLK_SDMMC>, <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>; - clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; + clock-names = "ciu", "biu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; status = "disabled"; };

On 3 August 2016 at 21:44, Kever Yang kever.yang@rock-chips.com wrote:
rk3399 sdcard is using dwmmc controller, enable it for sdcard. SCLK_SDMMC is the clock for controller operation clock, move it to the first place.
Signed-off-by: Kever Yang kever.yang@rock-chips.com Acked-by: Simon Glass sjg@chromium.org
Changes in v2:
- add commit message
- move the SCLK_SDMMC and its name to the first place
arch/arm/dts/rk3399-evb.dts | 4 ++++ arch/arm/dts/rk3399.dtsi | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-)
Applied to u-boot-rockchip, thanks!

Enable the rockchip dwmmc driver for rk3399 and its evb.
Signed-off-by: Kever Yang kever.yang@rock-chips.com Acked-by: Simon Glass sjg@chromium.org ---
Changes in v2: - add commit message
configs/evb-rk3399_defconfig | 1 + include/configs/rk3399_common.h | 1 + 2 files changed, 2 insertions(+)
diff --git a/configs/evb-rk3399_defconfig b/configs/evb-rk3399_defconfig index 0fcde3a..c6b0d4e 100644 --- a/configs/evb-rk3399_defconfig +++ b/configs/evb-rk3399_defconfig @@ -21,6 +21,7 @@ CONFIG_CLK=y CONFIG_FIT=y CONFIG_SYSRESET=y CONFIG_DM_MMC=y +CONFIG_ROCKCHIP_DWMMC=y CONFIG_ROCKCHIP_SDHCI=y CONFIG_ROCKCHIP_GPIO=y CONFIG_PINCTRL=y diff --git a/include/configs/rk3399_common.h b/include/configs/rk3399_common.h index 1ed4641..6875308 100644 --- a/include/configs/rk3399_common.h +++ b/include/configs/rk3399_common.h @@ -30,6 +30,7 @@ /* MMC/SD IP block */ #define CONFIG_MMC #define CONFIG_GENERIC_MMC +#define CONFIG_DWMMC #define CONFIG_SDHCI #define CONFIG_BOUNCE_BUFFER #define CONFIG_ROCKCHIP_SDHCI_MAX_FREQ 200000000

On 3 August 2016 at 21:45, Kever Yang kever.yang@rock-chips.com wrote:
Enable the rockchip dwmmc driver for rk3399 and its evb.
Signed-off-by: Kever Yang kever.yang@rock-chips.com Acked-by: Simon Glass sjg@chromium.org
Changes in v2:
- add commit message
configs/evb-rk3399_defconfig | 1 + include/configs/rk3399_common.h | 1 + 2 files changed, 2 insertions(+)
Applied to u-boot-rockchip, thanks!
participants (2)
-
Kever Yang
-
Simon Glass