All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 0/5] Submit upstream changes made while porting a customer board to mainline
@ 2018-11-20 18:55 Otavio Salvador
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree Otavio Salvador
                   ` (4 more replies)
  0 siblings, 5 replies; 22+ messages in thread
From: Otavio Salvador @ 2018-11-20 18:55 UTC (permalink / raw)
  To: u-boot

Those changes are intended to easy the process of using U-Boot
mainline with rv1108 based boards.

Please give them a good review and if possible, merge them as they are
in use for some time on our custom tree and working fine.

Changes in v2:
- new patch
- split bounce buffer change on a new patch

Otavio Salvador (5):
  clk_rv1108: Sync with vendor tree
  rv1108: Enable BOUNCE_BUFFER
  rv1108: Enable eMMC support
  rv1108: Make USB OTG functional
  rv1108: Add support for default distro_bootcmd

 arch/arm/dts/rv1108.dtsi                      |  74 ++-
 .../include/asm/arch-rockchip/cru_rv1108.h    | 143 +++++-
 arch/arm/mach-rockchip/Makefile               |   1 +
 arch/arm/mach-rockchip/rv1108-board.c         |  81 ++++
 drivers/clk/rockchip/clk_rv1108.c             | 457 +++++++++++++++++-
 include/configs/rv1108_common.h               |  18 +
 include/dt-bindings/clock/rv1108-cru.h        | 154 ++++--
 7 files changed, 877 insertions(+), 51 deletions(-)
 create mode 100644 arch/arm/mach-rockchip/rv1108-board.c

-- 
2.19.1

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
  2018-11-20 18:55 [U-Boot] [PATCH v2 0/5] Submit upstream changes made while porting a customer board to mainline Otavio Salvador
@ 2018-11-20 18:55 ` Otavio Salvador
  2018-11-27  1:43   ` Andy Yan
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 2/5] rv1108: Enable BOUNCE_BUFFER Otavio Salvador
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 22+ messages in thread
From: Otavio Salvador @ 2018-11-20 18:55 UTC (permalink / raw)
  To: u-boot

Make adjustments to the rv1108 clock driver in order to align it
with the internal Rockchip version.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---

Changes in v2: None

 .../include/asm/arch-rockchip/cru_rv1108.h    | 143 +++++-
 drivers/clk/rockchip/clk_rv1108.c             | 457 +++++++++++++++++-
 include/dt-bindings/clock/rv1108-cru.h        | 154 ++++--
 3 files changed, 706 insertions(+), 48 deletions(-)

diff --git a/arch/arm/include/asm/arch-rockchip/cru_rv1108.h b/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
index 3cc2ed0187..4ce8caa40f 100644
--- a/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
+++ b/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
@@ -11,7 +11,11 @@
 #define OSC_HZ		(24 * 1000 * 1000)
 
 #define APLL_HZ		(600 * 1000000)
-#define GPLL_HZ		(594 * 1000000)
+#define GPLL_HZ		(1188 * 1000000)
+#define ACLK_PERI_HZ	(148500000)
+#define HCLK_PERI_HZ	(148500000)
+#define PCLK_PERI_HZ	(74250000)
+#define ACLK_BUS_HZ	(148500000)
 
 struct rv1108_clk_priv {
 	struct rv1108_cru *cru;
@@ -80,6 +84,11 @@ enum {
 	WORK_MODE_NORMAL	= 1,
 	DSMPD_SHIFT             = 3,
 	DSMPD_MASK		= 1 << DSMPD_SHIFT,
+	INTEGER_MODE			= 1,
+	GLOBAL_POWER_DOWN_SHIFT		= 0,
+	GLOBAL_POWER_DOWN_MASK		= 1 << GLOBAL_POWER_DOWN_SHIFT,
+	GLOBAL_POWER_DOWN		= 1,
+	GLOBAL_POWER_UP			= 0,
 
 	/* CLKSEL0_CON */
 	CORE_PLL_SEL_SHIFT	= 8,
@@ -90,11 +99,77 @@ enum {
 	CORE_CLK_DIV_SHIFT	= 0,
 	CORE_CLK_DIV_MASK	= 0x1f << CORE_CLK_DIV_SHIFT,
 
+	/* CLKSEL_CON1 */
+	PCLK_DBG_DIV_CON_SHIFT		= 4,
+	PCLK_DBG_DIV_CON_MASK		= 0xf << PCLK_DBG_DIV_CON_SHIFT,
+	ACLK_CORE_DIV_CON_SHIFT		= 0,
+	ACLK_CORE_DIV_CON_MASK		= 7 << ACLK_CORE_DIV_CON_SHIFT,
+
+	/* CLKSEL_CON2 */
+	ACLK_BUS_PLL_SEL_SHIFT		= 8,
+	ACLK_BUS_PLL_SEL_MASK		= 3 << ACLK_BUS_PLL_SEL_SHIFT,
+	ACLK_BUS_PLL_SEL_GPLL		= 0,
+	ACLK_BUS_PLL_SEL_APLL		= 1,
+	ACLK_BUS_PLL_SEL_DPLL		= 2,
+	ACLK_BUS_DIV_CON_SHIFT		= 0,
+	ACLK_BUS_DIV_CON_MASK		= 0x1f << ACLK_BUS_DIV_CON_SHIFT,
+	ACLK_BUS_DIV_CON_WIDTH		= 5,
+
+	/* CLKSEL_CON3 */
+	PCLK_BUS_DIV_CON_SHIFT		= 8,
+	PCLK_BUS_DIV_CON_MASK		= 0x1f << PCLK_BUS_DIV_CON_SHIFT,
+	HCLK_BUS_DIV_CON_SHIFT		= 0,
+	HCLK_BUS_DIV_CON_MASK		= 0x1f,
+
+	/* CLKSEL_CON4 */
+	CLK_DDR_PLL_SEL_SHIFT		= 8,
+	CLK_DDR_PLL_SEL_MASK		= 0x3 << CLK_DDR_PLL_SEL_SHIFT,
+	CLK_DDR_DIV_CON_SHIFT		= 0,
+	CLK_DDR_DIV_CON_MASK		= 0x3 << CLK_DDR_DIV_CON_SHIFT,
+
+	/* CLKSEL_CON19 */
+	CLK_I2C1_PLL_SEL_SHIFT		= 15,
+	CLK_I2C1_PLL_SEL_MASK		= 1 << CLK_I2C1_PLL_SEL_SHIFT,
+	CLK_I2C1_PLL_SEL_DPLL		= 0,
+	CLK_I2C1_PLL_SEL_GPLL		= 1,
+	CLK_I2C1_DIV_CON_SHIFT		= 8,
+	CLK_I2C1_DIV_CON_MASK		= 0x7f << CLK_I2C1_DIV_CON_SHIFT,
+	CLK_I2C0_PLL_SEL_SHIFT		= 7,
+	CLK_I2C0_PLL_SEL_MASK		= 1 << CLK_I2C0_PLL_SEL_SHIFT,
+	CLK_I2C0_DIV_CON_SHIFT		= 0,
+	CLK_I2C0_DIV_CON_MASK		= 0x7f,
+	I2C_DIV_CON_WIDTH		= 7,
+
+	/* CLKSEL_CON20 */
+	CLK_I2C3_PLL_SEL_SHIFT		= 15,
+	CLK_I2C3_PLL_SEL_MASK		= 1 << CLK_I2C3_PLL_SEL_SHIFT,
+	CLK_I2C3_PLL_SEL_DPLL		= 0,
+	CLK_I2C3_PLL_SEL_GPLL		= 1,
+	CLK_I2C3_DIV_CON_SHIFT		= 8,
+	CLK_I2C3_DIV_CON_MASK		= 0x7f << CLK_I2C3_DIV_CON_SHIFT,
+	CLK_I2C2_PLL_SEL_SHIFT		= 7,
+	CLK_I2C2_PLL_SEL_MASK		= 1 << CLK_I2C2_PLL_SEL_SHIFT,
+	CLK_I2C2_DIV_CON_SHIFT		= 0,
+	CLK_I2C2_DIV_CON_MASK		= 0x7f,
+
 	/* CLKSEL_CON22 */
 	CLK_SARADC_DIV_CON_SHIFT= 0,
 	CLK_SARADC_DIV_CON_MASK	= GENMASK(9, 0),
 	CLK_SARADC_DIV_CON_WIDTH= 10,
 
+	/* CLKSEL_CON23 */
+	ACLK_PERI_PLL_SEL_SHIFT		= 15,
+	ACLK_PERI_PLL_SEL_MASK		= 1 << ACLK_PERI_PLL_SEL_SHIFT,
+	ACLK_PERI_PLL_SEL_GPLL		= 0,
+	ACLK_PERI_PLL_SEL_DPLL		= 1,
+	PCLK_PERI_DIV_CON_SHIFT		= 10,
+	PCLK_PERI_DIV_CON_MASK		= 0x1f << PCLK_PERI_DIV_CON_SHIFT,
+	HCLK_PERI_DIV_CON_SHIFT		= 5,
+	HCLK_PERI_DIV_CON_MASK		= 0x1f << HCLK_PERI_DIV_CON_SHIFT,
+	ACLK_PERI_DIV_CON_SHIFT		= 0,
+	ACLK_PERI_DIV_CON_MASK		= 0x1f,
+	PERI_DIV_CON_WIDTH		= 5,
+
 	/* CLKSEL24_CON */
 	MAC_PLL_SEL_SHIFT	= 12,
 	MAC_PLL_SEL_MASK	= 1 << MAC_PLL_SEL_SHIFT,
@@ -105,6 +180,16 @@ enum {
 	MAC_CLK_DIV_MASK	= 0x1f,
 	MAC_CLK_DIV_SHIFT	= 0,
 
+	/* CLKSEL25_CON */
+	EMMC_PLL_SEL_SHIFT	= 12,
+	EMMC_PLL_SEL_MASK	= 3 << EMMC_PLL_SEL_SHIFT,
+	EMMC_PLL_SEL_DPLL	= 0,
+	EMMC_PLL_SEL_GPLL,
+
+	/* CLKSEL26_CON */
+	EMMC_CLK_DIV_SHIFT	= 8,
+	EMMC_CLK_DIV_MASK	= 0xff << EMMC_CLK_DIV_SHIFT,
+
 	/* CLKSEL27_CON */
 	SFC_PLL_SEL_SHIFT	= 7,
 	SFC_PLL_SEL_MASK	= 1 << SFC_PLL_SEL_SHIFT,
@@ -112,5 +197,61 @@ enum {
 	SFC_PLL_SEL_GPLL	= 1,
 	SFC_CLK_DIV_SHIFT	= 0,
 	SFC_CLK_DIV_MASK	= 0x3f << SFC_CLK_DIV_SHIFT,
+
+	/* CLKSEL28_CON */
+	ACLK_VIO1_PLL_SEL_SHIFT		= 14,
+	ACLK_VIO1_PLL_SEL_MASK		= 3 << ACLK_VIO1_PLL_SEL_SHIFT,
+	VIO_PLL_SEL_DPLL		= 0,
+	VIO_PLL_SEL_GPLL		= 1,
+	ACLK_VIO1_CLK_DIV_SHIFT		= 8,
+	ACLK_VIO1_CLK_DIV_MASK		= 0x1f << ACLK_VIO1_CLK_DIV_SHIFT,
+	CLK_VIO_DIV_CON_WIDTH		= 5,
+	ACLK_VIO0_PLL_SEL_SHIFT		= 6,
+	ACLK_VIO0_PLL_SEL_MASK		= 3 << ACLK_VIO0_PLL_SEL_SHIFT,
+	ACLK_VIO0_CLK_DIV_SHIFT		= 0,
+	ACLK_VIO0_CLK_DIV_MASK		= 0x1f << ACLK_VIO0_CLK_DIV_SHIFT,
+
+	/* CLKSEL29_CON */
+	PCLK_VIO_CLK_DIV_SHIFT		= 8,
+	PCLK_VIO_CLK_DIV_MASK		= 0x1f << PCLK_VIO_CLK_DIV_SHIFT,
+	HCLK_VIO_CLK_DIV_SHIFT		= 0,
+	HCLK_VIO_CLK_DIV_MASK		= 0x1f << HCLK_VIO_CLK_DIV_SHIFT,
+
+	/* CLKSEL32_CON */
+	DCLK_VOP_SEL_SHIFT		= 7,
+	DCLK_VOP_SEL_MASK		= 1 << DCLK_VOP_SEL_SHIFT,
+	DCLK_VOP_SEL_HDMI		= 0,
+	DCLK_VOP_SEL_PLL		= 1,
+	DCLK_VOP_PLL_SEL_SHIFT		= 6,
+	DCLK_VOP_PLL_SEL_MASK		= 1 << DCLK_VOP_PLL_SEL_SHIFT,
+	DCLK_VOP_PLL_SEL_GPLL		= 0,
+	DCLK_VOP_PLL_SEL_DPLL		= 1,
+	DCLK_VOP_CLK_DIV_SHIFT		= 0,
+	DCLK_VOP_CLK_DIV_MASK		= 0x3f << DCLK_VOP_CLK_DIV_SHIFT,
+	DCLK_VOP_DIV_CON_WIDTH		= 6,
+
+	/* SOFTRST1_CON*/
+	DDRPHY_SRSTN_CLKDIV_REQ_SHIFT	= 0,
+	DDRPHY_SRSTN_CLKDIV_REQ		= 1,
+	DDRPHY_SRSTN_CLKDIV_DIS		= 0,
+	DDRPHY_SRSTN_CLKDIV_REQ_MASK	= 1 << DDRPHY_SRSTN_CLKDIV_REQ_SHIFT,
+	DDRPHY_SRSTN_REQ_SHIFT		= 1,
+	DDRPHY_SRSTN_REQ		= 1,
+	DDRPHY_SRSTN_DIS		= 0,
+	DDRPHY_SRSTN_REQ_MASK		= 1 << DDRPHY_SRSTN_REQ_SHIFT,
+	DDRPHY_PSRSTN_REQ_SHIFT		= 2,
+	DDRPHY_PSRSTN_REQ		= 1,
+	DDRPHY_PSRSTN_DIS		= 0,
+	DDRPHY_PSRSTN_REQ_MASK		= 1 << DDRPHY_PSRSTN_REQ_SHIFT,
+
+	/* SOFTRST2_CON*/
+	DDRUPCTL_PSRSTN_REQ_SHIFT	= 0,
+	DDRUPCTL_PSRSTN_REQ		= 1,
+	DDRUPCTL_PSRSTN_DIS		= 0,
+	DDRUPCTL_PSRSTN_REQ_MASK	= 1 << DDRUPCTL_PSRSTN_REQ_SHIFT,
+	DDRUPCTL_NSRSTN_REQ_SHIFT	= 1,
+	DDRUPCTL_NSRSTN_REQ		= 1,
+	DDRUPCTL_NSRSTN_DIS		= 0,
+	DDRUPCTL_NSRSTN_REQ_MASK	= 1 << DDRUPCTL_NSRSTN_REQ_SHIFT,
 };
 #endif
diff --git a/drivers/clk/rockchip/clk_rv1108.c b/drivers/clk/rockchip/clk_rv1108.c
index 1f9f534b28..3603568ee7 100644
--- a/drivers/clk/rockchip/clk_rv1108.c
+++ b/drivers/clk/rockchip/clk_rv1108.c
@@ -35,6 +35,9 @@ enum {
 			 #hz "Hz cannot be hit with PLL "\
 			 "divisors on line " __stringify(__LINE__));
 
+static const struct pll_div apll_init_cfg = PLL_DIVISORS(APLL_HZ, 1, 3, 1);
+static const struct pll_div gpll_init_cfg = PLL_DIVISORS(GPLL_HZ, 2, 2, 1);
+
 /* use integer mode */
 static inline int rv1108_pll_id(enum rk_clk_id clk_id)
 {
@@ -57,6 +60,58 @@ static inline int rv1108_pll_id(enum rk_clk_id clk_id)
 	return id;
 }
 
+static int rkclk_set_pll(struct rv1108_cru *cru, enum rk_clk_id clk_id,
+			 const struct pll_div *div)
+{
+	int pll_id = rv1108_pll_id(clk_id);
+	struct rv1108_pll *pll = &cru->pll[pll_id];
+
+	/* All PLLs have same VCO and output frequency range restrictions. */
+	uint vco_hz = OSC_HZ / 1000 * div->fbdiv / div->refdiv * 1000;
+	uint output_hz = vco_hz / div->postdiv1 / div->postdiv2;
+
+	debug("PLL at %p: fb=%d, ref=%d, pst1=%d, pst2=%d, vco=%u Hz, output=%u Hz\n",
+	      pll, div->fbdiv, div->refdiv, div->postdiv1,
+	      div->postdiv2, vco_hz, output_hz);
+	assert(vco_hz >= VCO_MIN_HZ && vco_hz <= VCO_MAX_HZ &&
+	       output_hz >= OUTPUT_MIN_HZ && output_hz <= OUTPUT_MAX_HZ);
+
+	/*
+	 * When power on or changing PLL setting,
+	 * we must force PLL into slow mode to ensure output stable clock.
+	 */
+	rk_clrsetreg(&pll->con3, WORK_MODE_MASK,
+		     WORK_MODE_SLOW << WORK_MODE_SHIFT);
+
+	/* use integer mode */
+	rk_setreg(&pll->con3, 1 << DSMPD_SHIFT);
+	/* Power down */
+	rk_setreg(&pll->con3, 1 << GLOBAL_POWER_DOWN_SHIFT);
+
+	rk_clrsetreg(&pll->con0, FBDIV_MASK, div->fbdiv << FBDIV_SHIFT);
+	rk_clrsetreg(&pll->con1, POSTDIV1_MASK | POSTDIV2_MASK | REFDIV_MASK,
+		     (div->postdiv1 << POSTDIV1_SHIFT |
+		     div->postdiv2 << POSTDIV2_SHIFT |
+		     div->refdiv << REFDIV_SHIFT));
+	rk_clrsetreg(&pll->con2, FRACDIV_MASK,
+		     (div->refdiv << REFDIV_SHIFT));
+
+	/* Power Up */
+	rk_clrreg(&pll->con3, 1 << GLOBAL_POWER_DOWN_SHIFT);
+
+	/* waiting for pll lock */
+	while (readl(&pll->con2) & (1 << LOCK_STA_SHIFT))
+		udelay(1);
+
+	/*
+	 * set PLL into normal mode.
+	 */
+	rk_clrsetreg(&pll->con3, WORK_MODE_MASK,
+		     WORK_MODE_NORMAL << WORK_MODE_SHIFT);
+
+	return 0;
+}
+
 static uint32_t rkclk_pll_get_rate(struct rv1108_cru *cru,
 				   enum rk_clk_id clk_id)
 {
@@ -74,7 +129,7 @@ static uint32_t rkclk_pll_get_rate(struct rv1108_cru *cru,
 		fbdiv = (con0 >> FBDIV_SHIFT) & FBDIV_MASK;
 		postdiv1 = (con1 & POSTDIV1_MASK) >> POSTDIV1_SHIFT;
 		postdiv2 = (con1 & POSTDIV2_MASK) >> POSTDIV2_SHIFT;
-		refdiv = (con1 & REFDIV_MASK) >> REFDIV_SHIFT;
+		refdiv = (con1 >> REFDIV_SHIFT) & REFDIV_MASK;
 		freq = (24 * fbdiv / (refdiv * postdiv1 * postdiv2)) * 1000000;
 	} else {
 		freq = OSC_HZ;
@@ -154,6 +209,322 @@ static ulong rv1108_saradc_set_clk(struct rv1108_cru *cru, uint hz)
 	return rv1108_saradc_get_clk(cru);
 }
 
+static ulong rv1108_aclk_vio1_get_clk(struct rv1108_cru *cru)
+{
+	u32 div, val;
+
+	val = readl(&cru->clksel_con[28]);
+	div = bitfield_extract(val, ACLK_VIO1_CLK_DIV_SHIFT,
+			       CLK_VIO_DIV_CON_WIDTH);
+
+	return DIV_TO_RATE(GPLL_HZ, div);
+}
+
+static ulong rv1108_aclk_vio1_set_clk(struct rv1108_cru *cru, uint hz)
+{
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(GPLL_HZ, hz) - 1;
+	assert(src_clk_div < 32);
+
+	rk_clrsetreg(&cru->clksel_con[28],
+		     ACLK_VIO1_CLK_DIV_MASK | ACLK_VIO1_PLL_SEL_MASK,
+		     (src_clk_div << ACLK_VIO1_CLK_DIV_SHIFT) |
+		     (VIO_PLL_SEL_GPLL << ACLK_VIO1_PLL_SEL_SHIFT));
+
+	return rv1108_aclk_vio1_get_clk(cru);
+}
+
+static ulong rv1108_aclk_vio0_get_clk(struct rv1108_cru *cru)
+{
+	u32 div, val;
+
+	val = readl(&cru->clksel_con[28]);
+	div = bitfield_extract(val, ACLK_VIO0_CLK_DIV_SHIFT,
+			       CLK_VIO_DIV_CON_WIDTH);
+
+	return DIV_TO_RATE(GPLL_HZ, div);
+}
+
+static ulong rv1108_aclk_vio0_set_clk(struct rv1108_cru *cru, uint hz)
+{
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(GPLL_HZ, hz) - 1;
+	assert(src_clk_div < 32);
+
+	rk_clrsetreg(&cru->clksel_con[28],
+		     ACLK_VIO0_CLK_DIV_MASK | ACLK_VIO0_PLL_SEL_MASK,
+		     (src_clk_div << ACLK_VIO0_CLK_DIV_SHIFT) |
+		     (VIO_PLL_SEL_GPLL << ACLK_VIO0_PLL_SEL_SHIFT));
+
+	/*HCLK_VIO default div = 4*/
+	rk_clrsetreg(&cru->clksel_con[29],
+		     HCLK_VIO_CLK_DIV_MASK,
+		     3 << HCLK_VIO_CLK_DIV_SHIFT);
+	/*PCLK_VIO default div = 4*/
+	rk_clrsetreg(&cru->clksel_con[29],
+		     PCLK_VIO_CLK_DIV_MASK,
+		     3 << PCLK_VIO_CLK_DIV_SHIFT);
+
+	return rv1108_aclk_vio0_get_clk(cru);
+}
+
+static ulong rv1108_dclk_vop_get_clk(struct rv1108_cru *cru)
+{
+	u32 div, val;
+
+	val = readl(&cru->clksel_con[32]);
+	div = bitfield_extract(val, DCLK_VOP_CLK_DIV_SHIFT,
+			       DCLK_VOP_DIV_CON_WIDTH);
+
+	return DIV_TO_RATE(GPLL_HZ, div);
+}
+
+static ulong rv1108_dclk_vop_set_clk(struct rv1108_cru *cru, uint hz)
+{
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(GPLL_HZ, hz) - 1;
+	assert(src_clk_div < 64);
+
+	rk_clrsetreg(&cru->clksel_con[32],
+		     DCLK_VOP_CLK_DIV_MASK | DCLK_VOP_PLL_SEL_MASK |
+		     DCLK_VOP_SEL_SHIFT,
+		     (src_clk_div << DCLK_VOP_CLK_DIV_SHIFT) |
+		     (DCLK_VOP_PLL_SEL_GPLL << DCLK_VOP_PLL_SEL_SHIFT) |
+		     (DCLK_VOP_SEL_PLL << DCLK_VOP_SEL_SHIFT));
+
+	return rv1108_dclk_vop_get_clk(cru);
+}
+
+static ulong rv1108_aclk_bus_get_clk(struct rv1108_cru *cru)
+{
+	u32 div, val;
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+
+	val = readl(&cru->clksel_con[2]);
+	div = bitfield_extract(val, ACLK_BUS_DIV_CON_SHIFT,
+			       ACLK_BUS_DIV_CON_WIDTH);
+
+	return DIV_TO_RATE(parent_rate, div);
+}
+
+static ulong rv1108_aclk_bus_set_clk(struct rv1108_cru *cru, uint hz)
+{
+	int src_clk_div;
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+
+	src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
+	assert(src_clk_div < 32);
+
+	rk_clrsetreg(&cru->clksel_con[2],
+		     ACLK_BUS_DIV_CON_MASK | ACLK_BUS_PLL_SEL_MASK,
+		     (src_clk_div << ACLK_BUS_DIV_CON_SHIFT) |
+		     (ACLK_BUS_PLL_SEL_GPLL << ACLK_BUS_PLL_SEL_SHIFT));
+
+	return rv1108_aclk_bus_get_clk(cru);
+}
+
+static ulong rv1108_aclk_peri_get_clk(struct rv1108_cru *cru)
+{
+	u32 div, val;
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+
+	val = readl(&cru->clksel_con[23]);
+	div = bitfield_extract(val, ACLK_PERI_DIV_CON_SHIFT,
+			       PERI_DIV_CON_WIDTH);
+
+	return DIV_TO_RATE(parent_rate, div);
+}
+
+static ulong rv1108_hclk_peri_get_clk(struct rv1108_cru *cru)
+{
+	u32 div, val;
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+
+	val = readl(&cru->clksel_con[23]);
+	div = bitfield_extract(val, HCLK_PERI_DIV_CON_SHIFT,
+			       PERI_DIV_CON_WIDTH);
+
+	return DIV_TO_RATE(parent_rate, div);
+}
+
+static ulong rv1108_pclk_peri_get_clk(struct rv1108_cru *cru)
+{
+	u32 div, val;
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+
+	val = readl(&cru->clksel_con[23]);
+	div = bitfield_extract(val, PCLK_PERI_DIV_CON_SHIFT,
+			       PERI_DIV_CON_WIDTH);
+
+	return DIV_TO_RATE(parent_rate, div);
+}
+
+static ulong rv1108_aclk_peri_set_clk(struct rv1108_cru *cru, uint hz)
+{
+	int src_clk_div;
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+
+	src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
+	assert(src_clk_div < 32);
+
+	rk_clrsetreg(&cru->clksel_con[23],
+		     ACLK_PERI_DIV_CON_MASK | ACLK_PERI_PLL_SEL_MASK,
+		     (src_clk_div << ACLK_PERI_DIV_CON_SHIFT) |
+		     (ACLK_PERI_PLL_SEL_GPLL << ACLK_PERI_PLL_SEL_SHIFT));
+
+	return rv1108_aclk_peri_get_clk(cru);
+}
+
+static ulong rv1108_hclk_peri_set_clk(struct rv1108_cru *cru, uint hz)
+{
+	int src_clk_div;
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+
+	src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
+	assert(src_clk_div < 32);
+
+	rk_clrsetreg(&cru->clksel_con[23],
+		     HCLK_PERI_DIV_CON_MASK,
+		     (src_clk_div << HCLK_PERI_DIV_CON_SHIFT));
+
+	return rv1108_hclk_peri_get_clk(cru);
+}
+
+static ulong rv1108_pclk_peri_set_clk(struct rv1108_cru *cru, uint hz)
+{
+	int src_clk_div;
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+
+	src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
+	assert(src_clk_div < 32);
+
+	rk_clrsetreg(&cru->clksel_con[23],
+		     PCLK_PERI_DIV_CON_MASK,
+		     (src_clk_div << PCLK_PERI_DIV_CON_SHIFT));
+
+	return rv1108_pclk_peri_get_clk(cru);
+}
+
+static ulong rv1108_i2c_get_clk(struct rv1108_cru *cru, ulong clk_id)
+{
+	u32 div, con;
+
+	switch (clk_id) {
+	case SCLK_I2C0_PMU:
+		con = readl(&cru->clksel_con[19]);
+		div = bitfield_extract(con, CLK_I2C0_DIV_CON_SHIFT,
+				       I2C_DIV_CON_WIDTH);
+		break;
+	case SCLK_I2C1:
+		con = readl(&cru->clksel_con[19]);
+		div = bitfield_extract(con, CLK_I2C1_DIV_CON_SHIFT,
+				       I2C_DIV_CON_WIDTH);
+		break;
+	case SCLK_I2C2:
+		con = readl(&cru->clksel_con[20]);
+		div = bitfield_extract(con, CLK_I2C2_DIV_CON_SHIFT,
+				       I2C_DIV_CON_WIDTH);
+		break;
+	case SCLK_I2C3:
+		con = readl(&cru->clksel_con[20]);
+		div = bitfield_extract(con, CLK_I2C3_DIV_CON_SHIFT,
+				       I2C_DIV_CON_WIDTH);
+		break;
+	default:
+		printf("do not support this i2c bus\n");
+		return -EINVAL;
+	}
+
+	return DIV_TO_RATE(GPLL_HZ, div);
+}
+
+static ulong rv1108_i2c_set_clk(struct rv1108_cru *cru, ulong clk_id, uint hz)
+{
+	int src_clk_div;
+
+	/* i2c0,4,8 src clock from ppll, i2c1,2,3,5,6,7 src clock from gpll*/
+	src_clk_div = GPLL_HZ / hz;
+	assert(src_clk_div - 1 <= 127);
+
+	switch (clk_id) {
+	case SCLK_I2C0_PMU:
+		rk_clrsetreg(&cru->clksel_con[19],
+			     CLK_I2C0_DIV_CON_MASK | CLK_I2C1_PLL_SEL_MASK,
+			     (src_clk_div << CLK_I2C0_DIV_CON_SHIFT) |
+			     (CLK_I2C1_PLL_SEL_GPLL << CLK_I2C1_PLL_SEL_SHIFT));
+		break;
+	case SCLK_I2C1:
+		rk_clrsetreg(&cru->clksel_con[19],
+			     CLK_I2C1_DIV_CON_MASK | CLK_I2C1_PLL_SEL_MASK,
+			     (src_clk_div << CLK_I2C1_DIV_CON_SHIFT) |
+			     (CLK_I2C1_PLL_SEL_GPLL << CLK_I2C1_PLL_SEL_SHIFT));
+		break;
+	case SCLK_I2C2:
+		rk_clrsetreg(&cru->clksel_con[20],
+			     CLK_I2C2_DIV_CON_MASK | CLK_I2C3_PLL_SEL_MASK,
+			     (src_clk_div << CLK_I2C2_DIV_CON_SHIFT) |
+			     (CLK_I2C3_PLL_SEL_GPLL << CLK_I2C3_PLL_SEL_SHIFT));
+		break;
+	case SCLK_I2C3:
+		rk_clrsetreg(&cru->clksel_con[20],
+			     CLK_I2C3_DIV_CON_MASK | CLK_I2C3_PLL_SEL_MASK,
+			     (src_clk_div << CLK_I2C3_DIV_CON_SHIFT) |
+			     (CLK_I2C3_PLL_SEL_GPLL << CLK_I2C3_PLL_SEL_SHIFT));
+		break;
+	default:
+		printf("do not support this i2c bus\n");
+		return -EINVAL;
+	}
+
+	return rv1108_i2c_get_clk(cru, clk_id);
+}
+
+static ulong rv1108_mmc_get_clk(struct clk *clk)
+{
+	struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rv1108_cru *cru = priv->cru;
+	u32 div, con;
+
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+
+	con = readl(&cru->clksel_con[26]);
+	div = (con & EMMC_CLK_DIV_MASK) >> EMMC_CLK_DIV_SHIFT;
+
+
+	debug("%s id %ld get_clk %ld\n", __func__, clk->id, DIV_TO_RATE(parent_rate, div));
+
+	return DIV_TO_RATE(parent_rate, div);
+
+}
+
+static ulong rv1108_mmc_set_clk(struct clk *clk, ulong set_rate)
+{
+	struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rv1108_cru *cru = priv->cru;
+	int src_clk_div;
+
+	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+	src_clk_div = DIV_ROUND_UP(parent_rate, set_rate);
+
+	if (src_clk_div > 127) {
+		src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, set_rate);
+	}
+
+	debug("%s id %ld src_clk_div %d\n", __func__, clk->id, src_clk_div);
+
+	rk_clrsetreg(&cru->clksel_con[26],
+		     EMMC_CLK_DIV_MASK , (src_clk_div -1) << EMMC_CLK_DIV_SHIFT);
+
+	rk_clrsetreg(&cru->clksel_con[25],
+		     EMMC_PLL_SEL_MASK , EMMC_PLL_SEL_GPLL << EMMC_PLL_SEL_SHIFT);
+
+	return rv1108_mmc_get_clk(clk);
+}
+
+
 static ulong rv1108_clk_get_rate(struct clk *clk)
 {
 	struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
@@ -163,6 +534,31 @@ static ulong rv1108_clk_get_rate(struct clk *clk)
 		return rkclk_pll_get_rate(priv->cru, clk->id);
 	case SCLK_SARADC:
 		return rv1108_saradc_get_clk(priv->cru);
+	case ACLK_VIO0:
+		return rv1108_aclk_vio0_get_clk(priv->cru);
+	case ACLK_VIO1:
+		return rv1108_aclk_vio1_get_clk(priv->cru);
+	case DCLK_VOP:
+		return rv1108_dclk_vop_get_clk(priv->cru);
+	case ACLK_PRE:
+		return rv1108_aclk_bus_get_clk(priv->cru);
+	case ACLK_PERI:
+		return rv1108_aclk_peri_get_clk(priv->cru);
+	case HCLK_PERI:
+		return rv1108_hclk_peri_get_clk(priv->cru);
+	case PCLK_PERI:
+		return rv1108_pclk_peri_get_clk(priv->cru);
+	case SCLK_I2C0_PMU:
+	case SCLK_I2C1:
+	case SCLK_I2C2:
+	case SCLK_I2C3:
+		return rv1108_i2c_get_clk(priv->cru, clk->id);
+	case HCLK_SDMMC:
+	case HCLK_EMMC:
+	case SCLK_SDMMC:
+	case SCLK_EMMC:
+	case SCLK_EMMC_SAMPLE:
+		return rv1108_mmc_get_clk(clk);
 	default:
 		return -ENOENT;
 	}
@@ -183,6 +579,39 @@ static ulong rv1108_clk_set_rate(struct clk *clk, ulong rate)
 	case SCLK_SARADC:
 		new_rate = rv1108_saradc_set_clk(priv->cru, rate);
 		break;
+	case ACLK_VIO0:
+		new_rate = rv1108_aclk_vio0_set_clk(priv->cru, rate);
+		break;
+	case ACLK_VIO1:
+		new_rate = rv1108_aclk_vio1_set_clk(priv->cru, rate);
+		break;
+	case DCLK_VOP:
+		new_rate = rv1108_dclk_vop_set_clk(priv->cru, rate);
+		break;
+	case ACLK_PRE:
+		new_rate = rv1108_aclk_bus_set_clk(priv->cru, rate);
+		break;
+	case ACLK_PERI:
+		new_rate = rv1108_aclk_peri_set_clk(priv->cru, rate);
+		break;
+	case HCLK_PERI:
+		new_rate = rv1108_hclk_peri_set_clk(priv->cru, rate);
+		break;
+	case PCLK_PERI:
+		new_rate = rv1108_pclk_peri_set_clk(priv->cru, rate);
+		break;
+	case SCLK_I2C0_PMU:
+	case SCLK_I2C1:
+	case SCLK_I2C2:
+	case SCLK_I2C3:
+		new_rate = rv1108_i2c_set_clk(priv->cru, clk->id, rate);
+		break;
+	case HCLK_SDMMC:
+	case HCLK_EMMC:
+	case SCLK_SDMMC:
+	case SCLK_EMMC:
+		new_rate = rv1108_mmc_set_clk(clk, rate);
+		break;
 	default:
 		return -ENOENT;
 	}
@@ -197,14 +626,34 @@ static const struct clk_ops rv1108_clk_ops = {
 
 static void rkclk_init(struct rv1108_cru *cru)
 {
-	unsigned int apll = rkclk_pll_get_rate(cru, CLK_ARM);
-	unsigned int dpll = rkclk_pll_get_rate(cru, CLK_DDR);
-	unsigned int gpll = rkclk_pll_get_rate(cru, CLK_GENERAL);
+	unsigned int apll, dpll, gpll;
+	unsigned int aclk_bus, aclk_peri, hclk_peri, pclk_peri;
+
+	aclk_bus = rv1108_aclk_bus_set_clk(cru, ACLK_BUS_HZ / 2);
+	aclk_peri = rv1108_aclk_peri_set_clk(cru, ACLK_PERI_HZ / 2);
+	hclk_peri = rv1108_hclk_peri_set_clk(cru, HCLK_PERI_HZ / 2);
+	pclk_peri = rv1108_pclk_peri_set_clk(cru, PCLK_PERI_HZ / 2);
+	rv1108_aclk_vio0_set_clk(cru, 297000000);
+	rv1108_aclk_vio1_set_clk(cru, 297000000);
+
+	/* configure apll */
+	rkclk_set_pll(cru, CLK_ARM, &apll_init_cfg);
+	rkclk_set_pll(cru, CLK_GENERAL, &gpll_init_cfg);
+	aclk_bus = rv1108_aclk_bus_set_clk(cru, ACLK_BUS_HZ);
+	aclk_peri = rv1108_aclk_peri_set_clk(cru, ACLK_PERI_HZ);
+	hclk_peri = rv1108_hclk_peri_set_clk(cru, HCLK_PERI_HZ);
+	pclk_peri = rv1108_pclk_peri_set_clk(cru, PCLK_PERI_HZ);
+
+	apll = rkclk_pll_get_rate(cru, CLK_ARM);
+	dpll = rkclk_pll_get_rate(cru, CLK_DDR);
+	gpll = rkclk_pll_get_rate(cru, CLK_GENERAL);
 
 	rk_clrsetreg(&cru->clksel_con[0], CORE_CLK_DIV_MASK,
 		     0 << MAC_CLK_DIV_SHIFT);
 
 	printf("APLL: %d DPLL:%d GPLL:%d\n", apll, dpll, gpll);
+	printf("ACLK_BUS: %d ACLK_PERI:%d HCLK_PERI:%d PCLK_PERI:%d\n",
+	       aclk_bus, aclk_peri, hclk_peri, pclk_peri);
 }
 
 static int rv1108_clk_ofdata_to_platdata(struct udevice *dev)
diff --git a/include/dt-bindings/clock/rv1108-cru.h b/include/dt-bindings/clock/rv1108-cru.h
index 9219a50a24..04e0a59f4b 100644
--- a/include/dt-bindings/clock/rv1108-cru.h
+++ b/include/dt-bindings/clock/rv1108-cru.h
@@ -14,7 +14,6 @@
 #define ARMCLK				3
 
 /* sclk gates (special clocks) */
-#define SCLK_MAC			64
 #define SCLK_SPI0			65
 #define SCLK_NANDC			67
 #define SCLK_SDMMC			68
@@ -35,20 +34,77 @@
 #define SCLK_SDMMC_SAMPLE		84
 #define SCLK_SDIO_SAMPLE		85
 #define SCLK_EMMC_SAMPLE		86
-#define SCLK_MAC_RX			87
-#define SCLK_MAC_TX			88
-#define SCLK_MACREF			89
-#define SCLK_MACREF_OUT			90
-#define SCLK_SARADC			91
+#define SCLK_VENC_CORE			87
+#define SCLK_HEVC_CORE			88
+#define SCLK_HEVC_CABAC			89
+#define SCLK_PWM0_PMU			90
+#define SCLK_I2C0_PMU			91
+#define SCLK_WIFI			92
+#define SCLK_CIFOUT			93
+#define SCLK_MIPI_CSI_OUT		94
+#define SCLK_CIF0			95
+#define SCLK_CIF1			96
+#define SCLK_CIF2			97
+#define SCLK_CIF3			98
+#define SCLK_DSP			99
+#define SCLK_DSP_IOP			100
+#define SCLK_DSP_EPP			101
+#define SCLK_DSP_EDP			102
+#define SCLK_DSP_EDAP			103
+#define SCLK_CVBS_HOST			104
+#define SCLK_HDMI_SFR			105
+#define SCLK_HDMI_CEC			106
+#define SCLK_CRYPTO			107
+#define SCLK_SPI			108
+#define SCLK_SARADC			109
+#define SCLK_TSADC			110
+#define SCLK_MAC_PRE			111
+#define SCLK_MAC			112
+#define SCLK_MAC_RX			113
+#define SCLK_MAC_REF			114
+#define SCLK_MAC_REFOUT			115
+#define SCLK_DSP_PFM			116
+#define SCLK_RGA			117
+#define SCLK_I2C1			118
+#define SCLK_I2C2			119
+#define SCLK_I2C3			120
+#define SCLK_PWM			121
+#define SCLK_ISP			122
+#define SCLK_USBPHY			123
+#define SCLK_I2S0_SRC			124
+#define SCLK_I2S1_SRC			125
+#define SCLK_I2S2_SRC			126
+#define SCLK_UART0_SRC			127
+#define SCLK_UART1_SRC			128
+#define SCLK_UART2_SRC			129
+#define SCLK_MAC_TX			130
+#define SCLK_MACREF			131
+#define SCLK_MACREF_OUT			132
 
+#define DCLK_VOP_SRC			185
+#define DCLK_HDMIPHY			186
+#define DCLK_VOP			187
 
 /* aclk gates */
 #define ACLK_DMAC			192
 #define ACLK_PRE			193
 #define ACLK_CORE			194
 #define ACLK_ENMCORE			195
-#define ACLK_GMAC			196
-
+#define ACLK_RKVENC			196
+#define ACLK_RKVDEC			197
+#define ACLK_VPU			198
+#define ACLK_CIF0			199
+#define ACLK_VIO0			200
+#define ACLK_VIO1			201
+#define ACLK_VOP			202
+#define ACLK_IEP			203
+#define ACLK_RGA			204
+#define ACLK_ISP			205
+#define ACLK_CIF1			206
+#define ACLK_CIF2			207
+#define ACLK_CIF3			208
+#define ACLK_PERI			209
+#define ACLK_GMAC			210
 
 /* pclk gates */
 #define PCLK_GPIO1			256
@@ -67,12 +123,24 @@
 #define PCLK_PWM			269
 #define PCLK_TIMER			270
 #define PCLK_PERI			271
-#define PCLK_GMAC			272
-#define PCLK_SARADC			273
+#define PCLK_GPIO0_PMU			272
+#define PCLK_I2C0_PMU			273
+#define PCLK_PWM0_PMU			274
+#define PCLK_ISP			275
+#define PCLK_VIO			276
+#define PCLK_MIPI_DSI			277
+#define PCLK_HDMI_CTRL			278
+#define PCLK_SARADC			279
+#define PCLK_DSP_CFG			280
+#define PCLK_BUS			281
+#define PCLK_EFUSE0			282
+#define PCLK_EFUSE1			283
+#define PCLK_WDT			284
+#define PCLK_GMAC			285
 
 /* hclk gates */
 #define HCLK_I2S0_8CH			320
-#define HCLK_I2S1_8CH			321
+#define HCLK_I2S1_2CH			321
 #define HCLK_I2S2_2CH			322
 #define HCLK_NANDC			323
 #define HCLK_SDMMC			324
@@ -80,20 +148,37 @@
 #define HCLK_EMMC			326
 #define HCLK_PERI			327
 #define HCLK_SFC			328
+#define HCLK_RKVENC			329
+#define HCLK_RKVDEC			330
+#define HCLK_CIF0			331
+#define HCLK_VIO			332
+#define HCLK_VOP			333
+#define HCLK_IEP			334
+#define HCLK_RGA			335
+#define HCLK_ISP			336
+#define HCLK_CRYPTO_MST			337
+#define HCLK_CRYPTO_SLV			338
+#define HCLK_HOST0			339
+#define HCLK_OTG			340
+#define HCLK_CIF1			341
+#define HCLK_CIF2			342
+#define HCLK_CIF3			343
+#define HCLK_BUS			344
+#define HCLK_VPU			345
 
-#define CLK_NR_CLKS			(HCLK_SFC + 1)
+#define CLK_NR_CLKS			(HCLK_VPU + 1)
 
 /* reset id */
-#define SRST_CORE_PO_AD		0
+#define SRST_CORE_PO_AD			0
 #define SRST_CORE_AD			1
 #define SRST_L2_AD			2
-#define SRST_CPU_NIU_AD		3
+#define SRST_CPU_NIU_AD			3
 #define SRST_CORE_PO			4
 #define SRST_CORE			5
-#define SRST_L2			6
+#define SRST_L2				6
 #define SRST_CORE_DBG			8
 #define PRST_DBG			9
-#define RST_DAP			10
+#define RST_DAP				10
 #define PRST_DBG_NIU			11
 #define ARST_STRC_SYS_AD		15
 
@@ -160,9 +245,9 @@
 #define HRST_SYSBUS			75
 #define PRST_USBGRF			76
 
-#define ARST_PERIPH_NIU		80
-#define HRST_PERIPH_NIU		81
-#define PRST_PERIPH_NIU		82
+#define ARST_PERIPH_NIU			80
+#define HRST_PERIPH_NIU			81
+#define PRST_PERIPH_NIU			82
 #define HRST_PERIPH			83
 #define HRST_SDMMC			84
 #define HRST_SDIO			85
@@ -180,28 +265,11 @@
 #define HRST_HOST0_AUX			96
 #define HRST_HOST0_ARB			97
 #define SRST_HOST0_EHCIPHY		98
-#define SRST_HOST0_UTMI		99
+#define SRST_HOST0_UTMI			99
 #define SRST_USBPOR			100
 #define SRST_UTMI0			101
 #define SRST_UTMI1			102
 
-#define ARST_VIO0_NIU			102
-#define ARST_VIO1_NIU			103
-#define HRST_VIO_NIU			104
-#define PRST_VIO_NIU			105
-#define ARST_VOP			106
-#define HRST_VOP			107
-#define DRST_VOP			108
-#define ARST_IEP			109
-#define HRST_IEP			110
-#define ARST_RGA			111
-#define HRST_RGA			112
-#define SRST_RGA			113
-#define PRST_CVBS			114
-#define PRST_HDMI			115
-#define SRST_HDMI			116
-#define PRST_MIPI_DSI			117
-
 #define ARST_ISP_NIU			118
 #define HRST_ISP_NIU			119
 #define HRST_ISP			120
@@ -227,21 +295,21 @@
 #define HRST_VPU_NIU			141
 #define ARST_VPU			142
 #define HRST_VPU			143
-#define ARST_RKVDEC_NIU		144
-#define HRST_RKVDEC_NIU		145
+#define ARST_RKVDEC_NIU			144
+#define HRST_RKVDEC_NIU			145
 #define ARST_RKVDEC			146
 #define HRST_RKVDEC			147
 #define SRST_RKVDEC_CABAC		148
 #define SRST_RKVDEC_CORE		149
-#define ARST_RKVENC_NIU		150
-#define HRST_RKVENC_NIU		151
+#define ARST_RKVENC_NIU			150
+#define HRST_RKVENC_NIU			151
 #define ARST_RKVENC			152
 #define HRST_RKVENC			153
 #define SRST_RKVENC_CORE		154
 
 #define SRST_DSP_CORE			156
 #define SRST_DSP_SYS			157
-#define SRST_DSP_GLOBAL		158
+#define SRST_DSP_GLOBAL			158
 #define SRST_DSP_OECM			159
 #define PRST_DSP_IOP_NIU		160
 #define ARST_DSP_EPP_NIU		161
@@ -259,7 +327,7 @@
 #define SRST_PMU_I2C0			173
 #define PRST_PMU_I2C0			174
 #define PRST_PMU_GPIO0			175
-#define PRST_PMU_INTMEM		176
+#define PRST_PMU_INTMEM			176
 #define PRST_PMU_PWM0			177
 #define SRST_PMU_PWM0			178
 #define PRST_PMU_GRF			179
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 2/5] rv1108: Enable BOUNCE_BUFFER
  2018-11-20 18:55 [U-Boot] [PATCH v2 0/5] Submit upstream changes made while porting a customer board to mainline Otavio Salvador
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree Otavio Salvador
@ 2018-11-20 18:55 ` Otavio Salvador
  2018-11-27  1:45   ` Andy Yan
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support Otavio Salvador
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 22+ messages in thread
From: Otavio Salvador @ 2018-11-20 18:55 UTC (permalink / raw)
  To: u-boot

In order to be able to build the Rockchip eMMC driver on rv1108, the
BOUNCE_BUFFER option needs to be selected. Select it like it is done
on the other Rockchip SoC common files.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---

Changes in v2:
- new patch

 include/configs/rv1108_common.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/include/configs/rv1108_common.h b/include/configs/rv1108_common.h
index 2ab3b85e0c..cc0384e2f4 100644
--- a/include/configs/rv1108_common.h
+++ b/include/configs/rv1108_common.h
@@ -17,6 +17,9 @@
 #define CONFIG_SYS_TIMER_BASE		0x10350020
 #define CONFIG_SYS_TIMER_COUNTER	(CONFIG_SYS_TIMER_BASE + 8)
 
+/* MMC/SD IP block */
+#define CONFIG_BOUNCE_BUFFER
+
 #define CONFIG_SYS_SDRAM_BASE		0x60000000
 #define CONFIG_SYS_INIT_SP_ADDR		(CONFIG_SYS_TEXT_BASE + 0x100000)
 #define CONFIG_SYS_LOAD_ADDR		(CONFIG_SYS_SDRAM_BASE + 0x2000000)
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support
  2018-11-20 18:55 [U-Boot] [PATCH v2 0/5] Submit upstream changes made while porting a customer board to mainline Otavio Salvador
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree Otavio Salvador
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 2/5] rv1108: Enable BOUNCE_BUFFER Otavio Salvador
@ 2018-11-20 18:55 ` Otavio Salvador
  2018-11-26 16:18   ` Otavio Salvador
  2018-11-27  1:51   ` Andy Yan
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 4/5] rv1108: Make USB OTG functional Otavio Salvador
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 5/5] rv1108: Add support for default distro_bootcmd Otavio Salvador
  4 siblings, 2 replies; 22+ messages in thread
From: Otavio Salvador @ 2018-11-20 18:55 UTC (permalink / raw)
  To: u-boot

This adds the pinctrl handles to enable the use of eMMC on custom
boards (as minievk) and makes it easier for later addition.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---

Changes in v2:
- split bounce buffer change on a new patch

 arch/arm/dts/rv1108.dtsi | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/arch/arm/dts/rv1108.dtsi b/arch/arm/dts/rv1108.dtsi
index acfd97e18d..23a44bfaca 100644
--- a/arch/arm/dts/rv1108.dtsi
+++ b/arch/arm/dts/rv1108.dtsi
@@ -427,6 +427,35 @@
 			};
 		};
 
+		emmc {
+			emmc_clk: emmc-clk {
+				rockchip,pins = <2 RK_PB6 RK_FUNC_1 &pcfg_pull_none_drv_8ma>;
+			};
+
+			emmc_cmd: emmc-cmd {
+				rockchip,pins = <2 RK_PB4 RK_FUNC_2 &pcfg_pull_up_drv_8ma>;
+			};
+
+			emmc_pwren: emmc-pwren {
+				rockchip,pins = <2 RK_PC2 RK_FUNC_2 &pcfg_pull_none>;
+			};
+
+			emmc_bus1: emmc-bus1 {
+				rockchip,pins = <2 RK_PA0 RK_FUNC_2 &pcfg_pull_up_drv_8ma>;
+			};
+
+			emmc_bus8: emmc-bus8 {
+				rockchip,pins = <2 RK_PA0 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
+						<2 RK_PA1 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
+						<2 RK_PA2 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
+						<2 RK_PA3 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
+						<2 RK_PA4 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
+						<2 RK_PA5 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
+						<2 RK_PA6 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
+						<2 RK_PA7 RK_FUNC_2 &pcfg_pull_up_drv_8ma>;
+			};
+		};
+
 		sdmmc {
 			sdmmc_clk: sdmmc-clk {
 				rockchip,pins = <3 RK_PC4 RK_FUNC_1 &pcfg_pull_none_drv_4ma>;
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 4/5] rv1108: Make USB OTG functional
  2018-11-20 18:55 [U-Boot] [PATCH v2 0/5] Submit upstream changes made while porting a customer board to mainline Otavio Salvador
                   ` (2 preceding siblings ...)
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support Otavio Salvador
@ 2018-11-20 18:55 ` Otavio Salvador
  2018-11-27  1:54   ` Andy Yan
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 5/5] rv1108: Add support for default distro_bootcmd Otavio Salvador
  4 siblings, 1 reply; 22+ messages in thread
From: Otavio Salvador @ 2018-11-20 18:55 UTC (permalink / raw)
  To: u-boot

Like it is done for other Rockchip SoCs, introduce a board_usb_init()
function so that USB OTG can be functional on rv1108 too.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---

Changes in v2: None

 arch/arm/dts/rv1108.dtsi              | 45 ++++++++++++++-
 arch/arm/mach-rockchip/Makefile       |  1 +
 arch/arm/mach-rockchip/rv1108-board.c | 81 +++++++++++++++++++++++++++
 3 files changed, 124 insertions(+), 3 deletions(-)
 create mode 100644 arch/arm/mach-rockchip/rv1108-board.c

diff --git a/arch/arm/dts/rv1108.dtsi b/arch/arm/dts/rv1108.dtsi
index 23a44bfaca..215d885225 100644
--- a/arch/arm/dts/rv1108.dtsi
+++ b/arch/arm/dts/rv1108.dtsi
@@ -121,8 +121,35 @@
 	};
 
 	grf: syscon at 10300000 {
-		compatible = "rockchip,rv1108-grf", "syscon";
+		compatible = "rockchip,rv1108-grf", "syscon", "simple-mfd";
 		reg = <0x10300000 0x1000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		u2phy: usb2-phy at 100 {
+			compatible = "rockchip,rv1108-usb2phy";
+			reg = <0x100 0x0c>;
+			clocks = <&cru SCLK_USBPHY>;
+			clock-names = "phyclk";
+			#clock-cells = <0>;
+			clock-output-names = "usbphy";
+			rockchip,usbgrf = <&usbgrf>;
+			status = "disabled";
+
+			u2phy_otg: otg-port {
+				interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
+				interrupt-names = "otg-mux";
+				#phy-cells = <0>;
+				status = "disabled";
+			};
+
+			u2phy_host: host-port {
+				interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+				interrupt-names = "linestate";
+				#phy-cells = <0>;
+				status = "disabled";
+			};
+		};
 	};
 
 	saradc: saradc at 1038c000 {
@@ -141,6 +168,11 @@
 		reg = <0x20060000 0x1000>;
 	};
 
+	usbgrf: syscon at 202a0000 {
+		compatible = "rockchip,rv1108-usbgrf", "syscon";
+		reg = <0x202a0000 0x1000>;
+	};
+
 	cru: clock-controller at 20200000 {
 		compatible = "rockchip,rv1108-cru";
 		reg = <0x20200000 0x1000>;
@@ -200,12 +232,19 @@
 	};
 
 	usb20_otg: usb at 30180000 {
-		compatible = "rockchip,rv1108-usb", "rockchip,rk3288-usb",
+		compatible = "rockchip,rv1108-usb", "rockchip,rk3066-usb",
 			     "snps,dwc2";
 		reg = <0x30180000 0x40000>;
 		interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
-		hnp-srp-disable;
+		clocks = <&cru HCLK_OTG>;
+		clock-names = "otg";
 		dr_mode = "otg";
+		g-np-tx-fifo-size = <16>;
+		g-rx-fifo-size = <280>;
+		g-tx-fifo-size = <256 128 128 64 32 16>;
+		g-use-dma;
+		phys = <&u2phy_otg>;
+		phy-names = "usb2-phy";
 		status = "disabled";
 	};
 
diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
index 05706c472a..368302e1da 100644
--- a/arch/arm/mach-rockchip/Makefile
+++ b/arch/arm/mach-rockchip/Makefile
@@ -33,6 +33,7 @@ obj-$(CONFIG_ROCKCHIP_RK322X) += rk322x-board.o
 obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board.o
 obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board.o
 obj-$(CONFIG_ROCKCHIP_RK3399) += rk3399-board.o
+obj-$(CONFIG_ROCKCHIP_RV1108) += rv1108-board.o
 endif
 
 obj-$(CONFIG_$(SPL_TPL_)RAM) += sdram_common.o
diff --git a/arch/arm/mach-rockchip/rv1108-board.c b/arch/arm/mach-rockchip/rv1108-board.c
new file mode 100644
index 0000000000..3412f2c063
--- /dev/null
+++ b/arch/arm/mach-rockchip/rv1108-board.c
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2015 Google, Inc
+ */
+
+#include <common.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG)
+#include <usb.h>
+#include <usb/dwc2_udc.h>
+
+static struct dwc2_plat_otg_data rv1108_otg_data = {
+	.rx_fifo_sz	= 512,
+	.np_tx_fifo_sz	= 16,
+	.tx_fifo_sz	= 128,
+};
+
+int board_usb_init(int index, enum usb_init_type init)
+{
+	const void *blob = gd->fdt_blob;
+	bool matched = false;
+	int node, phy_node;
+	u32 grf_phy_offset;
+	const char *mode;
+
+	/* find the usb_otg node */
+	node = fdt_node_offset_by_compatible(blob, -1, "rockchip,rk3066-usb");
+	while (node > 0) {
+		mode = fdt_getprop(blob, node, "dr_mode", NULL);
+		if (mode && strcmp(mode, "otg") == 0) {
+			matched = true;
+			break;
+		}
+
+		node = fdt_node_offset_by_compatible(blob, node,
+						     "rockchip,rk3066-usb");
+	}
+
+	if (!matched) {
+		debug("usb_otg device not found\n");
+		return -ENODEV;
+	}
+
+	rv1108_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
+
+	node = fdtdec_lookup_phandle(blob, node, "phys");
+	if (node <= 0) {
+		debug("phys node not found\n");
+		return -ENODEV;
+	}
+
+	phy_node = fdt_parent_offset(blob, node);
+	if (phy_node <= 0) {
+		debug("usb phy node not found\n");
+		return -ENODEV;
+	}
+
+	rv1108_otg_data.phy_of_node = phy_node;
+	grf_phy_offset = fdtdec_get_addr(blob, node, "reg");
+
+	/* find the grf node */
+	node = fdt_node_offset_by_compatible(blob, -1,
+					     "rockchip,rv1108-grf");
+	if (node <= 0) {
+		debug("grf node not found\n");
+		return -ENODEV;
+	}
+
+	rv1108_otg_data.regs_phy = grf_phy_offset + fdtdec_get_addr(blob, node,
+								    "reg");
+
+	return dwc2_udc_probe(&rv1108_otg_data);
+}
+
+int board_usb_cleanup(int index, enum usb_init_type init)
+{
+	return 0;
+}
+#endif
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 5/5] rv1108: Add support for default distro_bootcmd
  2018-11-20 18:55 [U-Boot] [PATCH v2 0/5] Submit upstream changes made while porting a customer board to mainline Otavio Salvador
                   ` (3 preceding siblings ...)
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 4/5] rv1108: Make USB OTG functional Otavio Salvador
@ 2018-11-20 18:55 ` Otavio Salvador
  2018-11-27  1:55   ` Andy Yan
  4 siblings, 1 reply; 22+ messages in thread
From: Otavio Salvador @ 2018-11-20 18:55 UTC (permalink / raw)
  To: u-boot

This allow easier integration of RV1108 based boards on generic
distributions and build systems.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---

Changes in v2: None

 include/configs/rv1108_common.h | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/include/configs/rv1108_common.h b/include/configs/rv1108_common.h
index cc0384e2f4..16d4e2e355 100644
--- a/include/configs/rv1108_common.h
+++ b/include/configs/rv1108_common.h
@@ -28,3 +28,18 @@
 #define CONFIG_USB_OHCI_NEW
 #define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS	1
 #endif
+
+#ifndef CONFIG_SPL_BUILD
+#define ENV_MEM_LAYOUT_SETTINGS \
+	"scriptaddr=0x60000000\0" \
+	"fdt_addr_r=0x61f00000\0" \
+	"kernel_addr_r=0x62000000\0" \
+	"ramdisk_addr_r=0x64000000\0"
+
+#include <config_distro_bootcmd.h>
+#define CONFIG_EXTRA_ENV_SETTINGS \
+	ENV_MEM_LAYOUT_SETTINGS \
+	"fdtfile=" CONFIG_DEFAULT_FDT_FILE "\0" \
+	"partitions=" PARTS_DEFAULT \
+	BOOTENV
+#endif
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support Otavio Salvador
@ 2018-11-26 16:18   ` Otavio Salvador
  2018-11-27  1:56     ` Andy Yan
  2018-11-27  1:51   ` Andy Yan
  1 sibling, 1 reply; 22+ messages in thread
From: Otavio Salvador @ 2018-11-26 16:18 UTC (permalink / raw)
  To: u-boot

On Tue, Nov 20, 2018 at 4:56 PM Otavio Salvador <otavio@ossystems.com.br> wrote:
>
> This adds the pinctrl handles to enable the use of eMMC on custom
> boards (as minievk) and makes it easier for later addition.
>
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>

Andy, did you review it? Is there someone which would be more
appropriate for me to send the patches?


-- 
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9 9981-7854          Mobile: +1 (347) 903-9750

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree Otavio Salvador
@ 2018-11-27  1:43   ` Andy Yan
  2018-11-27  9:46     ` Otavio Salvador
  2018-11-30  3:39     ` vicent.chi at rock-chips.com
  0 siblings, 2 replies; 22+ messages in thread
From: Andy Yan @ 2018-11-27  1:43 UTC (permalink / raw)
  To: u-boot

Hi

On 2018/11/21 上午2:55, Otavio Salvador wrote:
> Make adjustments to the rv1108 clock driver in order to align it
> with the internal Rockchip version.
>
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>
> Changes in v2: None
>
>   .../include/asm/arch-rockchip/cru_rv1108.h    | 143 +++++-
>   drivers/clk/rockchip/clk_rv1108.c             | 457 +++++++++++++++++-
>   include/dt-bindings/clock/rv1108-cru.h        | 154 ++++--
>   3 files changed, 706 insertions(+), 48 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/cru_rv1108.h b/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
> index 3cc2ed0187..4ce8caa40f 100644
> --- a/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
> +++ b/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
> @@ -11,7 +11,11 @@
>   #define OSC_HZ		(24 * 1000 * 1000)
>   
>   #define APLL_HZ		(600 * 1000000)
> -#define GPLL_HZ		(594 * 1000000)
> +#define GPLL_HZ		(1188 * 1000000)
> +#define ACLK_PERI_HZ	(148500000)
> +#define HCLK_PERI_HZ	(148500000)
> +#define PCLK_PERI_HZ	(74250000)
> +#define ACLK_BUS_HZ	(148500000)
>   
>   struct rv1108_clk_priv {
>   	struct rv1108_cru *cru;
> @@ -80,6 +84,11 @@ enum {
>   	WORK_MODE_NORMAL	= 1,
>   	DSMPD_SHIFT             = 3,
>   	DSMPD_MASK		= 1 << DSMPD_SHIFT,
> +	INTEGER_MODE			= 1,
> +	GLOBAL_POWER_DOWN_SHIFT		= 0,
> +	GLOBAL_POWER_DOWN_MASK		= 1 << GLOBAL_POWER_DOWN_SHIFT,
> +	GLOBAL_POWER_DOWN		= 1,
> +	GLOBAL_POWER_UP			= 0,
>   
>   	/* CLKSEL0_CON */
>   	CORE_PLL_SEL_SHIFT	= 8,
> @@ -90,11 +99,77 @@ enum {
>   	CORE_CLK_DIV_SHIFT	= 0,
>   	CORE_CLK_DIV_MASK	= 0x1f << CORE_CLK_DIV_SHIFT,
>   
> +	/* CLKSEL_CON1 */
> +	PCLK_DBG_DIV_CON_SHIFT		= 4,
> +	PCLK_DBG_DIV_CON_MASK		= 0xf << PCLK_DBG_DIV_CON_SHIFT,
> +	ACLK_CORE_DIV_CON_SHIFT		= 0,
> +	ACLK_CORE_DIV_CON_MASK		= 7 << ACLK_CORE_DIV_CON_SHIFT,
> +
> +	/* CLKSEL_CON2 */
> +	ACLK_BUS_PLL_SEL_SHIFT		= 8,
> +	ACLK_BUS_PLL_SEL_MASK		= 3 << ACLK_BUS_PLL_SEL_SHIFT,
> +	ACLK_BUS_PLL_SEL_GPLL		= 0,
> +	ACLK_BUS_PLL_SEL_APLL		= 1,
> +	ACLK_BUS_PLL_SEL_DPLL		= 2,
> +	ACLK_BUS_DIV_CON_SHIFT		= 0,
> +	ACLK_BUS_DIV_CON_MASK		= 0x1f << ACLK_BUS_DIV_CON_SHIFT,
> +	ACLK_BUS_DIV_CON_WIDTH		= 5,
> +
> +	/* CLKSEL_CON3 */
> +	PCLK_BUS_DIV_CON_SHIFT		= 8,
> +	PCLK_BUS_DIV_CON_MASK		= 0x1f << PCLK_BUS_DIV_CON_SHIFT,
> +	HCLK_BUS_DIV_CON_SHIFT		= 0,
> +	HCLK_BUS_DIV_CON_MASK		= 0x1f,
> +
> +	/* CLKSEL_CON4 */
> +	CLK_DDR_PLL_SEL_SHIFT		= 8,
> +	CLK_DDR_PLL_SEL_MASK		= 0x3 << CLK_DDR_PLL_SEL_SHIFT,
> +	CLK_DDR_DIV_CON_SHIFT		= 0,
> +	CLK_DDR_DIV_CON_MASK		= 0x3 << CLK_DDR_DIV_CON_SHIFT,
> +
> +	/* CLKSEL_CON19 */
> +	CLK_I2C1_PLL_SEL_SHIFT		= 15,
> +	CLK_I2C1_PLL_SEL_MASK		= 1 << CLK_I2C1_PLL_SEL_SHIFT,
> +	CLK_I2C1_PLL_SEL_DPLL		= 0,
> +	CLK_I2C1_PLL_SEL_GPLL		= 1,
> +	CLK_I2C1_DIV_CON_SHIFT		= 8,
> +	CLK_I2C1_DIV_CON_MASK		= 0x7f << CLK_I2C1_DIV_CON_SHIFT,
> +	CLK_I2C0_PLL_SEL_SHIFT		= 7,
> +	CLK_I2C0_PLL_SEL_MASK		= 1 << CLK_I2C0_PLL_SEL_SHIFT,
> +	CLK_I2C0_DIV_CON_SHIFT		= 0,
> +	CLK_I2C0_DIV_CON_MASK		= 0x7f,
> +	I2C_DIV_CON_WIDTH		= 7,
> +
> +	/* CLKSEL_CON20 */
> +	CLK_I2C3_PLL_SEL_SHIFT		= 15,
> +	CLK_I2C3_PLL_SEL_MASK		= 1 << CLK_I2C3_PLL_SEL_SHIFT,
> +	CLK_I2C3_PLL_SEL_DPLL		= 0,
> +	CLK_I2C3_PLL_SEL_GPLL		= 1,
> +	CLK_I2C3_DIV_CON_SHIFT		= 8,
> +	CLK_I2C3_DIV_CON_MASK		= 0x7f << CLK_I2C3_DIV_CON_SHIFT,
> +	CLK_I2C2_PLL_SEL_SHIFT		= 7,
> +	CLK_I2C2_PLL_SEL_MASK		= 1 << CLK_I2C2_PLL_SEL_SHIFT,
> +	CLK_I2C2_DIV_CON_SHIFT		= 0,
> +	CLK_I2C2_DIV_CON_MASK		= 0x7f,
> +
>   	/* CLKSEL_CON22 */
>   	CLK_SARADC_DIV_CON_SHIFT= 0,
>   	CLK_SARADC_DIV_CON_MASK	= GENMASK(9, 0),
>   	CLK_SARADC_DIV_CON_WIDTH= 10,
>   
> +	/* CLKSEL_CON23 */
> +	ACLK_PERI_PLL_SEL_SHIFT		= 15,
> +	ACLK_PERI_PLL_SEL_MASK		= 1 << ACLK_PERI_PLL_SEL_SHIFT,
> +	ACLK_PERI_PLL_SEL_GPLL		= 0,
> +	ACLK_PERI_PLL_SEL_DPLL		= 1,
> +	PCLK_PERI_DIV_CON_SHIFT		= 10,
> +	PCLK_PERI_DIV_CON_MASK		= 0x1f << PCLK_PERI_DIV_CON_SHIFT,
> +	HCLK_PERI_DIV_CON_SHIFT		= 5,
> +	HCLK_PERI_DIV_CON_MASK		= 0x1f << HCLK_PERI_DIV_CON_SHIFT,
> +	ACLK_PERI_DIV_CON_SHIFT		= 0,
> +	ACLK_PERI_DIV_CON_MASK		= 0x1f,
> +	PERI_DIV_CON_WIDTH		= 5,
> +
>   	/* CLKSEL24_CON */
>   	MAC_PLL_SEL_SHIFT	= 12,
>   	MAC_PLL_SEL_MASK	= 1 << MAC_PLL_SEL_SHIFT,
> @@ -105,6 +180,16 @@ enum {
>   	MAC_CLK_DIV_MASK	= 0x1f,
>   	MAC_CLK_DIV_SHIFT	= 0,
>   
> +	/* CLKSEL25_CON */
> +	EMMC_PLL_SEL_SHIFT	= 12,
> +	EMMC_PLL_SEL_MASK	= 3 << EMMC_PLL_SEL_SHIFT,
> +	EMMC_PLL_SEL_DPLL	= 0,
> +	EMMC_PLL_SEL_GPLL,
> +
> +	/* CLKSEL26_CON */
> +	EMMC_CLK_DIV_SHIFT	= 8,
> +	EMMC_CLK_DIV_MASK	= 0xff << EMMC_CLK_DIV_SHIFT,
> +
>   	/* CLKSEL27_CON */
>   	SFC_PLL_SEL_SHIFT	= 7,
>   	SFC_PLL_SEL_MASK	= 1 << SFC_PLL_SEL_SHIFT,
> @@ -112,5 +197,61 @@ enum {
>   	SFC_PLL_SEL_GPLL	= 1,
>   	SFC_CLK_DIV_SHIFT	= 0,
>   	SFC_CLK_DIV_MASK	= 0x3f << SFC_CLK_DIV_SHIFT,
> +
> +	/* CLKSEL28_CON */
> +	ACLK_VIO1_PLL_SEL_SHIFT		= 14,
> +	ACLK_VIO1_PLL_SEL_MASK		= 3 << ACLK_VIO1_PLL_SEL_SHIFT,
> +	VIO_PLL_SEL_DPLL		= 0,
> +	VIO_PLL_SEL_GPLL		= 1,
> +	ACLK_VIO1_CLK_DIV_SHIFT		= 8,
> +	ACLK_VIO1_CLK_DIV_MASK		= 0x1f << ACLK_VIO1_CLK_DIV_SHIFT,
> +	CLK_VIO_DIV_CON_WIDTH		= 5,
> +	ACLK_VIO0_PLL_SEL_SHIFT		= 6,
> +	ACLK_VIO0_PLL_SEL_MASK		= 3 << ACLK_VIO0_PLL_SEL_SHIFT,
> +	ACLK_VIO0_CLK_DIV_SHIFT		= 0,
> +	ACLK_VIO0_CLK_DIV_MASK		= 0x1f << ACLK_VIO0_CLK_DIV_SHIFT,
> +
> +	/* CLKSEL29_CON */
> +	PCLK_VIO_CLK_DIV_SHIFT		= 8,
> +	PCLK_VIO_CLK_DIV_MASK		= 0x1f << PCLK_VIO_CLK_DIV_SHIFT,
> +	HCLK_VIO_CLK_DIV_SHIFT		= 0,
> +	HCLK_VIO_CLK_DIV_MASK		= 0x1f << HCLK_VIO_CLK_DIV_SHIFT,
> +
> +	/* CLKSEL32_CON */
> +	DCLK_VOP_SEL_SHIFT		= 7,
> +	DCLK_VOP_SEL_MASK		= 1 << DCLK_VOP_SEL_SHIFT,
> +	DCLK_VOP_SEL_HDMI		= 0,
> +	DCLK_VOP_SEL_PLL		= 1,
> +	DCLK_VOP_PLL_SEL_SHIFT		= 6,
> +	DCLK_VOP_PLL_SEL_MASK		= 1 << DCLK_VOP_PLL_SEL_SHIFT,
> +	DCLK_VOP_PLL_SEL_GPLL		= 0,
> +	DCLK_VOP_PLL_SEL_DPLL		= 1,
> +	DCLK_VOP_CLK_DIV_SHIFT		= 0,
> +	DCLK_VOP_CLK_DIV_MASK		= 0x3f << DCLK_VOP_CLK_DIV_SHIFT,
> +	DCLK_VOP_DIV_CON_WIDTH		= 6,
> +
> +	/* SOFTRST1_CON*/
> +	DDRPHY_SRSTN_CLKDIV_REQ_SHIFT	= 0,
> +	DDRPHY_SRSTN_CLKDIV_REQ		= 1,
> +	DDRPHY_SRSTN_CLKDIV_DIS		= 0,
> +	DDRPHY_SRSTN_CLKDIV_REQ_MASK	= 1 << DDRPHY_SRSTN_CLKDIV_REQ_SHIFT,
> +	DDRPHY_SRSTN_REQ_SHIFT		= 1,
> +	DDRPHY_SRSTN_REQ		= 1,
> +	DDRPHY_SRSTN_DIS		= 0,
> +	DDRPHY_SRSTN_REQ_MASK		= 1 << DDRPHY_SRSTN_REQ_SHIFT,
> +	DDRPHY_PSRSTN_REQ_SHIFT		= 2,
> +	DDRPHY_PSRSTN_REQ		= 1,
> +	DDRPHY_PSRSTN_DIS		= 0,
> +	DDRPHY_PSRSTN_REQ_MASK		= 1 << DDRPHY_PSRSTN_REQ_SHIFT,
> +
> +	/* SOFTRST2_CON*/
> +	DDRUPCTL_PSRSTN_REQ_SHIFT	= 0,
> +	DDRUPCTL_PSRSTN_REQ		= 1,
> +	DDRUPCTL_PSRSTN_DIS		= 0,
> +	DDRUPCTL_PSRSTN_REQ_MASK	= 1 << DDRUPCTL_PSRSTN_REQ_SHIFT,
> +	DDRUPCTL_NSRSTN_REQ_SHIFT	= 1,
> +	DDRUPCTL_NSRSTN_REQ		= 1,
> +	DDRUPCTL_NSRSTN_DIS		= 0,
> +	DDRUPCTL_NSRSTN_REQ_MASK	= 1 << DDRUPCTL_NSRSTN_REQ_SHIFT,
>   };
>   #endif
> diff --git a/drivers/clk/rockchip/clk_rv1108.c b/drivers/clk/rockchip/clk_rv1108.c
> index 1f9f534b28..3603568ee7 100644
> --- a/drivers/clk/rockchip/clk_rv1108.c
> +++ b/drivers/clk/rockchip/clk_rv1108.c
> @@ -35,6 +35,9 @@ enum {
>   			 #hz "Hz cannot be hit with PLL "\
>   			 "divisors on line " __stringify(__LINE__));
>   
> +static const struct pll_div apll_init_cfg = PLL_DIVISORS(APLL_HZ, 1, 3, 1);
> +static const struct pll_div gpll_init_cfg = PLL_DIVISORS(GPLL_HZ, 2, 2, 1);
> +
>   /* use integer mode */
>   static inline int rv1108_pll_id(enum rk_clk_id clk_id)
>   {
> @@ -57,6 +60,58 @@ static inline int rv1108_pll_id(enum rk_clk_id clk_id)
>   	return id;
>   }
>   
> +static int rkclk_set_pll(struct rv1108_cru *cru, enum rk_clk_id clk_id,
> +			 const struct pll_div *div)
> +{
> +	int pll_id = rv1108_pll_id(clk_id);
> +	struct rv1108_pll *pll = &cru->pll[pll_id];
> +
> +	/* All PLLs have same VCO and output frequency range restrictions. */
> +	uint vco_hz = OSC_HZ / 1000 * div->fbdiv / div->refdiv * 1000;
> +	uint output_hz = vco_hz / div->postdiv1 / div->postdiv2;
> +
> +	debug("PLL at %p: fb=%d, ref=%d, pst1=%d, pst2=%d, vco=%u Hz, output=%u Hz\n",
> +	      pll, div->fbdiv, div->refdiv, div->postdiv1,
> +	      div->postdiv2, vco_hz, output_hz);
> +	assert(vco_hz >= VCO_MIN_HZ && vco_hz <= VCO_MAX_HZ &&
> +	       output_hz >= OUTPUT_MIN_HZ && output_hz <= OUTPUT_MAX_HZ);
> +
> +	/*
> +	 * When power on or changing PLL setting,
> +	 * we must force PLL into slow mode to ensure output stable clock.
> +	 */
> +	rk_clrsetreg(&pll->con3, WORK_MODE_MASK,
> +		     WORK_MODE_SLOW << WORK_MODE_SHIFT);
> +
> +	/* use integer mode */
> +	rk_setreg(&pll->con3, 1 << DSMPD_SHIFT);
> +	/* Power down */
> +	rk_setreg(&pll->con3, 1 << GLOBAL_POWER_DOWN_SHIFT);
> +
> +	rk_clrsetreg(&pll->con0, FBDIV_MASK, div->fbdiv << FBDIV_SHIFT);
> +	rk_clrsetreg(&pll->con1, POSTDIV1_MASK | POSTDIV2_MASK | REFDIV_MASK,
> +		     (div->postdiv1 << POSTDIV1_SHIFT |
> +		     div->postdiv2 << POSTDIV2_SHIFT |
> +		     div->refdiv << REFDIV_SHIFT));
> +	rk_clrsetreg(&pll->con2, FRACDIV_MASK,
> +		     (div->refdiv << REFDIV_SHIFT));
> +
> +	/* Power Up */
> +	rk_clrreg(&pll->con3, 1 << GLOBAL_POWER_DOWN_SHIFT);
> +
> +	/* waiting for pll lock */
> +	while (readl(&pll->con2) & (1 << LOCK_STA_SHIFT))
> +		udelay(1);
> +
> +	/*
> +	 * set PLL into normal mode.
> +	 */
> +	rk_clrsetreg(&pll->con3, WORK_MODE_MASK,
> +		     WORK_MODE_NORMAL << WORK_MODE_SHIFT);
> +
> +	return 0;
> +}
> +
>   static uint32_t rkclk_pll_get_rate(struct rv1108_cru *cru,
>   				   enum rk_clk_id clk_id)
>   {
> @@ -74,7 +129,7 @@ static uint32_t rkclk_pll_get_rate(struct rv1108_cru *cru,
>   		fbdiv = (con0 >> FBDIV_SHIFT) & FBDIV_MASK;
>   		postdiv1 = (con1 & POSTDIV1_MASK) >> POSTDIV1_SHIFT;
>   		postdiv2 = (con1 & POSTDIV2_MASK) >> POSTDIV2_SHIFT;
> -		refdiv = (con1 & REFDIV_MASK) >> REFDIV_SHIFT;
> +		refdiv = (con1 >> REFDIV_SHIFT) & REFDIV_MASK;
>   		freq = (24 * fbdiv / (refdiv * postdiv1 * postdiv2)) * 1000000;
>   	} else {
>   		freq = OSC_HZ;
> @@ -154,6 +209,322 @@ static ulong rv1108_saradc_set_clk(struct rv1108_cru *cru, uint hz)
>   	return rv1108_saradc_get_clk(cru);
>   }
>   
> +static ulong rv1108_aclk_vio1_get_clk(struct rv1108_cru *cru)
> +{
> +	u32 div, val;
> +
> +	val = readl(&cru->clksel_con[28]);
> +	div = bitfield_extract(val, ACLK_VIO1_CLK_DIV_SHIFT,
> +			       CLK_VIO_DIV_CON_WIDTH);
> +
> +	return DIV_TO_RATE(GPLL_HZ, div);
> +}
> +
> +static ulong rv1108_aclk_vio1_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(GPLL_HZ, hz) - 1;
> +	assert(src_clk_div < 32);
> +
> +	rk_clrsetreg(&cru->clksel_con[28],
> +		     ACLK_VIO1_CLK_DIV_MASK | ACLK_VIO1_PLL_SEL_MASK,
> +		     (src_clk_div << ACLK_VIO1_CLK_DIV_SHIFT) |
> +		     (VIO_PLL_SEL_GPLL << ACLK_VIO1_PLL_SEL_SHIFT));
> +
> +	return rv1108_aclk_vio1_get_clk(cru);
> +}
> +
> +static ulong rv1108_aclk_vio0_get_clk(struct rv1108_cru *cru)
> +{
> +	u32 div, val;
> +
> +	val = readl(&cru->clksel_con[28]);
> +	div = bitfield_extract(val, ACLK_VIO0_CLK_DIV_SHIFT,
> +			       CLK_VIO_DIV_CON_WIDTH);
> +
> +	return DIV_TO_RATE(GPLL_HZ, div);
> +}
> +
> +static ulong rv1108_aclk_vio0_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(GPLL_HZ, hz) - 1;
> +	assert(src_clk_div < 32);
> +
> +	rk_clrsetreg(&cru->clksel_con[28],
> +		     ACLK_VIO0_CLK_DIV_MASK | ACLK_VIO0_PLL_SEL_MASK,
> +		     (src_clk_div << ACLK_VIO0_CLK_DIV_SHIFT) |
> +		     (VIO_PLL_SEL_GPLL << ACLK_VIO0_PLL_SEL_SHIFT));
> +
> +	/*HCLK_VIO default div = 4*/
> +	rk_clrsetreg(&cru->clksel_con[29],
> +		     HCLK_VIO_CLK_DIV_MASK,
> +		     3 << HCLK_VIO_CLK_DIV_SHIFT);
> +	/*PCLK_VIO default div = 4*/
> +	rk_clrsetreg(&cru->clksel_con[29],
> +		     PCLK_VIO_CLK_DIV_MASK,
> +		     3 << PCLK_VIO_CLK_DIV_SHIFT);
> +
> +	return rv1108_aclk_vio0_get_clk(cru);
> +}
> +
> +static ulong rv1108_dclk_vop_get_clk(struct rv1108_cru *cru)
> +{
> +	u32 div, val;
> +
> +	val = readl(&cru->clksel_con[32]);
> +	div = bitfield_extract(val, DCLK_VOP_CLK_DIV_SHIFT,
> +			       DCLK_VOP_DIV_CON_WIDTH);
> +
> +	return DIV_TO_RATE(GPLL_HZ, div);
> +}
> +
> +static ulong rv1108_dclk_vop_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(GPLL_HZ, hz) - 1;
> +	assert(src_clk_div < 64);
> +
> +	rk_clrsetreg(&cru->clksel_con[32],
> +		     DCLK_VOP_CLK_DIV_MASK | DCLK_VOP_PLL_SEL_MASK |
> +		     DCLK_VOP_SEL_SHIFT,
> +		     (src_clk_div << DCLK_VOP_CLK_DIV_SHIFT) |
> +		     (DCLK_VOP_PLL_SEL_GPLL << DCLK_VOP_PLL_SEL_SHIFT) |
> +		     (DCLK_VOP_SEL_PLL << DCLK_VOP_SEL_SHIFT));
> +
> +	return rv1108_dclk_vop_get_clk(cru);
> +}
> +
> +static ulong rv1108_aclk_bus_get_clk(struct rv1108_cru *cru)
> +{
> +	u32 div, val;
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> +	val = readl(&cru->clksel_con[2]);
> +	div = bitfield_extract(val, ACLK_BUS_DIV_CON_SHIFT,
> +			       ACLK_BUS_DIV_CON_WIDTH);
> +
> +	return DIV_TO_RATE(parent_rate, div);
> +}
> +
> +static ulong rv1108_aclk_bus_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> +	int src_clk_div;
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> +	src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
> +	assert(src_clk_div < 32);
> +
> +	rk_clrsetreg(&cru->clksel_con[2],
> +		     ACLK_BUS_DIV_CON_MASK | ACLK_BUS_PLL_SEL_MASK,
> +		     (src_clk_div << ACLK_BUS_DIV_CON_SHIFT) |
> +		     (ACLK_BUS_PLL_SEL_GPLL << ACLK_BUS_PLL_SEL_SHIFT));
> +
> +	return rv1108_aclk_bus_get_clk(cru);
> +}
> +
> +static ulong rv1108_aclk_peri_get_clk(struct rv1108_cru *cru)
> +{
> +	u32 div, val;
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> +	val = readl(&cru->clksel_con[23]);
> +	div = bitfield_extract(val, ACLK_PERI_DIV_CON_SHIFT,
> +			       PERI_DIV_CON_WIDTH);
> +
> +	return DIV_TO_RATE(parent_rate, div);
> +}
> +
> +static ulong rv1108_hclk_peri_get_clk(struct rv1108_cru *cru)
> +{
> +	u32 div, val;
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> +	val = readl(&cru->clksel_con[23]);
> +	div = bitfield_extract(val, HCLK_PERI_DIV_CON_SHIFT,
> +			       PERI_DIV_CON_WIDTH);
> +
> +	return DIV_TO_RATE(parent_rate, div);
> +}
> +
> +static ulong rv1108_pclk_peri_get_clk(struct rv1108_cru *cru)
> +{
> +	u32 div, val;
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> +	val = readl(&cru->clksel_con[23]);
> +	div = bitfield_extract(val, PCLK_PERI_DIV_CON_SHIFT,
> +			       PERI_DIV_CON_WIDTH);
> +
> +	return DIV_TO_RATE(parent_rate, div);
> +}
> +
> +static ulong rv1108_aclk_peri_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> +	int src_clk_div;
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> +	src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
> +	assert(src_clk_div < 32);
> +
> +	rk_clrsetreg(&cru->clksel_con[23],
> +		     ACLK_PERI_DIV_CON_MASK | ACLK_PERI_PLL_SEL_MASK,
> +		     (src_clk_div << ACLK_PERI_DIV_CON_SHIFT) |
> +		     (ACLK_PERI_PLL_SEL_GPLL << ACLK_PERI_PLL_SEL_SHIFT));
> +
> +	return rv1108_aclk_peri_get_clk(cru);
> +}
> +
> +static ulong rv1108_hclk_peri_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> +	int src_clk_div;
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> +	src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
> +	assert(src_clk_div < 32);
> +
> +	rk_clrsetreg(&cru->clksel_con[23],
> +		     HCLK_PERI_DIV_CON_MASK,
> +		     (src_clk_div << HCLK_PERI_DIV_CON_SHIFT));
> +
> +	return rv1108_hclk_peri_get_clk(cru);
> +}
> +
> +static ulong rv1108_pclk_peri_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> +	int src_clk_div;
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> +	src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
> +	assert(src_clk_div < 32);
> +
> +	rk_clrsetreg(&cru->clksel_con[23],
> +		     PCLK_PERI_DIV_CON_MASK,
> +		     (src_clk_div << PCLK_PERI_DIV_CON_SHIFT));
> +
> +	return rv1108_pclk_peri_get_clk(cru);
> +}
> +
> +static ulong rv1108_i2c_get_clk(struct rv1108_cru *cru, ulong clk_id)
> +{
> +	u32 div, con;
> +
> +	switch (clk_id) {
> +	case SCLK_I2C0_PMU:
> +		con = readl(&cru->clksel_con[19]);
> +		div = bitfield_extract(con, CLK_I2C0_DIV_CON_SHIFT,
> +				       I2C_DIV_CON_WIDTH);
> +		break;
> +	case SCLK_I2C1:
> +		con = readl(&cru->clksel_con[19]);
> +		div = bitfield_extract(con, CLK_I2C1_DIV_CON_SHIFT,
> +				       I2C_DIV_CON_WIDTH);
> +		break;
> +	case SCLK_I2C2:
> +		con = readl(&cru->clksel_con[20]);
> +		div = bitfield_extract(con, CLK_I2C2_DIV_CON_SHIFT,
> +				       I2C_DIV_CON_WIDTH);
> +		break;
> +	case SCLK_I2C3:
> +		con = readl(&cru->clksel_con[20]);
> +		div = bitfield_extract(con, CLK_I2C3_DIV_CON_SHIFT,
> +				       I2C_DIV_CON_WIDTH);
> +		break;
> +	default:
> +		printf("do not support this i2c bus\n");
> +		return -EINVAL;
> +	}
> +
> +	return DIV_TO_RATE(GPLL_HZ, div);
> +}
> +
> +static ulong rv1108_i2c_set_clk(struct rv1108_cru *cru, ulong clk_id, uint hz)
> +{
> +	int src_clk_div;
> +
> +	/* i2c0,4,8 src clock from ppll, i2c1,2,3,5,6,7 src clock from gpll*/
> +	src_clk_div = GPLL_HZ / hz;
> +	assert(src_clk_div - 1 <= 127);
> +
> +	switch (clk_id) {
> +	case SCLK_I2C0_PMU:
> +		rk_clrsetreg(&cru->clksel_con[19],
> +			     CLK_I2C0_DIV_CON_MASK | CLK_I2C1_PLL_SEL_MASK,
> +			     (src_clk_div << CLK_I2C0_DIV_CON_SHIFT) |
> +			     (CLK_I2C1_PLL_SEL_GPLL << CLK_I2C1_PLL_SEL_SHIFT));
> +		break;
> +	case SCLK_I2C1:
> +		rk_clrsetreg(&cru->clksel_con[19],
> +			     CLK_I2C1_DIV_CON_MASK | CLK_I2C1_PLL_SEL_MASK,
> +			     (src_clk_div << CLK_I2C1_DIV_CON_SHIFT) |
> +			     (CLK_I2C1_PLL_SEL_GPLL << CLK_I2C1_PLL_SEL_SHIFT));
> +		break;
> +	case SCLK_I2C2:
> +		rk_clrsetreg(&cru->clksel_con[20],
> +			     CLK_I2C2_DIV_CON_MASK | CLK_I2C3_PLL_SEL_MASK,
> +			     (src_clk_div << CLK_I2C2_DIV_CON_SHIFT) |
> +			     (CLK_I2C3_PLL_SEL_GPLL << CLK_I2C3_PLL_SEL_SHIFT));
> +		break;
> +	case SCLK_I2C3:
> +		rk_clrsetreg(&cru->clksel_con[20],
> +			     CLK_I2C3_DIV_CON_MASK | CLK_I2C3_PLL_SEL_MASK,
> +			     (src_clk_div << CLK_I2C3_DIV_CON_SHIFT) |
> +			     (CLK_I2C3_PLL_SEL_GPLL << CLK_I2C3_PLL_SEL_SHIFT));
> +		break;
> +	default:
> +		printf("do not support this i2c bus\n");
> +		return -EINVAL;
> +	}
> +
> +	return rv1108_i2c_get_clk(cru, clk_id);
> +}
> +
> +static ulong rv1108_mmc_get_clk(struct clk *clk)
> +{
> +	struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rv1108_cru *cru = priv->cru;
> +	u32 div, con;
> +
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> +	con = readl(&cru->clksel_con[26]);
> +	div = (con & EMMC_CLK_DIV_MASK) >> EMMC_CLK_DIV_SHIFT;
> +
> +
> +	debug("%s id %ld get_clk %ld\n", __func__, clk->id, DIV_TO_RATE(parent_rate, div));
> +
> +	return DIV_TO_RATE(parent_rate, div);
> +
> +}
> +
> +static ulong rv1108_mmc_set_clk(struct clk *clk, ulong set_rate)
> +{
> +	struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rv1108_cru *cru = priv->cru;
> +	int src_clk_div;
> +
> +	ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +	src_clk_div = DIV_ROUND_UP(parent_rate, set_rate);
> +
> +	if (src_clk_div > 127) {
> +		src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, set_rate);
> +	}
> +
> +	debug("%s id %ld src_clk_div %d\n", __func__, clk->id, src_clk_div);
> +
> +	rk_clrsetreg(&cru->clksel_con[26],
> +		     EMMC_CLK_DIV_MASK , (src_clk_div -1) << EMMC_CLK_DIV_SHIFT);
> +
> +	rk_clrsetreg(&cru->clksel_con[25],
> +		     EMMC_PLL_SEL_MASK , EMMC_PLL_SEL_GPLL << EMMC_PLL_SEL_SHIFT);
> +
> +	return rv1108_mmc_get_clk(clk);
> +}
> +
> +
>   static ulong rv1108_clk_get_rate(struct clk *clk)
>   {
>   	struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
> @@ -163,6 +534,31 @@ static ulong rv1108_clk_get_rate(struct clk *clk)
>   		return rkclk_pll_get_rate(priv->cru, clk->id);
>   	case SCLK_SARADC:
>   		return rv1108_saradc_get_clk(priv->cru);
> +	case ACLK_VIO0:
> +		return rv1108_aclk_vio0_get_clk(priv->cru);
> +	case ACLK_VIO1:
> +		return rv1108_aclk_vio1_get_clk(priv->cru);
> +	case DCLK_VOP:
> +		return rv1108_dclk_vop_get_clk(priv->cru);
> +	case ACLK_PRE:
> +		return rv1108_aclk_bus_get_clk(priv->cru);
> +	case ACLK_PERI:
> +		return rv1108_aclk_peri_get_clk(priv->cru);
> +	case HCLK_PERI:
> +		return rv1108_hclk_peri_get_clk(priv->cru);
> +	case PCLK_PERI:
> +		return rv1108_pclk_peri_get_clk(priv->cru);
> +	case SCLK_I2C0_PMU:
> +	case SCLK_I2C1:
> +	case SCLK_I2C2:
> +	case SCLK_I2C3:
> +		return rv1108_i2c_get_clk(priv->cru, clk->id);
> +	case HCLK_SDMMC:
> +	case HCLK_EMMC:
> +	case SCLK_SDMMC:
> +	case SCLK_EMMC:
> +	case SCLK_EMMC_SAMPLE:
> +		return rv1108_mmc_get_clk(clk);
>   	default:
>   		return -ENOENT;
>   	}
> @@ -183,6 +579,39 @@ static ulong rv1108_clk_set_rate(struct clk *clk, ulong rate)
>   	case SCLK_SARADC:
>   		new_rate = rv1108_saradc_set_clk(priv->cru, rate);
>   		break;
> +	case ACLK_VIO0:
> +		new_rate = rv1108_aclk_vio0_set_clk(priv->cru, rate);
> +		break;
> +	case ACLK_VIO1:
> +		new_rate = rv1108_aclk_vio1_set_clk(priv->cru, rate);
> +		break;
> +	case DCLK_VOP:
> +		new_rate = rv1108_dclk_vop_set_clk(priv->cru, rate);
> +		break;
> +	case ACLK_PRE:
> +		new_rate = rv1108_aclk_bus_set_clk(priv->cru, rate);
> +		break;
> +	case ACLK_PERI:
> +		new_rate = rv1108_aclk_peri_set_clk(priv->cru, rate);
> +		break;
> +	case HCLK_PERI:
> +		new_rate = rv1108_hclk_peri_set_clk(priv->cru, rate);
> +		break;
> +	case PCLK_PERI:
> +		new_rate = rv1108_pclk_peri_set_clk(priv->cru, rate);
> +		break;
> +	case SCLK_I2C0_PMU:
> +	case SCLK_I2C1:
> +	case SCLK_I2C2:
> +	case SCLK_I2C3:
> +		new_rate = rv1108_i2c_set_clk(priv->cru, clk->id, rate);
> +		break;
> +	case HCLK_SDMMC:
> +	case HCLK_EMMC:
> +	case SCLK_SDMMC:
> +	case SCLK_EMMC:
> +		new_rate = rv1108_mmc_set_clk(clk, rate);
> +		break;
>   	default:
>   		return -ENOENT;
>   	}
> @@ -197,14 +626,34 @@ static const struct clk_ops rv1108_clk_ops = {
>   
>   static void rkclk_init(struct rv1108_cru *cru)
>   {
> -	unsigned int apll = rkclk_pll_get_rate(cru, CLK_ARM);
> -	unsigned int dpll = rkclk_pll_get_rate(cru, CLK_DDR);
> -	unsigned int gpll = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +	unsigned int apll, dpll, gpll;
> +	unsigned int aclk_bus, aclk_peri, hclk_peri, pclk_peri;
> +
> +	aclk_bus = rv1108_aclk_bus_set_clk(cru, ACLK_BUS_HZ / 2);
> +	aclk_peri = rv1108_aclk_peri_set_clk(cru, ACLK_PERI_HZ / 2);
> +	hclk_peri = rv1108_hclk_peri_set_clk(cru, HCLK_PERI_HZ / 2);
> +	pclk_peri = rv1108_pclk_peri_set_clk(cru, PCLK_PERI_HZ / 2);
> +	rv1108_aclk_vio0_set_clk(cru, 297000000);
> +	rv1108_aclk_vio1_set_clk(cru, 297000000);
> +
> +	/* configure apll */
> +	rkclk_set_pll(cru, CLK_ARM, &apll_init_cfg);
> +	rkclk_set_pll(cru, CLK_GENERAL, &gpll_init_cfg);
> +	aclk_bus = rv1108_aclk_bus_set_clk(cru, ACLK_BUS_HZ);
> +	aclk_peri = rv1108_aclk_peri_set_clk(cru, ACLK_PERI_HZ);
> +	hclk_peri = rv1108_hclk_peri_set_clk(cru, HCLK_PERI_HZ);
> +	pclk_peri = rv1108_pclk_peri_set_clk(cru, PCLK_PERI_HZ);
> +
> +	apll = rkclk_pll_get_rate(cru, CLK_ARM);
> +	dpll = rkclk_pll_get_rate(cru, CLK_DDR);
> +	gpll = rkclk_pll_get_rate(cru, CLK_GENERAL);
>   
>   	rk_clrsetreg(&cru->clksel_con[0], CORE_CLK_DIV_MASK,
>   		     0 << MAC_CLK_DIV_SHIFT);
>   
>   	printf("APLL: %d DPLL:%d GPLL:%d\n", apll, dpll, gpll);
> +	printf("ACLK_BUS: %d ACLK_PERI:%d HCLK_PERI:%d PCLK_PERI:%d\n",
> +	       aclk_bus, aclk_peri, hclk_peri, pclk_peri);
>   }
>   
>   static int rv1108_clk_ofdata_to_platdata(struct udevice *dev)
> diff --git a/include/dt-bindings/clock/rv1108-cru.h b/include/dt-bindings/clock/rv1108-cru.h
> index 9219a50a24..04e0a59f4b 100644
> --- a/include/dt-bindings/clock/rv1108-cru.h
> +++ b/include/dt-bindings/clock/rv1108-cru.h
> @@ -14,7 +14,6 @@
>   #define ARMCLK				3
>   
>   /* sclk gates (special clocks) */
> -#define SCLK_MAC			64
>   #define SCLK_SPI0			65
>   #define SCLK_NANDC			67
>   #define SCLK_SDMMC			68
> @@ -35,20 +34,77 @@
>   #define SCLK_SDMMC_SAMPLE		84
>   #define SCLK_SDIO_SAMPLE		85
>   #define SCLK_EMMC_SAMPLE		86
> -#define SCLK_MAC_RX			87
> -#define SCLK_MAC_TX			88
> -#define SCLK_MACREF			89
> -#define SCLK_MACREF_OUT			90
> -#define SCLK_SARADC			91
> +#define SCLK_VENC_CORE			87
> +#define SCLK_HEVC_CORE			88
> +#define SCLK_HEVC_CABAC			89
> +#define SCLK_PWM0_PMU			90
> +#define SCLK_I2C0_PMU			91
> +#define SCLK_WIFI			92
> +#define SCLK_CIFOUT			93
> +#define SCLK_MIPI_CSI_OUT		94
> +#define SCLK_CIF0			95
> +#define SCLK_CIF1			96
> +#define SCLK_CIF2			97
> +#define SCLK_CIF3			98
> +#define SCLK_DSP			99
> +#define SCLK_DSP_IOP			100
> +#define SCLK_DSP_EPP			101
> +#define SCLK_DSP_EDP			102
> +#define SCLK_DSP_EDAP			103
> +#define SCLK_CVBS_HOST			104
> +#define SCLK_HDMI_SFR			105
> +#define SCLK_HDMI_CEC			106
> +#define SCLK_CRYPTO			107
> +#define SCLK_SPI			108
> +#define SCLK_SARADC			109
> +#define SCLK_TSADC			110
> +#define SCLK_MAC_PRE			111
> +#define SCLK_MAC			112
> +#define SCLK_MAC_RX			113
> +#define SCLK_MAC_REF			114
> +#define SCLK_MAC_REFOUT			115
> +#define SCLK_DSP_PFM			116
> +#define SCLK_RGA			117
> +#define SCLK_I2C1			118
> +#define SCLK_I2C2			119
> +#define SCLK_I2C3			120
> +#define SCLK_PWM			121
> +#define SCLK_ISP			122
> +#define SCLK_USBPHY			123
> +#define SCLK_I2S0_SRC			124
> +#define SCLK_I2S1_SRC			125
> +#define SCLK_I2S2_SRC			126
> +#define SCLK_UART0_SRC			127
> +#define SCLK_UART1_SRC			128
> +#define SCLK_UART2_SRC			129
> +#define SCLK_MAC_TX			130
> +#define SCLK_MACREF			131
> +#define SCLK_MACREF_OUT			132
>   
> +#define DCLK_VOP_SRC			185
> +#define DCLK_HDMIPHY			186
> +#define DCLK_VOP			187
>   
>   /* aclk gates */
>   #define ACLK_DMAC			192
>   #define ACLK_PRE			193
>   #define ACLK_CORE			194
>   #define ACLK_ENMCORE			195
> -#define ACLK_GMAC			196
> -
> +#define ACLK_RKVENC			196
> +#define ACLK_RKVDEC			197
> +#define ACLK_VPU			198
> +#define ACLK_CIF0			199
> +#define ACLK_VIO0			200
> +#define ACLK_VIO1			201
> +#define ACLK_VOP			202
> +#define ACLK_IEP			203
> +#define ACLK_RGA			204
> +#define ACLK_ISP			205
> +#define ACLK_CIF1			206
> +#define ACLK_CIF2			207
> +#define ACLK_CIF3			208
> +#define ACLK_PERI			209
> +#define ACLK_GMAC			210
>   
>   /* pclk gates */
>   #define PCLK_GPIO1			256
> @@ -67,12 +123,24 @@
>   #define PCLK_PWM			269
>   #define PCLK_TIMER			270
>   #define PCLK_PERI			271
> -#define PCLK_GMAC			272
> -#define PCLK_SARADC			273
> +#define PCLK_GPIO0_PMU			272
> +#define PCLK_I2C0_PMU			273
> +#define PCLK_PWM0_PMU			274
> +#define PCLK_ISP			275
> +#define PCLK_VIO			276
> +#define PCLK_MIPI_DSI			277
> +#define PCLK_HDMI_CTRL			278
> +#define PCLK_SARADC			279
> +#define PCLK_DSP_CFG			280
> +#define PCLK_BUS			281
> +#define PCLK_EFUSE0			282
> +#define PCLK_EFUSE1			283
> +#define PCLK_WDT			284
> +#define PCLK_GMAC			285
>   
>   /* hclk gates */
>   #define HCLK_I2S0_8CH			320
> -#define HCLK_I2S1_8CH			321
> +#define HCLK_I2S1_2CH			321
>   #define HCLK_I2S2_2CH			322
>   #define HCLK_NANDC			323
>   #define HCLK_SDMMC			324
> @@ -80,20 +148,37 @@
>   #define HCLK_EMMC			326
>   #define HCLK_PERI			327
>   #define HCLK_SFC			328
> +#define HCLK_RKVENC			329
> +#define HCLK_RKVDEC			330
> +#define HCLK_CIF0			331
> +#define HCLK_VIO			332
> +#define HCLK_VOP			333
> +#define HCLK_IEP			334
> +#define HCLK_RGA			335
> +#define HCLK_ISP			336
> +#define HCLK_CRYPTO_MST			337
> +#define HCLK_CRYPTO_SLV			338
> +#define HCLK_HOST0			339
> +#define HCLK_OTG			340
> +#define HCLK_CIF1			341
> +#define HCLK_CIF2			342
> +#define HCLK_CIF3			343
> +#define HCLK_BUS			344
> +#define HCLK_VPU			345
>   
> -#define CLK_NR_CLKS			(HCLK_SFC + 1)
> +#define CLK_NR_CLKS			(HCLK_VPU + 1)
>   
>   /* reset id */
> -#define SRST_CORE_PO_AD		0
> +#define SRST_CORE_PO_AD			0
>   #define SRST_CORE_AD			1
>   #define SRST_L2_AD			2
> -#define SRST_CPU_NIU_AD		3
> +#define SRST_CPU_NIU_AD			3
>   #define SRST_CORE_PO			4
>   #define SRST_CORE			5
> -#define SRST_L2			6
> +#define SRST_L2				6
>   #define SRST_CORE_DBG			8
>   #define PRST_DBG			9
> -#define RST_DAP			10
> +#define RST_DAP				10
>   #define PRST_DBG_NIU			11
>   #define ARST_STRC_SYS_AD		15
>   
> @@ -160,9 +245,9 @@
>   #define HRST_SYSBUS			75
>   #define PRST_USBGRF			76
>   
> -#define ARST_PERIPH_NIU		80
> -#define HRST_PERIPH_NIU		81
> -#define PRST_PERIPH_NIU		82
> +#define ARST_PERIPH_NIU			80
> +#define HRST_PERIPH_NIU			81
> +#define PRST_PERIPH_NIU			82
>   #define HRST_PERIPH			83
>   #define HRST_SDMMC			84
>   #define HRST_SDIO			85
> @@ -180,28 +265,11 @@
>   #define HRST_HOST0_AUX			96
>   #define HRST_HOST0_ARB			97
>   #define SRST_HOST0_EHCIPHY		98
> -#define SRST_HOST0_UTMI		99
> +#define SRST_HOST0_UTMI			99
>   #define SRST_USBPOR			100
>   #define SRST_UTMI0			101
>   #define SRST_UTMI1			102
>   
> -#define ARST_VIO0_NIU			102
> -#define ARST_VIO1_NIU			103
> -#define HRST_VIO_NIU			104
> -#define PRST_VIO_NIU			105
> -#define ARST_VOP			106
> -#define HRST_VOP			107
> -#define DRST_VOP			108
> -#define ARST_IEP			109
> -#define HRST_IEP			110
> -#define ARST_RGA			111
> -#define HRST_RGA			112
> -#define SRST_RGA			113
> -#define PRST_CVBS			114
> -#define PRST_HDMI			115
> -#define SRST_HDMI			116
> -#define PRST_MIPI_DSI			117


Why these display devices removed?

> -
>   #define ARST_ISP_NIU			118
>   #define HRST_ISP_NIU			119
>   #define HRST_ISP			120
> @@ -227,21 +295,21 @@
>   #define HRST_VPU_NIU			141
>   #define ARST_VPU			142
>   #define HRST_VPU			143
> -#define ARST_RKVDEC_NIU		144
> -#define HRST_RKVDEC_NIU		145
> +#define ARST_RKVDEC_NIU			144
> +#define HRST_RKVDEC_NIU			145
>   #define ARST_RKVDEC			146
>   #define HRST_RKVDEC			147
>   #define SRST_RKVDEC_CABAC		148
>   #define SRST_RKVDEC_CORE		149
> -#define ARST_RKVENC_NIU		150
> -#define HRST_RKVENC_NIU		151
> +#define ARST_RKVENC_NIU			150
> +#define HRST_RKVENC_NIU			151
>   #define ARST_RKVENC			152
>   #define HRST_RKVENC			153
>   #define SRST_RKVENC_CORE		154
>   
>   #define SRST_DSP_CORE			156
>   #define SRST_DSP_SYS			157
> -#define SRST_DSP_GLOBAL		158
> +#define SRST_DSP_GLOBAL			158
>   #define SRST_DSP_OECM			159
>   #define PRST_DSP_IOP_NIU		160
>   #define ARST_DSP_EPP_NIU		161
> @@ -259,7 +327,7 @@
>   #define SRST_PMU_I2C0			173
>   #define PRST_PMU_I2C0			174
>   #define PRST_PMU_GPIO0			175
> -#define PRST_PMU_INTMEM		176
> +#define PRST_PMU_INTMEM			176
>   #define PRST_PMU_PWM0			177
>   #define SRST_PMU_PWM0			178
>   #define PRST_PMU_GRF			179

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 2/5] rv1108: Enable BOUNCE_BUFFER
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 2/5] rv1108: Enable BOUNCE_BUFFER Otavio Salvador
@ 2018-11-27  1:45   ` Andy Yan
  0 siblings, 0 replies; 22+ messages in thread
From: Andy Yan @ 2018-11-27  1:45 UTC (permalink / raw)
  To: u-boot

Hi

On 2018/11/21 上午2:55, Otavio Salvador wrote:
> In order to be able to build the Rockchip eMMC driver on rv1108, the
> BOUNCE_BUFFER option needs to be selected. Select it like it is done
> on the other Rockchip SoC common files.
>
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>
> Changes in v2:
> - new patch
>
>   include/configs/rv1108_common.h | 3 +++
>   1 file changed, 3 insertions(+)
>
> diff --git a/include/configs/rv1108_common.h b/include/configs/rv1108_common.h
> index 2ab3b85e0c..cc0384e2f4 100644
> --- a/include/configs/rv1108_common.h
> +++ b/include/configs/rv1108_common.h
> @@ -17,6 +17,9 @@
>   #define CONFIG_SYS_TIMER_BASE		0x10350020
>   #define CONFIG_SYS_TIMER_COUNTER	(CONFIG_SYS_TIMER_BASE + 8)
>   
> +/* MMC/SD IP block */
> +#define CONFIG_BOUNCE_BUFFER
> +
>   #define CONFIG_SYS_SDRAM_BASE		0x60000000
>   #define CONFIG_SYS_INIT_SP_ADDR		(CONFIG_SYS_TEXT_BASE + 0x100000)
>   #define CONFIG_SYS_LOAD_ADDR		(CONFIG_SYS_SDRAM_BASE + 0x2000000)


Reviewed-by: Andy Yan <andy.yan@rock-chips.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support Otavio Salvador
  2018-11-26 16:18   ` Otavio Salvador
@ 2018-11-27  1:51   ` Andy Yan
  2018-11-27  9:33     ` Otavio Salvador
  1 sibling, 1 reply; 22+ messages in thread
From: Andy Yan @ 2018-11-27  1:51 UTC (permalink / raw)
  To: u-boot

Hi:

  The subject should be something like: "Arm: dts: rockchip: add emmc 
pinctrl for rv1108"

On 2018/11/21 上午2:55, Otavio Salvador wrote:
> This adds the pinctrl handles to enable the use of eMMC on custom
> boards (as minievk) and makes it easier for later addition.
>
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>
> Changes in v2:
> - split bounce buffer change on a new patch
>
>   arch/arm/dts/rv1108.dtsi | 29 +++++++++++++++++++++++++++++
>   1 file changed, 29 insertions(+)
>
> diff --git a/arch/arm/dts/rv1108.dtsi b/arch/arm/dts/rv1108.dtsi
> index acfd97e18d..23a44bfaca 100644
> --- a/arch/arm/dts/rv1108.dtsi
> +++ b/arch/arm/dts/rv1108.dtsi
> @@ -427,6 +427,35 @@
>   			};
>   		};
>   
> +		emmc {
> +			emmc_clk: emmc-clk {
> +				rockchip,pins = <2 RK_PB6 RK_FUNC_1 &pcfg_pull_none_drv_8ma>;
> +			};
> +
> +			emmc_cmd: emmc-cmd {
> +				rockchip,pins = <2 RK_PB4 RK_FUNC_2 &pcfg_pull_up_drv_8ma>;
> +			};
> +
> +			emmc_pwren: emmc-pwren {
> +				rockchip,pins = <2 RK_PC2 RK_FUNC_2 &pcfg_pull_none>;
> +			};
> +
> +			emmc_bus1: emmc-bus1 {
> +				rockchip,pins = <2 RK_PA0 RK_FUNC_2 &pcfg_pull_up_drv_8ma>;
> +			};
> +
> +			emmc_bus8: emmc-bus8 {
> +				rockchip,pins = <2 RK_PA0 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
> +						<2 RK_PA1 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
> +						<2 RK_PA2 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
> +						<2 RK_PA3 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
> +						<2 RK_PA4 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
> +						<2 RK_PA5 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
> +						<2 RK_PA6 RK_FUNC_2 &pcfg_pull_up_drv_8ma>,
> +						<2 RK_PA7 RK_FUNC_2 &pcfg_pull_up_drv_8ma>;
> +			};
> +		};
> +
>   		sdmmc {
>   			sdmmc_clk: sdmmc-clk {
>   				rockchip,pins = <3 RK_PC4 RK_FUNC_1 &pcfg_pull_none_drv_4ma>;

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 4/5] rv1108: Make USB OTG functional
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 4/5] rv1108: Make USB OTG functional Otavio Salvador
@ 2018-11-27  1:54   ` Andy Yan
  0 siblings, 0 replies; 22+ messages in thread
From: Andy Yan @ 2018-11-27  1:54 UTC (permalink / raw)
  To: u-boot

Hi:

On 2018/11/21 上午2:55, Otavio Salvador wrote:
> Like it is done for other Rockchip SoCs, introduce a board_usb_init()
> function so that USB OTG can be functional on rv1108 too.
>
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>
> Changes in v2: None
>
>   arch/arm/dts/rv1108.dtsi              | 45 ++++++++++++++-
>   arch/arm/mach-rockchip/Makefile       |  1 +
>   arch/arm/mach-rockchip/rv1108-board.c | 81 +++++++++++++++++++++++++++
>   3 files changed, 124 insertions(+), 3 deletions(-)
>   create mode 100644 arch/arm/mach-rockchip/rv1108-board.c


It's better to split dtsi and .c file

>
> diff --git a/arch/arm/dts/rv1108.dtsi b/arch/arm/dts/rv1108.dtsi
> index 23a44bfaca..215d885225 100644
> --- a/arch/arm/dts/rv1108.dtsi
> +++ b/arch/arm/dts/rv1108.dtsi
> @@ -121,8 +121,35 @@
>   	};
>   
>   	grf: syscon at 10300000 {
> -		compatible = "rockchip,rv1108-grf", "syscon";
> +		compatible = "rockchip,rv1108-grf", "syscon", "simple-mfd";
>   		reg = <0x10300000 0x1000>;
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +
> +		u2phy: usb2-phy at 100 {
> +			compatible = "rockchip,rv1108-usb2phy";
> +			reg = <0x100 0x0c>;
> +			clocks = <&cru SCLK_USBPHY>;
> +			clock-names = "phyclk";
> +			#clock-cells = <0>;
> +			clock-output-names = "usbphy";
> +			rockchip,usbgrf = <&usbgrf>;
> +			status = "disabled";
> +
> +			u2phy_otg: otg-port {
> +				interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
> +				interrupt-names = "otg-mux";
> +				#phy-cells = <0>;
> +				status = "disabled";
> +			};
> +
> +			u2phy_host: host-port {
> +				interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
> +				interrupt-names = "linestate";
> +				#phy-cells = <0>;
> +				status = "disabled";
> +			};
> +		};
>   	};
>   
>   	saradc: saradc at 1038c000 {
> @@ -141,6 +168,11 @@
>   		reg = <0x20060000 0x1000>;
>   	};
>   
> +	usbgrf: syscon at 202a0000 {
> +		compatible = "rockchip,rv1108-usbgrf", "syscon";
> +		reg = <0x202a0000 0x1000>;
> +	};
> +
>   	cru: clock-controller at 20200000 {
>   		compatible = "rockchip,rv1108-cru";
>   		reg = <0x20200000 0x1000>;
> @@ -200,12 +232,19 @@
>   	};
>   
>   	usb20_otg: usb at 30180000 {
> -		compatible = "rockchip,rv1108-usb", "rockchip,rk3288-usb",
> +		compatible = "rockchip,rv1108-usb", "rockchip,rk3066-usb",
>   			     "snps,dwc2";
>   		reg = <0x30180000 0x40000>;
>   		interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
> -		hnp-srp-disable;
> +		clocks = <&cru HCLK_OTG>;
> +		clock-names = "otg";
>   		dr_mode = "otg";
> +		g-np-tx-fifo-size = <16>;
> +		g-rx-fifo-size = <280>;
> +		g-tx-fifo-size = <256 128 128 64 32 16>;
> +		g-use-dma;
> +		phys = <&u2phy_otg>;
> +		phy-names = "usb2-phy";
>   		status = "disabled";
>   	};
>   
> diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
> index 05706c472a..368302e1da 100644
> --- a/arch/arm/mach-rockchip/Makefile
> +++ b/arch/arm/mach-rockchip/Makefile
> @@ -33,6 +33,7 @@ obj-$(CONFIG_ROCKCHIP_RK322X) += rk322x-board.o
>   obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board.o
>   obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board.o
>   obj-$(CONFIG_ROCKCHIP_RK3399) += rk3399-board.o
> +obj-$(CONFIG_ROCKCHIP_RV1108) += rv1108-board.o
>   endif
>   
>   obj-$(CONFIG_$(SPL_TPL_)RAM) += sdram_common.o
> diff --git a/arch/arm/mach-rockchip/rv1108-board.c b/arch/arm/mach-rockchip/rv1108-board.c
> new file mode 100644
> index 0000000000..3412f2c063
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/rv1108-board.c
> @@ -0,0 +1,81 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2015 Google, Inc
> + */
> +
> +#include <common.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG)
> +#include <usb.h>
> +#include <usb/dwc2_udc.h>
> +
> +static struct dwc2_plat_otg_data rv1108_otg_data = {
> +	.rx_fifo_sz	= 512,
> +	.np_tx_fifo_sz	= 16,
> +	.tx_fifo_sz	= 128,
> +};
> +
> +int board_usb_init(int index, enum usb_init_type init)
> +{
> +	const void *blob = gd->fdt_blob;
> +	bool matched = false;
> +	int node, phy_node;
> +	u32 grf_phy_offset;
> +	const char *mode;
> +
> +	/* find the usb_otg node */
> +	node = fdt_node_offset_by_compatible(blob, -1, "rockchip,rk3066-usb");
> +	while (node > 0) {
> +		mode = fdt_getprop(blob, node, "dr_mode", NULL);
> +		if (mode && strcmp(mode, "otg") == 0) {
> +			matched = true;
> +			break;
> +		}
> +
> +		node = fdt_node_offset_by_compatible(blob, node,
> +						     "rockchip,rk3066-usb");
> +	}
> +
> +	if (!matched) {
> +		debug("usb_otg device not found\n");
> +		return -ENODEV;
> +	}
> +
> +	rv1108_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
> +
> +	node = fdtdec_lookup_phandle(blob, node, "phys");
> +	if (node <= 0) {
> +		debug("phys node not found\n");
> +		return -ENODEV;
> +	}
> +
> +	phy_node = fdt_parent_offset(blob, node);
> +	if (phy_node <= 0) {
> +		debug("usb phy node not found\n");
> +		return -ENODEV;
> +	}
> +
> +	rv1108_otg_data.phy_of_node = phy_node;
> +	grf_phy_offset = fdtdec_get_addr(blob, node, "reg");
> +
> +	/* find the grf node */
> +	node = fdt_node_offset_by_compatible(blob, -1,
> +					     "rockchip,rv1108-grf");
> +	if (node <= 0) {
> +		debug("grf node not found\n");
> +		return -ENODEV;
> +	}
> +
> +	rv1108_otg_data.regs_phy = grf_phy_offset + fdtdec_get_addr(blob, node,
> +								    "reg");
> +
> +	return dwc2_udc_probe(&rv1108_otg_data);
> +}
> +
> +int board_usb_cleanup(int index, enum usb_init_type init)
> +{
> +	return 0;
> +}
> +#endif

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 5/5] rv1108: Add support for default distro_bootcmd
  2018-11-20 18:55 ` [U-Boot] [PATCH v2 5/5] rv1108: Add support for default distro_bootcmd Otavio Salvador
@ 2018-11-27  1:55   ` Andy Yan
  0 siblings, 0 replies; 22+ messages in thread
From: Andy Yan @ 2018-11-27  1:55 UTC (permalink / raw)
  To: u-boot

Hi:

On 2018/11/21 上午2:55, Otavio Salvador wrote:
> This allow easier integration of RV1108 based boards on generic
> distributions and build systems.
>
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>
> Changes in v2: None
>
>   include/configs/rv1108_common.h | 15 +++++++++++++++
>   1 file changed, 15 insertions(+)
>
> diff --git a/include/configs/rv1108_common.h b/include/configs/rv1108_common.h
> index cc0384e2f4..16d4e2e355 100644
> --- a/include/configs/rv1108_common.h
> +++ b/include/configs/rv1108_common.h
> @@ -28,3 +28,18 @@
>   #define CONFIG_USB_OHCI_NEW
>   #define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS	1
>   #endif
> +
> +#ifndef CONFIG_SPL_BUILD
> +#define ENV_MEM_LAYOUT_SETTINGS \
> +	"scriptaddr=0x60000000\0" \
> +	"fdt_addr_r=0x61f00000\0" \
> +	"kernel_addr_r=0x62000000\0" \
> +	"ramdisk_addr_r=0x64000000\0"
> +
> +#include <config_distro_bootcmd.h>
> +#define CONFIG_EXTRA_ENV_SETTINGS \
> +	ENV_MEM_LAYOUT_SETTINGS \
> +	"fdtfile=" CONFIG_DEFAULT_FDT_FILE "\0" \
> +	"partitions=" PARTS_DEFAULT \
> +	BOOTENV
> +#endif


Reviewed-by: Andy Yan <andy.yan@rock-chips.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support
  2018-11-26 16:18   ` Otavio Salvador
@ 2018-11-27  1:56     ` Andy Yan
  2018-11-27  1:59       ` Philipp Tomsich
  0 siblings, 1 reply; 22+ messages in thread
From: Andy Yan @ 2018-11-27  1:56 UTC (permalink / raw)
  To: u-boot

Hi:

On 2018/11/27 上午12:18, Otavio Salvador wrote:
> On Tue, Nov 20, 2018 at 4:56 PM Otavio Salvador <otavio@ossystems.com.br> wrote:
>> This adds the pinctrl handles to enable the use of eMMC on custom
>> boards (as minievk) and makes it easier for later addition.
>>
>> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> Andy, did you review it? Is there someone which would be more
> appropriate for me to send the patches?


Thte whole series will to through Dr. Philipp Tomsich

>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support
  2018-11-27  1:56     ` Andy Yan
@ 2018-11-27  1:59       ` Philipp Tomsich
  0 siblings, 0 replies; 22+ messages in thread
From: Philipp Tomsich @ 2018-11-27  1:59 UTC (permalink / raw)
  To: u-boot



> On 27.11.2018, at 02:56, Andy Yan <andy.yan@rock-chips.com> wrote:
> 
> Hi:
> 
> On 2018/11/27 上午12:18, Otavio Salvador wrote:
>> On Tue, Nov 20, 2018 at 4:56 PM Otavio Salvador <otavio@ossystems.com.br> wrote:
>>> This adds the pinctrl handles to enable the use of eMMC on custom
>>> boards (as minievk) and makes it easier for later addition.
>>> 
>>> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
>> Andy, did you review it? Is there someone which would be more
>> appropriate for me to send the patches?
> 
> 
> Thte whole series will to through Dr. Philipp Tomsich

And I’ve been reading the reviews as you sent them out.
Thanks for helping out on reviewing these… as I don’t have the RV1108 documentation
I rely on others to provide feedback.

Cheers,
Philipp.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support
  2018-11-27  1:51   ` Andy Yan
@ 2018-11-27  9:33     ` Otavio Salvador
  0 siblings, 0 replies; 22+ messages in thread
From: Otavio Salvador @ 2018-11-27  9:33 UTC (permalink / raw)
  To: u-boot

On Mon, Nov 26, 2018 at 11:51 PM Andy Yan <andy.yan@rock-chips.com> wrote:
>   The subject should be something like: "Arm: dts: rockchip: add emmc
> pinctrl for rv1108"


Thanks, I am preparing a v3 and will send it soon.



-- 
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9 9981-7854          Mobile: +1 (347) 903-9750

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
  2018-11-27  1:43   ` Andy Yan
@ 2018-11-27  9:46     ` Otavio Salvador
  2018-11-30  3:39     ` vicent.chi at rock-chips.com
  1 sibling, 0 replies; 22+ messages in thread
From: Otavio Salvador @ 2018-11-27  9:46 UTC (permalink / raw)
  To: u-boot

On Mon, Nov 26, 2018 at 11:43 PM Andy Yan <andy.yan@rock-chips.com> wrote:
> On 2018/11/21 上午2:55, Otavio Salvador wrote:
> > -#define ARST_VIO0_NIU                        102
> > -#define ARST_VIO1_NIU                        103
> > -#define HRST_VIO_NIU                 104
> > -#define PRST_VIO_NIU                 105
> > -#define ARST_VOP                     106
> > -#define HRST_VOP                     107
> > -#define DRST_VOP                     108
> > -#define ARST_IEP                     109
> > -#define HRST_IEP                     110
> > -#define ARST_RGA                     111
> > -#define HRST_RGA                     112
> > -#define SRST_RGA                     113
> > -#define PRST_CVBS                    114
> > -#define PRST_HDMI                    115
> > -#define SRST_HDMI                    116
> > -#define PRST_MIPI_DSI                        117
>
>
> Why these display devices removed?

Good catch, it was a leftover change. I am reverting this for next patchset.

-- 
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9 9981-7854          Mobile: +1 (347) 903-9750

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
  2018-11-27  1:43   ` Andy Yan
  2018-11-27  9:46     ` Otavio Salvador
@ 2018-11-30  3:39     ` vicent.chi at rock-chips.com
  2018-11-30  9:58       ` Otavio Salvador
  1 sibling, 1 reply; 22+ messages in thread
From: vicent.chi at rock-chips.com @ 2018-11-30  3:39 UTC (permalink / raw)
  To: u-boot

Hi Otavio Salvador:
       Fixed a problem of rv1108 emmc clock configuration.
       I am afraid that the code between us is not synchronized, so I also send the modified files to you.
       Thank you!

```
diff --git a/arch/arm/include/asm/arch-rockchip/cru_rv1108.h b/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
index 60a5db2..d220d0d 100644
--- a/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
+++ b/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
@@ -186,6 +186,7 @@ enum {
        EMMC_PLL_SEL_MASK       = 3 << EMMC_PLL_SEL_SHIFT,
        EMMC_PLL_SEL_DPLL       = 0,
        EMMC_PLL_SEL_GPLL,
+       EMMC_PLL_SEL_OSC,
 
        /* CLKSEL26_CON */
        EMMC_CLK_DIV_SHIFT      = 8,
diff --git a/drivers/clk/rockchip/clk_rv1108.c b/drivers/clk/rockchip/clk_rv1108.c
index d95fe739..b758240 100644
--- a/drivers/clk/rockchip/clk_rv1108.c
+++ b/drivers/clk/rockchip/clk_rv1108.c
@@ -484,49 +484,53 @@ static ulong rv1108_i2c_set_clk(struct rv1108_cru *cru, ulong clk_id, uint hz)
        return rv1108_i2c_get_clk(cru, clk_id);
 }
 
-static ulong rv1108_mmc_get_clk(struct clk *clk)
+static ulong rv1108_mmc_get_clk(struct rv1108_cru *cru)
 {
-       struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
-       struct rv1108_cru *cru = priv->cru;
        u32 div, con;
-
-       ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+       ulong mmc_clk;
 
        con = readl(&cru->clksel_con[26]);
-       div = (con & EMMC_CLK_DIV_MASK) >> EMMC_CLK_DIV_SHIFT;
-
+       div = bitfield_extract(con, EMMC_CLK_DIV_SHIFT, 8);
 
-       debug("%s id %ld get_clk %ld\n", __func__, clk->id, DIV_TO_RATE(parent_rate, div));
+       con = readl(&cru->clksel_con[25]);
 
-       return DIV_TO_RATE(parent_rate, div);
+       if ((con & EMMC_PLL_SEL_MASK) >> EMMC_PLL_SEL_SHIFT == EMMC_PLL_SEL_OSC)
+               mmc_clk = DIV_TO_RATE(OSC_HZ, div) / 2;
+       else
+               mmc_clk = DIV_TO_RATE(GPLL_HZ, div) / 2;
 
+       debug("%s div %d get_clk %ld\n", __func__, div, mmc_clk);
+       return mmc_clk;
 }
 
-static ulong rv1108_mmc_set_clk(struct clk *clk, ulong set_rate)
+static ulong rv1108_mmc_set_clk(struct rv1108_cru *cru, ulong rate)
 {
-       struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
-       struct rv1108_cru *cru = priv->cru;
-       int src_clk_div;
+       int div;
+       u32 pll_rate;
 
-       ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
-       src_clk_div = DIV_ROUND_UP(parent_rate, set_rate);
+       div = DIV_ROUND_UP(rkclk_pll_get_rate(cru, CLK_GENERAL), rate);
 
-       if (src_clk_div > 127) {
-               src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, set_rate);
+       if (div < 127) {
+               debug("%s source gpll\n", __func__);
+               rk_clrsetreg(&cru->clksel_con[25], EMMC_PLL_SEL_MASK,
+                           (EMMC_PLL_SEL_GPLL << EMMC_PLL_SEL_SHIFT));
+               pll_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
+       } else {
+               debug("%s source 24m\n", __func__);
+               rk_clrsetreg(&cru->clksel_con[25], EMMC_PLL_SEL_MASK,
+                           (EMMC_PLL_SEL_OSC << EMMC_PLL_SEL_SHIFT));
+               pll_rate = OSC_HZ;
        }
 
-       debug("%s id %ld src_clk_div %d\n", __func__, clk->id, src_clk_div);
+       div = DIV_ROUND_UP(pll_rate / 2, rate);
+       rk_clrsetreg(&cru->clksel_con[26], EMMC_CLK_DIV_MASK,
+                   ((div - 1) << EMMC_CLK_DIV_SHIFT));
 
-       rk_clrsetreg(&cru->clksel_con[26],
-                    EMMC_CLK_DIV_MASK , (src_clk_div -1) << EMMC_CLK_DIV_SHIFT);
+       debug("%s set_rate %ld div %d\n", __func__,  rate, div);
 
-       rk_clrsetreg(&cru->clksel_con[25],
-                    EMMC_PLL_SEL_MASK , EMMC_PLL_SEL_GPLL << EMMC_PLL_SEL_SHIFT);
-
-       return rv1108_mmc_get_clk(clk);
+       return DIV_TO_RATE(pll_rate, div);
 }
 
-
 static ulong rv1108_clk_get_rate(struct clk *clk)
 {
        struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
@@ -555,12 +559,10 @@ static ulong rv1108_clk_get_rate(struct clk *clk)
        case SCLK_I2C2:
        case SCLK_I2C3:
                return rv1108_i2c_get_clk(priv->cru, clk->id);
-       case HCLK_SDMMC:
        case HCLK_EMMC:
-       case SCLK_SDMMC:
        case SCLK_EMMC:
        case SCLK_EMMC_SAMPLE:
-               return rv1108_mmc_get_clk(clk);
+               return rv1108_mmc_get_clk(priv->cru);
        default:
                return -ENOENT;
        }
@@ -608,11 +610,9 @@ static ulong rv1108_clk_set_rate(struct clk *clk, ulong rate)
        case SCLK_I2C3:
                new_rate = rv1108_i2c_set_clk(priv->cru, clk->id, rate);
                break;
-       case HCLK_SDMMC:
        case HCLK_EMMC:
-       case SCLK_SDMMC:
        case SCLK_EMMC:
-               new_rate = rv1108_mmc_set_clk(clk, rate);
+               new_rate = rv1108_mmc_set_clk(priv->cru, rate);
                break;
        default:
                return -ENOENT;
(END)
```




vicent.chi at rock-chips.com
 
From: Andy Yan
Date: 2018-11-27 09:43
To: Otavio Salvador; U-Boot Mailing List
CC: Jason Zhu; Vicent Chi; Albert Aribaud; Philipp Tomsich; Simon Glass; zhangqing
Subject: Re: [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
Hi
 
On 2018/11/21 上午2:55, Otavio Salvador wrote:
> Make adjustments to the rv1108 clock driver in order to align it
> with the internal Rockchip version.
>
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>
> Changes in v2: None
>
>   .../include/asm/arch-rockchip/cru_rv1108.h    | 143 +++++-
>   drivers/clk/rockchip/clk_rv1108.c             | 457 +++++++++++++++++-
>   include/dt-bindings/clock/rv1108-cru.h        | 154 ++++--
>   3 files changed, 706 insertions(+), 48 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/cru_rv1108.h b/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
> index 3cc2ed0187..4ce8caa40f 100644
> --- a/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
> +++ b/arch/arm/include/asm/arch-rockchip/cru_rv1108.h
> @@ -11,7 +11,11 @@
>   #define OSC_HZ (24 * 1000 * 1000)
>   
>   #define APLL_HZ (600 * 1000000)
> -#define GPLL_HZ (594 * 1000000)
> +#define GPLL_HZ (1188 * 1000000)
> +#define ACLK_PERI_HZ (148500000)
> +#define HCLK_PERI_HZ (148500000)
> +#define PCLK_PERI_HZ (74250000)
> +#define ACLK_BUS_HZ (148500000)
>   
>   struct rv1108_clk_priv {
>   struct rv1108_cru *cru;
> @@ -80,6 +84,11 @@ enum {
>   WORK_MODE_NORMAL = 1,
>   DSMPD_SHIFT             = 3,
>   DSMPD_MASK = 1 << DSMPD_SHIFT,
> + INTEGER_MODE = 1,
> + GLOBAL_POWER_DOWN_SHIFT = 0,
> + GLOBAL_POWER_DOWN_MASK = 1 << GLOBAL_POWER_DOWN_SHIFT,
> + GLOBAL_POWER_DOWN = 1,
> + GLOBAL_POWER_UP = 0,
>   
>   /* CLKSEL0_CON */
>   CORE_PLL_SEL_SHIFT = 8,
> @@ -90,11 +99,77 @@ enum {
>   CORE_CLK_DIV_SHIFT = 0,
>   CORE_CLK_DIV_MASK = 0x1f << CORE_CLK_DIV_SHIFT,
>   
> + /* CLKSEL_CON1 */
> + PCLK_DBG_DIV_CON_SHIFT = 4,
> + PCLK_DBG_DIV_CON_MASK = 0xf << PCLK_DBG_DIV_CON_SHIFT,
> + ACLK_CORE_DIV_CON_SHIFT = 0,
> + ACLK_CORE_DIV_CON_MASK = 7 << ACLK_CORE_DIV_CON_SHIFT,
> +
> + /* CLKSEL_CON2 */
> + ACLK_BUS_PLL_SEL_SHIFT = 8,
> + ACLK_BUS_PLL_SEL_MASK = 3 << ACLK_BUS_PLL_SEL_SHIFT,
> + ACLK_BUS_PLL_SEL_GPLL = 0,
> + ACLK_BUS_PLL_SEL_APLL = 1,
> + ACLK_BUS_PLL_SEL_DPLL = 2,
> + ACLK_BUS_DIV_CON_SHIFT = 0,
> + ACLK_BUS_DIV_CON_MASK = 0x1f << ACLK_BUS_DIV_CON_SHIFT,
> + ACLK_BUS_DIV_CON_WIDTH = 5,
> +
> + /* CLKSEL_CON3 */
> + PCLK_BUS_DIV_CON_SHIFT = 8,
> + PCLK_BUS_DIV_CON_MASK = 0x1f << PCLK_BUS_DIV_CON_SHIFT,
> + HCLK_BUS_DIV_CON_SHIFT = 0,
> + HCLK_BUS_DIV_CON_MASK = 0x1f,
> +
> + /* CLKSEL_CON4 */
> + CLK_DDR_PLL_SEL_SHIFT = 8,
> + CLK_DDR_PLL_SEL_MASK = 0x3 << CLK_DDR_PLL_SEL_SHIFT,
> + CLK_DDR_DIV_CON_SHIFT = 0,
> + CLK_DDR_DIV_CON_MASK = 0x3 << CLK_DDR_DIV_CON_SHIFT,
> +
> + /* CLKSEL_CON19 */
> + CLK_I2C1_PLL_SEL_SHIFT = 15,
> + CLK_I2C1_PLL_SEL_MASK = 1 << CLK_I2C1_PLL_SEL_SHIFT,
> + CLK_I2C1_PLL_SEL_DPLL = 0,
> + CLK_I2C1_PLL_SEL_GPLL = 1,
> + CLK_I2C1_DIV_CON_SHIFT = 8,
> + CLK_I2C1_DIV_CON_MASK = 0x7f << CLK_I2C1_DIV_CON_SHIFT,
> + CLK_I2C0_PLL_SEL_SHIFT = 7,
> + CLK_I2C0_PLL_SEL_MASK = 1 << CLK_I2C0_PLL_SEL_SHIFT,
> + CLK_I2C0_DIV_CON_SHIFT = 0,
> + CLK_I2C0_DIV_CON_MASK = 0x7f,
> + I2C_DIV_CON_WIDTH = 7,
> +
> + /* CLKSEL_CON20 */
> + CLK_I2C3_PLL_SEL_SHIFT = 15,
> + CLK_I2C3_PLL_SEL_MASK = 1 << CLK_I2C3_PLL_SEL_SHIFT,
> + CLK_I2C3_PLL_SEL_DPLL = 0,
> + CLK_I2C3_PLL_SEL_GPLL = 1,
> + CLK_I2C3_DIV_CON_SHIFT = 8,
> + CLK_I2C3_DIV_CON_MASK = 0x7f << CLK_I2C3_DIV_CON_SHIFT,
> + CLK_I2C2_PLL_SEL_SHIFT = 7,
> + CLK_I2C2_PLL_SEL_MASK = 1 << CLK_I2C2_PLL_SEL_SHIFT,
> + CLK_I2C2_DIV_CON_SHIFT = 0,
> + CLK_I2C2_DIV_CON_MASK = 0x7f,
> +
>   /* CLKSEL_CON22 */
>   CLK_SARADC_DIV_CON_SHIFT= 0,
>   CLK_SARADC_DIV_CON_MASK = GENMASK(9, 0),
>   CLK_SARADC_DIV_CON_WIDTH= 10,
>   
> + /* CLKSEL_CON23 */
> + ACLK_PERI_PLL_SEL_SHIFT = 15,
> + ACLK_PERI_PLL_SEL_MASK = 1 << ACLK_PERI_PLL_SEL_SHIFT,
> + ACLK_PERI_PLL_SEL_GPLL = 0,
> + ACLK_PERI_PLL_SEL_DPLL = 1,
> + PCLK_PERI_DIV_CON_SHIFT = 10,
> + PCLK_PERI_DIV_CON_MASK = 0x1f << PCLK_PERI_DIV_CON_SHIFT,
> + HCLK_PERI_DIV_CON_SHIFT = 5,
> + HCLK_PERI_DIV_CON_MASK = 0x1f << HCLK_PERI_DIV_CON_SHIFT,
> + ACLK_PERI_DIV_CON_SHIFT = 0,
> + ACLK_PERI_DIV_CON_MASK = 0x1f,
> + PERI_DIV_CON_WIDTH = 5,
> +
>   /* CLKSEL24_CON */
>   MAC_PLL_SEL_SHIFT = 12,
>   MAC_PLL_SEL_MASK = 1 << MAC_PLL_SEL_SHIFT,
> @@ -105,6 +180,16 @@ enum {
>   MAC_CLK_DIV_MASK = 0x1f,
>   MAC_CLK_DIV_SHIFT = 0,
>   
> + /* CLKSEL25_CON */
> + EMMC_PLL_SEL_SHIFT = 12,
> + EMMC_PLL_SEL_MASK = 3 << EMMC_PLL_SEL_SHIFT,
> + EMMC_PLL_SEL_DPLL = 0,
> + EMMC_PLL_SEL_GPLL,
> +
> + /* CLKSEL26_CON */
> + EMMC_CLK_DIV_SHIFT = 8,
> + EMMC_CLK_DIV_MASK = 0xff << EMMC_CLK_DIV_SHIFT,
> +
>   /* CLKSEL27_CON */
>   SFC_PLL_SEL_SHIFT = 7,
>   SFC_PLL_SEL_MASK = 1 << SFC_PLL_SEL_SHIFT,
> @@ -112,5 +197,61 @@ enum {
>   SFC_PLL_SEL_GPLL = 1,
>   SFC_CLK_DIV_SHIFT = 0,
>   SFC_CLK_DIV_MASK = 0x3f << SFC_CLK_DIV_SHIFT,
> +
> + /* CLKSEL28_CON */
> + ACLK_VIO1_PLL_SEL_SHIFT = 14,
> + ACLK_VIO1_PLL_SEL_MASK = 3 << ACLK_VIO1_PLL_SEL_SHIFT,
> + VIO_PLL_SEL_DPLL = 0,
> + VIO_PLL_SEL_GPLL = 1,
> + ACLK_VIO1_CLK_DIV_SHIFT = 8,
> + ACLK_VIO1_CLK_DIV_MASK = 0x1f << ACLK_VIO1_CLK_DIV_SHIFT,
> + CLK_VIO_DIV_CON_WIDTH = 5,
> + ACLK_VIO0_PLL_SEL_SHIFT = 6,
> + ACLK_VIO0_PLL_SEL_MASK = 3 << ACLK_VIO0_PLL_SEL_SHIFT,
> + ACLK_VIO0_CLK_DIV_SHIFT = 0,
> + ACLK_VIO0_CLK_DIV_MASK = 0x1f << ACLK_VIO0_CLK_DIV_SHIFT,
> +
> + /* CLKSEL29_CON */
> + PCLK_VIO_CLK_DIV_SHIFT = 8,
> + PCLK_VIO_CLK_DIV_MASK = 0x1f << PCLK_VIO_CLK_DIV_SHIFT,
> + HCLK_VIO_CLK_DIV_SHIFT = 0,
> + HCLK_VIO_CLK_DIV_MASK = 0x1f << HCLK_VIO_CLK_DIV_SHIFT,
> +
> + /* CLKSEL32_CON */
> + DCLK_VOP_SEL_SHIFT = 7,
> + DCLK_VOP_SEL_MASK = 1 << DCLK_VOP_SEL_SHIFT,
> + DCLK_VOP_SEL_HDMI = 0,
> + DCLK_VOP_SEL_PLL = 1,
> + DCLK_VOP_PLL_SEL_SHIFT = 6,
> + DCLK_VOP_PLL_SEL_MASK = 1 << DCLK_VOP_PLL_SEL_SHIFT,
> + DCLK_VOP_PLL_SEL_GPLL = 0,
> + DCLK_VOP_PLL_SEL_DPLL = 1,
> + DCLK_VOP_CLK_DIV_SHIFT = 0,
> + DCLK_VOP_CLK_DIV_MASK = 0x3f << DCLK_VOP_CLK_DIV_SHIFT,
> + DCLK_VOP_DIV_CON_WIDTH = 6,
> +
> + /* SOFTRST1_CON*/
> + DDRPHY_SRSTN_CLKDIV_REQ_SHIFT = 0,
> + DDRPHY_SRSTN_CLKDIV_REQ = 1,
> + DDRPHY_SRSTN_CLKDIV_DIS = 0,
> + DDRPHY_SRSTN_CLKDIV_REQ_MASK = 1 << DDRPHY_SRSTN_CLKDIV_REQ_SHIFT,
> + DDRPHY_SRSTN_REQ_SHIFT = 1,
> + DDRPHY_SRSTN_REQ = 1,
> + DDRPHY_SRSTN_DIS = 0,
> + DDRPHY_SRSTN_REQ_MASK = 1 << DDRPHY_SRSTN_REQ_SHIFT,
> + DDRPHY_PSRSTN_REQ_SHIFT = 2,
> + DDRPHY_PSRSTN_REQ = 1,
> + DDRPHY_PSRSTN_DIS = 0,
> + DDRPHY_PSRSTN_REQ_MASK = 1 << DDRPHY_PSRSTN_REQ_SHIFT,
> +
> + /* SOFTRST2_CON*/
> + DDRUPCTL_PSRSTN_REQ_SHIFT = 0,
> + DDRUPCTL_PSRSTN_REQ = 1,
> + DDRUPCTL_PSRSTN_DIS = 0,
> + DDRUPCTL_PSRSTN_REQ_MASK = 1 << DDRUPCTL_PSRSTN_REQ_SHIFT,
> + DDRUPCTL_NSRSTN_REQ_SHIFT = 1,
> + DDRUPCTL_NSRSTN_REQ = 1,
> + DDRUPCTL_NSRSTN_DIS = 0,
> + DDRUPCTL_NSRSTN_REQ_MASK = 1 << DDRUPCTL_NSRSTN_REQ_SHIFT,
>   };
>   #endif
> diff --git a/drivers/clk/rockchip/clk_rv1108.c b/drivers/clk/rockchip/clk_rv1108.c
> index 1f9f534b28..3603568ee7 100644
> --- a/drivers/clk/rockchip/clk_rv1108.c
> +++ b/drivers/clk/rockchip/clk_rv1108.c
> @@ -35,6 +35,9 @@ enum {
>   #hz "Hz cannot be hit with PLL "\
>   "divisors on line " __stringify(__LINE__));
>   
> +static const struct pll_div apll_init_cfg = PLL_DIVISORS(APLL_HZ, 1, 3, 1);
> +static const struct pll_div gpll_init_cfg = PLL_DIVISORS(GPLL_HZ, 2, 2, 1);
> +
>   /* use integer mode */
>   static inline int rv1108_pll_id(enum rk_clk_id clk_id)
>   {
> @@ -57,6 +60,58 @@ static inline int rv1108_pll_id(enum rk_clk_id clk_id)
>   return id;
>   }
>   
> +static int rkclk_set_pll(struct rv1108_cru *cru, enum rk_clk_id clk_id,
> + const struct pll_div *div)
> +{
> + int pll_id = rv1108_pll_id(clk_id);
> + struct rv1108_pll *pll = &cru->pll[pll_id];
> +
> + /* All PLLs have same VCO and output frequency range restrictions. */
> + uint vco_hz = OSC_HZ / 1000 * div->fbdiv / div->refdiv * 1000;
> + uint output_hz = vco_hz / div->postdiv1 / div->postdiv2;
> +
> + debug("PLL at %p: fb=%d, ref=%d, pst1=%d, pst2=%d, vco=%u Hz, output=%u Hz\n",
> +       pll, div->fbdiv, div->refdiv, div->postdiv1,
> +       div->postdiv2, vco_hz, output_hz);
> + assert(vco_hz >= VCO_MIN_HZ && vco_hz <= VCO_MAX_HZ &&
> +        output_hz >= OUTPUT_MIN_HZ && output_hz <= OUTPUT_MAX_HZ);
> +
> + /*
> + * When power on or changing PLL setting,
> + * we must force PLL into slow mode to ensure output stable clock.
> + */
> + rk_clrsetreg(&pll->con3, WORK_MODE_MASK,
> +      WORK_MODE_SLOW << WORK_MODE_SHIFT);
> +
> + /* use integer mode */
> + rk_setreg(&pll->con3, 1 << DSMPD_SHIFT);
> + /* Power down */
> + rk_setreg(&pll->con3, 1 << GLOBAL_POWER_DOWN_SHIFT);
> +
> + rk_clrsetreg(&pll->con0, FBDIV_MASK, div->fbdiv << FBDIV_SHIFT);
> + rk_clrsetreg(&pll->con1, POSTDIV1_MASK | POSTDIV2_MASK | REFDIV_MASK,
> +      (div->postdiv1 << POSTDIV1_SHIFT |
> +      div->postdiv2 << POSTDIV2_SHIFT |
> +      div->refdiv << REFDIV_SHIFT));
> + rk_clrsetreg(&pll->con2, FRACDIV_MASK,
> +      (div->refdiv << REFDIV_SHIFT));
> +
> + /* Power Up */
> + rk_clrreg(&pll->con3, 1 << GLOBAL_POWER_DOWN_SHIFT);
> +
> + /* waiting for pll lock */
> + while (readl(&pll->con2) & (1 << LOCK_STA_SHIFT))
> + udelay(1);
> +
> + /*
> + * set PLL into normal mode.
> + */
> + rk_clrsetreg(&pll->con3, WORK_MODE_MASK,
> +      WORK_MODE_NORMAL << WORK_MODE_SHIFT);
> +
> + return 0;
> +}
> +
>   static uint32_t rkclk_pll_get_rate(struct rv1108_cru *cru,
>      enum rk_clk_id clk_id)
>   {
> @@ -74,7 +129,7 @@ static uint32_t rkclk_pll_get_rate(struct rv1108_cru *cru,
>   fbdiv = (con0 >> FBDIV_SHIFT) & FBDIV_MASK;
>   postdiv1 = (con1 & POSTDIV1_MASK) >> POSTDIV1_SHIFT;
>   postdiv2 = (con1 & POSTDIV2_MASK) >> POSTDIV2_SHIFT;
> - refdiv = (con1 & REFDIV_MASK) >> REFDIV_SHIFT;
> + refdiv = (con1 >> REFDIV_SHIFT) & REFDIV_MASK;
>   freq = (24 * fbdiv / (refdiv * postdiv1 * postdiv2)) * 1000000;
>   } else {
>   freq = OSC_HZ;
> @@ -154,6 +209,322 @@ static ulong rv1108_saradc_set_clk(struct rv1108_cru *cru, uint hz)
>   return rv1108_saradc_get_clk(cru);
>   }
>   
> +static ulong rv1108_aclk_vio1_get_clk(struct rv1108_cru *cru)
> +{
> + u32 div, val;
> +
> + val = readl(&cru->clksel_con[28]);
> + div = bitfield_extract(val, ACLK_VIO1_CLK_DIV_SHIFT,
> +        CLK_VIO_DIV_CON_WIDTH);
> +
> + return DIV_TO_RATE(GPLL_HZ, div);
> +}
> +
> +static ulong rv1108_aclk_vio1_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> + int src_clk_div;
> +
> + src_clk_div = DIV_ROUND_UP(GPLL_HZ, hz) - 1;
> + assert(src_clk_div < 32);
> +
> + rk_clrsetreg(&cru->clksel_con[28],
> +      ACLK_VIO1_CLK_DIV_MASK | ACLK_VIO1_PLL_SEL_MASK,
> +      (src_clk_div << ACLK_VIO1_CLK_DIV_SHIFT) |
> +      (VIO_PLL_SEL_GPLL << ACLK_VIO1_PLL_SEL_SHIFT));
> +
> + return rv1108_aclk_vio1_get_clk(cru);
> +}
> +
> +static ulong rv1108_aclk_vio0_get_clk(struct rv1108_cru *cru)
> +{
> + u32 div, val;
> +
> + val = readl(&cru->clksel_con[28]);
> + div = bitfield_extract(val, ACLK_VIO0_CLK_DIV_SHIFT,
> +        CLK_VIO_DIV_CON_WIDTH);
> +
> + return DIV_TO_RATE(GPLL_HZ, div);
> +}
> +
> +static ulong rv1108_aclk_vio0_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> + int src_clk_div;
> +
> + src_clk_div = DIV_ROUND_UP(GPLL_HZ, hz) - 1;
> + assert(src_clk_div < 32);
> +
> + rk_clrsetreg(&cru->clksel_con[28],
> +      ACLK_VIO0_CLK_DIV_MASK | ACLK_VIO0_PLL_SEL_MASK,
> +      (src_clk_div << ACLK_VIO0_CLK_DIV_SHIFT) |
> +      (VIO_PLL_SEL_GPLL << ACLK_VIO0_PLL_SEL_SHIFT));
> +
> + /*HCLK_VIO default div = 4*/
> + rk_clrsetreg(&cru->clksel_con[29],
> +      HCLK_VIO_CLK_DIV_MASK,
> +      3 << HCLK_VIO_CLK_DIV_SHIFT);
> + /*PCLK_VIO default div = 4*/
> + rk_clrsetreg(&cru->clksel_con[29],
> +      PCLK_VIO_CLK_DIV_MASK,
> +      3 << PCLK_VIO_CLK_DIV_SHIFT);
> +
> + return rv1108_aclk_vio0_get_clk(cru);
> +}
> +
> +static ulong rv1108_dclk_vop_get_clk(struct rv1108_cru *cru)
> +{
> + u32 div, val;
> +
> + val = readl(&cru->clksel_con[32]);
> + div = bitfield_extract(val, DCLK_VOP_CLK_DIV_SHIFT,
> +        DCLK_VOP_DIV_CON_WIDTH);
> +
> + return DIV_TO_RATE(GPLL_HZ, div);
> +}
> +
> +static ulong rv1108_dclk_vop_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> + int src_clk_div;
> +
> + src_clk_div = DIV_ROUND_UP(GPLL_HZ, hz) - 1;
> + assert(src_clk_div < 64);
> +
> + rk_clrsetreg(&cru->clksel_con[32],
> +      DCLK_VOP_CLK_DIV_MASK | DCLK_VOP_PLL_SEL_MASK |
> +      DCLK_VOP_SEL_SHIFT,
> +      (src_clk_div << DCLK_VOP_CLK_DIV_SHIFT) |
> +      (DCLK_VOP_PLL_SEL_GPLL << DCLK_VOP_PLL_SEL_SHIFT) |
> +      (DCLK_VOP_SEL_PLL << DCLK_VOP_SEL_SHIFT));
> +
> + return rv1108_dclk_vop_get_clk(cru);
> +}
> +
> +static ulong rv1108_aclk_bus_get_clk(struct rv1108_cru *cru)
> +{
> + u32 div, val;
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> + val = readl(&cru->clksel_con[2]);
> + div = bitfield_extract(val, ACLK_BUS_DIV_CON_SHIFT,
> +        ACLK_BUS_DIV_CON_WIDTH);
> +
> + return DIV_TO_RATE(parent_rate, div);
> +}
> +
> +static ulong rv1108_aclk_bus_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> + int src_clk_div;
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> + src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
> + assert(src_clk_div < 32);
> +
> + rk_clrsetreg(&cru->clksel_con[2],
> +      ACLK_BUS_DIV_CON_MASK | ACLK_BUS_PLL_SEL_MASK,
> +      (src_clk_div << ACLK_BUS_DIV_CON_SHIFT) |
> +      (ACLK_BUS_PLL_SEL_GPLL << ACLK_BUS_PLL_SEL_SHIFT));
> +
> + return rv1108_aclk_bus_get_clk(cru);
> +}
> +
> +static ulong rv1108_aclk_peri_get_clk(struct rv1108_cru *cru)
> +{
> + u32 div, val;
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> + val = readl(&cru->clksel_con[23]);
> + div = bitfield_extract(val, ACLK_PERI_DIV_CON_SHIFT,
> +        PERI_DIV_CON_WIDTH);
> +
> + return DIV_TO_RATE(parent_rate, div);
> +}
> +
> +static ulong rv1108_hclk_peri_get_clk(struct rv1108_cru *cru)
> +{
> + u32 div, val;
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> + val = readl(&cru->clksel_con[23]);
> + div = bitfield_extract(val, HCLK_PERI_DIV_CON_SHIFT,
> +        PERI_DIV_CON_WIDTH);
> +
> + return DIV_TO_RATE(parent_rate, div);
> +}
> +
> +static ulong rv1108_pclk_peri_get_clk(struct rv1108_cru *cru)
> +{
> + u32 div, val;
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> + val = readl(&cru->clksel_con[23]);
> + div = bitfield_extract(val, PCLK_PERI_DIV_CON_SHIFT,
> +        PERI_DIV_CON_WIDTH);
> +
> + return DIV_TO_RATE(parent_rate, div);
> +}
> +
> +static ulong rv1108_aclk_peri_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> + int src_clk_div;
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> + src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
> + assert(src_clk_div < 32);
> +
> + rk_clrsetreg(&cru->clksel_con[23],
> +      ACLK_PERI_DIV_CON_MASK | ACLK_PERI_PLL_SEL_MASK,
> +      (src_clk_div << ACLK_PERI_DIV_CON_SHIFT) |
> +      (ACLK_PERI_PLL_SEL_GPLL << ACLK_PERI_PLL_SEL_SHIFT));
> +
> + return rv1108_aclk_peri_get_clk(cru);
> +}
> +
> +static ulong rv1108_hclk_peri_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> + int src_clk_div;
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> + src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
> + assert(src_clk_div < 32);
> +
> + rk_clrsetreg(&cru->clksel_con[23],
> +      HCLK_PERI_DIV_CON_MASK,
> +      (src_clk_div << HCLK_PERI_DIV_CON_SHIFT));
> +
> + return rv1108_hclk_peri_get_clk(cru);
> +}
> +
> +static ulong rv1108_pclk_peri_set_clk(struct rv1108_cru *cru, uint hz)
> +{
> + int src_clk_div;
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> + src_clk_div = DIV_ROUND_UP(parent_rate, hz) - 1;
> + assert(src_clk_div < 32);
> +
> + rk_clrsetreg(&cru->clksel_con[23],
> +      PCLK_PERI_DIV_CON_MASK,
> +      (src_clk_div << PCLK_PERI_DIV_CON_SHIFT));
> +
> + return rv1108_pclk_peri_get_clk(cru);
> +}
> +
> +static ulong rv1108_i2c_get_clk(struct rv1108_cru *cru, ulong clk_id)
> +{
> + u32 div, con;
> +
> + switch (clk_id) {
> + case SCLK_I2C0_PMU:
> + con = readl(&cru->clksel_con[19]);
> + div = bitfield_extract(con, CLK_I2C0_DIV_CON_SHIFT,
> +        I2C_DIV_CON_WIDTH);
> + break;
> + case SCLK_I2C1:
> + con = readl(&cru->clksel_con[19]);
> + div = bitfield_extract(con, CLK_I2C1_DIV_CON_SHIFT,
> +        I2C_DIV_CON_WIDTH);
> + break;
> + case SCLK_I2C2:
> + con = readl(&cru->clksel_con[20]);
> + div = bitfield_extract(con, CLK_I2C2_DIV_CON_SHIFT,
> +        I2C_DIV_CON_WIDTH);
> + break;
> + case SCLK_I2C3:
> + con = readl(&cru->clksel_con[20]);
> + div = bitfield_extract(con, CLK_I2C3_DIV_CON_SHIFT,
> +        I2C_DIV_CON_WIDTH);
> + break;
> + default:
> + printf("do not support this i2c bus\n");
> + return -EINVAL;
> + }
> +
> + return DIV_TO_RATE(GPLL_HZ, div);
> +}
> +
> +static ulong rv1108_i2c_set_clk(struct rv1108_cru *cru, ulong clk_id, uint hz)
> +{
> + int src_clk_div;
> +
> + /* i2c0,4,8 src clock from ppll, i2c1,2,3,5,6,7 src clock from gpll*/
> + src_clk_div = GPLL_HZ / hz;
> + assert(src_clk_div - 1 <= 127);
> +
> + switch (clk_id) {
> + case SCLK_I2C0_PMU:
> + rk_clrsetreg(&cru->clksel_con[19],
> +      CLK_I2C0_DIV_CON_MASK | CLK_I2C1_PLL_SEL_MASK,
> +      (src_clk_div << CLK_I2C0_DIV_CON_SHIFT) |
> +      (CLK_I2C1_PLL_SEL_GPLL << CLK_I2C1_PLL_SEL_SHIFT));
> + break;
> + case SCLK_I2C1:
> + rk_clrsetreg(&cru->clksel_con[19],
> +      CLK_I2C1_DIV_CON_MASK | CLK_I2C1_PLL_SEL_MASK,
> +      (src_clk_div << CLK_I2C1_DIV_CON_SHIFT) |
> +      (CLK_I2C1_PLL_SEL_GPLL << CLK_I2C1_PLL_SEL_SHIFT));
> + break;
> + case SCLK_I2C2:
> + rk_clrsetreg(&cru->clksel_con[20],
> +      CLK_I2C2_DIV_CON_MASK | CLK_I2C3_PLL_SEL_MASK,
> +      (src_clk_div << CLK_I2C2_DIV_CON_SHIFT) |
> +      (CLK_I2C3_PLL_SEL_GPLL << CLK_I2C3_PLL_SEL_SHIFT));
> + break;
> + case SCLK_I2C3:
> + rk_clrsetreg(&cru->clksel_con[20],
> +      CLK_I2C3_DIV_CON_MASK | CLK_I2C3_PLL_SEL_MASK,
> +      (src_clk_div << CLK_I2C3_DIV_CON_SHIFT) |
> +      (CLK_I2C3_PLL_SEL_GPLL << CLK_I2C3_PLL_SEL_SHIFT));
> + break;
> + default:
> + printf("do not support this i2c bus\n");
> + return -EINVAL;
> + }
> +
> + return rv1108_i2c_get_clk(cru, clk_id);
> +}
> +
> +static ulong rv1108_mmc_get_clk(struct clk *clk)
> +{
> + struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
> + struct rv1108_cru *cru = priv->cru;
> + u32 div, con;
> +
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> +
> + con = readl(&cru->clksel_con[26]);
> + div = (con & EMMC_CLK_DIV_MASK) >> EMMC_CLK_DIV_SHIFT;
> +
> +
> + debug("%s id %ld get_clk %ld\n", __func__, clk->id, DIV_TO_RATE(parent_rate, div));
> +
> + return DIV_TO_RATE(parent_rate, div);
> +
> +}
> +
> +static ulong rv1108_mmc_set_clk(struct clk *clk, ulong set_rate)
> +{
> + struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
> + struct rv1108_cru *cru = priv->cru;
> + int src_clk_div;
> +
> + ulong parent_rate = rkclk_pll_get_rate(cru, CLK_GENERAL);
> + src_clk_div = DIV_ROUND_UP(parent_rate, set_rate);
> +
> + if (src_clk_div > 127) {
> + src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, set_rate);
> + }
> +
> + debug("%s id %ld src_clk_div %d\n", __func__, clk->id, src_clk_div);
> +
> + rk_clrsetreg(&cru->clksel_con[26],
> +      EMMC_CLK_DIV_MASK , (src_clk_div -1) << EMMC_CLK_DIV_SHIFT);
> +
> + rk_clrsetreg(&cru->clksel_con[25],
> +      EMMC_PLL_SEL_MASK , EMMC_PLL_SEL_GPLL << EMMC_PLL_SEL_SHIFT);
> +
> + return rv1108_mmc_get_clk(clk);
> +}
> +
> +
>   static ulong rv1108_clk_get_rate(struct clk *clk)
>   {
>   struct rv1108_clk_priv *priv = dev_get_priv(clk->dev);
> @@ -163,6 +534,31 @@ static ulong rv1108_clk_get_rate(struct clk *clk)
>   return rkclk_pll_get_rate(priv->cru, clk->id);
>   case SCLK_SARADC:
>   return rv1108_saradc_get_clk(priv->cru);
> + case ACLK_VIO0:
> + return rv1108_aclk_vio0_get_clk(priv->cru);
> + case ACLK_VIO1:
> + return rv1108_aclk_vio1_get_clk(priv->cru);
> + case DCLK_VOP:
> + return rv1108_dclk_vop_get_clk(priv->cru);
> + case ACLK_PRE:
> + return rv1108_aclk_bus_get_clk(priv->cru);
> + case ACLK_PERI:
> + return rv1108_aclk_peri_get_clk(priv->cru);
> + case HCLK_PERI:
> + return rv1108_hclk_peri_get_clk(priv->cru);
> + case PCLK_PERI:
> + return rv1108_pclk_peri_get_clk(priv->cru);
> + case SCLK_I2C0_PMU:
> + case SCLK_I2C1:
> + case SCLK_I2C2:
> + case SCLK_I2C3:
> + return rv1108_i2c_get_clk(priv->cru, clk->id);
> + case HCLK_SDMMC:
> + case HCLK_EMMC:
> + case SCLK_SDMMC:
> + case SCLK_EMMC:
> + case SCLK_EMMC_SAMPLE:
> + return rv1108_mmc_get_clk(clk);
>   default:
>   return -ENOENT;
>   }
> @@ -183,6 +579,39 @@ static ulong rv1108_clk_set_rate(struct clk *clk, ulong rate)
>   case SCLK_SARADC:
>   new_rate = rv1108_saradc_set_clk(priv->cru, rate);
>   break;
> + case ACLK_VIO0:
> + new_rate = rv1108_aclk_vio0_set_clk(priv->cru, rate);
> + break;
> + case ACLK_VIO1:
> + new_rate = rv1108_aclk_vio1_set_clk(priv->cru, rate);
> + break;
> + case DCLK_VOP:
> + new_rate = rv1108_dclk_vop_set_clk(priv->cru, rate);
> + break;
> + case ACLK_PRE:
> + new_rate = rv1108_aclk_bus_set_clk(priv->cru, rate);
> + break;
> + case ACLK_PERI:
> + new_rate = rv1108_aclk_peri_set_clk(priv->cru, rate);
> + break;
> + case HCLK_PERI:
> + new_rate = rv1108_hclk_peri_set_clk(priv->cru, rate);
> + break;
> + case PCLK_PERI:
> + new_rate = rv1108_pclk_peri_set_clk(priv->cru, rate);
> + break;
> + case SCLK_I2C0_PMU:
> + case SCLK_I2C1:
> + case SCLK_I2C2:
> + case SCLK_I2C3:
> + new_rate = rv1108_i2c_set_clk(priv->cru, clk->id, rate);
> + break;
> + case HCLK_SDMMC:
> + case HCLK_EMMC:
> + case SCLK_SDMMC:
> + case SCLK_EMMC:
> + new_rate = rv1108_mmc_set_clk(clk, rate);
> + break;
>   default:
>   return -ENOENT;
>   }
> @@ -197,14 +626,34 @@ static const struct clk_ops rv1108_clk_ops = {
>   
>   static void rkclk_init(struct rv1108_cru *cru)
>   {
> - unsigned int apll = rkclk_pll_get_rate(cru, CLK_ARM);
> - unsigned int dpll = rkclk_pll_get_rate(cru, CLK_DDR);
> - unsigned int gpll = rkclk_pll_get_rate(cru, CLK_GENERAL);
> + unsigned int apll, dpll, gpll;
> + unsigned int aclk_bus, aclk_peri, hclk_peri, pclk_peri;
> +
> + aclk_bus = rv1108_aclk_bus_set_clk(cru, ACLK_BUS_HZ / 2);
> + aclk_peri = rv1108_aclk_peri_set_clk(cru, ACLK_PERI_HZ / 2);
> + hclk_peri = rv1108_hclk_peri_set_clk(cru, HCLK_PERI_HZ / 2);
> + pclk_peri = rv1108_pclk_peri_set_clk(cru, PCLK_PERI_HZ / 2);
> + rv1108_aclk_vio0_set_clk(cru, 297000000);
> + rv1108_aclk_vio1_set_clk(cru, 297000000);
> +
> + /* configure apll */
> + rkclk_set_pll(cru, CLK_ARM, &apll_init_cfg);
> + rkclk_set_pll(cru, CLK_GENERAL, &gpll_init_cfg);
> + aclk_bus = rv1108_aclk_bus_set_clk(cru, ACLK_BUS_HZ);
> + aclk_peri = rv1108_aclk_peri_set_clk(cru, ACLK_PERI_HZ);
> + hclk_peri = rv1108_hclk_peri_set_clk(cru, HCLK_PERI_HZ);
> + pclk_peri = rv1108_pclk_peri_set_clk(cru, PCLK_PERI_HZ);
> +
> + apll = rkclk_pll_get_rate(cru, CLK_ARM);
> + dpll = rkclk_pll_get_rate(cru, CLK_DDR);
> + gpll = rkclk_pll_get_rate(cru, CLK_GENERAL);
>   
>   rk_clrsetreg(&cru->clksel_con[0], CORE_CLK_DIV_MASK,
>        0 << MAC_CLK_DIV_SHIFT);
>   
>   printf("APLL: %d DPLL:%d GPLL:%d\n", apll, dpll, gpll);
> + printf("ACLK_BUS: %d ACLK_PERI:%d HCLK_PERI:%d PCLK_PERI:%d\n",
> +        aclk_bus, aclk_peri, hclk_peri, pclk_peri);
>   }
>   
>   static int rv1108_clk_ofdata_to_platdata(struct udevice *dev)
> diff --git a/include/dt-bindings/clock/rv1108-cru.h b/include/dt-bindings/clock/rv1108-cru.h
> index 9219a50a24..04e0a59f4b 100644
> --- a/include/dt-bindings/clock/rv1108-cru.h
> +++ b/include/dt-bindings/clock/rv1108-cru.h
> @@ -14,7 +14,6 @@
>   #define ARMCLK 3
>   
>   /* sclk gates (special clocks) */
> -#define SCLK_MAC 64
>   #define SCLK_SPI0 65
>   #define SCLK_NANDC 67
>   #define SCLK_SDMMC 68
> @@ -35,20 +34,77 @@
>   #define SCLK_SDMMC_SAMPLE 84
>   #define SCLK_SDIO_SAMPLE 85
>   #define SCLK_EMMC_SAMPLE 86
> -#define SCLK_MAC_RX 87
> -#define SCLK_MAC_TX 88
> -#define SCLK_MACREF 89
> -#define SCLK_MACREF_OUT 90
> -#define SCLK_SARADC 91
> +#define SCLK_VENC_CORE 87
> +#define SCLK_HEVC_CORE 88
> +#define SCLK_HEVC_CABAC 89
> +#define SCLK_PWM0_PMU 90
> +#define SCLK_I2C0_PMU 91
> +#define SCLK_WIFI 92
> +#define SCLK_CIFOUT 93
> +#define SCLK_MIPI_CSI_OUT 94
> +#define SCLK_CIF0 95
> +#define SCLK_CIF1 96
> +#define SCLK_CIF2 97
> +#define SCLK_CIF3 98
> +#define SCLK_DSP 99
> +#define SCLK_DSP_IOP 100
> +#define SCLK_DSP_EPP 101
> +#define SCLK_DSP_EDP 102
> +#define SCLK_DSP_EDAP 103
> +#define SCLK_CVBS_HOST 104
> +#define SCLK_HDMI_SFR 105
> +#define SCLK_HDMI_CEC 106
> +#define SCLK_CRYPTO 107
> +#define SCLK_SPI 108
> +#define SCLK_SARADC 109
> +#define SCLK_TSADC 110
> +#define SCLK_MAC_PRE 111
> +#define SCLK_MAC 112
> +#define SCLK_MAC_RX 113
> +#define SCLK_MAC_REF 114
> +#define SCLK_MAC_REFOUT 115
> +#define SCLK_DSP_PFM 116
> +#define SCLK_RGA 117
> +#define SCLK_I2C1 118
> +#define SCLK_I2C2 119
> +#define SCLK_I2C3 120
> +#define SCLK_PWM 121
> +#define SCLK_ISP 122
> +#define SCLK_USBPHY 123
> +#define SCLK_I2S0_SRC 124
> +#define SCLK_I2S1_SRC 125
> +#define SCLK_I2S2_SRC 126
> +#define SCLK_UART0_SRC 127
> +#define SCLK_UART1_SRC 128
> +#define SCLK_UART2_SRC 129
> +#define SCLK_MAC_TX 130
> +#define SCLK_MACREF 131
> +#define SCLK_MACREF_OUT 132
>   
> +#define DCLK_VOP_SRC 185
> +#define DCLK_HDMIPHY 186
> +#define DCLK_VOP 187
>   
>   /* aclk gates */
>   #define ACLK_DMAC 192
>   #define ACLK_PRE 193
>   #define ACLK_CORE 194
>   #define ACLK_ENMCORE 195
> -#define ACLK_GMAC 196
> -
> +#define ACLK_RKVENC 196
> +#define ACLK_RKVDEC 197
> +#define ACLK_VPU 198
> +#define ACLK_CIF0 199
> +#define ACLK_VIO0 200
> +#define ACLK_VIO1 201
> +#define ACLK_VOP 202
> +#define ACLK_IEP 203
> +#define ACLK_RGA 204
> +#define ACLK_ISP 205
> +#define ACLK_CIF1 206
> +#define ACLK_CIF2 207
> +#define ACLK_CIF3 208
> +#define ACLK_PERI 209
> +#define ACLK_GMAC 210
>   
>   /* pclk gates */
>   #define PCLK_GPIO1 256
> @@ -67,12 +123,24 @@
>   #define PCLK_PWM 269
>   #define PCLK_TIMER 270
>   #define PCLK_PERI 271
> -#define PCLK_GMAC 272
> -#define PCLK_SARADC 273
> +#define PCLK_GPIO0_PMU 272
> +#define PCLK_I2C0_PMU 273
> +#define PCLK_PWM0_PMU 274
> +#define PCLK_ISP 275
> +#define PCLK_VIO 276
> +#define PCLK_MIPI_DSI 277
> +#define PCLK_HDMI_CTRL 278
> +#define PCLK_SARADC 279
> +#define PCLK_DSP_CFG 280
> +#define PCLK_BUS 281
> +#define PCLK_EFUSE0 282
> +#define PCLK_EFUSE1 283
> +#define PCLK_WDT 284
> +#define PCLK_GMAC 285
>   
>   /* hclk gates */
>   #define HCLK_I2S0_8CH 320
> -#define HCLK_I2S1_8CH 321
> +#define HCLK_I2S1_2CH 321
>   #define HCLK_I2S2_2CH 322
>   #define HCLK_NANDC 323
>   #define HCLK_SDMMC 324
> @@ -80,20 +148,37 @@
>   #define HCLK_EMMC 326
>   #define HCLK_PERI 327
>   #define HCLK_SFC 328
> +#define HCLK_RKVENC 329
> +#define HCLK_RKVDEC 330
> +#define HCLK_CIF0 331
> +#define HCLK_VIO 332
> +#define HCLK_VOP 333
> +#define HCLK_IEP 334
> +#define HCLK_RGA 335
> +#define HCLK_ISP 336
> +#define HCLK_CRYPTO_MST 337
> +#define HCLK_CRYPTO_SLV 338
> +#define HCLK_HOST0 339
> +#define HCLK_OTG 340
> +#define HCLK_CIF1 341
> +#define HCLK_CIF2 342
> +#define HCLK_CIF3 343
> +#define HCLK_BUS 344
> +#define HCLK_VPU 345
>   
> -#define CLK_NR_CLKS (HCLK_SFC + 1)
> +#define CLK_NR_CLKS (HCLK_VPU + 1)
>   
>   /* reset id */
> -#define SRST_CORE_PO_AD 0
> +#define SRST_CORE_PO_AD 0
>   #define SRST_CORE_AD 1
>   #define SRST_L2_AD 2
> -#define SRST_CPU_NIU_AD 3
> +#define SRST_CPU_NIU_AD 3
>   #define SRST_CORE_PO 4
>   #define SRST_CORE 5
> -#define SRST_L2 6
> +#define SRST_L2 6
>   #define SRST_CORE_DBG 8
>   #define PRST_DBG 9
> -#define RST_DAP 10
> +#define RST_DAP 10
>   #define PRST_DBG_NIU 11
>   #define ARST_STRC_SYS_AD 15
>   
> @@ -160,9 +245,9 @@
>   #define HRST_SYSBUS 75
>   #define PRST_USBGRF 76
>   
> -#define ARST_PERIPH_NIU 80
> -#define HRST_PERIPH_NIU 81
> -#define PRST_PERIPH_NIU 82
> +#define ARST_PERIPH_NIU 80
> +#define HRST_PERIPH_NIU 81
> +#define PRST_PERIPH_NIU 82
>   #define HRST_PERIPH 83
>   #define HRST_SDMMC 84
>   #define HRST_SDIO 85
> @@ -180,28 +265,11 @@
>   #define HRST_HOST0_AUX 96
>   #define HRST_HOST0_ARB 97
>   #define SRST_HOST0_EHCIPHY 98
> -#define SRST_HOST0_UTMI 99
> +#define SRST_HOST0_UTMI 99
>   #define SRST_USBPOR 100
>   #define SRST_UTMI0 101
>   #define SRST_UTMI1 102
>   
> -#define ARST_VIO0_NIU 102
> -#define ARST_VIO1_NIU 103
> -#define HRST_VIO_NIU 104
> -#define PRST_VIO_NIU 105
> -#define ARST_VOP 106
> -#define HRST_VOP 107
> -#define DRST_VOP 108
> -#define ARST_IEP 109
> -#define HRST_IEP 110
> -#define ARST_RGA 111
> -#define HRST_RGA 112
> -#define SRST_RGA 113
> -#define PRST_CVBS 114
> -#define PRST_HDMI 115
> -#define SRST_HDMI 116
> -#define PRST_MIPI_DSI 117
 
 
Why these display devices removed?
 
> -
>   #define ARST_ISP_NIU 118
>   #define HRST_ISP_NIU 119
>   #define HRST_ISP 120
> @@ -227,21 +295,21 @@
>   #define HRST_VPU_NIU 141
>   #define ARST_VPU 142
>   #define HRST_VPU 143
> -#define ARST_RKVDEC_NIU 144
> -#define HRST_RKVDEC_NIU 145
> +#define ARST_RKVDEC_NIU 144
> +#define HRST_RKVDEC_NIU 145
>   #define ARST_RKVDEC 146
>   #define HRST_RKVDEC 147
>   #define SRST_RKVDEC_CABAC 148
>   #define SRST_RKVDEC_CORE 149
> -#define ARST_RKVENC_NIU 150
> -#define HRST_RKVENC_NIU 151
> +#define ARST_RKVENC_NIU 150
> +#define HRST_RKVENC_NIU 151
>   #define ARST_RKVENC 152
>   #define HRST_RKVENC 153
>   #define SRST_RKVENC_CORE 154
>   
>   #define SRST_DSP_CORE 156
>   #define SRST_DSP_SYS 157
> -#define SRST_DSP_GLOBAL 158
> +#define SRST_DSP_GLOBAL 158
>   #define SRST_DSP_OECM 159
>   #define PRST_DSP_IOP_NIU 160
>   #define ARST_DSP_EPP_NIU 161
> @@ -259,7 +327,7 @@
>   #define SRST_PMU_I2C0 173
>   #define PRST_PMU_I2C0 174
>   #define PRST_PMU_GPIO0 175
> -#define PRST_PMU_INTMEM 176
> +#define PRST_PMU_INTMEM 176
>   #define PRST_PMU_PWM0 177
>   #define SRST_PMU_PWM0 178
>   #define PRST_PMU_GRF 179
 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cru_rv1108.h
Type: application/octet-stream
Size: 7100 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20181130/cfa9b2c7/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: clk_rv1108.c
Type: application/octet-stream
Size: 19451 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20181130/cfa9b2c7/attachment-0001.obj>

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
  2018-11-30  3:39     ` vicent.chi at rock-chips.com
@ 2018-11-30  9:58       ` Otavio Salvador
  2018-11-30 10:37         ` Otavio Salvador
  0 siblings, 1 reply; 22+ messages in thread
From: Otavio Salvador @ 2018-11-30  9:58 UTC (permalink / raw)
  To: u-boot

Hello Vicent,

On Fri, Nov 30, 2018 at 1:39 AM vicent.chi at rock-chips.com
<vicent.chi@rock-chips.com> wrote:
>
> Hi Otavio Salvador:
>        Fixed a problem of rv1108 emmc clock configuration.
>        I am afraid that the code between us is not synchronized, so I also send the modified files to you.

The patch you quote below does not match with the files you attached
it seems. Would you mind send me the patch?

-- 
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9 9981-7854          Mobile: +1 (347) 903-9750

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
  2018-11-30  9:58       ` Otavio Salvador
@ 2018-11-30 10:37         ` Otavio Salvador
  2018-11-30 11:18           ` Philipp Tomsich
  0 siblings, 1 reply; 22+ messages in thread
From: Otavio Salvador @ 2018-11-30 10:37 UTC (permalink / raw)
  To: u-boot

Hello Vicent,

On Fri, Nov 30, 2018 at 7:58 AM Otavio Salvador <otavio@ossystems.com.br> wrote:
> On Fri, Nov 30, 2018 at 1:39 AM vicent.chi at rock-chips.com
> <vicent.chi@rock-chips.com> wrote:
> >
> > Hi Otavio Salvador:
> >        Fixed a problem of rv1108 emmc clock configuration.
> >        I am afraid that the code between us is not synchronized, so I also send the modified files to you.
>
> The patch you quote below does not match with the files you attached
> it seems. Would you mind send me the patch?

I succeed in applying it here. I will run it on a few boards before
sending the new patch revision. Thanks again for your support on this.

-- 
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9 9981-7854          Mobile: +1 (347) 903-9750

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
  2018-11-30 10:37         ` Otavio Salvador
@ 2018-11-30 11:18           ` Philipp Tomsich
  2018-11-30 11:24             ` Otavio Salvador
  0 siblings, 1 reply; 22+ messages in thread
From: Philipp Tomsich @ 2018-11-30 11:18 UTC (permalink / raw)
  To: u-boot

Otavio,

> On 30.11.2018, at 11:37, Otavio Salvador <otavio.salvador@ossystems.com.br> wrote:
> 
> Hello Vicent,
> 
> On Fri, Nov 30, 2018 at 7:58 AM Otavio Salvador <otavio@ossystems.com.br> wrote:
>> On Fri, Nov 30, 2018 at 1:39 AM vicent.chi at rock-chips.com
>> <vicent.chi@rock-chips.com> wrote:
>>> 
>>> Hi Otavio Salvador:
>>>       Fixed a problem of rv1108 emmc clock configuration.
>>>       I am afraid that the code between us is not synchronized, so I also send the modified files to you.
>> 
>> The patch you quote below does not match with the files you attached
>> it seems. Would you mind send me the patch?
> 
> I succeed in applying it here. I will run it on a few boards before
> sending the new patch revision. Thanks again for your support on this.

I’ll wait for v3 before doing anything further with the series then.
I had this queued for a PR this weekend (as the end of the merge-window is getting
close), but can pick this also next week (I really need to get this in quickly after rc1
or it will slip to the next merge-window).

Thanks,
Philipp.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
  2018-11-30 11:18           ` Philipp Tomsich
@ 2018-11-30 11:24             ` Otavio Salvador
  2018-11-30 11:26               ` Philipp Tomsich
  0 siblings, 1 reply; 22+ messages in thread
From: Otavio Salvador @ 2018-11-30 11:24 UTC (permalink / raw)
  To: u-boot

On Fri, Nov 30, 2018 at 9:18 AM Philipp Tomsich
<philipp.tomsich@theobroma-systems.com> wrote:
> > On 30.11.2018, at 11:37, Otavio Salvador <otavio.salvador@ossystems.com.br> wrote:
> > On Fri, Nov 30, 2018 at 7:58 AM Otavio Salvador <otavio@ossystems.com.br> wrote:
> >> On Fri, Nov 30, 2018 at 1:39 AM vicent.chi at rock-chips.com
> >> <vicent.chi@rock-chips.com> wrote:
> >>>
> >>> Hi Otavio Salvador:
> >>>       Fixed a problem of rv1108 emmc clock configuration.
> >>>       I am afraid that the code between us is not synchronized, so I also send the modified files to you.
> >>
> >> The patch you quote below does not match with the files you attached
> >> it seems. Would you mind send me the patch?
> >
> > I succeed in applying it here. I will run it on a few boards before
> > sending the new patch revision. Thanks again for your support on this.
>
> I’ll wait for v3 before doing anything further with the series then.
> I had this queued for a PR this weekend (as the end of the merge-window is getting
> close), but can pick this also next week (I really need to get this in quickly after rc1
> or it will slip to the next merge-window).

Sure, I will be sending this and also our customer board (on top of
this) later today or tomorrow.

-- 
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9 9981-7854          Mobile: +1 (347) 903-9750

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree
  2018-11-30 11:24             ` Otavio Salvador
@ 2018-11-30 11:26               ` Philipp Tomsich
  0 siblings, 0 replies; 22+ messages in thread
From: Philipp Tomsich @ 2018-11-30 11:26 UTC (permalink / raw)
  To: u-boot

> On 30.11.2018, at 12:24, Otavio Salvador <otavio.salvador@ossystems.com.br> wrote:
> 
> On Fri, Nov 30, 2018 at 9:18 AM Philipp Tomsich
> <philipp.tomsich@theobroma-systems.com> wrote:
>>> On 30.11.2018, at 11:37, Otavio Salvador <otavio.salvador@ossystems.com.br> wrote:
>>> On Fri, Nov 30, 2018 at 7:58 AM Otavio Salvador <otavio@ossystems.com.br> wrote:
>>>> On Fri, Nov 30, 2018 at 1:39 AM vicent.chi at rock-chips.com
>>>> <vicent.chi@rock-chips.com> wrote:
>>>>> 
>>>>> Hi Otavio Salvador:
>>>>>      Fixed a problem of rv1108 emmc clock configuration.
>>>>>      I am afraid that the code between us is not synchronized, so I also send the modified files to you.
>>>> 
>>>> The patch you quote below does not match with the files you attached
>>>> it seems. Would you mind send me the patch?
>>> 
>>> I succeed in applying it here. I will run it on a few boards before
>>> sending the new patch revision. Thanks again for your support on this.
>> 
>> I’ll wait for v3 before doing anything further with the series then.
>> I had this queued for a PR this weekend (as the end of the merge-window is getting
>> close), but can pick this also next week (I really need to get this in quickly after rc1
>> or it will slip to the next merge-window).
> 
> Sure, I will be sending this and also our customer board (on top of
> this) later today or tomorrow.

I’ll try to hold off with my PR until then, so Tom can pick all changes in a single go.

Thanks,
Philipp.

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2018-11-30 11:26 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-20 18:55 [U-Boot] [PATCH v2 0/5] Submit upstream changes made while porting a customer board to mainline Otavio Salvador
2018-11-20 18:55 ` [U-Boot] [PATCH v2 1/5] clk_rv1108: Sync with vendor tree Otavio Salvador
2018-11-27  1:43   ` Andy Yan
2018-11-27  9:46     ` Otavio Salvador
2018-11-30  3:39     ` vicent.chi at rock-chips.com
2018-11-30  9:58       ` Otavio Salvador
2018-11-30 10:37         ` Otavio Salvador
2018-11-30 11:18           ` Philipp Tomsich
2018-11-30 11:24             ` Otavio Salvador
2018-11-30 11:26               ` Philipp Tomsich
2018-11-20 18:55 ` [U-Boot] [PATCH v2 2/5] rv1108: Enable BOUNCE_BUFFER Otavio Salvador
2018-11-27  1:45   ` Andy Yan
2018-11-20 18:55 ` [U-Boot] [PATCH v2 3/5] rv1108: Enable eMMC support Otavio Salvador
2018-11-26 16:18   ` Otavio Salvador
2018-11-27  1:56     ` Andy Yan
2018-11-27  1:59       ` Philipp Tomsich
2018-11-27  1:51   ` Andy Yan
2018-11-27  9:33     ` Otavio Salvador
2018-11-20 18:55 ` [U-Boot] [PATCH v2 4/5] rv1108: Make USB OTG functional Otavio Salvador
2018-11-27  1:54   ` Andy Yan
2018-11-20 18:55 ` [U-Boot] [PATCH v2 5/5] rv1108: Add support for default distro_bootcmd Otavio Salvador
2018-11-27  1:55   ` Andy Yan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.