All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC
@ 2019-10-30  8:11 Andy Yan
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 1/9] arm: rockchip: Add RK3308 SOC support Andy Yan
                   ` (5 more replies)
  0 siblings, 6 replies; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:11 UTC (permalink / raw)
  To: u-boot


RK3308 is a quad Cortex A35 based SOC with rich audio
interfaces(I2S/PCM/TDM/PDM/SPDIF/VAD/HDMI ARC), which
designed for intelligent voice interaction and audio
input/output processing.

This path set add basic support for it, test with a
emmc board.

More boards support such as Firefly ROC-RK3308-CC will coming soon.

Changes in v2:
- Add board ROC-rk3308-CC
- Update doc/README.rockchip

Andy Yan (8):
  arm: rockchip: Add RK3308 SOC support
  arm: dts: rockchip: Add dts for rk3308 evb
  board: rockchip: Add rk3308 evb support
  rockchip: rk3308: Add sdram driver
  rockchip: mkimage: add support for RK3308
  rockchip: rk3308: Add dts for ROC-RK3308-CC
  rockchip: rk3308: Add support for ROC-RK3308-CC board
  doc: rockchip: Add documentation for rk3308 based boards

Finley Xiao (1):
  rockchip: clk: Add clk driver for rk3308

 arch/arm/dts/Makefile                         |    4 +
 arch/arm/dts/rk3308-evb-u-boot.dtsi           |   17 +
 arch/arm/dts/rk3308-evb.dts                   |  230 +++
 arch/arm/dts/rk3308-roc-cc-u-boot.dtsi        |   17 +
 arch/arm/dts/rk3308-roc-cc.dts                |  190 ++
 arch/arm/dts/rk3308-u-boot.dtsi               |   25 +
 arch/arm/dts/rk3308.dtsi                      | 1829 +++++++++++++++++
 arch/arm/include/asm/arch-rk3308/boot0.h      |   11 +
 arch/arm/include/asm/arch-rk3308/cru_rk3308.h |  290 +++
 arch/arm/include/asm/arch-rk3308/gpio.h       |   11 +
 arch/arm/include/asm/arch-rk3308/grf_rk3308.h |  197 ++
 arch/arm/mach-rockchip/Kconfig                |   24 +
 arch/arm/mach-rockchip/Makefile               |    1 +
 arch/arm/mach-rockchip/rk3308/Kconfig         |   27 +
 arch/arm/mach-rockchip/rk3308/Makefile        |    9 +
 arch/arm/mach-rockchip/rk3308/clk_rk3308.c    |   31 +
 arch/arm/mach-rockchip/rk3308/rk3308.c        |  175 ++
 arch/arm/mach-rockchip/rk3308/syscon_rk3308.c |   20 +
 board/firefly/firefly-rk3308/Kconfig          |   15 +
 board/firefly/firefly-rk3308/MAINTAINERS      |    5 +
 board/firefly/firefly-rk3308/Makefile         |    7 +
 board/firefly/firefly-rk3308/roc_rk3308_cc.c  |   82 +
 board/rockchip/evb_rk3308/Kconfig             |   15 +
 board/rockchip/evb_rk3308/MAINTAINERS         |    6 +
 board/rockchip/evb_rk3308/Makefile            |    7 +
 board/rockchip/evb_rk3308/evb_rk3308.c        |   44 +
 configs/evb-rk3308_defconfig                  |   77 +
 configs/roc-rk3308-cc_defconfig               |   77 +
 doc/README.rockchip                           |   20 +-
 drivers/clk/rockchip/Makefile                 |    1 +
 drivers/clk/rockchip/clk_rk3308.c             | 1078 ++++++++++
 drivers/ram/rockchip/Makefile                 |    1 +
 drivers/ram/rockchip/sdram_rk3308.c           |   55 +
 include/configs/evb_rk3308.h                  |   20 +
 include/configs/rk3308_common.h               |   58 +
 include/dt-bindings/clock/rk3308-cru.h        |  387 ++++
 tools/rkcommon.c                              |    1 +
 37 files changed, 5063 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/dts/rk3308-evb-u-boot.dtsi
 create mode 100644 arch/arm/dts/rk3308-evb.dts
 create mode 100644 arch/arm/dts/rk3308-roc-cc-u-boot.dtsi
 create mode 100644 arch/arm/dts/rk3308-roc-cc.dts
 create mode 100644 arch/arm/dts/rk3308-u-boot.dtsi
 create mode 100644 arch/arm/dts/rk3308.dtsi
 create mode 100644 arch/arm/include/asm/arch-rk3308/boot0.h
 create mode 100644 arch/arm/include/asm/arch-rk3308/cru_rk3308.h
 create mode 100644 arch/arm/include/asm/arch-rk3308/gpio.h
 create mode 100644 arch/arm/include/asm/arch-rk3308/grf_rk3308.h
 create mode 100644 arch/arm/mach-rockchip/rk3308/Kconfig
 create mode 100644 arch/arm/mach-rockchip/rk3308/Makefile
 create mode 100644 arch/arm/mach-rockchip/rk3308/clk_rk3308.c
 create mode 100644 arch/arm/mach-rockchip/rk3308/rk3308.c
 create mode 100644 arch/arm/mach-rockchip/rk3308/syscon_rk3308.c
 create mode 100644 board/firefly/firefly-rk3308/Kconfig
 create mode 100644 board/firefly/firefly-rk3308/MAINTAINERS
 create mode 100644 board/firefly/firefly-rk3308/Makefile
 create mode 100644 board/firefly/firefly-rk3308/roc_rk3308_cc.c
 create mode 100644 board/rockchip/evb_rk3308/Kconfig
 create mode 100644 board/rockchip/evb_rk3308/MAINTAINERS
 create mode 100644 board/rockchip/evb_rk3308/Makefile
 create mode 100644 board/rockchip/evb_rk3308/evb_rk3308.c
 create mode 100644 configs/evb-rk3308_defconfig
 create mode 100644 configs/roc-rk3308-cc_defconfig
 create mode 100644 drivers/clk/rockchip/clk_rk3308.c
 create mode 100644 drivers/ram/rockchip/sdram_rk3308.c
 create mode 100644 include/configs/evb_rk3308.h
 create mode 100644 include/configs/rk3308_common.h
 create mode 100644 include/dt-bindings/clock/rk3308-cru.h

-- 
2.17.1

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

* [U-Boot] [PATCH v2 1/9] arm: rockchip: Add RK3308 SOC support
  2019-10-30  8:11 [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Andy Yan
@ 2019-10-30  8:11 ` Andy Yan
  2019-11-07  9:30   ` Kever Yang
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 2/9] rockchip: clk: Add clk driver for rk3308 Andy Yan
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:11 UTC (permalink / raw)
  To: u-boot

RK3308 is a quad Cortex A35 based SOC with rich audio
interfaces(I2S/PCM/TDM/PDM/SPDIF/VAD/HDMI ARC), which
designed for intelligent voice interaction and audio
input/output processing.

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

---

Changes in v2: None

 arch/arm/include/asm/arch-rk3308/boot0.h      |  11 +
 arch/arm/include/asm/arch-rk3308/cru_rk3308.h | 290 ++++++++++++++++++
 arch/arm/include/asm/arch-rk3308/gpio.h       |  11 +
 arch/arm/include/asm/arch-rk3308/grf_rk3308.h | 197 ++++++++++++
 arch/arm/mach-rockchip/Kconfig                |  24 ++
 arch/arm/mach-rockchip/Makefile               |   1 +
 arch/arm/mach-rockchip/rk3308/Kconfig         |  14 +
 arch/arm/mach-rockchip/rk3308/Makefile        |   9 +
 arch/arm/mach-rockchip/rk3308/clk_rk3308.c    |  31 ++
 arch/arm/mach-rockchip/rk3308/rk3308.c        | 175 +++++++++++
 arch/arm/mach-rockchip/rk3308/syscon_rk3308.c |  20 ++
 include/configs/rk3308_common.h               |  58 ++++
 12 files changed, 841 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-rk3308/boot0.h
 create mode 100644 arch/arm/include/asm/arch-rk3308/cru_rk3308.h
 create mode 100644 arch/arm/include/asm/arch-rk3308/gpio.h
 create mode 100644 arch/arm/include/asm/arch-rk3308/grf_rk3308.h
 create mode 100644 arch/arm/mach-rockchip/rk3308/Kconfig
 create mode 100644 arch/arm/mach-rockchip/rk3308/Makefile
 create mode 100644 arch/arm/mach-rockchip/rk3308/clk_rk3308.c
 create mode 100644 arch/arm/mach-rockchip/rk3308/rk3308.c
 create mode 100644 arch/arm/mach-rockchip/rk3308/syscon_rk3308.c
 create mode 100644 include/configs/rk3308_common.h

diff --git a/arch/arm/include/asm/arch-rk3308/boot0.h b/arch/arm/include/asm/arch-rk3308/boot0.h
new file mode 100644
index 0000000000..2e78b074ad
--- /dev/null
+++ b/arch/arm/include/asm/arch-rk3308/boot0.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2019 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef __ASM_ARCH_BOOT0_H__
+#define __ASM_ARCH_BOOT0_H__
+
+#include <asm/arch-rockchip/boot0.h>
+
+#endif
diff --git a/arch/arm/include/asm/arch-rk3308/cru_rk3308.h b/arch/arm/include/asm/arch-rk3308/cru_rk3308.h
new file mode 100644
index 0000000000..a14b64cdb3
--- /dev/null
+++ b/arch/arm/include/asm/arch-rk3308/cru_rk3308.h
@@ -0,0 +1,290 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2018 Rockchip Electronics Co., Ltd.
+ */
+#ifndef _ASM_ARCH_CRU_RK3308_H
+#define _ASM_ARCH_CRU_RK3308_H
+
+#include <common.h>
+
+#define MHz		1000000
+#define OSC_HZ		(24 * MHz)
+
+#define APLL_HZ		(816 * MHz)
+
+#define CORE_ACLK_HZ	408000000
+#define CORE_DBG_HZ	204000000
+
+#define BUS_ACLK_HZ	200000000
+#define BUS_HCLK_HZ	100000000
+#define BUS_PCLK_HZ	100000000
+
+#define PERI_ACLK_HZ	200000000
+#define PERI_HCLK_HZ	100000000
+#define PERI_PCLK_HZ	100000000
+
+#define AUDIO_HCLK_HZ	100000000
+#define AUDIO_PCLK_HZ	100000000
+
+#define RK3308_PLL_CON(x)	((x) * 0x4)
+#define RK3308_MODE_CON		0xa0
+
+/* RK3308 pll id */
+enum rk3308_pll_id {
+	APLL,
+	DPLL,
+	VPLL0,
+	VPLL1,
+	PLL_COUNT,
+};
+
+struct rk3308_clk_info {
+	unsigned long id;
+	char *name;
+};
+
+/* Private data for the clock driver - used by rockchip_get_cru() */
+struct rk3308_clk_priv {
+	struct rk3308_cru *cru;
+	ulong armclk_hz;
+	ulong dpll_hz;
+	ulong vpll0_hz;
+	ulong vpll1_hz;
+};
+
+struct rk3308_cru {
+	struct rk3308_pll {
+		unsigned int con0;
+		unsigned int con1;
+		unsigned int con2;
+		unsigned int con3;
+		unsigned int con4;
+		unsigned int reserved0[3];
+	} pll[4];
+	unsigned int reserved1[8];
+	unsigned int mode;
+	unsigned int misc;
+	unsigned int reserved2[2];
+	unsigned int glb_cnt_th;
+	unsigned int glb_rst_st;
+	unsigned int glb_srst_fst;
+	unsigned int glb_srst_snd;
+	unsigned int glb_rst_con;
+	unsigned int pll_lock;
+	unsigned int reserved3[6];
+	unsigned int hwffc_con0;
+	unsigned int reserved4;
+	unsigned int hwffc_th;
+	unsigned int hwffc_intst;
+	unsigned int apll_con0_s;
+	unsigned int apll_con1_s;
+	unsigned int clksel_con0_s;
+	unsigned int reserved5;
+	unsigned int clksel_con[74];
+	unsigned int reserved6[54];
+	unsigned int clkgate_con[15];
+	unsigned int reserved7[(0x380 - 0x338) / 4 - 1];
+	unsigned int ssgtbl[32];
+	unsigned int softrst_con[10];
+	unsigned int reserved8[(0x480 - 0x424) / 4 - 1];
+	unsigned int sdmmc_con[2];
+	unsigned int sdio_con[2];
+	unsigned int emmc_con[2];
+};
+
+enum {
+	/* PLLCON0*/
+	PLL_BP_SHIFT		= 15,
+	PLL_POSTDIV1_SHIFT	= 12,
+	PLL_POSTDIV1_MASK	= 7 << PLL_POSTDIV1_SHIFT,
+	PLL_FBDIV_SHIFT		= 0,
+	PLL_FBDIV_MASK		= 0xfff,
+
+	/* PLLCON1 */
+	PLL_PDSEL_SHIFT		= 15,
+	PLL_PD1_SHIFT		= 14,
+	PLL_PD_SHIFT		= 13,
+	PLL_PD_MASK		= 1 << PLL_PD_SHIFT,
+	PLL_DSMPD_SHIFT		= 12,
+	PLL_DSMPD_MASK		= 1 << PLL_DSMPD_SHIFT,
+	PLL_LOCK_STATUS_SHIFT	= 10,
+	PLL_LOCK_STATUS_MASK	= 1 << PLL_LOCK_STATUS_SHIFT,
+	PLL_POSTDIV2_SHIFT	= 6,
+	PLL_POSTDIV2_MASK	= 7 << PLL_POSTDIV2_SHIFT,
+	PLL_REFDIV_SHIFT	= 0,
+	PLL_REFDIV_MASK		= 0x3f,
+
+	/* PLLCON2 */
+	PLL_FOUT4PHASEPD_SHIFT	= 27,
+	PLL_FOUTVCOPD_SHIFT	= 26,
+	PLL_FOUTPOSTDIVPD_SHIFT	= 25,
+	PLL_DACPD_SHIFT		= 24,
+	PLL_FRAC_DIV	= 0xffffff,
+
+	/* CRU_MODE */
+	PLLMUX_FROM_XIN24M	= 0,
+	PLLMUX_FROM_PLL,
+	PLLMUX_FROM_RTC32K,
+	USBPHY480M_MODE_SHIFT	= 8,
+	USBPHY480M_MODE_MASK	= 3 << USBPHY480M_MODE_SHIFT,
+	VPLL1_MODE_SHIFT		= 6,
+	VPLL1_MODE_MASK		= 3 << VPLL1_MODE_SHIFT,
+	VPLL0_MODE_SHIFT		= 4,
+	VPLL0_MODE_MASK		= 3 << VPLL0_MODE_SHIFT,
+	DPLL_MODE_SHIFT		= 2,
+	DPLL_MODE_MASK		= 3 << DPLL_MODE_SHIFT,
+	APLL_MODE_SHIFT		= 0,
+	APLL_MODE_MASK		= 3 << APLL_MODE_SHIFT,
+
+	/* CRU_CLK_SEL0_CON */
+	CORE_ACLK_DIV_SHIFT	= 12,
+	CORE_ACLK_DIV_MASK	= 0x7 << CORE_ACLK_DIV_SHIFT,
+	CORE_DBG_DIV_SHIFT	= 8,
+	CORE_DBG_DIV_MASK	= 0xf << CORE_DBG_DIV_SHIFT,
+	CORE_CLK_PLL_SEL_SHIFT	= 6,
+	CORE_CLK_PLL_SEL_MASK	= 0x3 << CORE_CLK_PLL_SEL_SHIFT,
+	CORE_CLK_PLL_SEL_APLL	= 0,
+	CORE_CLK_PLL_SEL_VPLL0,
+	CORE_CLK_PLL_SEL_VPLL1,
+	CORE_DIV_CON_SHIFT	= 0,
+	CORE_DIV_CON_MASK	= 0x0f << CORE_DIV_CON_SHIFT,
+
+	/* CRU_CLK_SEL5_CON */
+	BUS_PLL_SEL_SHIFT	= 6,
+	BUS_PLL_SEL_MASK	= 0x3 << BUS_PLL_SEL_SHIFT,
+	BUS_PLL_SEL_DPLL	= 0,
+	BUS_PLL_SEL_VPLL0,
+	BUS_PLL_SEL_VPLL1,
+	BUS_ACLK_DIV_SHIFT	= 0,
+	BUS_ACLK_DIV_MASK	= 0x1f << BUS_ACLK_DIV_SHIFT,
+
+	/* CRU_CLK_SEL6_CON */
+	BUS_PCLK_DIV_SHIFT	= 8,
+	BUS_PCLK_DIV_MASK	= 0x1f << BUS_PCLK_DIV_SHIFT,
+	BUS_HCLK_DIV_SHIFT	= 0,
+	BUS_HCLK_DIV_MASK	= 0x1f << BUS_HCLK_DIV_SHIFT,
+
+	/* CRU_CLK_SEL7_CON */
+	CRYPTO_APK_SEL_SHIFT	= 14,
+	CRYPTO_APK_PLL_SEL_MASK	= 3 << CRYPTO_APK_SEL_SHIFT,
+	CRYPTO_PLL_SEL_DPLL	= 0,
+	CRYPTO_PLL_SEL_VPLL0,
+	CRYPTO_PLL_SEL_VPLL1	= 0,
+	CRYPTO_APK_DIV_SHIFT	= 8,
+	CRYPTO_APK_DIV_MASK	= 0x1f << CRYPTO_APK_DIV_SHIFT,
+	CRYPTO_PLL_SEL_SHIFT	= 6,
+	CRYPTO_PLL_SEL_MASK	= 3 << CRYPTO_PLL_SEL_SHIFT,
+	CRYPTO_DIV_SHIFT	= 0,
+	CRYPTO_DIV_MASK		= 0x1f << CRYPTO_DIV_SHIFT,
+
+	/* CRU_CLK_SEL8_CON */
+	DCLK_VOP_SEL_SHIFT	= 14,
+	DCLK_VOP_SEL_MASK	= 0x3 << DCLK_VOP_SEL_SHIFT,
+	DCLK_VOP_SEL_DIVOUT	= 0,
+	DCLK_VOP_SEL_FRACOUT,
+	DCLK_VOP_SEL_24M,
+	DCLK_VOP_PLL_SEL_SHIFT	= 10,
+	DCLK_VOP_PLL_SEL_MASK	= 0x3 << DCLK_VOP_PLL_SEL_SHIFT,
+	DCLK_VOP_PLL_SEL_DPLL	= 0,
+	DCLK_VOP_PLL_SEL_VPLL0,
+	DCLK_VOP_PLL_SEL_VPLL1,
+	DCLK_VOP_DIV_SHIFT	= 0,
+	DCLK_VOP_DIV_MASK	= 0xff,
+
+	/* CRU_CLK_SEL25_CON */
+	/* CRU_CLK_SEL26_CON */
+	/* CRU_CLK_SEL27_CON */
+	/* CRU_CLK_SEL28_CON */
+	CLK_I2C_PLL_SEL_SHIFT		= 14,
+	CLK_I2C_PLL_SEL_MASK		= 0x3 << CLK_I2C_PLL_SEL_SHIFT,
+	CLK_I2C_PLL_SEL_DPLL		= 0,
+	CLK_I2C_PLL_SEL_VPLL0,
+	CLK_I2C_PLL_SEL_24M,
+	CLK_I2C_DIV_CON_SHIFT		= 0,
+	CLK_I2C_DIV_CON_MASK		= 0x7f << CLK_I2C_DIV_CON_SHIFT,
+
+	/* CRU_CLK_SEL29_CON */
+	CLK_PWM_PLL_SEL_SHIFT		= 14,
+	CLK_PWM_PLL_SEL_MASK		= 0x3 << CLK_PWM_PLL_SEL_SHIFT,
+	CLK_PWM_PLL_SEL_DPLL		= 0,
+	CLK_PWM_PLL_SEL_VPLL0,
+	CLK_PWM_PLL_SEL_24M,
+	CLK_PWM_DIV_CON_SHIFT		= 0,
+	CLK_PWM_DIV_CON_MASK		= 0x7f << CLK_PWM_DIV_CON_SHIFT,
+
+	/* CRU_CLK_SEL30_CON */
+	/* CRU_CLK_SEL31_CON */
+	/* CRU_CLK_SEL32_CON */
+	CLK_SPI_PLL_SEL_SHIFT		= 14,
+	CLK_SPI_PLL_SEL_MASK		= 0x3 << CLK_SPI_PLL_SEL_SHIFT,
+	CLK_SPI_PLL_SEL_DPLL		= 0,
+	CLK_SPI_PLL_SEL_VPLL0,
+	CLK_SPI_PLL_SEL_24M,
+	CLK_SPI_DIV_CON_SHIFT		= 0,
+	CLK_SPI_DIV_CON_MASK		= 0x7f << CLK_SPI_DIV_CON_SHIFT,
+
+	/* CRU_CLK_SEL34_CON */
+	CLK_SARADC_DIV_CON_SHIFT	= 0,
+	CLK_SARADC_DIV_CON_MASK		= 0x7ff << CLK_SARADC_DIV_CON_SHIFT,
+
+	/* CRU_CLK_SEL36_CON */
+	PERI_PLL_SEL_SHIFT	= 6,
+	PERI_PLL_SEL_MASK	= 0x3 << PERI_PLL_SEL_SHIFT,
+	PERI_PLL_DPLL		= 0,
+	PERI_PLL_VPLL0,
+	PERI_PLL_VPLL1,
+	PERI_ACLK_DIV_SHIFT	= 0,
+	PERI_ACLK_DIV_MASK	= 0x1f << PERI_ACLK_DIV_SHIFT,
+
+	/* CRU_CLK_SEL37_CON */
+	PERI_PCLK_DIV_SHIFT	= 8,
+	PERI_PCLK_DIV_MASK	= 0x1f << PERI_PCLK_DIV_SHIFT,
+	PERI_HCLK_DIV_SHIFT	= 0,
+	PERI_HCLK_DIV_MASK	= 0x1f << PERI_HCLK_DIV_SHIFT,
+
+	/* CRU_CLKSEL41_CON */
+	EMMC_CLK_SEL_SHIFT	= 15,
+	EMMC_CLK_SEL_MASK	= 1 << EMMC_CLK_SEL_SHIFT,
+	EMMC_CLK_SEL_EMMC	= 0,
+	EMMC_CLK_SEL_EMMC_DIV50,
+	EMMC_PLL_SHIFT		= 8,
+	EMMC_PLL_MASK		= 0x3 << EMMC_PLL_SHIFT,
+	EMMC_SEL_DPLL		= 0,
+	EMMC_SEL_VPLL0,
+	EMMC_SEL_VPLL1,
+	EMMC_SEL_24M,
+	EMMC_DIV_SHIFT		= 0,
+	EMMC_DIV_MASK		= 0xff << EMMC_DIV_SHIFT,
+
+	/* CRU_CLKSEL43_CON */
+	MAC_CLK_SPEED_SEL_SHIFT = 15,
+	MAC_CLK_SPEED_SEL_MASK = 1 << MAC_CLK_SPEED_SEL_SHIFT,
+	MAC_CLK_SPEED_SEL_10M = 0,
+	MAC_CLK_SPEED_SEL_100M,
+	MAC_CLK_SOURCE_SEL_SHIFT = 14,
+	MAC_CLK_SOURCE_SEL_MASK = 1 << MAC_CLK_SOURCE_SEL_SHIFT,
+	MAC_CLK_SOURCE_SEL_INTERNAL	= 0,
+	MAC_CLK_SOURCE_SEL_EXTERNAL,
+	MAC_PLL_SHIFT		= 6,
+	MAC_PLL_MASK		= 0x3 << MAC_PLL_SHIFT,
+	MAC_SEL_DPLL		= 0,
+	MAC_SEL_VPLL0,
+	MAC_SEL_VPLL1,
+	MAC_DIV_SHIFT		= 0,
+	MAC_DIV_MASK		= 0x1f << MAC_DIV_SHIFT,
+
+	/* CRU_CLK_SEL45_CON */
+	AUDIO_PCLK_DIV_SHIFT	= 8,
+	AUDIO_PCLK_DIV_MASK	= 0x1f << AUDIO_PCLK_DIV_SHIFT,
+	AUDIO_PLL_SEL_SHIFT	= 6,
+	AUDIO_PLL_SEL_MASK	= 0x3 << AUDIO_PLL_SEL_SHIFT,
+	AUDIO_PLL_VPLL0		= 0,
+	AUDIO_PLL_VPLL1,
+	AUDIO_PLL_24M,
+	AUDIO_HCLK_DIV_SHIFT	= 0,
+	AUDIO_HCLK_DIV_MASK	= 0x1f << AUDIO_HCLK_DIV_SHIFT,
+};
+
+check_member(rk3308_cru, emmc_con[1], 0x494);
+
+#endif
diff --git a/arch/arm/include/asm/arch-rk3308/gpio.h b/arch/arm/include/asm/arch-rk3308/gpio.h
new file mode 100644
index 0000000000..eca79d5159
--- /dev/null
+++ b/arch/arm/include/asm/arch-rk3308/gpio.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2019 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef __ASM_ARCH_GPIO_H__
+#define __ASM_ARCH_GPIO_H__
+
+#include <asm/arch-rockchip/gpio.h>
+
+#endif
diff --git a/arch/arm/include/asm/arch-rk3308/grf_rk3308.h b/arch/arm/include/asm/arch-rk3308/grf_rk3308.h
new file mode 100644
index 0000000000..3e68626d3e
--- /dev/null
+++ b/arch/arm/include/asm/arch-rk3308/grf_rk3308.h
@@ -0,0 +1,197 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ *Copyright 2019 Rockchip Electronics Co., Ltd.
+ */
+#ifndef _ASM_ARCH_GRF_rk3308_H
+#define _ASM_ARCH_GRF_rk3308_H
+
+#include <common.h>
+
+struct rk3308_grf {
+	unsigned int gpio0a_iomux;
+	unsigned int reserved0;
+	unsigned int gpio0b_iomux;
+	unsigned int reserved1;
+	unsigned int gpio0c_iomux;
+	unsigned int reserved2[3];
+	unsigned int gpio1a_iomux;
+	unsigned int reserved3;
+	unsigned int gpio1bl_iomux;
+	unsigned int gpio1bh_iomux;
+	unsigned int gpio1cl_iomux;
+	unsigned int gpio1ch_iomux;
+	unsigned int gpio1d_iomux;
+	unsigned int reserved4;
+	unsigned int gpio2a_iomux;
+	unsigned int reserved5;
+	unsigned int gpio2b_iomux;
+	unsigned int reserved6;
+	unsigned int gpio2c_iomux;
+	unsigned int reserved7[3];
+	unsigned int gpio3a_iomux;
+	unsigned int reserved8;
+	unsigned int gpio3b_iomux;
+	unsigned int reserved9[5];
+	unsigned int gpio4a_iomux;
+	unsigned int reserved33;
+	unsigned int gpio4b_iomux;
+	unsigned int reserved10;
+	unsigned int gpio4c_iomux;
+	unsigned int reserved11;
+	unsigned int gpio4d_iomux;
+	unsigned int reserved34;
+	unsigned int gpio0a_p;
+	unsigned int gpio0b_p;
+	unsigned int gpio0c_p;
+	unsigned int reserved12;
+	unsigned int gpio1a_p;
+	unsigned int gpio1b_p;
+	unsigned int gpio1c_p;
+	unsigned int gpio1d_p;
+	unsigned int gpio2a_p;
+	unsigned int gpio2b_p;
+	unsigned int gpio2c_p;
+	unsigned int reserved13;
+	unsigned int gpio3a_p;
+	unsigned int gpio3b_p;
+	unsigned int reserved14[2];
+	unsigned int gpio4a_p;
+	unsigned int gpio4b_p;
+	unsigned int gpio4c_p;
+	unsigned int gpio4d_p;
+	unsigned int reserved15[(0x100 - 0xec) / 4 - 1];
+	unsigned int gpio0a_e;
+	unsigned int gpio0b_e;
+	unsigned int gpio0c_e;
+	unsigned int reserved16;
+	unsigned int gpio1a_e;
+	unsigned int gpio1b_e;
+	unsigned int gpio1c_e;
+	unsigned int gpio1d_e;
+	unsigned int gpio2a_e;
+	unsigned int gpio2b_e;
+	unsigned int gpio2c_e;
+	unsigned int reserved17;
+	unsigned int gpio3a_e;
+	unsigned int gpio3b_e;
+	unsigned int reserved18[2];
+	unsigned int gpio4a_e;
+	unsigned int gpio4b_e;
+	unsigned int gpio4c_e;
+	unsigned int gpio4d_e;
+	unsigned int gpio0a_sr;
+	unsigned int gpio0b_sr;
+	unsigned int gpio0c_sr;
+	unsigned int reserved19;
+	unsigned int gpio1a_sr;
+	unsigned int gpio1b_sr;
+	unsigned int gpio1c_sr;
+	unsigned int gpio1d_sr;
+	unsigned int gpio2a_sr;
+	unsigned int gpio2b_sr;
+	unsigned int gpio2c_sr;
+	unsigned int reserved20;
+	unsigned int gpio3a_sr;
+	unsigned int gpio3b_sr;
+	unsigned int reserved21[2];
+	unsigned int gpio4a_sr;
+	unsigned int gpio4b_sr;
+	unsigned int gpio4c_sr;
+	unsigned int gpio4d_sr;
+	unsigned int gpio0a_smt;
+	unsigned int gpio0b_smt;
+	unsigned int gpio0c_smt;
+	unsigned int reserved22;
+	unsigned int gpio1a_smt;
+	unsigned int gpio1b_smt;
+	unsigned int gpio1c_smt;
+	unsigned int gpio1d_smt;
+	unsigned int gpio2a_smt;
+	unsigned int gpio2b_smt;
+	unsigned int gpio2c_smt;
+	unsigned int reserved23;
+	unsigned int gpio3a_smt;
+	unsigned int gpio3b_smt;
+	unsigned int reserved35[2];
+	unsigned int gpio4a_smt;
+	unsigned int gpio4b_smt;
+	unsigned int gpio4c_smt;
+	unsigned int gpio4d_smt;
+	unsigned int reserved24[(0x300 - 0x1EC) / 4 - 1];
+	unsigned int soc_con0;
+	unsigned int soc_con1;
+	unsigned int soc_con2;
+	unsigned int soc_con3;
+	unsigned int soc_con4;
+	unsigned int soc_con5;
+	unsigned int soc_con6;
+	unsigned int soc_con7;
+	unsigned int soc_con8;
+	unsigned int soc_con9;
+	unsigned int soc_con10;
+	unsigned int reserved25[(0x380 - 0x328) / 4 - 1];
+	unsigned int soc_status0;
+	unsigned int reserved26[(0x400 - 0x380) / 4 - 1];
+	unsigned int cpu_con0;
+	unsigned int cpu_con1;
+	unsigned int cpu_con2;
+	unsigned int reserved27[(0x420 - 0x408) / 4 - 1];
+	unsigned int cpu_status0;
+	unsigned int cpu_status1;
+	unsigned int reserved28[(0x440 - 0x424) / 4 - 1];
+	unsigned int pvtm_con0;
+	unsigned int pvtm_con1;
+	unsigned int pvtm_status0;
+	unsigned int pvtm_status1;
+	unsigned int reserved29[(0x460 - 0x44C) / 4 - 1];
+	unsigned int tsadc_tbl;
+	unsigned int tsadc_tbh;
+	unsigned int reserved30[(0x480 - 0x464) / 4 - 1];
+	unsigned int host0_con0;
+	unsigned int host0_con1;
+	unsigned int otg_con0;
+	unsigned int host0_status0;
+	unsigned int reserved31[(0x4a0 - 0x48C) / 4 - 1];
+	unsigned int mac_con0;
+	unsigned int upctrl_con0;
+	unsigned int upctrl_status0;
+	unsigned int reserved32[(0x500 - 0x4A8) / 4 - 1];
+	unsigned int os_reg0;
+	unsigned int os_reg1;
+	unsigned int os_reg2;
+	unsigned int os_reg3;
+	unsigned int os_reg4;
+	unsigned int os_reg5;
+	unsigned int os_reg6;
+	unsigned int os_reg7;
+	unsigned int os_reg8;
+	unsigned int os_reg9;
+	unsigned int os_reg10;
+	unsigned int os_reg11;
+	unsigned int reserved38[(0x600 - 0x52c) / 4 - 1];
+	unsigned int soc_con12;
+	unsigned int reserved39;
+	unsigned int soc_con13;
+	unsigned int soc_con14;
+	unsigned int soc_con15;
+	unsigned int reserved40[(0x800 - 0x610) / 4 - 1];
+	unsigned int chip_id;
+};
+check_member(rk3308_grf, gpio0a_p, 0xa0);
+
+struct rk3308_sgrf {
+	unsigned int soc_con0;
+	unsigned int soc_con1;
+	unsigned int con_tzma_r0size;
+	unsigned int con_secure0;
+	unsigned int reserved0;
+	unsigned int clk_timer_en;
+	unsigned int clkgat_con;
+	unsigned int fastboot_addr;
+	unsigned int fastboot_en;
+	unsigned int reserved1[(0x30 - 0x24) / 4];
+	unsigned int srst_con;
+};
+check_member(rk3308_sgrf, fastboot_en, 0x20);
+
+#endif
diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
index f5a80b4f0c..fb199bc910 100644
--- a/arch/arm/mach-rockchip/Kconfig
+++ b/arch/arm/mach-rockchip/Kconfig
@@ -105,6 +105,29 @@ config ROCKCHIP_RK3288
 	  and video codec support. Peripherals include Gigabit Ethernet,
 	  USB2 host and OTG, SDIO, I2S, UARTs, SPI, I2C and PWMs.
 
+config ROCKCHIP_RK3308
+	bool "Support Rockchip RK3308"
+	select ARM64
+	select DEBUG_UART_BOARD_INIT
+	select SUPPORT_SPL
+	select SUPPORT_TPL
+	select SPL
+	select SPL_ATF
+	select SPL_ATF_NO_PLATFORM_PARAM
+	select SPL_LOAD_FIT
+	imply ROCKCHIP_COMMON_BOARD
+	imply SPL_ROCKCHIP_COMMON_BOARD
+	imply SPL_CLK
+	imply SPL_REGMAP
+	imply SPL_SYSCON
+	imply SPL_RAM
+	imply SPL_SERIAL_SUPPORT
+	imply TPL_SERIAL_SUPPORT
+	imply SPL_SEPARATE_BSS
+	help
+	  The Rockchip RK3308 is a ARM-based Soc which embedded with quad
+	  Cortex-A35 and highly integrated audio interfaces.
+
 config ROCKCHIP_RK3328
 	bool "Support Rockchip RK3328"
 	select ARM64
@@ -320,6 +343,7 @@ source "arch/arm/mach-rockchip/rk3128/Kconfig"
 source "arch/arm/mach-rockchip/rk3188/Kconfig"
 source "arch/arm/mach-rockchip/rk322x/Kconfig"
 source "arch/arm/mach-rockchip/rk3288/Kconfig"
+source "arch/arm/mach-rockchip/rk3308/Kconfig"
 source "arch/arm/mach-rockchip/rk3328/Kconfig"
 source "arch/arm/mach-rockchip/rk3368/Kconfig"
 source "arch/arm/mach-rockchip/rk3399/Kconfig"
diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
index 45d9b06233..974fbc138c 100644
--- a/arch/arm/mach-rockchip/Makefile
+++ b/arch/arm/mach-rockchip/Makefile
@@ -32,6 +32,7 @@ obj-$(CONFIG_ROCKCHIP_RK3128) += rk3128/
 obj-$(CONFIG_ROCKCHIP_RK3188) += rk3188/
 obj-$(CONFIG_ROCKCHIP_RK322X) += rk322x/
 obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288/
+obj-$(CONFIG_ROCKCHIP_RK3308) += rk3308/
 obj-$(CONFIG_ROCKCHIP_RK3328) += rk3328/
 obj-$(CONFIG_ROCKCHIP_RK3368) += rk3368/
 obj-$(CONFIG_ROCKCHIP_RK3399) += rk3399/
diff --git a/arch/arm/mach-rockchip/rk3308/Kconfig b/arch/arm/mach-rockchip/rk3308/Kconfig
new file mode 100644
index 0000000000..9c09661595
--- /dev/null
+++ b/arch/arm/mach-rockchip/rk3308/Kconfig
@@ -0,0 +1,14 @@
+if ROCKCHIP_RK3308
+
+config SYS_SOC
+	default "rk3308"
+
+config SYS_MALLOC_F_LEN
+	default 0x400
+
+config SPL_SERIAL_SUPPORT
+	default y
+
+config ROCKCHIP_BOOT_MODE_REG
+	default 0xff000500
+endif
diff --git a/arch/arm/mach-rockchip/rk3308/Makefile b/arch/arm/mach-rockchip/rk3308/Makefile
new file mode 100644
index 0000000000..ce4d44bb34
--- /dev/null
+++ b/arch/arm/mach-rockchip/rk3308/Makefile
@@ -0,0 +1,9 @@
+#
+# (C) Copyright 2018 Rockchip Electronics Co., Ltd.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += syscon_rk3308.o
+obj-y += rk3308.o
+obj-y += clk_rk3308.o
diff --git a/arch/arm/mach-rockchip/rk3308/clk_rk3308.c b/arch/arm/mach-rockchip/rk3308/clk_rk3308.c
new file mode 100644
index 0000000000..51b43153e8
--- /dev/null
+++ b/arch/arm/mach-rockchip/rk3308/clk_rk3308.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <syscon.h>
+#include <asm/arch-rockchip/clock.h>
+#include <asm/arch/cru_rk3308.h>
+
+int rockchip_get_clk(struct udevice **devp)
+{
+	return uclass_get_device_by_driver(UCLASS_CLK,
+			DM_GET_DRIVER(rockchip_rk3308_cru), devp);
+}
+
+void *rockchip_get_cru(void)
+{
+	struct rk3308_clk_priv *priv;
+	struct udevice *dev;
+	int ret;
+
+	ret = rockchip_get_clk(&dev);
+	if (ret)
+		return ERR_PTR(ret);
+
+	priv = dev_get_priv(dev);
+
+	return priv->cru;
+}
diff --git a/arch/arm/mach-rockchip/rk3308/rk3308.c b/arch/arm/mach-rockchip/rk3308/rk3308.c
new file mode 100644
index 0000000000..f27f9e8c0b
--- /dev/null
+++ b/arch/arm/mach-rockchip/rk3308/rk3308.c
@@ -0,0 +1,175 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *Copyright (c) 2018 Rockchip Electronics Co., Ltd
+ */
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/grf_rk3308.h>
+#include <asm/arch-rockchip/hardware.h>
+#include <asm/gpio.h>
+#include <debug_uart.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#include <asm/armv8/mmu.h>
+static struct mm_region rk3308_mem_map[] = {
+	{
+		.virt = 0x0UL,
+		.phys = 0x0UL,
+		.size = 0xff000000UL,
+		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+			 PTE_BLOCK_INNER_SHARE
+	}, {
+		.virt = 0xff000000UL,
+		.phys = 0xff000000UL,
+		.size = 0x01000000UL,
+		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+			 PTE_BLOCK_NON_SHARE |
+			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
+	}, {
+		/* List terminator */
+		0,
+	}
+};
+
+struct mm_region *mem_map = rk3308_mem_map;
+
+#define GRF_BASE	0xff000000
+#define SGRF_BASE	0xff2b0000
+
+enum {
+	GPIO1C7_SHIFT		= 8,
+	GPIO1C7_MASK		= GENMASK(11, 8),
+	GPIO1C7_GPIO		= 0,
+	GPIO1C7_UART1_RTSN,
+	GPIO1C7_UART2_TX_M0,
+	GPIO1C7_SPI2_MOSI,
+	GPIO1C7_JTAG_TMS,
+
+	GPIO1C6_SHIFT		= 4,
+	GPIO1C6_MASK		= GENMASK(7, 4),
+	GPIO1C6_GPIO		= 0,
+	GPIO1C6_UART1_CTSN,
+	GPIO1C6_UART2_RX_M0,
+	GPIO1C6_SPI2_MISO,
+	GPIO1C6_JTAG_TCLK,
+
+	GPIO4D3_SHIFT           = 6,
+	GPIO4D3_MASK            = GENMASK(7, 6),
+	GPIO4D3_GPIO            = 0,
+	GPIO4D3_SDMMC_D3,
+	GPIO4D3_UART2_TX_M1,
+
+	GPIO4D2_SHIFT           = 4,
+	GPIO4D2_MASK            = GENMASK(5, 4),
+	GPIO4D2_GPIO            = 0,
+	GPIO4D2_SDMMC_D2,
+	GPIO4D2_UART2_RX_M1,
+
+	UART2_IO_SEL_SHIFT	= 2,
+	UART2_IO_SEL_MASK	= GENMASK(3, 2),
+	UART2_IO_SEL_M0		= 0,
+	UART2_IO_SEL_M1,
+	UART2_IO_SEL_USB,
+
+	GPIO3B3_SEL_SRC_CTRL_SHIFT	= 7,
+	GPIO3B3_SEL_SRC_CTRL_MASK	= BIT(7),
+	GPIO3B3_SEL_SRC_CTRL_IOMUX	= 0,
+	GPIO3B3_SEL_SRC_CTRL_SEL_PLUS,
+
+	GPIO3B3_SEL_PLUS_SHIFT		= 4,
+	GPIO3B3_SEL_PLUS_MASK		= GENMASK(6, 4),
+	GPIO3B3_SEL_PLUS_GPIO3_B3	= 0,
+	GPIO3B3_SEL_PLUS_FLASH_ALE,
+	GPIO3B3_SEL_PLUS_EMMC_PWREN,
+	GPIO3B3_SEL_PLUS_SPI1_CLK,
+	GPIO3B3_SEL_PLUS_LCDC_D23_M1,
+
+	GPIO3B2_SEL_SRC_CTRL_SHIFT	= 3,
+	GPIO3B2_SEL_SRC_CTRL_MASK	= BIT(3),
+	GPIO3B2_SEL_SRC_CTRL_IOMUX	= 0,
+	GPIO3B2_SEL_SRC_CTRL_SEL_PLUS,
+
+	GPIO3B2_SEL_PLUS_SHIFT		= 0,
+	GPIO3B2_SEL_PLUS_MASK		= GENMASK(2, 0),
+	GPIO3B2_SEL_PLUS_GPIO3_B2	= 0,
+	GPIO3B2_SEL_PLUS_FLASH_RDN,
+	GPIO3B2_SEL_PLUS_EMMC_RSTN,
+	GPIO3B2_SEL_PLUS_SPI1_MISO,
+	GPIO3B2_SEL_PLUS_LCDC_D22_M1,
+};
+
+enum {
+	IOVSEL3_CTRL_SHIFT	= 8,
+	IOVSEL3_CTRL_MASK	= BIT(8),
+	VCCIO3_SEL_BY_GPIO	= 0,
+	VCCIO3_SEL_BY_IOVSEL3,
+
+	IOVSEL3_SHIFT		= 3,
+	IOVSEL3_MASK		= BIT(3),
+	VCCIO3_3V3		= 0,
+	VCCIO3_1V8,
+};
+
+/*
+ * The voltage of VCCIO3(which is the voltage domain of emmc/flash/sfc
+ * interface) can indicated by GPIO0_A4 or io_vsel3. The SOC defaults
+ * use GPIO0_A4 to indicate power supply voltage for VCCIO3 by hardware,
+ * then we can switch to io_vsel3 after system power on, and release GPIO0_A4
+ * for other usage.
+ */
+
+#define GPIO0_A4	4
+
+int rk_board_init(void)
+{
+	static struct rk3308_grf * const grf = (void *)GRF_BASE;
+	u32 val;
+	int ret;
+
+	ret = gpio_request(GPIO0_A4, "gpio0_a4");
+	if (ret < 0) {
+		printf("request for gpio0_a4 failed:%d\n", ret);
+		return 0;
+	}
+
+	gpio_direction_input(GPIO0_A4);
+
+	if (gpio_get_value(GPIO0_A4))
+		val = VCCIO3_SEL_BY_IOVSEL3 << IOVSEL3_CTRL_SHIFT |
+		      VCCIO3_1V8 << IOVSEL3_SHIFT;
+	else
+		val = VCCIO3_SEL_BY_IOVSEL3 << IOVSEL3_CTRL_SHIFT |
+		      VCCIO3_3V3 << IOVSEL3_SHIFT;
+	rk_clrsetreg(&grf->soc_con0, IOVSEL3_CTRL_MASK | IOVSEL3_MASK, val);
+
+	gpio_free(GPIO0_A4);
+	return 0;
+}
+
+#if defined(CONFIG_DEBUG_UART)
+__weak void board_debug_uart_init(void)
+{
+	static struct rk3308_grf * const grf = (void *)GRF_BASE;
+
+	/* Enable early UART2 channel m1 on the rk3308 */
+	rk_clrsetreg(&grf->soc_con5, UART2_IO_SEL_MASK,
+		     UART2_IO_SEL_M1 << UART2_IO_SEL_SHIFT);
+	rk_clrsetreg(&grf->gpio4d_iomux,
+		     GPIO4D3_MASK | GPIO4D2_MASK,
+		     GPIO4D2_UART2_RX_M1 << GPIO4D2_SHIFT |
+		     GPIO4D3_UART2_TX_M1 << GPIO4D3_SHIFT);
+}
+#endif
+
+#if defined(CONFIG_SPL_BUILD)
+int arch_cpu_init(void)
+{
+	static struct rk3308_sgrf * const sgrf = (void *)SGRF_BASE;
+
+	/* Set CRYPTO SDMMC EMMC NAND SFC USB master bus to be secure access */
+	rk_clrreg(&sgrf->con_secure0, 0x2b83);
+
+	return 0;
+}
+#endif
diff --git a/arch/arm/mach-rockchip/rk3308/syscon_rk3308.c b/arch/arm/mach-rockchip/rk3308/syscon_rk3308.c
new file mode 100644
index 0000000000..b380ff5723
--- /dev/null
+++ b/arch/arm/mach-rockchip/rk3308/syscon_rk3308.c
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier:     GPL-2.0+
+/*
+ * (C) Copyright 2018 Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <syscon.h>
+#include <asm/arch-rockchip/clock.h>
+
+static const struct udevice_id rk3308_syscon_ids[] = {
+	{ .compatible = "rockchip,rk3308-grf", .data = ROCKCHIP_SYSCON_GRF },
+	{ }
+};
+
+U_BOOT_DRIVER(syscon_rk3308) = {
+	.name = "rk3308_syscon",
+	.id = UCLASS_SYSCON,
+	.of_match = rk3308_syscon_ids,
+};
diff --git a/include/configs/rk3308_common.h b/include/configs/rk3308_common.h
new file mode 100644
index 0000000000..a67d3d7d1b
--- /dev/null
+++ b/include/configs/rk3308_common.h
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2017 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef __CONFIG_RK3308_COMMON_H
+#define __CONFIG_RK3308_COMMON_H
+
+#include "rockchip-common.h"
+
+#define CONFIG_SYS_CBSIZE		1024
+#define CONFIG_SKIP_LOWLEVEL_INIT
+#define CONFIG_SYS_MAX_NAND_DEVICE	1
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+#define CONFIG_SYS_NAND_PAGE_SIZE	2048
+#define CONFIG_SYS_NAND_PAGE_COUNT	64
+#define CONFIG_SYS_NAND_SIZE		(256 * 1024 * 1024)
+#define CONFIG_SPL_MAX_SIZE		0x20000
+#define CONFIG_SPL_BSS_START_ADDR	0x00400000
+#define CONFIG_SPL_BSS_MAX_SIZE		0x2000
+#define CONFIG_SYS_SPI_U_BOOT_OFFS	0x8000
+
+#define CONFIG_SYS_NS16550_MEM32
+
+#define CONFIG_ROCKCHIP_STIMER_BASE	0xff1b00a0
+#define CONFIG_IRAM_BASE		0xfff80000
+#define CONFIG_SYS_INIT_SP_ADDR		0x00800000
+#define CONFIG_SYS_LOAD_ADDR		0x00C00800
+#define CONFIG_SPL_STACK		0x00400000
+#define CONFIG_SYS_BOOTM_LEN		(64 << 20)	/* 64M */
+
+#define COUNTER_FREQUENCY		24000000
+
+#define CONFIG_SYS_BOOTM_LEN	(64 << 20)	/* 64M */
+
+#define CONFIG_SYS_SDRAM_BASE		0
+#define SDRAM_MAX_SIZE			0xff000000
+#define SDRAM_BANK_SIZE			(2UL << 30)
+
+#ifndef CONFIG_SPL_BUILD
+
+#define ENV_MEM_LAYOUT_SETTINGS \
+	"scriptaddr=0x00500000\0" \
+	"pxefile_addr_r=0x00600000\0" \
+	"fdt_addr_r=0x01f00000\0" \
+	"kernel_addr_r=0x00680000\0" \
+	"ramdisk_addr_r=0x04000000\0"
+
+#include <config_distro_bootcmd.h>
+#define CONFIG_EXTRA_ENV_SETTINGS \
+	ENV_MEM_LAYOUT_SETTINGS \
+	"partitions=" PARTS_DEFAULT \
+	ROCKCHIP_DEVICE_SETTINGS \
+	BOOTENV
+
+#endif
+
+#endif
-- 
2.17.1

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

* [U-Boot] [PATCH v2 2/9] rockchip: clk: Add clk driver for rk3308
  2019-10-30  8:11 [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Andy Yan
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 1/9] arm: rockchip: Add RK3308 SOC support Andy Yan
@ 2019-10-30  8:11 ` Andy Yan
  2019-11-07  9:31   ` Kever Yang
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 3/9] arm: dts: rockchip: Add dts for rk3308 evb Andy Yan
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:11 UTC (permalink / raw)
  To: u-boot

From: Finley Xiao <finley.xiao@rock-chips.com>

Add clk controller driver for RK3308 SOC.

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

Changes in v2: None

 drivers/clk/rockchip/Makefile          |    1 +
 drivers/clk/rockchip/clk_rk3308.c      | 1078 ++++++++++++++++++++++++
 include/dt-bindings/clock/rk3308-cru.h |  387 +++++++++
 3 files changed, 1466 insertions(+)
 create mode 100644 drivers/clk/rockchip/clk_rk3308.c
 create mode 100644 include/dt-bindings/clock/rk3308-cru.h

diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile
index 03a9fa77ba..f2068a8e94 100644
--- a/drivers/clk/rockchip/Makefile
+++ b/drivers/clk/rockchip/Makefile
@@ -9,6 +9,7 @@ obj-$(CONFIG_ROCKCHIP_RK3128) += clk_rk3128.o
 obj-$(CONFIG_ROCKCHIP_RK3188) += clk_rk3188.o
 obj-$(CONFIG_ROCKCHIP_RK322X) += clk_rk322x.o
 obj-$(CONFIG_ROCKCHIP_RK3288) += clk_rk3288.o
+obj-$(CONFIG_ROCKCHIP_RK3308) += clk_rk3308.o
 obj-$(CONFIG_ROCKCHIP_RK3328) += clk_rk3328.o
 obj-$(CONFIG_ROCKCHIP_RK3368) += clk_rk3368.o
 obj-$(CONFIG_ROCKCHIP_RK3399) += clk_rk3399.o
diff --git a/drivers/clk/rockchip/clk_rk3308.c b/drivers/clk/rockchip/clk_rk3308.c
new file mode 100644
index 0000000000..e4e213d463
--- /dev/null
+++ b/drivers/clk/rockchip/clk_rk3308.c
@@ -0,0 +1,1078 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * (C) Copyright 2017 Rockchip Electronics Co., Ltd
+ */
+#include <common.h>
+#include <bitfield.h>
+#include <clk-uclass.h>
+#include <dm.h>
+#include <div64.h>
+#include <errno.h>
+#include <syscon.h>
+#include <asm/io.h>
+#include <asm/arch/cru_rk3308.h>
+#include <asm/arch-rockchip/clock.h>
+#include <asm/arch-rockchip/hardware.h>
+#include <dm/lists.h>
+#include <dt-bindings/clock/rk3308-cru.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+enum {
+	VCO_MAX_HZ	= 3200U * 1000000,
+	VCO_MIN_HZ	= 800 * 1000000,
+	OUTPUT_MAX_HZ	= 3200U * 1000000,
+	OUTPUT_MIN_HZ	= 24 * 1000000,
+};
+
+#define DIV_TO_RATE(input_rate, div)    ((input_rate) / ((div) + 1))
+
+#define RK3308_CPUCLK_RATE(_rate, _aclk_div, _pclk_div)         \
+{                                                               \
+	.rate   = _rate##U,                                     \
+	.aclk_div = _aclk_div,                                  \
+	.pclk_div = _pclk_div,                                  \
+}
+
+static struct rockchip_pll_rate_table rk3308_pll_rates[] = {
+	/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
+	RK3036_PLL_RATE(1300000000, 6, 325, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0),
+	RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
+	RK3036_PLL_RATE(748000000, 2, 187, 3, 1, 1, 0),
+};
+
+static struct rockchip_cpu_rate_table rk3308_cpu_rates[] = {
+	RK3308_CPUCLK_RATE(1200000000, 1, 5),
+	RK3308_CPUCLK_RATE(1008000000, 1, 5),
+	RK3308_CPUCLK_RATE(816000000, 1, 3),
+	RK3308_CPUCLK_RATE(600000000, 1, 3),
+	RK3308_CPUCLK_RATE(408000000, 1, 1),
+};
+
+static struct rockchip_pll_clock rk3308_pll_clks[] = {
+	[APLL] = PLL(pll_rk3328, PLL_APLL, RK3308_PLL_CON(0),
+		     RK3308_MODE_CON, 0, 10, 0, rk3308_pll_rates),
+	[DPLL] = PLL(pll_rk3328, PLL_DPLL, RK3308_PLL_CON(8),
+		     RK3308_MODE_CON, 2, 10, 0, NULL),
+	[VPLL0] = PLL(pll_rk3328, PLL_VPLL0, RK3308_PLL_CON(16),
+		      RK3308_MODE_CON, 4, 10, 0, NULL),
+	[VPLL1] = PLL(pll_rk3328, PLL_VPLL1, RK3308_PLL_CON(24),
+		      RK3308_MODE_CON, 6, 10, 0, NULL),
+};
+
+static ulong rk3308_armclk_set_clk(struct rk3308_clk_priv *priv, ulong hz)
+{
+	struct rk3308_cru *cru = priv->cru;
+	const struct rockchip_cpu_rate_table *rate;
+	ulong old_rate;
+
+	rate = rockchip_get_cpu_settings(rk3308_cpu_rates, hz);
+	if (!rate) {
+		printf("%s unsupport rate\n", __func__);
+		return -EINVAL;
+	}
+
+	/*
+	 * select apll as cpu/core clock pll source and
+	 * set up dependent divisors for PERI and ACLK clocks.
+	 * core hz : apll = 1:1
+	 */
+	old_rate = rockchip_pll_get_rate(&rk3308_pll_clks[APLL],
+					 priv->cru, APLL);
+	if (old_rate > hz) {
+		if (rockchip_pll_set_rate(&rk3308_pll_clks[APLL],
+					  priv->cru, APLL, hz))
+			return -EINVAL;
+		rk_clrsetreg(&cru->clksel_con[0],
+			     CORE_CLK_PLL_SEL_MASK | CORE_DIV_CON_MASK |
+			     CORE_ACLK_DIV_MASK | CORE_DBG_DIV_MASK,
+			     rate->aclk_div << CORE_ACLK_DIV_SHIFT |
+			     rate->pclk_div << CORE_DBG_DIV_SHIFT |
+			     CORE_CLK_PLL_SEL_APLL << CORE_CLK_PLL_SEL_SHIFT |
+			     0 << CORE_DIV_CON_SHIFT);
+	} else if (old_rate < hz) {
+		rk_clrsetreg(&cru->clksel_con[0],
+			     CORE_CLK_PLL_SEL_MASK | CORE_DIV_CON_MASK |
+			     CORE_ACLK_DIV_MASK | CORE_DBG_DIV_MASK,
+			     rate->aclk_div << CORE_ACLK_DIV_SHIFT |
+			     rate->pclk_div << CORE_DBG_DIV_SHIFT |
+			     CORE_CLK_PLL_SEL_APLL << CORE_CLK_PLL_SEL_SHIFT |
+			     0 << CORE_DIV_CON_SHIFT);
+		if (rockchip_pll_set_rate(&rk3308_pll_clks[APLL],
+					  priv->cru, APLL, hz))
+			return -EINVAL;
+	}
+
+	return rockchip_pll_get_rate(&rk3308_pll_clks[APLL], priv->cru, APLL);
+}
+
+static void rk3308_clk_get_pll_rate(struct rk3308_clk_priv *priv)
+{
+	if (!priv->dpll_hz)
+		priv->dpll_hz = rockchip_pll_get_rate(&rk3308_pll_clks[DPLL],
+						      priv->cru, DPLL);
+	if (!priv->vpll0_hz)
+		priv->vpll0_hz = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL0],
+						       priv->cru, VPLL0);
+	if (!priv->vpll1_hz)
+		priv->vpll1_hz = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL1],
+						       priv->cru, VPLL1);
+}
+
+static ulong rk3308_i2c_get_clk(struct clk *clk)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con, con_id;
+
+	switch (clk->id) {
+	case SCLK_I2C0:
+		con_id = 25;
+		break;
+	case SCLK_I2C1:
+		con_id = 26;
+		break;
+	case SCLK_I2C2:
+		con_id = 27;
+		break;
+	case SCLK_I2C3:
+		con_id = 28;
+		break;
+	default:
+		printf("do not support this i2c bus\n");
+		return -EINVAL;
+	}
+
+	con = readl(&cru->clksel_con[con_id]);
+	div = con >> CLK_I2C_DIV_CON_SHIFT & CLK_I2C_DIV_CON_MASK;
+
+	return DIV_TO_RATE(priv->dpll_hz, div);
+}
+
+static ulong rk3308_i2c_set_clk(struct clk *clk, uint hz)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 src_clk_div, con_id;
+
+	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
+	assert(src_clk_div - 1 <= 127);
+
+	switch (clk->id) {
+	case SCLK_I2C0:
+		con_id = 25;
+		break;
+	case SCLK_I2C1:
+		con_id = 26;
+		break;
+	case SCLK_I2C2:
+		con_id = 27;
+		break;
+	case SCLK_I2C3:
+		con_id = 28;
+		break;
+	default:
+		printf("do not support this i2c bus\n");
+		return -EINVAL;
+	}
+	rk_clrsetreg(&cru->clksel_con[con_id],
+		     CLK_I2C_PLL_SEL_MASK | CLK_I2C_DIV_CON_MASK,
+		     CLK_I2C_PLL_SEL_DPLL << CLK_I2C_PLL_SEL_SHIFT |
+		     (src_clk_div - 1) << CLK_I2C_DIV_CON_SHIFT);
+
+	return rk3308_i2c_get_clk(clk);
+}
+
+static ulong rk3308_mac_set_clk(struct clk *clk, uint hz)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 con = readl(&cru->clksel_con[43]);
+	ulong pll_rate;
+	u8 div;
+
+	if ((con >> MAC_PLL_SHIFT) & MAC_SEL_VPLL0)
+		pll_rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL0],
+						 priv->cru, VPLL0);
+	else if ((con >> MAC_PLL_SHIFT) & MAC_SEL_VPLL1)
+		pll_rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL1],
+						 priv->cru, VPLL1);
+	else
+		pll_rate = rockchip_pll_get_rate(&rk3308_pll_clks[DPLL],
+						 priv->cru, DPLL);
+
+	/*default set 50MHZ for gmac*/
+	if (!hz)
+		hz = 50000000;
+
+	div = DIV_ROUND_UP(pll_rate, hz) - 1;
+	assert(div < 32);
+	rk_clrsetreg(&cru->clksel_con[43], MAC_DIV_MASK,
+		     div << MAC_DIV_SHIFT);
+
+	return DIV_TO_RATE(pll_rate, div);
+}
+
+static int rk3308_mac_set_speed_clk(struct clk *clk, uint hz)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+
+	if (hz != 2500000 && hz != 25000000) {
+		debug("Unsupported mac speed:%d\n", hz);
+		return -EINVAL;
+	}
+
+	rk_clrsetreg(&cru->clksel_con[43], MAC_CLK_SPEED_SEL_MASK,
+		     ((hz == 2500000) ? 0 : 1) << MAC_CLK_SPEED_SEL_SHIFT);
+
+	return 0;
+}
+
+static ulong rk3308_mmc_get_clk(struct clk *clk)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con, con_id;
+
+	switch (clk->id) {
+	case HCLK_SDMMC:
+	case SCLK_SDMMC:
+		con_id = 39;
+		break;
+	case HCLK_EMMC:
+	case SCLK_EMMC:
+	case SCLK_EMMC_SAMPLE:
+		con_id = 41;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	con = readl(&cru->clksel_con[con_id]);
+	div = (con & EMMC_DIV_MASK) >> EMMC_DIV_SHIFT;
+
+	if ((con & EMMC_PLL_MASK) >> EMMC_PLL_SHIFT
+	    == EMMC_SEL_24M)
+		return DIV_TO_RATE(OSC_HZ, div) / 2;
+	else
+		return DIV_TO_RATE(priv->vpll0_hz, div) / 2;
+}
+
+static ulong rk3308_mmc_set_clk(struct clk *clk, ulong set_rate)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	int src_clk_div;
+	u32 con_id;
+
+	switch (clk->id) {
+	case HCLK_SDMMC:
+	case SCLK_SDMMC:
+		con_id = 39;
+		break;
+	case HCLK_EMMC:
+	case SCLK_EMMC:
+		con_id = 41;
+		break;
+	default:
+		return -EINVAL;
+	}
+	/* Select clk_sdmmc/emmc source from VPLL0 by default */
+	/* mmc clock defaulg div 2 internal, need provide double in cru */
+	src_clk_div = DIV_ROUND_UP(priv->vpll0_hz / 2, set_rate);
+
+	if (src_clk_div > 127) {
+		/* use 24MHz source for 400KHz clock */
+		src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, set_rate);
+		rk_clrsetreg(&cru->clksel_con[con_id],
+			     EMMC_PLL_MASK | EMMC_DIV_MASK | EMMC_CLK_SEL_MASK,
+			     EMMC_CLK_SEL_EMMC << EMMC_CLK_SEL_SHIFT |
+			     EMMC_SEL_24M << EMMC_PLL_SHIFT |
+			     (src_clk_div - 1) << EMMC_DIV_SHIFT);
+	} else {
+		rk_clrsetreg(&cru->clksel_con[con_id],
+			     EMMC_PLL_MASK | EMMC_DIV_MASK | EMMC_CLK_SEL_MASK,
+			     EMMC_CLK_SEL_EMMC << EMMC_CLK_SEL_SHIFT |
+			     EMMC_SEL_VPLL0 << EMMC_PLL_SHIFT |
+			     (src_clk_div - 1) << EMMC_DIV_SHIFT);
+	}
+
+	return rk3308_mmc_get_clk(clk);
+}
+
+static ulong rk3308_saradc_get_clk(struct clk *clk)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con;
+
+	con = readl(&cru->clksel_con[34]);
+	div = con >> CLK_SARADC_DIV_CON_SHIFT & CLK_SARADC_DIV_CON_MASK;
+
+	return DIV_TO_RATE(OSC_HZ, div);
+}
+
+static ulong rk3308_saradc_set_clk(struct clk *clk, uint hz)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(OSC_HZ, hz);
+	assert(src_clk_div - 1 <= 2047);
+
+	rk_clrsetreg(&cru->clksel_con[34],
+		     CLK_SARADC_DIV_CON_MASK,
+		     (src_clk_div - 1) << CLK_SARADC_DIV_CON_SHIFT);
+
+	return rk3308_saradc_get_clk(clk);
+}
+
+static ulong rk3308_tsadc_get_clk(struct clk *clk)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con;
+
+	con = readl(&cru->clksel_con[33]);
+	div = con >> CLK_SARADC_DIV_CON_SHIFT & CLK_SARADC_DIV_CON_MASK;
+
+	return DIV_TO_RATE(OSC_HZ, div);
+}
+
+static ulong rk3308_tsadc_set_clk(struct clk *clk, uint hz)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(OSC_HZ, hz);
+	assert(src_clk_div - 1 <= 2047);
+
+	rk_clrsetreg(&cru->clksel_con[33],
+		     CLK_SARADC_DIV_CON_MASK,
+		     (src_clk_div - 1) << CLK_SARADC_DIV_CON_SHIFT);
+
+	return rk3308_tsadc_get_clk(clk);
+}
+
+static ulong rk3308_spi_get_clk(struct clk *clk)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con, con_id;
+
+	switch (clk->id) {
+	case SCLK_SPI0:
+		con_id = 30;
+		break;
+	case SCLK_SPI1:
+		con_id = 31;
+		break;
+	case SCLK_SPI2:
+		con_id = 32;
+		break;
+	default:
+		printf("do not support this spi bus\n");
+		return -EINVAL;
+	}
+
+	con = readl(&cru->clksel_con[con_id]);
+	div = con >> CLK_SPI_DIV_CON_SHIFT & CLK_SPI_DIV_CON_MASK;
+
+	return DIV_TO_RATE(priv->dpll_hz, div);
+}
+
+static ulong rk3308_spi_set_clk(struct clk *clk, uint hz)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 src_clk_div, con_id;
+
+	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
+	assert(src_clk_div - 1 <= 127);
+
+	switch (clk->id) {
+	case SCLK_SPI0:
+		con_id = 30;
+		break;
+	case SCLK_SPI1:
+		con_id = 31;
+		break;
+	case SCLK_SPI2:
+		con_id = 32;
+		break;
+	default:
+		printf("do not support this spi bus\n");
+		return -EINVAL;
+	}
+
+	rk_clrsetreg(&cru->clksel_con[con_id],
+		     CLK_SPI_PLL_SEL_MASK | CLK_SPI_DIV_CON_MASK,
+		     CLK_SPI_PLL_SEL_DPLL << CLK_SPI_PLL_SEL_SHIFT |
+		     (src_clk_div - 1) << CLK_SPI_DIV_CON_SHIFT);
+
+	return rk3308_spi_get_clk(clk);
+}
+
+static ulong rk3308_pwm_get_clk(struct clk *clk)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con;
+
+	con = readl(&cru->clksel_con[29]);
+	div = con >> CLK_PWM_DIV_CON_SHIFT & CLK_PWM_DIV_CON_MASK;
+
+	return DIV_TO_RATE(priv->dpll_hz, div);
+}
+
+static ulong rk3308_pwm_set_clk(struct clk *clk, uint hz)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
+	assert(src_clk_div - 1 <= 127);
+
+	rk_clrsetreg(&cru->clksel_con[29],
+		     CLK_PWM_PLL_SEL_MASK | CLK_PWM_DIV_CON_MASK,
+		     CLK_PWM_PLL_SEL_DPLL << CLK_PWM_PLL_SEL_SHIFT |
+		     (src_clk_div - 1) << CLK_PWM_DIV_CON_SHIFT);
+
+	return rk3308_pwm_get_clk(clk);
+}
+
+static ulong rk3308_vop_get_clk(struct clk *clk)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, pll_sel, vol_sel, con, parent;
+
+	con = readl(&cru->clksel_con[8]);
+	vol_sel = (con & DCLK_VOP_SEL_MASK) >> DCLK_VOP_SEL_SHIFT;
+	pll_sel = (con & DCLK_VOP_PLL_SEL_MASK) >> DCLK_VOP_PLL_SEL_SHIFT;
+	div = con & DCLK_VOP_DIV_MASK;
+
+	if (vol_sel == DCLK_VOP_SEL_24M) {
+		parent = OSC_HZ;
+	} else if (vol_sel == DCLK_VOP_SEL_DIVOUT) {
+		switch (pll_sel) {
+		case DCLK_VOP_PLL_SEL_DPLL:
+			parent = priv->dpll_hz;
+			break;
+		case DCLK_VOP_PLL_SEL_VPLL0:
+			parent = priv->vpll0_hz;
+			break;
+		case DCLK_VOP_PLL_SEL_VPLL1:
+			parent = priv->vpll0_hz;
+			break;
+		default:
+			printf("do not support this vop pll sel\n");
+			return -EINVAL;
+		}
+	} else {
+		printf("do not support this vop sel\n");
+		return -EINVAL;
+	}
+
+	return DIV_TO_RATE(parent, div);
+}
+
+static ulong rk3308_vop_set_clk(struct clk *clk, ulong hz)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3308_cru *cru = priv->cru;
+	ulong pll_rate, now, best_rate = 0;
+	u32 i, div, best_div = 0, best_sel = 0;
+
+	for (i = 0; i <= DCLK_VOP_PLL_SEL_VPLL1; i++) {
+		switch (i) {
+		case DCLK_VOP_PLL_SEL_DPLL:
+			pll_rate = priv->dpll_hz;
+			break;
+		case DCLK_VOP_PLL_SEL_VPLL0:
+			pll_rate = priv->vpll0_hz;
+			break;
+		case DCLK_VOP_PLL_SEL_VPLL1:
+			pll_rate = priv->vpll1_hz;
+			break;
+		default:
+			printf("do not support this vop pll sel\n");
+			return -EINVAL;
+		}
+
+		div = DIV_ROUND_UP(pll_rate, hz);
+		if (div > 255)
+			continue;
+		now = pll_rate / div;
+		if (abs(hz - now) < abs(hz - best_rate)) {
+			best_rate = now;
+			best_div = div;
+			best_sel = i;
+		}
+		debug("pll_rate=%lu, best_rate=%lu, best_div=%u, best_sel=%u\n",
+		      pll_rate, best_rate, best_div, best_sel);
+	}
+
+	if (best_rate != hz && hz == OSC_HZ) {
+		rk_clrsetreg(&cru->clksel_con[8],
+			     DCLK_VOP_SEL_MASK,
+			     DCLK_VOP_SEL_24M << DCLK_VOP_SEL_SHIFT);
+	} else if (best_rate) {
+		rk_clrsetreg(&cru->clksel_con[8],
+			     DCLK_VOP_SEL_MASK | DCLK_VOP_PLL_SEL_MASK |
+			     DCLK_VOP_DIV_MASK,
+			     DCLK_VOP_SEL_DIVOUT << DCLK_VOP_SEL_SHIFT |
+			     best_sel << DCLK_VOP_PLL_SEL_SHIFT |
+			     (best_div - 1) << DCLK_VOP_DIV_SHIFT);
+	} else {
+		printf("do not support this vop freq\n");
+		return -EINVAL;
+	}
+
+	return rk3308_vop_get_clk(clk);
+}
+
+static ulong rk3308_bus_get_clk(struct rk3308_clk_priv *priv, ulong clk_id)
+{
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con, parent = priv->dpll_hz;
+
+	switch (clk_id) {
+	case ACLK_BUS:
+		con = readl(&cru->clksel_con[5]);
+		div = (con & BUS_ACLK_DIV_MASK) >> BUS_ACLK_DIV_SHIFT;
+		break;
+	case HCLK_BUS:
+		con = readl(&cru->clksel_con[6]);
+		div = (con & BUS_HCLK_DIV_MASK) >> BUS_HCLK_DIV_SHIFT;
+		break;
+	case PCLK_BUS:
+	case PCLK_WDT:
+		con = readl(&cru->clksel_con[6]);
+		div = (con & BUS_PCLK_DIV_MASK) >> BUS_PCLK_DIV_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return DIV_TO_RATE(parent, div);
+}
+
+static ulong rk3308_bus_set_clk(struct rk3308_clk_priv *priv, ulong clk_id,
+				ulong hz)
+{
+	struct rk3308_cru *cru = priv->cru;
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
+	assert(src_clk_div - 1 <= 31);
+
+	/*
+	 * select dpll as pd_bus bus clock source and
+	 * set up dependent divisors for PCLK/HCLK and ACLK clocks.
+	 */
+	switch (clk_id) {
+	case ACLK_BUS:
+		rk_clrsetreg(&cru->clksel_con[5],
+			     BUS_PLL_SEL_MASK | BUS_ACLK_DIV_MASK,
+			     BUS_PLL_SEL_DPLL << BUS_PLL_SEL_SHIFT |
+			     (src_clk_div - 1) << BUS_ACLK_DIV_SHIFT);
+		break;
+	case HCLK_BUS:
+		rk_clrsetreg(&cru->clksel_con[6],
+			     BUS_HCLK_DIV_MASK,
+			     (src_clk_div - 1) << BUS_HCLK_DIV_SHIFT);
+		break;
+	case PCLK_BUS:
+		rk_clrsetreg(&cru->clksel_con[6],
+			     BUS_PCLK_DIV_MASK,
+			     (src_clk_div - 1) << BUS_PCLK_DIV_SHIFT);
+		break;
+	default:
+		printf("do not support this bus freq\n");
+		return -EINVAL;
+	}
+
+	return rk3308_bus_get_clk(priv, clk_id);
+}
+
+static ulong rk3308_peri_get_clk(struct rk3308_clk_priv *priv, ulong clk_id)
+{
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con, parent = priv->dpll_hz;
+
+	switch (clk_id) {
+	case ACLK_PERI:
+		con = readl(&cru->clksel_con[36]);
+		div = (con & PERI_ACLK_DIV_MASK) >> PERI_ACLK_DIV_SHIFT;
+		break;
+	case HCLK_PERI:
+		con = readl(&cru->clksel_con[37]);
+		div = (con & PERI_HCLK_DIV_MASK) >> PERI_HCLK_DIV_SHIFT;
+		break;
+	case PCLK_PERI:
+		con = readl(&cru->clksel_con[37]);
+		div = (con & PERI_PCLK_DIV_MASK) >> PERI_PCLK_DIV_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return DIV_TO_RATE(parent, div);
+}
+
+static ulong rk3308_peri_set_clk(struct rk3308_clk_priv *priv, ulong clk_id,
+				 ulong hz)
+{
+	struct rk3308_cru *cru = priv->cru;
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
+	assert(src_clk_div - 1 <= 31);
+
+	/*
+	 * select dpll as pd_peri bus clock source and
+	 * set up dependent divisors for PCLK/HCLK and ACLK clocks.
+	 */
+	switch (clk_id) {
+	case ACLK_PERI:
+		rk_clrsetreg(&cru->clksel_con[36],
+			     PERI_PLL_SEL_MASK | PERI_ACLK_DIV_MASK,
+			     PERI_PLL_DPLL << PERI_PLL_SEL_SHIFT |
+			     (src_clk_div - 1) << PERI_ACLK_DIV_SHIFT);
+		break;
+	case HCLK_PERI:
+		rk_clrsetreg(&cru->clksel_con[37],
+			     PERI_HCLK_DIV_MASK,
+			     (src_clk_div - 1) << PERI_HCLK_DIV_SHIFT);
+		break;
+	case PCLK_PERI:
+		rk_clrsetreg(&cru->clksel_con[37],
+			     PERI_PCLK_DIV_MASK,
+			     (src_clk_div - 1) << PERI_PCLK_DIV_SHIFT);
+		break;
+	default:
+		printf("do not support this peri freq\n");
+		return -EINVAL;
+	}
+
+	return rk3308_peri_get_clk(priv, clk_id);
+}
+
+static ulong rk3308_audio_get_clk(struct rk3308_clk_priv *priv, ulong clk_id)
+{
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con, parent = priv->vpll0_hz;
+
+	switch (clk_id) {
+	case HCLK_AUDIO:
+		con = readl(&cru->clksel_con[45]);
+		div = (con & AUDIO_HCLK_DIV_MASK) >> AUDIO_HCLK_DIV_SHIFT;
+		break;
+	case PCLK_AUDIO:
+		con = readl(&cru->clksel_con[45]);
+		div = (con & AUDIO_PCLK_DIV_MASK) >> AUDIO_PCLK_DIV_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return DIV_TO_RATE(parent, div);
+}
+
+static ulong rk3308_audio_set_clk(struct rk3308_clk_priv *priv, ulong clk_id,
+				  ulong hz)
+{
+	struct rk3308_cru *cru = priv->cru;
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(priv->vpll0_hz, hz);
+	assert(src_clk_div - 1 <= 31);
+
+	/*
+	 * select vpll0 as audio bus clock source and
+	 * set up dependent divisors for HCLK and PCLK clocks.
+	 */
+	switch (clk_id) {
+	case HCLK_AUDIO:
+		rk_clrsetreg(&cru->clksel_con[45],
+			     AUDIO_PLL_SEL_MASK | AUDIO_HCLK_DIV_MASK,
+			     AUDIO_PLL_VPLL0 << AUDIO_PLL_SEL_SHIFT |
+			     (src_clk_div - 1) << AUDIO_HCLK_DIV_SHIFT);
+		break;
+	case PCLK_AUDIO:
+		rk_clrsetreg(&cru->clksel_con[45],
+			     AUDIO_PLL_SEL_MASK | AUDIO_PCLK_DIV_MASK,
+			     AUDIO_PLL_VPLL0 << AUDIO_PLL_SEL_SHIFT |
+			     (src_clk_div - 1) << AUDIO_PCLK_DIV_SHIFT);
+		break;
+	default:
+		printf("do not support this audio freq\n");
+		return -EINVAL;
+	}
+
+	return rk3308_peri_get_clk(priv, clk_id);
+}
+
+static ulong rk3308_crypto_get_clk(struct rk3308_clk_priv *priv, ulong clk_id)
+{
+	struct rk3308_cru *cru = priv->cru;
+	u32 div, con, parent;
+
+	switch (clk_id) {
+	case SCLK_CRYPTO:
+		con = readl(&cru->clksel_con[7]);
+		div = (con & CRYPTO_DIV_MASK) >> CRYPTO_DIV_SHIFT;
+		parent = priv->vpll0_hz;
+		break;
+	case SCLK_CRYPTO_APK:
+		con = readl(&cru->clksel_con[7]);
+		div = (con & CRYPTO_APK_DIV_MASK) >> CRYPTO_APK_DIV_SHIFT;
+		parent = priv->vpll0_hz;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return DIV_TO_RATE(parent, div);
+}
+
+static ulong rk3308_crypto_set_clk(struct rk3308_clk_priv *priv, ulong clk_id,
+				   ulong hz)
+{
+	struct rk3308_cru *cru = priv->cru;
+	int src_clk_div;
+
+	src_clk_div = DIV_ROUND_UP(priv->vpll0_hz, hz);
+	assert(src_clk_div - 1 <= 31);
+
+	/*
+	 * select gpll as crypto clock source and
+	 * set up dependent divisors for crypto clocks.
+	 */
+	switch (clk_id) {
+	case SCLK_CRYPTO:
+		rk_clrsetreg(&cru->clksel_con[7],
+			     CRYPTO_PLL_SEL_MASK | CRYPTO_DIV_MASK,
+			     CRYPTO_PLL_SEL_VPLL0 << CRYPTO_PLL_SEL_SHIFT |
+			     (src_clk_div - 1) << CRYPTO_DIV_SHIFT);
+		break;
+	case SCLK_CRYPTO_APK:
+		rk_clrsetreg(&cru->clksel_con[7],
+			     CRYPTO_APK_PLL_SEL_MASK | CRYPTO_APK_DIV_MASK,
+			     CRYPTO_PLL_SEL_VPLL0 << CRYPTO_APK_SEL_SHIFT |
+			     (src_clk_div - 1) << CRYPTO_APK_DIV_SHIFT);
+		break;
+	default:
+		printf("do not support this peri freq\n");
+		return -EINVAL;
+	}
+
+	return rk3308_crypto_get_clk(priv, clk_id);
+}
+
+static ulong rk3308_clk_get_rate(struct clk *clk)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	ulong rate = 0;
+
+	debug("%s id:%ld\n", __func__, clk->id);
+
+	switch (clk->id) {
+	case PLL_APLL:
+	case ARMCLK:
+		rate = rockchip_pll_get_rate(&rk3308_pll_clks[APLL],
+					     priv->cru, APLL);
+		break;
+	case PLL_DPLL:
+		rate = rockchip_pll_get_rate(&rk3308_pll_clks[DPLL],
+					     priv->cru, DPLL);
+		break;
+	case PLL_VPLL0:
+		rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL0],
+					     priv->cru, VPLL0);
+		break;
+	case PLL_VPLL1:
+		rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL1],
+					     priv->cru, VPLL1);
+		break;
+	case HCLK_SDMMC:
+	case HCLK_EMMC:
+	case SCLK_SDMMC:
+	case SCLK_EMMC:
+	case SCLK_EMMC_SAMPLE:
+		rate = rk3308_mmc_get_clk(clk);
+		break;
+	case SCLK_I2C0:
+	case SCLK_I2C1:
+	case SCLK_I2C2:
+	case SCLK_I2C3:
+		rate = rk3308_i2c_get_clk(clk);
+		break;
+	case SCLK_SARADC:
+		rate = rk3308_saradc_get_clk(clk);
+		break;
+	case SCLK_TSADC:
+		rate = rk3308_tsadc_get_clk(clk);
+		break;
+	case SCLK_SPI0:
+	case SCLK_SPI1:
+		rate = rk3308_spi_get_clk(clk);
+		break;
+	case SCLK_PWM0:
+		rate = rk3308_pwm_get_clk(clk);
+		break;
+	case DCLK_VOP:
+		rate = rk3308_vop_get_clk(clk);
+		break;
+	case ACLK_BUS:
+	case HCLK_BUS:
+	case PCLK_BUS:
+	case PCLK_WDT:
+		rate = rk3308_bus_get_clk(priv, clk->id);
+		break;
+	case ACLK_PERI:
+	case HCLK_PERI:
+	case PCLK_PERI:
+		rate = rk3308_peri_get_clk(priv, clk->id);
+		break;
+	case HCLK_AUDIO:
+	case PCLK_AUDIO:
+		rate = rk3308_audio_get_clk(priv, clk->id);
+		break;
+	case SCLK_CRYPTO:
+	case SCLK_CRYPTO_APK:
+		rate = rk3308_crypto_get_clk(priv, clk->id);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rate;
+}
+
+static ulong rk3308_clk_set_rate(struct clk *clk, ulong rate)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+	ulong ret = 0;
+
+	debug("%s %ld %ld\n", __func__, clk->id, rate);
+
+	switch (clk->id) {
+	case PLL_DPLL:
+		ret = rockchip_pll_set_rate(&rk3308_pll_clks[DPLL], priv->cru,
+					    DPLL, rate);
+		priv->dpll_hz = rockchip_pll_get_rate(&rk3308_pll_clks[DPLL],
+						      priv->cru, DPLL);
+		break;
+	case ARMCLK:
+		if (priv->armclk_hz)
+			rk3308_armclk_set_clk(priv, rate);
+		priv->armclk_hz = rate;
+		break;
+	case HCLK_SDMMC:
+	case HCLK_EMMC:
+	case SCLK_SDMMC:
+	case SCLK_EMMC:
+		ret = rk3308_mmc_set_clk(clk, rate);
+		break;
+	case SCLK_I2C0:
+	case SCLK_I2C1:
+	case SCLK_I2C2:
+	case SCLK_I2C3:
+		ret = rk3308_i2c_set_clk(clk, rate);
+		break;
+	case SCLK_MAC:
+		ret = rk3308_mac_set_clk(clk, rate);
+		break;
+	case SCLK_MAC_RMII:
+		ret = rk3308_mac_set_speed_clk(clk, rate);
+		break;
+	case SCLK_SARADC:
+		ret = rk3308_saradc_set_clk(clk, rate);
+		break;
+	case SCLK_TSADC:
+		ret = rk3308_tsadc_set_clk(clk, rate);
+		break;
+	case SCLK_SPI0:
+	case SCLK_SPI1:
+		ret = rk3308_spi_set_clk(clk, rate);
+		break;
+	case SCLK_PWM0:
+		ret = rk3308_pwm_set_clk(clk, rate);
+		break;
+	case DCLK_VOP:
+		ret = rk3308_vop_set_clk(clk, rate);
+		break;
+	case ACLK_BUS:
+	case HCLK_BUS:
+	case PCLK_BUS:
+		rate = rk3308_bus_set_clk(priv, clk->id, rate);
+		break;
+	case ACLK_PERI:
+	case HCLK_PERI:
+	case PCLK_PERI:
+		rate = rk3308_peri_set_clk(priv, clk->id, rate);
+		break;
+	case HCLK_AUDIO:
+	case PCLK_AUDIO:
+		rate = rk3308_audio_set_clk(priv, clk->id, rate);
+		break;
+	case SCLK_CRYPTO:
+	case SCLK_CRYPTO_APK:
+		ret = rk3308_crypto_set_clk(priv, clk->id, rate);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return ret;
+}
+
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+static int __maybe_unused rk3308_mac_set_parent(struct clk *clk, struct clk *parent)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+
+	/*
+	 * If the requested parent is in the same clock-controller and
+	 * the id is SCLK_MAC_SRC, switch to the internal clock.
+	 */
+	if (parent->id == SCLK_MAC_SRC) {
+		debug("%s: switching RMII to SCLK_MAC\n", __func__);
+		rk_clrreg(&priv->cru->clksel_con[43], BIT(14));
+	} else {
+		debug("%s: switching RMII to CLKIN\n", __func__);
+		rk_setreg(&priv->cru->clksel_con[43], BIT(14));
+	}
+
+	return 0;
+}
+
+static int __maybe_unused rk3308_clk_set_parent(struct clk *clk, struct clk *parent)
+{
+	switch (clk->id) {
+	case SCLK_MAC:
+		return rk3308_mac_set_parent(clk, parent);
+	default:
+		break;
+	}
+
+	debug("%s: unsupported clk %ld\n", __func__, clk->id);
+	return -ENOENT;
+}
+#endif
+
+static struct clk_ops rk3308_clk_ops = {
+	.get_rate = rk3308_clk_get_rate,
+	.set_rate = rk3308_clk_set_rate,
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+	.set_parent = rk3308_clk_set_parent,
+#endif
+};
+
+static void rk3308_clk_init(struct udevice *dev)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	if (rockchip_pll_get_rate(&rk3308_pll_clks[APLL],
+				  priv->cru, APLL) != APLL_HZ) {
+		ret = rk3308_armclk_set_clk(priv, APLL_HZ);
+		if (ret < 0)
+			printf("%s failed to set armclk rate\n", __func__);
+	}
+
+	rk3308_clk_get_pll_rate(priv);
+
+	rk3308_bus_set_clk(priv, ACLK_BUS, BUS_ACLK_HZ);
+	rk3308_bus_set_clk(priv, HCLK_BUS, BUS_HCLK_HZ);
+	rk3308_bus_set_clk(priv, PCLK_BUS, BUS_PCLK_HZ);
+
+	rk3308_peri_set_clk(priv, ACLK_PERI, PERI_ACLK_HZ);
+	rk3308_peri_set_clk(priv, HCLK_PERI, PERI_HCLK_HZ);
+	rk3308_peri_set_clk(priv, PCLK_PERI, PERI_PCLK_HZ);
+
+	rk3308_audio_set_clk(priv, HCLK_AUDIO, AUDIO_HCLK_HZ);
+	rk3308_audio_set_clk(priv, PCLK_AUDIO, AUDIO_PCLK_HZ);
+}
+
+static int rk3308_clk_probe(struct udevice *dev)
+{
+	int ret;
+
+	rk3308_clk_init(dev);
+
+	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
+	ret = clk_set_defaults(dev);
+	if (ret)
+		debug("%s clk_set_defaults failed %d\n", __func__, ret);
+
+	return ret;
+}
+
+static int rk3308_clk_ofdata_to_platdata(struct udevice *dev)
+{
+	struct rk3308_clk_priv *priv = dev_get_priv(dev);
+
+	priv->cru = dev_read_addr_ptr(dev);
+
+	return 0;
+}
+
+static int rk3308_clk_bind(struct udevice *dev)
+{
+	int ret;
+	struct udevice *sys_child, *sf_child;
+	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
+
+	/* The reset driver does not have a device node, so bind it here */
+	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
+				 &sys_child);
+	if (ret) {
+		debug("Warning: No sysreset driver: ret=%d\n", ret);
+	} else {
+		priv = malloc(sizeof(struct sysreset_reg));
+		priv->glb_srst_fst_value = offsetof(struct rk3308_cru,
+						    glb_srst_fst);
+		priv->glb_srst_snd_value = offsetof(struct rk3308_cru,
+						    glb_srst_snd);
+		sys_child->priv = priv;
+	}
+
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3308_cru,
+						    softrst_con[0]);
+		sf_priv->sf_reset_num = 12;
+		sf_child->priv = sf_priv;
+	}
+
+	return 0;
+}
+
+static const struct udevice_id rk3308_clk_ids[] = {
+	{ .compatible = "rockchip,rk3308-cru" },
+	{ }
+};
+
+U_BOOT_DRIVER(rockchip_rk3308_cru) = {
+	.name		= "rockchip_rk3308_cru",
+	.id		= UCLASS_CLK,
+	.of_match	= rk3308_clk_ids,
+	.priv_auto_alloc_size = sizeof(struct rk3308_clk_priv),
+	.ofdata_to_platdata = rk3308_clk_ofdata_to_platdata,
+	.ops		= &rk3308_clk_ops,
+	.bind		= rk3308_clk_bind,
+	.probe		= rk3308_clk_probe,
+};
diff --git a/include/dt-bindings/clock/rk3308-cru.h b/include/dt-bindings/clock/rk3308-cru.h
new file mode 100644
index 0000000000..d97840f9ee
--- /dev/null
+++ b/include/dt-bindings/clock/rk3308-cru.h
@@ -0,0 +1,387 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2019 Rockchip Electronics Co. Ltd.
+ * Author: Finley Xiao <finley.xiao@rock-chips.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3308_H
+#define _DT_BINDINGS_CLK_ROCKCHIP_RK3308_H
+
+/* core clocks */
+#define PLL_APLL		1
+#define PLL_DPLL		2
+#define PLL_VPLL0		3
+#define PLL_VPLL1		4
+#define ARMCLK			5
+
+/* sclk (special clocks) */
+#define USB480M			14
+#define SCLK_RTC32K		15
+#define SCLK_PVTM_CORE		16
+#define SCLK_UART0		17
+#define SCLK_UART1		18
+#define SCLK_UART2		19
+#define SCLK_UART3		20
+#define SCLK_UART4		21
+#define SCLK_I2C0		22
+#define SCLK_I2C1		23
+#define SCLK_I2C2		24
+#define SCLK_I2C3		25
+#define SCLK_PWM0		26
+#define SCLK_SPI0		27
+#define SCLK_SPI1		28
+#define SCLK_SPI2		29
+#define SCLK_TIMER0		30
+#define SCLK_TIMER1		31
+#define SCLK_TIMER2		32
+#define SCLK_TIMER3		33
+#define SCLK_TIMER4		34
+#define SCLK_TIMER5		35
+#define SCLK_TSADC		36
+#define SCLK_SARADC		37
+#define SCLK_OTP		38
+#define SCLK_OTP_USR		39
+#define SCLK_CPU_BOOST		40
+#define SCLK_CRYPTO		41
+#define SCLK_CRYPTO_APK		42
+#define SCLK_NANDC_DIV		43
+#define SCLK_NANDC_DIV50	44
+#define SCLK_NANDC		45
+#define SCLK_SDMMC_DIV		46
+#define SCLK_SDMMC_DIV50	47
+#define SCLK_SDMMC		48
+#define SCLK_SDMMC_DRV		49
+#define SCLK_SDMMC_SAMPLE	50
+#define SCLK_SDIO_DIV		51
+#define SCLK_SDIO_DIV50		52
+#define SCLK_SDIO		53
+#define SCLK_SDIO_DRV		54
+#define SCLK_SDIO_SAMPLE	55
+#define SCLK_EMMC_DIV		56
+#define SCLK_EMMC_DIV50		57
+#define SCLK_EMMC		58
+#define SCLK_EMMC_DRV		59
+#define SCLK_EMMC_SAMPLE	60
+#define SCLK_SFC		61
+#define SCLK_OTG_ADP		62
+#define SCLK_MAC_SRC		63
+#define SCLK_MAC		64
+#define SCLK_MAC_REF		65
+#define SCLK_MAC_RX_TX		66
+#define SCLK_MAC_RMII		67
+#define SCLK_DDR_MON_TIMER	68
+#define SCLK_DDR_MON		69
+#define SCLK_DDRCLK		70
+#define SCLK_PMU		71
+#define SCLK_USBPHY_REF		72
+#define SCLK_WIFI		73
+#define SCLK_PVTM_PMU		74
+#define SCLK_PDM		75
+#define SCLK_I2S0_8CH_TX	76
+#define SCLK_I2S0_8CH_TX_OUT	77
+#define SCLK_I2S0_8CH_RX	78
+#define SCLK_I2S0_8CH_RX_OUT	79
+#define SCLK_I2S1_8CH_TX	80
+#define SCLK_I2S1_8CH_TX_OUT	81
+#define SCLK_I2S1_8CH_RX	82
+#define SCLK_I2S1_8CH_RX_OUT	83
+#define SCLK_I2S2_8CH_TX	84
+#define SCLK_I2S2_8CH_TX_OUT	85
+#define SCLK_I2S2_8CH_RX	86
+#define SCLK_I2S2_8CH_RX_OUT	87
+#define SCLK_I2S3_8CH_TX	88
+#define SCLK_I2S3_8CH_TX_OUT	89
+#define SCLK_I2S3_8CH_RX	90
+#define SCLK_I2S3_8CH_RX_OUT	91
+#define SCLK_I2S0_2CH		92
+#define SCLK_I2S0_2CH_OUT	93
+#define SCLK_I2S1_2CH		94
+#define SCLK_I2S1_2CH_OUT	95
+#define SCLK_SPDIF_TX_DIV	96
+#define SCLK_SPDIF_TX_DIV50	97
+#define SCLK_SPDIF_TX		98
+#define SCLK_SPDIF_RX_DIV	99
+#define SCLK_SPDIF_RX_DIV50	100
+#define SCLK_SPDIF_RX		101
+#define SCLK_I2S0_8CH_TX_MUX	102
+#define SCLK_I2S0_8CH_RX_MUX	103
+#define SCLK_I2S1_8CH_TX_MUX	104
+#define SCLK_I2S1_8CH_RX_MUX	105
+#define SCLK_I2S2_8CH_TX_MUX	106
+#define SCLK_I2S2_8CH_RX_MUX	107
+#define SCLK_I2S3_8CH_TX_MUX	108
+#define SCLK_I2S3_8CH_RX_MUX	109
+#define SCLK_I2S0_8CH_TX_SRC	110
+#define SCLK_I2S0_8CH_RX_SRC	111
+#define SCLK_I2S1_8CH_TX_SRC	112
+#define SCLK_I2S1_8CH_RX_SRC	113
+#define SCLK_I2S2_8CH_TX_SRC	114
+#define SCLK_I2S2_8CH_RX_SRC	115
+#define SCLK_I2S3_8CH_TX_SRC	116
+#define SCLK_I2S3_8CH_RX_SRC	117
+#define SCLK_I2S0_2CH_SRC	118
+#define SCLK_I2S1_2CH_SRC	119
+#define SCLK_PWM1		120
+#define SCLK_PWM2		121
+#define SCLK_OWIRE		122
+
+/* dclk */
+#define DCLK_VOP		125
+
+/* aclk */
+#define ACLK_BUS_SRC		130
+#define ACLK_BUS		131
+#define ACLK_PERI_SRC		132
+#define ACLK_PERI		133
+#define ACLK_MAC		134
+#define ACLK_CRYPTO		135
+#define ACLK_VOP		136
+#define ACLK_GIC		137
+#define ACLK_DMAC0		138
+#define ACLK_DMAC1		139
+
+/* hclk */
+#define HCLK_BUS		150
+#define HCLK_PERI		151
+#define HCLK_AUDIO		152
+#define HCLK_NANDC		153
+#define HCLK_SDMMC		154
+#define HCLK_SDIO		155
+#define HCLK_EMMC		156
+#define HCLK_SFC		157
+#define HCLK_OTG		158
+#define HCLK_HOST		159
+#define HCLK_HOST_ARB		160
+#define HCLK_PDM		161
+#define HCLK_SPDIFTX		162
+#define HCLK_SPDIFRX		163
+#define HCLK_I2S0_8CH		164
+#define HCLK_I2S1_8CH		165
+#define HCLK_I2S2_8CH		166
+#define HCLK_I2S3_8CH		167
+#define HCLK_I2S0_2CH		168
+#define HCLK_I2S1_2CH		169
+#define HCLK_VAD		170
+#define HCLK_CRYPTO		171
+#define HCLK_VOP		172
+
+/* pclk */
+#define PCLK_BUS		190
+#define PCLK_DDR		191
+#define PCLK_PERI		192
+#define PCLK_PMU		193
+#define PCLK_AUDIO		194
+#define PCLK_MAC		195
+#define PCLK_ACODEC		196
+#define PCLK_UART0		197
+#define PCLK_UART1		198
+#define PCLK_UART2		199
+#define PCLK_UART3		200
+#define PCLK_UART4		201
+#define PCLK_I2C0		202
+#define PCLK_I2C1		203
+#define PCLK_I2C2		204
+#define PCLK_I2C3		205
+#define PCLK_PWM0		206
+#define PCLK_SPI0		207
+#define PCLK_SPI1		208
+#define PCLK_SPI2		209
+#define PCLK_SARADC		210
+#define PCLK_TSADC		211
+#define PCLK_TIMER		212
+#define PCLK_OTP_NS		213
+#define PCLK_WDT		214
+#define PCLK_GPIO0		215
+#define PCLK_GPIO1		216
+#define PCLK_GPIO2		217
+#define PCLK_GPIO3		218
+#define PCLK_GPIO4		219
+#define PCLK_SGRF		220
+#define PCLK_GRF		221
+#define PCLK_USBSD_DET		222
+#define PCLK_DDR_UPCTL		223
+#define PCLK_DDR_MON		224
+#define PCLK_DDRPHY		225
+#define PCLK_DDR_STDBY		226
+#define PCLK_USB_GRF		227
+#define PCLK_CRU		228
+#define PCLK_OTP_PHY		229
+#define PCLK_CPU_BOOST		230
+#define PCLK_PWM1		231
+#define PCLK_PWM2		232
+#define PCLK_CAN		233
+#define PCLK_OWIRE		234
+
+#define CLK_NR_CLKS		(PCLK_OWIRE + 1)
+
+/* soft-reset indices */
+
+/* cru_softrst_con0 */
+#define SRST_CORE0_PO		0
+#define SRST_CORE1_PO		1
+#define SRST_CORE2_PO		2
+#define SRST_CORE3_PO		3
+#define SRST_CORE0		4
+#define SRST_CORE1		5
+#define SRST_CORE2		6
+#define SRST_CORE3		7
+#define SRST_CORE0_DBG		8
+#define SRST_CORE1_DBG		9
+#define SRST_CORE2_DBG		10
+#define SRST_CORE3_DBG		11
+#define SRST_TOPDBG		12
+#define SRST_CORE_NOC		13
+#define SRST_STRC_A		14
+#define SRST_L2C		15
+
+/* cru_softrst_con1 */
+#define SRST_DAP		16
+#define SRST_CORE_PVTM		17
+#define SRST_CORE_PRF		18
+#define SRST_CORE_GRF		19
+#define SRST_DDRUPCTL		20
+#define SRST_DDRUPCTL_P		22
+#define SRST_MSCH		23
+#define SRST_DDRMON_P		25
+#define SRST_DDRSTDBY_P		26
+#define SRST_DDRSTDBY		27
+#define SRST_DDRPHY		28
+#define SRST_DDRPHY_DIV		29
+#define SRST_DDRPHY_P		30
+
+/* cru_softrst_con2 */
+#define SRST_BUS_NIU_H		32
+#define SRST_USB_NIU_P		33
+#define SRST_CRYPTO_A		34
+#define SRST_CRYPTO_H		35
+#define SRST_CRYPTO		36
+#define SRST_CRYPTO_APK		37
+#define SRST_VOP_A		38
+#define SRST_VOP_H		39
+#define SRST_VOP_D		40
+#define SRST_INTMEM_A		41
+#define SRST_ROM_H		42
+#define SRST_GIC_A		43
+#define SRST_UART0_P		44
+#define SRST_UART0		45
+#define SRST_UART1_P		46
+#define SRST_UART1		47
+
+/* cru_softrst_con3 */
+#define SRST_UART2_P		48
+#define SRST_UART2		49
+#define SRST_UART3_P		50
+#define SRST_UART3		51
+#define SRST_UART4_P		52
+#define SRST_UART4		53
+#define SRST_I2C0_P		54
+#define SRST_I2C0		55
+#define SRST_I2C1_P		56
+#define SRST_I2C1		57
+#define SRST_I2C2_P		58
+#define SRST_I2C2		59
+#define SRST_I2C3_P		60
+#define SRST_I2C3		61
+#define SRST_PWM0_P		62
+#define SRST_PWM0		63
+
+/* cru_softrst_con4 */
+#define SRST_SPI0_P		64
+#define SRST_SPI0		65
+#define SRST_SPI1_P		66
+#define SRST_SPI1		67
+#define SRST_SPI2_P		68
+#define SRST_SPI2		69
+#define SRST_SARADC_P		70
+#define SRST_TSADC_P		71
+#define SRST_TSADC		72
+#define SRST_TIMER0_P		73
+#define SRST_TIMER0		74
+#define SRST_TIMER1		75
+#define SRST_TIMER2		76
+#define SRST_TIMER3		77
+#define SRST_TIMER4		78
+#define SRST_TIMER5		79
+
+/* cru_softrst_con5 */
+#define SRST_OTP_NS_P		80
+#define SRST_OTP_NS_SBPI	81
+#define SRST_OTP_NS_USR		82
+#define SRST_OTP_PHY_P		83
+#define SRST_OTP_PHY		84
+#define SRST_GPIO0_P		86
+#define SRST_GPIO1_P		87
+#define SRST_GPIO2_P		88
+#define SRST_GPIO3_P		89
+#define SRST_GPIO4_P		90
+#define SRST_GRF_P		91
+#define SRST_USBSD_DET_P	92
+#define SRST_PMU		93
+#define SRST_PMU_PVTM		94
+#define SRST_USB_GRF_P		95
+
+/* cru_softrst_con6 */
+#define SRST_CPU_BOOST		96
+#define SRST_CPU_BOOST_P	97
+#define SRST_PWM1_P		98
+#define SRST_PWM1		99
+#define SRST_PWM2_P		100
+#define SRST_PWM2		101
+#define SRST_PERI_NIU_A		104
+#define SRST_PERI_NIU_H		105
+#define SRST_PERI_NIU_p		106
+#define SRST_USB2OTG_H		107
+#define SRST_USB2OTG		108
+#define SRST_USB2OTG_ADP	109
+#define SRST_USB2HOST_H		110
+#define SRST_USB2HOST_ARB_H	111
+
+/* cru_softrst_con7 */
+#define SRST_USB2HOST_AUX_H	112
+#define SRST_USB2HOST_EHCI	113
+#define SRST_USB2HOST		114
+#define SRST_USBPHYPOR		115
+#define SRST_UTMI0		116
+#define SRST_UTMI1		117
+#define SRST_SDIO_H		118
+#define SRST_EMMC_H		119
+#define SRST_SFC_H		120
+#define SRST_SFC		121
+#define SRST_SD_H		122
+#define SRST_NANDC_H		123
+#define SRST_NANDC_N		124
+#define SRST_MAC_A		125
+#define SRST_CAN_P		126
+#define SRST_OWIRE_P		127
+
+/* cru_softrst_con8 */
+#define SRST_AUDIO_NIU_H	128
+#define SRST_AUDIO_NIU_P	129
+#define SRST_PDM_H		130
+#define SRST_PDM_M		131
+#define SRST_SPDIFTX_H		132
+#define SRST_SPDIFTX_M		133
+#define SRST_SPDIFRX_H		134
+#define SRST_SPDIFRX_M		135
+#define SRST_I2S0_8CH_H		136
+#define SRST_I2S0_8CH_TX_M	137
+#define SRST_I2S0_8CH_RX_M	138
+#define SRST_I2S1_8CH_H		139
+#define SRST_I2S1_8CH_TX_M	140
+#define SRST_I2S1_8CH_RX_M	141
+#define SRST_I2S2_8CH_H		142
+#define SRST_I2S2_8CH_TX_M	143
+
+/* cru_softrst_con9 */
+#define SRST_I2S2_8CH_RX_M	144
+#define SRST_I2S3_8CH_H		145
+#define SRST_I2S3_8CH_TX_M	146
+#define SRST_I2S3_8CH_RX_M	147
+#define SRST_I2S0_2CH_H		148
+#define SRST_I2S0_2CH_M		149
+#define SRST_I2S1_2CH_H		150
+#define SRST_I2S1_2CH_M		151
+#define SRST_VAD_H		152
+#define SRST_ACODEC_P		153
+
+#endif
-- 
2.17.1

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

* [U-Boot] [PATCH v2 3/9] arm: dts: rockchip: Add dts for rk3308 evb
  2019-10-30  8:11 [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Andy Yan
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 1/9] arm: rockchip: Add RK3308 SOC support Andy Yan
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 2/9] rockchip: clk: Add clk driver for rk3308 Andy Yan
@ 2019-10-30  8:11 ` Andy Yan
  2019-11-07  9:31   ` Kever Yang
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 4/9] board: rockchip: Add rk3308 evb support Andy Yan
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:11 UTC (permalink / raw)
  To: u-boot

Add dts for rk3308 evb, sync from the linux kernel
upstream list [0].

[0]https://patchwork.kernel.org/patch/11201555/

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

Changes in v2: None

 arch/arm/dts/Makefile               |    3 +
 arch/arm/dts/rk3308-evb-u-boot.dtsi |   17 +
 arch/arm/dts/rk3308-evb.dts         |  230 ++++
 arch/arm/dts/rk3308-u-boot.dtsi     |   25 +
 arch/arm/dts/rk3308.dtsi            | 1829 +++++++++++++++++++++++++++
 5 files changed, 2104 insertions(+)
 create mode 100644 arch/arm/dts/rk3308-evb-u-boot.dtsi
 create mode 100644 arch/arm/dts/rk3308-evb.dts
 create mode 100644 arch/arm/dts/rk3308-u-boot.dtsi
 create mode 100644 arch/arm/dts/rk3308.dtsi

diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 11feb0c533..95538b117e 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -93,6 +93,9 @@ dtb-$(CONFIG_ROCKCHIP_RK3288) += \
 	rk3288-veyron-speedy.dtb \
 	rk3288-vyasa.dtb
 
+dtb-$(CONFIG_ROCKCHIP_RK3308) += \
+	rk3308-evb.dtb
+
 dtb-$(CONFIG_ROCKCHIP_RK3328) += \
 	rk3328-evb.dtb \
 	rk3328-rock64.dtb
diff --git a/arch/arm/dts/rk3308-evb-u-boot.dtsi b/arch/arm/dts/rk3308-evb-u-boot.dtsi
new file mode 100644
index 0000000000..c6ea746de0
--- /dev/null
+++ b/arch/arm/dts/rk3308-evb-u-boot.dtsi
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2018-2019 Rockchip Electronics Co., Ltd
+ */
+#include "rk3308-u-boot.dtsi"
+
+/ {
+	chosen {
+		u-boot,spl-boot-order = "same-as-spl", &emmc;
+	};
+};
+
+&uart4 {
+	u-boot,dm-pre-reloc;
+	clock-frequency = <24000000>;
+	status = "okay";
+};
diff --git a/arch/arm/dts/rk3308-evb.dts b/arch/arm/dts/rk3308-evb.dts
new file mode 100644
index 0000000000..124a240866
--- /dev/null
+++ b/arch/arm/dts/rk3308-evb.dts
@@ -0,0 +1,230 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ *
+ */
+
+/dts-v1/;
+#include <dt-bindings/input/input.h>
+#include "rk3308.dtsi"
+
+/ {
+	model = "Rockchip RK3308 EVB";
+	compatible = "rockchip,rk3308-evb", "rockchip,rk3308";
+
+	chosen {
+		stdout-path = "serial4:1500000n8";
+	};
+
+	adc-keys0 {
+		compatible = "adc-keys";
+		io-channels = <&saradc 0>;
+		io-channel-names = "buttons";
+		poll-interval = <100>;
+		keyup-threshold-microvolt = <1800000>;
+
+		func-key {
+			linux,code = <KEY_FN>;
+			label = "function";
+			press-threshold-microvolt = <18000>;
+		};
+	};
+
+	adc-keys1 {
+		compatible = "adc-keys";
+		io-channels = <&saradc 1>;
+		io-channel-names = "buttons";
+		poll-interval = <100>;
+		keyup-threshold-microvolt = <1800000>;
+
+		esc-key {
+			linux,code = <KEY_MICMUTE>;
+			label = "micmute";
+			press-threshold-microvolt = <1130000>;
+		};
+
+		home-key {
+			linux,code = <KEY_MODE>;
+			label = "mode";
+			press-threshold-microvolt = <901000>;
+		};
+
+		menu-key {
+			linux,code = <KEY_PLAY>;
+			label = "play";
+			press-threshold-microvolt = <624000>;
+		};
+
+		vol-down-key {
+			linux,code = <KEY_VOLUMEDOWN>;
+			label = "volume down";
+			press-threshold-microvolt = <300000>;
+		};
+
+		vol-up-key {
+			linux,code = <KEY_VOLUMEUP>;
+			label = "volume up";
+			press-threshold-microvolt = <18000>;
+		};
+	};
+
+	gpio-keys {
+		compatible = "gpio-keys";
+		autorepeat;
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwr_key>;
+
+		power {
+			gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_POWER>;
+			label = "GPIO Key Power";
+			wakeup-source;
+			debounce-interval = <100>;
+		};
+	};
+
+	vcc12v_dcin: vcc12v-dcin {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc12v_dcin";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <12000000>;
+		regulator-max-microvolt = <12000000>;
+	};
+
+	vcc5v0_sys: vcc5v0-sys {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_sys";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		vin-supply = <&vcc12v_dcin>;
+	};
+
+	vdd_core: vdd-core {
+		compatible = "pwm-regulator";
+		pwms = <&pwm0 0 5000 1>;
+		regulator-name = "vdd_core";
+		regulator-min-microvolt = <827000>;
+		regulator-max-microvolt = <1340000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+	};
+
+	vdd_log: vdd-log {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_log";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1050000>;
+		regulator-max-microvolt = <1050000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vdd_1v0: vdd-1v0 {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_1v0";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1000000>;
+		regulator-max-microvolt = <1000000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vccio_sdio: vcc_1v8: vcc-1v8 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_1v8";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+		vin-supply = <&vcc_io>;
+	};
+
+	vcc_ddr: vcc-ddr {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_ddr";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1500000>;
+		regulator-max-microvolt = <1500000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_io: vcc-io {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_io";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vccio_flash: vccio-flash {
+		compatible = "regulator-fixed";
+		regulator-name = "vccio_flash";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		vin-supply = <&vcc_io>;
+	};
+
+	vcc5v0_host: vcc5v0-host {
+		compatible = "regulator-fixed";
+		enable-active-high;
+		gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&usb_drv>;
+		regulator-name = "vbus_host";
+		vin-supply = <&vcc5v0_sys>;
+	};
+};
+
+&cpu0 {
+	cpu-supply = <&vdd_core>;
+};
+
+&saradc {
+	status = "okay";
+	vref-supply = <&vcc_1v8>;
+};
+
+&pinctrl {
+	pinctrl-names = "default";
+	pinctrl-0 = <&rtc_32k>;
+
+	buttons {
+		pwr_key: pwr-key {
+			rockchip,pins = <0 RK_PA6 0 &pcfg_pull_up>;
+		};
+	};
+
+	usb {
+		usb_drv: usb-drv {
+			rockchip,pins = <0 RK_PC5 0 &pcfg_pull_none>;
+		};
+	};
+
+	sdio-pwrseq {
+		wifi_enable_h: wifi-enable-h {
+			rockchip,pins = <0 RK_PA2 0 &pcfg_pull_none>;
+		};
+	};
+};
+
+&pwm0 {
+	status = "okay";
+	pinctrl-0 = <&pwm0_pin_pull_down>;
+};
+
+&uart4 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart4_xfer>;
+	status = "okay";
+};
diff --git a/arch/arm/dts/rk3308-u-boot.dtsi b/arch/arm/dts/rk3308-u-boot.dtsi
new file mode 100644
index 0000000000..1a68decef3
--- /dev/null
+++ b/arch/arm/dts/rk3308-u-boot.dtsi
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *(C) Copyright 2019 Rockchip Electronics Co., Ltd
+ */
+
+&cru {
+	u-boot,dm-pre-reloc;
+};
+
+&dmc {
+	u-boot,dm-pre-reloc;
+};
+
+&emmc {
+	u-boot,dm-pre-reloc;
+};
+
+&grf {
+	u-boot,dm-pre-reloc;
+};
+
+&saradc {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
diff --git a/arch/arm/dts/rk3308.dtsi b/arch/arm/dts/rk3308.dtsi
new file mode 100644
index 0000000000..4e703dd3dd
--- /dev/null
+++ b/arch/arm/dts/rk3308.dtsi
@@ -0,0 +1,1829 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ *
+ */
+
+#include <dt-bindings/clock/rk3308-cru.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/pinctrl/rockchip.h>
+#include <dt-bindings/thermal/thermal.h>
+
+/ {
+	compatible = "rockchip,rk3308";
+
+	interrupt-parent = <&gic>;
+	#address-cells = <2>;
+	#size-cells = <2>;
+
+	aliases {
+		i2c0 = &i2c0;
+		i2c1 = &i2c1;
+		i2c2 = &i2c2;
+		i2c3 = &i2c3;
+		serial0 = &uart0;
+		serial1 = &uart1;
+		serial2 = &uart2;
+		serial3 = &uart3;
+		serial4 = &uart4;
+		spi0 = &spi0;
+		spi1 = &spi1;
+		spi2 = &spi2;
+	};
+
+	cpus {
+		#address-cells = <2>;
+		#size-cells = <0>;
+
+		cpu0: cpu at 0 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a35", "arm,armv8";
+			reg = <0x0 0x0>;
+			enable-method = "psci";
+			clocks = <&cru ARMCLK>;
+			#cooling-cells = <2>;
+			dynamic-power-coefficient = <90>;
+			operating-points-v2 = <&cpu0_opp_table>;
+			cpu-idle-states = <&CPU_SLEEP>;
+			next-level-cache = <&l2>;
+		};
+
+		cpu1: cpu at 1 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a35", "arm,armv8";
+			reg = <0x0 0x1>;
+			enable-method = "psci";
+			operating-points-v2 = <&cpu0_opp_table>;
+			cpu-idle-states = <&CPU_SLEEP>;
+			next-level-cache = <&l2>;
+		};
+
+		cpu2: cpu at 2 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a35", "arm,armv8";
+			reg = <0x0 0x2>;
+			enable-method = "psci";
+			operating-points-v2 = <&cpu0_opp_table>;
+			cpu-idle-states = <&CPU_SLEEP>;
+			next-level-cache = <&l2>;
+		};
+
+		cpu3: cpu at 3 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a35", "arm,armv8";
+			reg = <0x0 0x3>;
+			enable-method = "psci";
+			operating-points-v2 = <&cpu0_opp_table>;
+			cpu-idle-states = <&CPU_SLEEP>;
+			next-level-cache = <&l2>;
+		};
+
+		idle-states {
+			entry-method = "psci";
+
+			CPU_SLEEP: cpu-sleep {
+				compatible = "arm,idle-state";
+				local-timer-stop;
+				arm,psci-suspend-param = <0x0010000>;
+				entry-latency-us = <120>;
+				exit-latency-us = <250>;
+				min-residency-us = <900>;
+			};
+		};
+
+		l2: l2-cache {
+			compatible = "cache";
+		};
+	};
+
+	cpu0_opp_table: cpu0-opp-table {
+		compatible = "operating-points-v2";
+		opp-shared;
+
+		opp-408000000 {
+			opp-hz = /bits/ 64 <408000000>;
+			opp-microvolt = <950000 950000 1340000>;
+			clock-latency-ns = <40000>;
+			opp-suspend;
+		};
+		opp-600000000 {
+			opp-hz = /bits/ 64 <600000000>;
+			opp-microvolt = <950000 950000 1340000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-816000000 {
+			opp-hz = /bits/ 64 <816000000>;
+			opp-microvolt = <1025000 1025000 1340000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1008000000 {
+			opp-hz = /bits/ 64 <1008000000>;
+			opp-microvolt = <1125000 1125000 1340000>;
+			clock-latency-ns = <40000>;
+		};
+	};
+
+	arm-pmu {
+		compatible = "arm,cortex-a53-pmu";
+		interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
+	};
+
+	mac_clkin: external-mac-clock {
+		compatible = "fixed-clock";
+		clock-frequency = <50000000>;
+		clock-output-names = "mac_clkin";
+		#clock-cells = <0>;
+	};
+
+	psci {
+		compatible = "arm,psci-1.0";
+		method = "smc";
+	};
+
+	timer {
+		compatible = "arm,armv8-timer";
+		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
+			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
+			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
+			     <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
+	};
+
+	xin24m: xin24m {
+		compatible = "fixed-clock";
+		#clock-cells = <0>;
+		clock-frequency = <24000000>;
+		clock-output-names = "xin24m";
+	};
+
+	grf: grf at ff000000 {
+		compatible = "rockchip,rk3308-grf", "syscon", "simple-mfd";
+		reg = <0x0 0xff000000 0x0 0x10000>;
+	};
+
+	dmc: dmc at 0xff010000 {
+		compatible = "rockchip,rk3308-dmc";
+		reg = <0x0 0xff010000 0x0 0x10000>;
+	};
+
+	detect_grf: syscon at ff00b000 {
+		compatible = "rockchip,rk3308-detect-grf", "syscon", "simple-mfd";
+		reg = <0x0 0xff00b000 0x0 0x1000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+	};
+
+	core_grf: syscon at ff00c000 {
+		compatible = "rockchip,rk3308-core-grf", "syscon", "simple-mfd";
+		reg = <0x0 0xff00c000 0x0 0x1000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+	};
+
+	i2c0: i2c at ff040000 {
+		compatible = "rockchip,rk3308-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xff040000 0x0 0x1000>;
+		clocks = <&cru SCLK_I2C0>, <&cru PCLK_I2C0>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c1: i2c at ff050000 {
+		compatible = "rockchip,rk3308-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xff050000 0x0 0x1000>;
+		clocks = <&cru SCLK_I2C1>, <&cru PCLK_I2C1>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c1_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c2: i2c at ff060000 {
+		compatible = "rockchip,rk3308-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xff060000 0x0 0x1000>;
+		clocks = <&cru SCLK_I2C2>, <&cru PCLK_I2C2>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c2_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c3: i2c at ff070000 {
+		compatible = "rockchip,rk3308-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xff070000 0x0 0x1000>;
+		clocks = <&cru SCLK_I2C3>, <&cru PCLK_I2C3>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c3m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	wdt: watchdog at ff080000 {
+		compatible = "snps,dw-wdt";
+		reg = <0x0 0xff080000 0x0 0x100>;
+		clocks = <&cru PCLK_WDT>;
+		interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
+		status = "disabled";
+	};
+
+	uart0: serial at ff0a0000 {
+		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff0a0000 0x0 0x100>;
+		interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>;
+		status = "disabled";
+	};
+
+	uart1: serial at ff0b0000 {
+		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff0b0000 0x0 0x100>;
+		interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart1_xfer &uart1_cts &uart1_rts>;
+		status = "disabled";
+	};
+
+	uart2: serial at ff0c0000 {
+		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff0c0000 0x0 0x100>;
+		interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart2m0_xfer>;
+		status = "disabled";
+	};
+
+	uart3: serial at ff0d0000 {
+		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff0d0000 0x0 0x100>;
+		interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart3_xfer>;
+		status = "disabled";
+	};
+
+	uart4: serial at ff0e0000 {
+		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff0e0000 0x0 0x100>;
+		interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart4_xfer &uart4_cts &uart4_rts>;
+		status = "disabled";
+	};
+
+	spi0: spi at ff120000 {
+		compatible = "rockchip,rk3308-spi", "rockchip,rk3066-spi";
+		reg = <0x0 0xff120000 0x0 0x1000>;
+		interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		clocks = <&cru SCLK_SPI0>, <&cru PCLK_SPI0>;
+		clock-names = "spiclk", "apb_pclk";
+		dmas = <&dmac0 0>, <&dmac0 1>;
+		dma-names = "tx", "rx";
+		pinctrl-names = "default", "high_speed";
+		pinctrl-0 = <&spi0_clk &spi0_csn0 &spi0_miso &spi0_mosi>;
+		pinctrl-1 = <&spi0_clk_hs &spi0_csn0 &spi0_miso_hs &spi0_mosi_hs>;
+		status = "disabled";
+	};
+
+	spi1: spi at ff130000 {
+		compatible = "rockchip,rk3308-spi", "rockchip,rk3066-spi";
+		reg = <0x0 0xff130000 0x0 0x1000>;
+		interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		clocks = <&cru SCLK_SPI1>, <&cru PCLK_SPI1>;
+		clock-names = "spiclk", "apb_pclk";
+		dmas = <&dmac0 2>, <&dmac0 3>;
+		dma-names = "tx", "rx";
+		pinctrl-names = "default", "high_speed";
+		pinctrl-0 = <&spi1_clk &spi1_csn0 &spi1_miso &spi1_mosi>;
+		pinctrl-1 = <&spi1_clk_hs &spi1_csn0 &spi1_miso_hs &spi1_mosi_hs>;
+		status = "disabled";
+	};
+
+	spi2: spi at ff140000 {
+		compatible = "rockchip,rk3308-spi", "rockchip,rk3066-spi";
+		reg = <0x0 0xff140000 0x0 0x1000>;
+		interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		clocks = <&cru SCLK_SPI2>, <&cru PCLK_SPI2>;
+		clock-names = "spiclk", "apb_pclk";
+		dmas = <&dmac1 16>, <&dmac1 17>;
+		dma-names = "tx", "rx";
+		pinctrl-names = "default", "high_speed";
+		pinctrl-0 = <&spi2_clk &spi2_csn0 &spi2_miso &spi2_mosi>;
+		pinctrl-1 = <&spi2_clk_hs &spi2_csn0 &spi2_miso_hs &spi2_mosi_hs>;
+		status = "disabled";
+	};
+
+	pwm8: pwm at ff160000 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff160000 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm8_pin>;
+		clocks = <&cru SCLK_PWM2>, <&cru PCLK_PWM2>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm9: pwm at ff160010 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff160010 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm9_pin>;
+		clocks = <&cru SCLK_PWM2>, <&cru PCLK_PWM2>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm10: pwm at ff160020 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff160020 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm10_pin>;
+		clocks = <&cru SCLK_PWM2>, <&cru PCLK_PWM2>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm11: pwm at ff160030 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff160030 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm11_pin>;
+		clocks = <&cru SCLK_PWM2>, <&cru PCLK_PWM2>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm4: pwm at ff170000 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff170000 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm4_pin>;
+		clocks = <&cru SCLK_PWM1>, <&cru PCLK_PWM1>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm5: pwm at ff170010 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff170010 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm5_pin>;
+		clocks = <&cru SCLK_PWM1>, <&cru PCLK_PWM1>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm6: pwm at ff170020 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff170020 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm6_pin>;
+		clocks = <&cru SCLK_PWM1>, <&cru PCLK_PWM1>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm7: pwm at ff170030 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff170030 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm7_pin>;
+		clocks = <&cru SCLK_PWM1>, <&cru PCLK_PWM1>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm0: pwm at ff180000 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff180000 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm0_pin>;
+		clocks = <&cru SCLK_PWM0>, <&cru PCLK_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm1: pwm at ff180010 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff180010 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm1_pin>;
+		clocks = <&cru SCLK_PWM0>, <&cru PCLK_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm2: pwm at ff180020 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff180020 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm2_pin>;
+		clocks = <&cru SCLK_PWM0>, <&cru PCLK_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm3: pwm at ff180030 {
+		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff180030 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pwm3_pin>;
+		clocks = <&cru SCLK_PWM0>, <&cru PCLK_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	rktimer: rktimer at ff1a0000 {
+		compatible = "rockchip,rk3288-timer";
+		reg = <0x0 0xff1a0000 0x0 0x20>;
+		interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru PCLK_TIMER>, <&cru SCLK_TIMER0>;
+		clock-names = "pclk", "timer";
+	};
+
+	saradc: saradc at ff1e0000 {
+		compatible = "rockchip,rk3308-saradc", "rockchip,rk3399-saradc";
+		reg = <0x0 0xff1e0000 0x0 0x100>;
+		interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+		#io-channel-cells = <1>;
+		clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
+		clock-names = "saradc", "apb_pclk";
+		resets = <&cru SRST_SARADC_P>;
+		reset-names = "saradc-apb";
+		status = "disabled";
+	};
+
+	amba {
+		compatible = "arm,amba-bus";
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		dmac0: dma-controller at ff2c0000 {
+			compatible = "arm,pl330", "arm,primecell";
+			reg = <0x0 0xff2c0000 0x0 0x4000>;
+			interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
+			#dma-cells = <1>;
+			clocks = <&cru ACLK_DMAC0>;
+			clock-names = "apb_pclk";
+			peripherals-req-type-burst;
+		};
+
+		dmac1: dma-controller at ff2d0000 {
+			compatible = "arm,pl330", "arm,primecell";
+			reg = <0x0 0xff2d0000 0x0 0x4000>;
+			interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
+			#dma-cells = <1>;
+			clocks = <&cru ACLK_DMAC1>;
+			clock-names = "apb_pclk";
+			peripherals-req-type-burst;
+		};
+	};
+
+	i2s_2ch_0: i2s at ff350000 {
+		compatible = "rockchip,rk3308-i2s", "rockchip,rk3066-i2s";
+		reg = <0x0 0xff350000 0x0 0x1000>;
+		interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_I2S0_2CH>, <&cru HCLK_I2S0_2CH>;
+		clock-names = "i2s_clk", "i2s_hclk";
+		dmas = <&dmac1 8>, <&dmac1 9>;
+		dma-names = "tx", "rx";
+		resets = <&cru SRST_I2S0_2CH_M>, <&cru SRST_I2S0_2CH_H>;
+		reset-names = "reset-m", "reset-h";
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2s_2ch_0_sclk
+			     &i2s_2ch_0_lrck
+			     &i2s_2ch_0_sdi
+			     &i2s_2ch_0_sdo>;
+		status = "disabled";
+	};
+
+	i2s_2ch_1: i2s at ff360000 {
+		compatible = "rockchip,rk3308-i2s", "rockchip,rk3066-i2s";
+		reg = <0x0 0xff360000 0x0 0x1000>;
+		interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_I2S1_2CH>, <&cru HCLK_I2S1_2CH>;
+		clock-names = "i2s_clk", "i2s_hclk";
+		dmas = <&dmac1 11>;
+		dma-names = "rx";
+		resets = <&cru SRST_I2S1_2CH_M>, <&cru SRST_I2S1_2CH_H>;
+		reset-names = "reset-m", "reset-h";
+		status = "disabled";
+	};
+
+	spdif_tx: spdif-tx at ff3a0000 {
+		compatible = "rockchip,rk3308-spdif", "rockchip,rk3328-spdif";
+		reg = <0x0 0xff3a0000 0x0 0x1000>;
+		interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_SPDIF_TX>, <&cru HCLK_SPDIFTX>;
+		clock-names = "mclk", "hclk";
+		dmas = <&dmac1 13>;
+		dma-names = "tx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&spdif_out>;
+		status = "disabled";
+	};
+
+	sdmmc: dwmmc at ff480000 {
+		compatible = "rockchip,rk3308-dw-mshc", "rockchip,rk3288-dw-mshc";
+		reg = <0x0 0xff480000 0x0 0x4000>;
+		max-frequency = <150000000>;
+		bus-width = <4>;
+		clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
+			 <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
+		clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
+		fifo-depth = <0x100>;
+		interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_det &sdmmc_bus4>;
+		status = "disabled";
+	};
+
+	emmc: dwmmc at ff490000 {
+		compatible = "rockchip,rk3308-dw-mshc", "rockchip,rk3288-dw-mshc";
+		reg = <0x0 0xff490000 0x0 0x4000>;
+		max-frequency = <150000000>;
+		bus-width = <8>;
+		clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>,
+			 <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>;
+		clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
+		fifo-depth = <0x100>;
+		interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
+		status = "disabled";
+	};
+
+	sdio: dwmmc at ff4a0000 {
+		compatible = "rockchip,rk3308-dw-mshc", "rockchip,rk3288-dw-mshc";
+		reg = <0x0 0xff4a0000 0x0 0x4000>;
+		max-frequency = <150000000>;
+		bus-width = <4>;
+		clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>,
+			 <&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;
+		clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
+		fifo-depth = <0x100>;
+		interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&sdio_bus4 &sdio_cmd &sdio_clk>;
+		status = "disabled";
+	};
+
+	cru: clock-controller at ff500000 {
+		compatible = "rockchip,rk3308-cru";
+		reg = <0x0 0xff500000 0x0 0x1000>;
+		rockchip,grf = <&grf>;
+		#clock-cells = <1>;
+		#reset-cells = <1>;
+	};
+
+	gic: interrupt-controller at ff580000 {
+		compatible = "arm,gic-400";
+		#interrupt-cells = <3>;
+		#address-cells = <0>;
+		interrupt-controller;
+
+		reg = <0x0 0xff581000 0x0 0x1000>,
+		      <0x0 0xff582000 0x0 0x2000>,
+		      <0x0 0xff584000 0x0 0x2000>,
+		      <0x0 0xff586000 0x0 0x2000>;
+		interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
+	};
+
+	sram: sram at fff80000 {
+		compatible = "mmio-sram";
+		reg = <0x0 0xfff80000 0x0 0x40000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges = <0 0x0 0xfff80000 0x40000>;
+		/* reserved for ddr dvfs and system suspend/resume */
+		ddr-sram at 0 {
+			reg = <0x0 0x8000>;
+		};
+		/* reserved for vad audio buffer */
+		vad_sram: vad-sram at 8000 {
+			reg = <0x8000 0x38000>;
+		};
+	};
+
+	pinctrl: pinctrl {
+		compatible = "rockchip,rk3308-pinctrl";
+		rockchip,grf = <&grf>;
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+		gpio0: gpio0 at ff220000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xff220000 0x0 0x100>;
+			interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO0>;
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio1: gpio1 at ff230000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xff230000 0x0 0x100>;
+			interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO1>;
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio2: gpio2 at ff240000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xff240000 0x0 0x100>;
+			interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO2>;
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio3: gpio3 at ff250000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xff250000 0x0 0x100>;
+			interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO3>;
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio4: gpio4 at ff260000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xff260000 0x0 0x100>;
+			interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO4>;
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		pcfg_pull_up: pcfg-pull-up {
+			bias-pull-up;
+		};
+
+		pcfg_pull_down: pcfg-pull-down {
+			bias-pull-down;
+		};
+
+		pcfg_pull_none: pcfg-pull-none {
+			bias-disable;
+		};
+
+		pcfg_pull_none_2ma: pcfg-pull-none-2ma {
+			bias-disable;
+			drive-strength = <2>;
+		};
+
+		pcfg_pull_up_2ma: pcfg-pull-up-2ma {
+			bias-pull-up;
+			drive-strength = <2>;
+		};
+
+		pcfg_pull_up_4ma: pcfg-pull-up-4ma {
+			bias-pull-up;
+			drive-strength = <4>;
+		};
+
+		pcfg_pull_none_4ma: pcfg-pull-none-4ma {
+			bias-disable;
+			drive-strength = <4>;
+		};
+
+		pcfg_pull_down_4ma: pcfg-pull-down-4ma {
+			bias-pull-down;
+			drive-strength = <4>;
+		};
+
+		pcfg_pull_none_8ma: pcfg-pull-none-8ma {
+			bias-disable;
+			drive-strength = <8>;
+		};
+
+		pcfg_pull_up_8ma: pcfg-pull-up-8ma {
+			bias-pull-up;
+			drive-strength = <8>;
+		};
+
+		pcfg_pull_none_12ma: pcfg-pull-none-12ma {
+			bias-disable;
+			drive-strength = <12>;
+		};
+
+		pcfg_pull_up_12ma: pcfg-pull-up-12ma {
+			bias-pull-up;
+			drive-strength = <12>;
+		};
+
+		pcfg_pull_none_smt: pcfg-pull-none-smt {
+			bias-disable;
+			input-schmitt-enable;
+		};
+
+		pcfg_output_high: pcfg-output-high {
+			output-high;
+		};
+
+		pcfg_output_low: pcfg-output-low {
+			output-low;
+		};
+
+		pcfg_input_high: pcfg-input-high {
+			bias-pull-up;
+			input-enable;
+		};
+
+		pcfg_input: pcfg-input {
+			input-enable;
+		};
+
+		i2c0 {
+			i2c0_xfer: i2c0-xfer {
+				rockchip,pins =
+					<1 RK_PD0 2 &pcfg_pull_none_smt>,
+					<1 RK_PD1 2 &pcfg_pull_none_smt>;
+			};
+		};
+
+		i2c1 {
+			i2c1_xfer: i2c1-xfer {
+				rockchip,pins =
+					<0 RK_PB3 1 &pcfg_pull_none_smt>,
+					<0 RK_PB4 1 &pcfg_pull_none_smt>;
+			};
+		};
+
+		i2c2 {
+			i2c2_xfer: i2c2-xfer {
+				rockchip,pins =
+					<2 RK_PA2 3 &pcfg_pull_none_smt>,
+					<2 RK_PA3 3 &pcfg_pull_none_smt>;
+			};
+		};
+
+		i2c3-m0 {
+			i2c3m0_xfer: i2c3m0-xfer {
+				rockchip,pins =
+					<0 RK_PB7 2 &pcfg_pull_none_smt>,
+					<0 RK_PC0 2 &pcfg_pull_none_smt>;
+			};
+		};
+
+		i2c3-m1 {
+			i2c3m1_xfer: i2c3m1-xfer {
+				rockchip,pins =
+					<3 RK_PB4 2 &pcfg_pull_none_smt>,
+					<3 RK_PB5 2 &pcfg_pull_none_smt>;
+			};
+		};
+
+		i2c3-m2 {
+			i2c3m2_xfer: i2c3m2-xfer {
+				rockchip,pins =
+					<2 RK_PA1 3 &pcfg_pull_none_smt>,
+					<2 RK_PA0 3 &pcfg_pull_none_smt>;
+			};
+		};
+
+		i2s_2ch_0 {
+			i2s_2ch_0_mclk: i2s-2ch-0-mclk {
+				rockchip,pins =
+					<4 RK_PB4 1 &pcfg_pull_none>;
+			};
+
+			i2s_2ch_0_sclk: i2s-2ch-0-sclk {
+				rockchip,pins =
+					<4 RK_PB5 1 &pcfg_pull_none>;
+			};
+
+			i2s_2ch_0_lrck: i2s-2ch-0-lrck {
+				rockchip,pins =
+					<4 RK_PB6 1 &pcfg_pull_none>;
+			};
+
+			i2s_2ch_0_sdo: i2s-2ch-0-sdo {
+				rockchip,pins =
+					<4 RK_PB7 1 &pcfg_pull_none>;
+			};
+
+			i2s_2ch_0_sdi: i2s-2ch-0-sdi {
+				rockchip,pins =
+					<4 RK_PC0 1 &pcfg_pull_none>;
+			};
+		};
+
+		i2s_8ch_0 {
+			i2s_8ch_0_mclk: i2s-8ch-0-mclk {
+				rockchip,pins =
+					<2 RK_PA4 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sclktx: i2s-8ch-0-sclktx {
+				rockchip,pins =
+					<2 RK_PA5 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sclkrx: i2s-8ch-0-sclkrx {
+				rockchip,pins =
+					<2 RK_PA6 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_lrcktx: i2s-8ch-0-lrcktx {
+				rockchip,pins =
+					<2 RK_PA7 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_lrckrx: i2s-8ch-0-lrckrx {
+				rockchip,pins =
+					<2 RK_PB0 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sdo0: i2s-8ch-0-sdo0 {
+				rockchip,pins =
+					<2 RK_PB1 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sdo1: i2s-8ch-0-sdo1 {
+				rockchip,pins =
+					<2 RK_PB2 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sdo2: i2s-8ch-0-sdo2 {
+				rockchip,pins =
+					<2 RK_PB3 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sdo3: i2s-8ch-0-sdo3 {
+				rockchip,pins =
+					<2 RK_PB4 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sdi0: i2s-8ch-0-sdi0 {
+				rockchip,pins =
+					<2 RK_PB5 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sdi1: i2s-8ch-0-sdi1 {
+				rockchip,pins =
+					<2 RK_PB6 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sdi2: i2s-8ch-0-sdi2 {
+				rockchip,pins =
+					<2 RK_PB7 1 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_0_sdi3: i2s-8ch-0-sdi3 {
+				rockchip,pins =
+					<2 RK_PC0 1 &pcfg_pull_none>;
+			};
+		};
+
+		i2s_8ch_1_m0 {
+			i2s_8ch_1_m0_mclk: i2s-8ch-1-m0-mclk {
+				rockchip,pins =
+					<1 RK_PA2 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m0_sclktx: i2s-8ch-1-m0-sclktx {
+				rockchip,pins =
+					<1 RK_PA3 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m0_sclkrx: i2s-8ch-1-m0-sclkrx {
+				rockchip,pins =
+					<1 RK_PA4 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m0_lrcktx: i2s-8ch-1-m0-lrcktx {
+				rockchip,pins =
+					<1 RK_PA5 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m0_lrckrx: i2s-8ch-1-m0-lrckrx {
+				rockchip,pins =
+					<1 RK_PA6 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m0_sdo0: i2s-8ch-1-m0-sdo0 {
+				rockchip,pins =
+					<1 RK_PA7 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m0_sdo1_sdi3: i2s-8ch-1-m0-sdo1-sdi3 {
+				rockchip,pins =
+					<1 RK_PB0 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m0_sdo2_sdi2: i2s-8ch-1-m0-sdo2-sdi2 {
+				rockchip,pins =
+					<1 RK_PB1 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m0_sdo3_sdi1: i2s-8ch-1-m0-sdo3_sdi1 {
+				rockchip,pins =
+					<1 RK_PB2 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m0_sdi0: i2s-8ch-1-m0-sdi0 {
+				rockchip,pins =
+					<1 RK_PB3 2 &pcfg_pull_none>;
+			};
+		};
+
+		i2s_8ch_1_m1 {
+			i2s_8ch_1_m1_mclk: i2s-8ch-1-m1-mclk {
+				rockchip,pins =
+					<1 RK_PB4 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m1_sclktx: i2s-8ch-1-m1-sclktx {
+				rockchip,pins =
+					<1 RK_PB5 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m1_sclkrx: i2s-8ch-1-m1-sclkrx {
+				rockchip,pins =
+					<1 RK_PB6 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m1_lrcktx: i2s-8ch-1-m1-lrcktx {
+				rockchip,pins =
+					<1 RK_PB7 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m1_lrckrx: i2s-8ch-1-m1-lrckrx {
+				rockchip,pins =
+					<1 RK_PC0 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m1_sdo0: i2s-8ch-1-m1-sdo0 {
+				rockchip,pins =
+					<1 RK_PC1 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m1_sdo1_sdi3: i2s-8ch-1-m1-sdo1-sdi3 {
+				rockchip,pins =
+					<1 RK_PC2 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m1_sdo2_sdi2: i2s-8ch-1-m1-sdo2-sdi2 {
+				rockchip,pins =
+					<1 RK_PC3 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m1_sdo3_sdi1: i2s-8ch-1-m1-sdo3_sdi1 {
+				rockchip,pins =
+					<1 RK_PC4 2 &pcfg_pull_none>;
+			};
+
+			i2s_8ch_1_m1_sdi0: i2s-8ch-1-m1-sdi0 {
+				rockchip,pins =
+					<1 RK_PC5 2 &pcfg_pull_none>;
+			};
+		};
+
+		pdm_m0 {
+			pdm_m0_clk: pdm-m0-clk {
+				rockchip,pins =
+					<1 RK_PA4 3 &pcfg_pull_none>;
+			};
+
+			pdm_m0_sdi0: pdm-m0-sdi0 {
+				rockchip,pins =
+					<1 RK_PB3 3 &pcfg_pull_none>;
+			};
+
+			pdm_m0_sdi1: pdm-m0-sdi1 {
+				rockchip,pins =
+					<1 RK_PB2 3 &pcfg_pull_none>;
+			};
+
+			pdm_m0_sdi2: pdm-m0-sdi2 {
+				rockchip,pins =
+					<1 RK_PB1 3 &pcfg_pull_none>;
+			};
+
+			pdm_m0_sdi3: pdm-m0-sdi3 {
+				rockchip,pins =
+					<1 RK_PB0 3 &pcfg_pull_none>;
+			};
+		};
+
+		pdm_m1 {
+			pdm_m1_clk: pdm-m1-clk {
+				rockchip,pins =
+					<1 RK_PB6 4 &pcfg_pull_none>;
+			};
+
+			pdm_m1_sdi0: pdm-m1-sdi0 {
+				rockchip,pins =
+					<1 RK_PC5 4 &pcfg_pull_none>;
+			};
+
+			pdm_m1_sdi1: pdm-m1-sdi1 {
+				rockchip,pins =
+					<1 RK_PC4 4 &pcfg_pull_none>;
+			};
+
+			pdm_m1_sdi2: pdm-m1-sdi2 {
+				rockchip,pins =
+					<1 RK_PC3 4 &pcfg_pull_none>;
+			};
+
+			pdm_m1_sdi3: pdm-m1-sdi3 {
+				rockchip,pins =
+					<1 RK_PC2 4 &pcfg_pull_none>;
+			};
+		};
+
+		pdm_m2 {
+			pdm_m2_clkm: pdm-m2-clkm {
+				rockchip,pins =
+					<2 RK_PA4 3 &pcfg_pull_none>;
+			};
+
+			pdm_m2_clk: pdm-m2-clk {
+				rockchip,pins =
+					<2 RK_PA6 2 &pcfg_pull_none>;
+			};
+
+			pdm_m2_sdi0: pdm-m2-sdi0 {
+				rockchip,pins =
+					<2 RK_PB5 2 &pcfg_pull_none>;
+			};
+
+			pdm_m2_sdi1: pdm-m2-sdi1 {
+				rockchip,pins =
+					<2 RK_PB6 2 &pcfg_pull_none>;
+			};
+
+			pdm_m2_sdi2: pdm-m2-sdi2 {
+				rockchip,pins =
+					<2 RK_PB7 2 &pcfg_pull_none>;
+			};
+
+			pdm_m2_sdi3: pdm-m2-sdi3 {
+				rockchip,pins =
+					<2 RK_PC0 2 &pcfg_pull_none>;
+			};
+		};
+
+		spdif_in {
+			spdif_in: spdif-in {
+				rockchip,pins =
+					<0 RK_PC2 1 &pcfg_pull_none>;
+			};
+		};
+
+		spdif_out {
+			spdif_out: spdif-out {
+				rockchip,pins =
+					<0 RK_PC1 1 &pcfg_pull_none>;
+			};
+		};
+
+		tsadc {
+			tsadc_otp_gpio: tsadc-otp-gpio {
+				rockchip,pins =
+					<0 RK_PB2 0 &pcfg_pull_none>;
+			};
+
+			tsadc_otp_out: tsadc-otp-out {
+				rockchip,pins =
+					<0 RK_PB2 1 &pcfg_pull_none>;
+			};
+		};
+
+		uart0 {
+			uart0_xfer: uart0-xfer {
+				rockchip,pins =
+					<2 RK_PA1 1 &pcfg_pull_up>,
+					<2 RK_PA0 1 &pcfg_pull_up>;
+			};
+
+			uart0_cts: uart0-cts {
+				rockchip,pins =
+					<2 RK_PA2 1 &pcfg_pull_none>;
+			};
+
+			uart0_rts: uart0-rts {
+				rockchip,pins =
+					<2 RK_PA3 1 &pcfg_pull_none>;
+			};
+
+			uart0_rts_gpio: uart0-rts-gpio {
+				rockchip,pins =
+					<2 RK_PA3 0 &pcfg_pull_none>;
+			};
+		};
+
+		uart1 {
+			uart1_xfer: uart1-xfer {
+				rockchip,pins =
+					<1 RK_PD1 1 &pcfg_pull_up>,
+					<1 RK_PD0 1 &pcfg_pull_up>;
+			};
+
+			uart1_cts: uart1-cts {
+				rockchip,pins =
+					<1 RK_PC6 1 &pcfg_pull_none>;
+			};
+
+			uart1_rts: uart1-rts {
+				rockchip,pins =
+					<1 RK_PC7 1 &pcfg_pull_none>;
+			};
+		};
+
+		uart2-m0 {
+			uart2m0_xfer: uart2m0-xfer {
+				rockchip,pins =
+					<1 RK_PC7 2 &pcfg_pull_up>,
+					<1 RK_PC6 2 &pcfg_pull_up>;
+			};
+		};
+
+		uart2-m1 {
+			uart2m1_xfer: uart2m1-xfer {
+				rockchip,pins =
+					<4 RK_PD3 2 &pcfg_pull_up>,
+					<4 RK_PD2 2 &pcfg_pull_up>;
+			};
+		};
+
+		uart3 {
+			uart3_xfer: uart3-xfer {
+				rockchip,pins =
+					<3 RK_PB5 4 &pcfg_pull_up>,
+					<3 RK_PB4 4 &pcfg_pull_up>;
+			};
+		};
+
+		uart3-m1 {
+			uart3m1_xfer: uart3m1-xfer {
+				rockchip,pins =
+					<0 RK_PC2 3 &pcfg_pull_up>,
+					<0 RK_PC1 3 &pcfg_pull_up>;
+			};
+		};
+
+		uart4 {
+
+			uart4_xfer: uart4-xfer {
+				rockchip,pins =
+					<4 RK_PB1 1 &pcfg_pull_up>,
+					<4 RK_PB0 1 &pcfg_pull_up>;
+			};
+
+			uart4_cts: uart4-cts {
+				rockchip,pins =
+					<4 RK_PA6 1 &pcfg_pull_none>;
+
+			};
+
+			uart4_rts: uart4-rts {
+				rockchip,pins =
+					<4 RK_PA7 1 &pcfg_pull_none>;
+			};
+
+			uart4_rts_gpio: uart4-rts-gpio {
+				rockchip,pins =
+					<4 RK_PA7 0 &pcfg_pull_none>;
+			};
+		};
+
+		spi0 {
+			spi0_clk: spi0-clk {
+				rockchip,pins =
+					<2 RK_PA2 2 &pcfg_pull_up_4ma>;
+			};
+
+			spi0_csn0: spi0-csn0 {
+				rockchip,pins =
+					<2 RK_PA3 2 &pcfg_pull_up_4ma>;
+			};
+
+			spi0_miso: spi0-miso {
+				rockchip,pins =
+					<2 RK_PA0 2 &pcfg_pull_up_4ma>;
+			};
+
+			spi0_mosi: spi0-mosi {
+				rockchip,pins =
+					<2 RK_PA1 2 &pcfg_pull_up_4ma>;
+			};
+
+			spi0_clk_hs: spi0-clk-hs {
+				rockchip,pins =
+					<2 RK_PA2 2 &pcfg_pull_up_8ma>;
+			};
+
+			spi0_miso_hs: spi0-miso-hs {
+				rockchip,pins =
+					<2 RK_PA0 2 &pcfg_pull_up_8ma>;
+			};
+
+			spi0_mosi_hs: spi0-mosi-hs {
+				rockchip,pins =
+					<2 RK_PA1 2 &pcfg_pull_up_8ma>;
+			};
+
+		};
+
+		spi1 {
+			spi1_clk: spi1-clk {
+				rockchip,pins =
+					<3 RK_PB3 3 &pcfg_pull_up_4ma>;
+			};
+
+			spi1_csn0: spi1-csn0 {
+				rockchip,pins =
+					<3 RK_PB5 3 &pcfg_pull_up_4ma>;
+			};
+
+			spi1_miso: spi1-miso {
+				rockchip,pins =
+					<3 RK_PB2 3 &pcfg_pull_up_4ma>;
+			};
+
+			spi1_mosi: spi1-mosi {
+				rockchip,pins =
+					<3 RK_PB4 3 &pcfg_pull_up_4ma>;
+			};
+
+			spi1_clk_hs: spi1-clk-hs {
+				rockchip,pins =
+					<3 RK_PB3 3 &pcfg_pull_up_8ma>;
+			};
+
+			spi1_miso_hs: spi1-miso-hs {
+				rockchip,pins =
+					<3 RK_PB2 3 &pcfg_pull_up_8ma>;
+			};
+
+			spi1_mosi_hs: spi1-mosi-hs {
+				rockchip,pins =
+					<3 RK_PB4 3 &pcfg_pull_up_8ma>;
+			};
+		};
+
+		spi1-m1 {
+			spi1m1_miso: spi1m1-miso {
+				rockchip,pins =
+					<2 RK_PA4 2 &pcfg_pull_up_4ma>;
+			};
+
+			spi1m1_mosi: spi1m1-mosi {
+				rockchip,pins =
+					<2 RK_PA5 2 &pcfg_pull_up_4ma>;
+			};
+
+			spi1m1_clk: spi1m1-clk {
+				rockchip,pins =
+					<2 RK_PA7 2 &pcfg_pull_up_4ma>;
+			};
+
+			spi1m1_csn0: spi1m1-csn0 {
+				rockchip,pins =
+					<2 RK_PB1 2 &pcfg_pull_up_4ma>;
+			};
+
+			spi1m1_miso_hs: spi1m1-miso-hs {
+				rockchip,pins =
+					<2 RK_PA4 2 &pcfg_pull_up_8ma>;
+			};
+
+			spi1m1_mosi_hs: spi1m1-mosi-hs {
+				rockchip,pins =
+					<2 RK_PA5 2 &pcfg_pull_up_8ma>;
+			};
+
+			spi1m1_clk_hs: spi1m1-clk-hs {
+				rockchip,pins =
+					<2 RK_PA7 2 &pcfg_pull_up_8ma>;
+			};
+
+			spi1m1_csn0_hs: spi1m1-csn0-hs {
+				rockchip,pins =
+					<2 RK_PB1 2 &pcfg_pull_up_8ma>;
+			};
+		};
+
+		spi2 {
+			spi2_clk: spi2-clk {
+				rockchip,pins =
+					<1 RK_PD0 3 &pcfg_pull_up_4ma>;
+			};
+
+			spi2_csn0: spi2-csn0 {
+				rockchip,pins =
+					<1 RK_PD1 3 &pcfg_pull_up_4ma>;
+			};
+
+			spi2_miso: spi2-miso {
+				rockchip,pins =
+					<1 RK_PC6 3 &pcfg_pull_up_4ma>;
+			};
+
+			spi2_mosi: spi2-mosi {
+				rockchip,pins =
+					<1 RK_PC7 3 &pcfg_pull_up_4ma>;
+			};
+
+			spi2_clk_hs: spi2-clk-hs {
+				rockchip,pins =
+					<1 RK_PD0 3 &pcfg_pull_up_8ma>;
+			};
+
+			spi2_miso_hs: spi2-miso-hs {
+				rockchip,pins =
+					<1 RK_PC6 3 &pcfg_pull_up_8ma>;
+			};
+
+			spi2_mosi_hs: spi2-mosi-hs {
+				rockchip,pins =
+					<1 RK_PC7 3 &pcfg_pull_up_8ma>;
+			};
+		};
+
+		sdmmc {
+			sdmmc_clk: sdmmc-clk {
+				rockchip,pins =
+					<4 RK_PD5 1 &pcfg_pull_none_4ma>;
+			};
+
+			sdmmc_cmd: sdmmc-cmd {
+				rockchip,pins =
+					<4 RK_PD4 1 &pcfg_pull_up_4ma>;
+			};
+
+			sdmmc_det: sdmmc-det {
+				rockchip,pins =
+					<0 RK_PA3 1 &pcfg_pull_up_4ma>;
+			};
+
+			sdmmc_pwren: sdmmc-pwren {
+				rockchip,pins =
+					<4 RK_PD6 1 &pcfg_pull_none_4ma>;
+			};
+
+			sdmmc_bus1: sdmmc-bus1 {
+				rockchip,pins =
+					<4 RK_PD0 1 &pcfg_pull_up_4ma>;
+			};
+
+			sdmmc_bus4: sdmmc-bus4 {
+				rockchip,pins =
+					<4 RK_PD0 1 &pcfg_pull_up_4ma>,
+					<4 RK_PD1 1 &pcfg_pull_up_4ma>,
+					<4 RK_PD2 1 &pcfg_pull_up_4ma>,
+					<4 RK_PD3 1 &pcfg_pull_up_4ma>;
+			};
+
+			sdmmc_gpio: sdmmc-gpio {
+				rockchip,pins =
+					<4 RK_PD0 0 &pcfg_pull_up_4ma>,
+					<4 RK_PD1 0 &pcfg_pull_up_4ma>,
+					<4 RK_PD2 0 &pcfg_pull_up_4ma>,
+					<4 RK_PD3 0 &pcfg_pull_up_4ma>,
+					<4 RK_PD4 0 &pcfg_pull_up_4ma>,
+					<4 RK_PD5 0 &pcfg_pull_up_4ma>,
+					<4 RK_PD6 0 &pcfg_pull_up_4ma>;
+			};
+		};
+
+		sdio {
+			sdio_clk: sdio-clk {
+				rockchip,pins =
+					<4 RK_PA5 1 &pcfg_pull_none_8ma>;
+			};
+
+			sdio_cmd: sdio-cmd {
+				rockchip,pins =
+					<4 RK_PA4 1 &pcfg_pull_up_8ma>;
+			};
+
+			sdio_pwren: sdio-pwren {
+				rockchip,pins =
+					<0 RK_PA2 1 &pcfg_pull_none_8ma>;
+			};
+
+			sdio_wrpt: sdio-wrpt {
+				rockchip,pins =
+					<0 RK_PA1 1 &pcfg_pull_none_8ma>;
+			};
+
+			sdio_intn: sdio-intn {
+				rockchip,pins =
+					<0 RK_PA0 1 &pcfg_pull_none_8ma>;
+			};
+
+			sdio_bus1: sdio-bus1 {
+				rockchip,pins =
+					<4 RK_PA0 1 &pcfg_pull_up_8ma>;
+			};
+
+			sdio_bus4: sdio-bus4 {
+				rockchip,pins =
+					<4 RK_PA0 1 &pcfg_pull_up_8ma>,
+					<4 RK_PA1 1 &pcfg_pull_up_8ma>,
+					<4 RK_PA2 1 &pcfg_pull_up_8ma>,
+					<4 RK_PA3 1 &pcfg_pull_up_8ma>;
+			};
+
+			sdio_gpio: sdio-gpio {
+				rockchip,pins =
+					<4 RK_PA0 0 &pcfg_pull_up_4ma>,
+					<4 RK_PA1 0 &pcfg_pull_up_4ma>,
+					<4 RK_PA2 0 &pcfg_pull_up_4ma>,
+					<4 RK_PA3 0 &pcfg_pull_up_4ma>,
+					<4 RK_PA4 0 &pcfg_pull_up_4ma>,
+					<4 RK_PA5 0 &pcfg_pull_up_4ma>;
+			};
+		};
+
+		emmc {
+			emmc_clk: emmc-clk {
+				rockchip,pins =
+					<3 RK_PB1 2 &pcfg_pull_none_8ma>;
+			};
+
+			emmc_cmd: emmc-cmd {
+				rockchip,pins =
+					<3 RK_PB0 2 &pcfg_pull_up_8ma>;
+			};
+
+			emmc_pwren: emmc-pwren {
+				rockchip,pins =
+					<3 RK_PB3 2 &pcfg_pull_none>;
+			};
+
+			emmc_rstn: emmc-rstn {
+				rockchip,pins =
+					<3 RK_PB2 2 &pcfg_pull_none>;
+			};
+
+			emmc_bus1: emmc-bus1 {
+				rockchip,pins =
+					<3 RK_PA0 2 &pcfg_pull_up_8ma>;
+			};
+
+			emmc_bus4: emmc-bus4 {
+				rockchip,pins =
+					<3 RK_PA0 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA1 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA2 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA3 2 &pcfg_pull_up_8ma>;
+			};
+
+			emmc_bus8: emmc-bus8 {
+				rockchip,pins =
+					<3 RK_PA0 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA1 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA2 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA3 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA4 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA5 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA6 2 &pcfg_pull_up_8ma>,
+					<3 RK_PA7 2 &pcfg_pull_up_8ma>;
+			};
+		};
+
+		flash {
+			flash_csn0: flash-csn0 {
+				rockchip,pins =
+					<3 RK_PB5 1 &pcfg_pull_none>;
+			};
+
+			flash_rdy: flash-rdy {
+				rockchip,pins =
+					<3 RK_PB4 1 &pcfg_pull_none>;
+			};
+
+			flash_ale: flash-ale {
+				rockchip,pins =
+					<3 RK_PB3 1 &pcfg_pull_none>;
+			};
+
+			flash_cle: flash-cle {
+				rockchip,pins =
+					<3 RK_PB1 1 &pcfg_pull_none>;
+			};
+
+			flash_wrn: flash-wrn {
+				rockchip,pins =
+					<3 RK_PB0 1 &pcfg_pull_none>;
+			};
+
+			flash_rdn: flash-rdn {
+				rockchip,pins =
+					<3 RK_PB2 1 &pcfg_pull_none>;
+			};
+
+			flash_bus8: flash-bus8 {
+				rockchip,pins =
+					<3 RK_PA0 1 &pcfg_pull_up_12ma>,
+					<3 RK_PA1 1 &pcfg_pull_up_12ma>,
+					<3 RK_PA2 1 &pcfg_pull_up_12ma>,
+					<3 RK_PA3 1 &pcfg_pull_up_12ma>,
+					<3 RK_PA4 1 &pcfg_pull_up_12ma>,
+					<3 RK_PA5 1 &pcfg_pull_up_12ma>,
+					<3 RK_PA6 1 &pcfg_pull_up_12ma>,
+					<3 RK_PA7 1 &pcfg_pull_up_12ma>;
+			};
+		};
+
+		pwm0 {
+			pwm0_pin: pwm0-pin {
+				rockchip,pins =
+					<0 RK_PB5 1 &pcfg_pull_none>;
+			};
+
+			pwm0_pin_pull_down: pwm0-pin-pull-down {
+				rockchip,pins =
+					<0 RK_PB5 1 &pcfg_pull_down>;
+			};
+		};
+
+		pwm1 {
+			pwm1_pin: pwm1-pin {
+				rockchip,pins =
+					<0 RK_PB6 1 &pcfg_pull_none>;
+			};
+
+			pwm1_pin_pull_down: pwm1-pin-pull-down {
+				rockchip,pins =
+					<0 RK_PB6 1 &pcfg_pull_down>;
+			};
+		};
+
+		pwm2 {
+			pwm2_pin: pwm2-pin {
+				rockchip,pins =
+					<0 RK_PB7 1 &pcfg_pull_none>;
+			};
+
+			pwm2_pin_pull_down: pwm2-pin-pull-down {
+				rockchip,pins =
+					<0 RK_PB7 1 &pcfg_pull_down>;
+			};
+		};
+
+		pwm3 {
+			pwm3_pin: pwm3-pin {
+				rockchip,pins =
+					<0 RK_PC0 1 &pcfg_pull_none>;
+			};
+
+			pwm3_pin_pull_down: pwm3-pin-pull-down {
+				rockchip,pins =
+					<0 RK_PC0 1 &pcfg_pull_down>;
+			};
+		};
+
+		pwm4 {
+			pwm4_pin: pwm4-pin {
+				rockchip,pins =
+					<0 RK_PA1 2 &pcfg_pull_none>;
+			};
+
+			pwm4_pin_pull_down: pwm4-pin-pull-down {
+				rockchip,pins =
+					<0 RK_PA1 2 &pcfg_pull_down>;
+			};
+		};
+
+		pwm5 {
+			pwm5_pin: pwm5-pin {
+				rockchip,pins =
+					<0 RK_PC1 2 &pcfg_pull_none>;
+			};
+
+			pwm5_pin_pull_down: pwm5-pin-pull-down {
+				rockchip,pins =
+					<0 RK_PC1 2 &pcfg_pull_down>;
+			};
+		};
+
+		pwm6 {
+			pwm6_pin: pwm6-pin {
+				rockchip,pins =
+					<0 RK_PC2 2 &pcfg_pull_none>;
+			};
+
+			pwm6_pin_pull_down: pwm6-pin-pull-down {
+				rockchip,pins =
+					<0 RK_PC2 2 &pcfg_pull_down>;
+			};
+		};
+
+		pwm7 {
+			pwm7_pin: pwm7-pin {
+				rockchip,pins =
+					<2 RK_PB0 2 &pcfg_pull_none>;
+			};
+
+			pwm7_pin_pull_down: pwm7-pin-pull-down {
+				rockchip,pins =
+					<2 RK_PB0 2 &pcfg_pull_down>;
+			};
+		};
+
+		pwm8 {
+			pwm8_pin: pwm8-pin {
+				rockchip,pins =
+					<2 RK_PB2 2 &pcfg_pull_none>;
+			};
+
+			pwm8_pin_pull_down: pwm8-pin-pull-down {
+				rockchip,pins =
+					<2 RK_PB2 2 &pcfg_pull_down>;
+			};
+		};
+
+		pwm9 {
+			pwm9_pin: pwm9-pin {
+				rockchip,pins =
+					<2 RK_PB3 2 &pcfg_pull_none>;
+			};
+
+			pwm9_pin_pull_down: pwm9-pin-pull-down {
+				rockchip,pins =
+					<2 RK_PB3 2 &pcfg_pull_down>;
+			};
+		};
+
+		pwm10 {
+			pwm10_pin: pwm10-pin {
+				rockchip,pins =
+					<2 RK_PB4 2 &pcfg_pull_none>;
+			};
+
+			pwm10_pin_pull_down: pwm10-pin-pull-down {
+				rockchip,pins =
+					<2 RK_PB4 2 &pcfg_pull_down>;
+			};
+		};
+
+		pwm11 {
+			pwm11_pin: pwm11-pin {
+				rockchip,pins =
+					<2 RK_PC0 4 &pcfg_pull_none>;
+			};
+
+			pwm11_pin_pull_down: pwm11-pin-pull-down {
+				rockchip,pins =
+					<2 RK_PC0 4 &pcfg_pull_down>;
+			};
+		};
+
+		gmac {
+			rmii_pins: rmii-pins {
+				rockchip,pins =
+					/* mac_txen */
+					<1 RK_PC1 3 &pcfg_pull_none_12ma>,
+					/* mac_txd1 */
+					<1 RK_PC3 3 &pcfg_pull_none_12ma>,
+					/* mac_txd0 */
+					<1 RK_PC2 3 &pcfg_pull_none_12ma>,
+					/* mac_rxd0 */
+					<1 RK_PC4 3 &pcfg_pull_none>,
+					/* mac_rxd1 */
+					<1 RK_PC5 3 &pcfg_pull_none>,
+					/* mac_rxer */
+					<1 RK_PB7 3 &pcfg_pull_none>,
+					/* mac_rxdv */
+					<1 RK_PC0 3 &pcfg_pull_none>,
+					/* mac_mdio */
+					<1 RK_PB6 3 &pcfg_pull_none>,
+					/* mac_mdc */
+					<1 RK_PB5 3 &pcfg_pull_none>;
+			};
+
+			mac_refclk_12ma: mac-refclk-12ma {
+				rockchip,pins =
+					<1 RK_PB4 3 &pcfg_pull_none_12ma>;
+			};
+
+			mac_refclk: mac-refclk {
+				rockchip,pins =
+					<1 RK_PB4 3 &pcfg_pull_none>;
+			};
+		};
+
+		gmac-m1 {
+			rmiim1_pins: rmiim1-pins {
+				rockchip,pins =
+					/* mac_txen */
+					<4 RK_PB7 2 &pcfg_pull_none_12ma>,
+					/* mac_txd1 */
+					<4 RK_PA5 2 &pcfg_pull_none_12ma>,
+					/* mac_txd0 */
+					<4 RK_PA4 2 &pcfg_pull_none_12ma>,
+					/* mac_rxd0 */
+					<4 RK_PA2 2 &pcfg_pull_none>,
+					/* mac_rxd1 */
+					<4 RK_PA3 2 &pcfg_pull_none>,
+					/* mac_rxer */
+					<4 RK_PA0 2 &pcfg_pull_none>,
+					/* mac_rxdv */
+					<4 RK_PA1 2 &pcfg_pull_none>,
+					/* mac_mdio */
+					<4 RK_PB6 2 &pcfg_pull_none>,
+					/* mac_mdc */
+					<4 RK_PB5 2 &pcfg_pull_none>;
+			};
+
+			macm1_refclk_12ma: macm1-refclk-12ma {
+				rockchip,pins =
+					<4 RK_PB4 2 &pcfg_pull_none_12ma>;
+			};
+
+			macm1_refclk: macm1-refclk {
+				rockchip,pins =
+					<4 RK_PB4 2 &pcfg_pull_none>;
+			};
+		};
+
+		rtc {
+			rtc_32k: rtc-32k {
+				rockchip,pins =
+					<0 RK_PC3 1 &pcfg_pull_none>;
+			};
+		};
+
+	};
+};
-- 
2.17.1

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

* [U-Boot] [PATCH v2 4/9] board: rockchip: Add rk3308 evb support
  2019-10-30  8:11 [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Andy Yan
                   ` (2 preceding siblings ...)
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 3/9] arm: dts: rockchip: Add dts for rk3308 evb Andy Yan
@ 2019-10-30  8:11 ` Andy Yan
  2019-11-07  9:33   ` Kever Yang
  2019-10-30  8:16 ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Andy Yan
  2019-11-18  2:55 ` [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Kever Yang
  5 siblings, 1 reply; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:11 UTC (permalink / raw)
  To: u-boot

Add support for rk3308 evaluation board.

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

Changes in v2: None

 arch/arm/mach-rockchip/rk3308/Kconfig  |  8 +++
 board/rockchip/evb_rk3308/Kconfig      | 15 +++++
 board/rockchip/evb_rk3308/MAINTAINERS  |  6 ++
 board/rockchip/evb_rk3308/Makefile     |  7 +++
 board/rockchip/evb_rk3308/evb_rk3308.c | 44 +++++++++++++++
 configs/evb-rk3308_defconfig           | 77 ++++++++++++++++++++++++++
 include/configs/evb_rk3308.h           | 20 +++++++
 7 files changed, 177 insertions(+)
 create mode 100644 board/rockchip/evb_rk3308/Kconfig
 create mode 100644 board/rockchip/evb_rk3308/MAINTAINERS
 create mode 100644 board/rockchip/evb_rk3308/Makefile
 create mode 100644 board/rockchip/evb_rk3308/evb_rk3308.c
 create mode 100644 configs/evb-rk3308_defconfig
 create mode 100644 include/configs/evb_rk3308.h

diff --git a/arch/arm/mach-rockchip/rk3308/Kconfig b/arch/arm/mach-rockchip/rk3308/Kconfig
index 9c09661595..c74d1fc7f1 100644
--- a/arch/arm/mach-rockchip/rk3308/Kconfig
+++ b/arch/arm/mach-rockchip/rk3308/Kconfig
@@ -1,5 +1,9 @@
 if ROCKCHIP_RK3308
 
+config TARGET_EVB_RK3308
+	bool "EVB_RK3308"
+	select BOARD_LATE_INIT
+
 config SYS_SOC
 	default "rk3308"
 
@@ -11,4 +15,8 @@ config SPL_SERIAL_SUPPORT
 
 config ROCKCHIP_BOOT_MODE_REG
 	default 0xff000500
+
+
+source "board/rockchip/evb_rk3308/Kconfig"
+
 endif
diff --git a/board/rockchip/evb_rk3308/Kconfig b/board/rockchip/evb_rk3308/Kconfig
new file mode 100644
index 0000000000..0074429cb6
--- /dev/null
+++ b/board/rockchip/evb_rk3308/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_EVB_RK3308
+
+config SYS_BOARD
+	default "evb_rk3308"
+
+config SYS_VENDOR
+	default "rockchip"
+
+config SYS_CONFIG_NAME
+	default "evb_rk3308"
+
+config BOARD_SPECIFIC_OPTIONS # dummy
+	def_bool y
+
+endif
diff --git a/board/rockchip/evb_rk3308/MAINTAINERS b/board/rockchip/evb_rk3308/MAINTAINERS
new file mode 100644
index 0000000000..0af119ae0a
--- /dev/null
+++ b/board/rockchip/evb_rk3308/MAINTAINERS
@@ -0,0 +1,6 @@
+EVB-RK3308
+M:      Andy Yan <andy.yan@rock-chips.com>
+S:      Maintained
+F:      board/rockchip/evb_rk3308
+F:      include/configs/evb_rk3308.h
+F:      configs/evb-rk3308_defconfig
diff --git a/board/rockchip/evb_rk3308/Makefile b/board/rockchip/evb_rk3308/Makefile
new file mode 100644
index 0000000000..05de5560f1
--- /dev/null
+++ b/board/rockchip/evb_rk3308/Makefile
@@ -0,0 +1,7 @@
+#
+# (C) Copyright 2018 Rockchip Electronics Co., Ltd
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y	+= evb_rk3308.o
diff --git a/board/rockchip/evb_rk3308/evb_rk3308.c b/board/rockchip/evb_rk3308/evb_rk3308.c
new file mode 100644
index 0000000000..180f1fe4f0
--- /dev/null
+++ b/board/rockchip/evb_rk3308/evb_rk3308.c
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2018 Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <adc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define KEY_DOWN_MIN_VAL        0
+#define KEY_DOWN_MAX_VAL        30
+
+/*
+ * Two board variants whith adc channel 3 is for board id
+ * v10: 1024, v11: 512
+ * v10: adc channel 0 for dnl key
+ * v11: adc channel 1 for dnl key
+ */
+int rockchip_dnl_key_pressed(void)
+{
+	unsigned int key_val, id_val;
+	int key_ch;
+
+	if (adc_channel_single_shot("saradc", 3, &id_val)) {
+		printf("%s read board id failed\n", __func__);
+		return false;
+	}
+
+	if (abs(id_val - 1024) <= 30)
+		key_ch = 0;
+	else
+		key_ch = 1;
+
+	if (adc_channel_single_shot("saradc", key_ch, &key_val)) {
+		printf("%s read adc key val failed\n", __func__);
+		return false;
+	}
+
+	if (key_val >= KEY_DOWN_MIN_VAL && key_val <= KEY_DOWN_MAX_VAL)
+		return true;
+	else
+		return false;
+}
diff --git a/configs/evb-rk3308_defconfig b/configs/evb-rk3308_defconfig
new file mode 100644
index 0000000000..36d30dfa80
--- /dev/null
+++ b/configs/evb-rk3308_defconfig
@@ -0,0 +1,77 @@
+CONFIG_ARM=y
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_SYS_TEXT_BASE=0x00600000
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_ROCKCHIP_RK3308=y
+CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_TARGET_EVB_RK3308=y
+CONFIG_SPL_STACK_R_ADDR=0xc00000
+CONFIG_DEBUG_UART_BASE=0xFF0C0000
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_DEBUG_UART=y
+CONFIG_ANDROID_BOOT_IMAGE=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_BOOTDELAY=0
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_SPL_STACK_R=y
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_CONSOLE is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_GPT=y
+# CONFIG_CMD_LOADB is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_MASS_STORAGE=y
+# CONFIG_CMD_ITEST is not set
+# CONFIG_CMD_SETEXPR is not set
+# CONFIG_CMD_MISC is not set
+# CONFIG_DOS_PARTITION is not set
+# CONFIG_ISO_PARTITION is not set
+CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_OF_LIVE=y
+CONFIG_DEFAULT_DEVICE_TREE="rk3308-evb"
+CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
+CONFIG_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_CLK=y
+# CONFIG_USB_FUNCTION_FASTBOOT is not set
+CONFIG_ROCKCHIP_GPIO=y
+CONFIG_SYS_I2C_ROCKCHIP=y
+CONFIG_MMC_DW=y
+CONFIG_MMC_DW_ROCKCHIP=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_GMAC_ROCKCHIP=y
+CONFIG_PHY=y
+CONFIG_PINCTRL=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_PWM_ROCKCHIP=y
+CONFIG_RAM=y
+CONFIG_DM_RESET=y
+CONFIG_BAUDRATE=1500000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_SKIP_INIT=y
+CONFIG_SYSRESET=y
+CONFIG_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_DWC2=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_DWC2_OTG=y
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_SPL_TINY_MEMSET=y
+CONFIG_LZ4=y
+CONFIG_LZO=y
+CONFIG_ERRNO_STR=y
+# CONFIG_EFI_LOADER is not set
diff --git a/include/configs/evb_rk3308.h b/include/configs/evb_rk3308.h
new file mode 100644
index 0000000000..fb027c7270
--- /dev/null
+++ b/include/configs/evb_rk3308.h
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2018 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef __EVB_RK3308_H
+#define __EVB_RK3308_H
+
+#include <configs/rk3308_common.h>
+
+#define CONFIG_SUPPORT_EMMC_RPMB
+#define CONFIG_SYS_MMC_ENV_DEV 0
+
+#define ROCKCHIP_DEVICE_SETTINGS \
+			"stdout=serial,vidconsole\0" \
+			"stderr=serial,vidconsole\0"
+#undef CONFIG_CONSOLE_SCROLL_LINES
+#define CONFIG_CONSOLE_SCROLL_LINES            10
+
+#endif
-- 
2.17.1

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

* [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver
  2019-10-30  8:11 [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Andy Yan
                   ` (3 preceding siblings ...)
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 4/9] board: rockchip: Add rk3308 evb support Andy Yan
@ 2019-10-30  8:16 ` Andy Yan
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 6/9] rockchip: mkimage: add support for RK3308 Andy Yan
                     ` (4 more replies)
  2019-11-18  2:55 ` [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Kever Yang
  5 siblings, 5 replies; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:16 UTC (permalink / raw)
  To: u-boot

A dm based dram driver for rk3308 u-boot
to get capacity.

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

Changes in v2: None

 drivers/ram/rockchip/Makefile       |  1 +
 drivers/ram/rockchip/sdram_rk3308.c | 55 +++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)
 create mode 100644 drivers/ram/rockchip/sdram_rk3308.c

diff --git a/drivers/ram/rockchip/Makefile b/drivers/ram/rockchip/Makefile
index feb1f82d00..1adca32dcb 100644
--- a/drivers/ram/rockchip/Makefile
+++ b/drivers/ram/rockchip/Makefile
@@ -9,5 +9,6 @@ obj-$(CONFIG_ROCKCHIP_RK3128) = sdram_rk3128.o
 obj-$(CONFIG_ROCKCHIP_RK3188) = sdram_rk3188.o
 obj-$(CONFIG_ROCKCHIP_RK322X) = sdram_rk322x.o
 obj-$(CONFIG_ROCKCHIP_RK3288) = sdram_rk3288.o
+obj-$(CONFIG_ROCKCHIP_RK3308) = sdram_rk3308.o
 obj-$(CONFIG_ROCKCHIP_RK3328) = sdram_rk3328.o
 obj-$(CONFIG_RAM_RK3399) += sdram_rk3399.o
diff --git a/drivers/ram/rockchip/sdram_rk3308.c b/drivers/ram/rockchip/sdram_rk3308.c
new file mode 100644
index 0000000000..43d44cce62
--- /dev/null
+++ b/drivers/ram/rockchip/sdram_rk3308.c
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+/*
+ * (C) Copyright 2019 Rockchip Electronics Co., Ltd.
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <ram.h>
+#include <syscon.h>
+#include <asm/arch/grf_rk3308.h>
+#include <asm/arch-rockchip/clock.h>
+#include <asm/arch-rockchip/sdram_common.h>
+
+struct dram_info {
+	struct ram_info info;
+	struct rk3308_grf *grf;
+};
+
+static int rk3308_dmc_probe(struct udevice *dev)
+{
+	struct dram_info *priv = dev_get_priv(dev);
+
+	priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+	priv->info.base = CONFIG_SYS_SDRAM_BASE;
+	priv->info.size = rockchip_sdram_size((phys_addr_t)&priv->grf->os_reg2);
+
+	return 0;
+}
+
+static int rk3308_dmc_get_info(struct udevice *dev, struct ram_info *info)
+{
+	struct dram_info *priv = dev_get_priv(dev);
+
+	*info = priv->info;
+
+	return 0;
+}
+
+static struct ram_ops rk3308_dmc_ops = {
+	.get_info = rk3308_dmc_get_info,
+};
+
+static const struct udevice_id rk3308_dmc_ids[] = {
+	{ .compatible = "rockchip,rk3308-dmc" },
+	{ }
+};
+
+U_BOOT_DRIVER(dmc_rk3308) = {
+	.name = "rockchip_rk3308_dmc",
+	.id = UCLASS_RAM,
+	.of_match = rk3308_dmc_ids,
+	.ops = &rk3308_dmc_ops,
+	.probe = rk3308_dmc_probe,
+	.priv_auto_alloc_size = sizeof(struct dram_info),
+};
-- 
2.17.1

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

* [U-Boot] [PATCH v2 6/9] rockchip: mkimage: add support for RK3308
  2019-10-30  8:16 ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Andy Yan
@ 2019-10-30  8:16   ` Andy Yan
  2019-11-07  9:34     ` Kever Yang
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 7/9] rockchip: rk3308: Add dts for ROC-RK3308-CC Andy Yan
                     ` (3 subsequent siblings)
  4 siblings, 1 reply; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:16 UTC (permalink / raw)
  To: u-boot

Usage:

 (1) tools/mkimage -n rk3308 -T rksd -d tpl/u-boot-tpl.bin idbloader.img
 (2) cat spl/u-boot-spl.bin >> idbloader.img
 (3) upgrade_tool wl 0x40 idbloader.img

Note:
  When use a ddr binary from rkbin as tpl, use it replace u-boot-tpl.bin in (1)

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

Changes in v2: None

 tools/rkcommon.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/rkcommon.c b/tools/rkcommon.c
index 831c2ad820..a16f83c1ef 100644
--- a/tools/rkcommon.c
+++ b/tools/rkcommon.c
@@ -72,6 +72,7 @@ static struct spl_info spl_infos[] = {
 	{ "rk3188", "RK31", 0x8000 - 0x800, true },
 	{ "rk322x", "RK32", 0x8000 - 0x1000, false },
 	{ "rk3288", "RK32", 0x8000, false },
+	{ "rk3308", "RK33", 0x40000 - 0x1000, false},
 	{ "rk3328", "RK32", 0x8000 - 0x1000, false },
 	{ "rk3368", "RK33", 0x8000 - 0x1000, false },
 	{ "rk3399", "RK33", 0x30000 - 0x2000, false },
-- 
2.17.1

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

* [U-Boot] [PATCH v2 7/9] rockchip: rk3308: Add dts for ROC-RK3308-CC
  2019-10-30  8:16 ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Andy Yan
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 6/9] rockchip: mkimage: add support for RK3308 Andy Yan
@ 2019-10-30  8:16   ` Andy Yan
  2019-11-07  9:39     ` Kever Yang
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 8/9] rockchip: rk3308: Add support for ROC-RK3308-CC board Andy Yan
                     ` (2 subsequent siblings)
  4 siblings, 1 reply; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:16 UTC (permalink / raw)
  To: u-boot

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

Changes in v2: None

 arch/arm/dts/Makefile                  |   3 +-
 arch/arm/dts/rk3308-roc-cc-u-boot.dtsi |  17 +++
 arch/arm/dts/rk3308-roc-cc.dts         | 190 +++++++++++++++++++++++++
 3 files changed, 209 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/dts/rk3308-roc-cc-u-boot.dtsi
 create mode 100644 arch/arm/dts/rk3308-roc-cc.dts

diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 95538b117e..1cb10b5613 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -94,7 +94,8 @@ dtb-$(CONFIG_ROCKCHIP_RK3288) += \
 	rk3288-vyasa.dtb
 
 dtb-$(CONFIG_ROCKCHIP_RK3308) += \
-	rk3308-evb.dtb
+	rk3308-evb.dtb \
+	rk3308-roc-cc.dtb
 
 dtb-$(CONFIG_ROCKCHIP_RK3328) += \
 	rk3328-evb.dtb \
diff --git a/arch/arm/dts/rk3308-roc-cc-u-boot.dtsi b/arch/arm/dts/rk3308-roc-cc-u-boot.dtsi
new file mode 100644
index 0000000000..ffbe742053
--- /dev/null
+++ b/arch/arm/dts/rk3308-roc-cc-u-boot.dtsi
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2018-2019 Rockchip Electronics Co., Ltd
+ */
+#include "rk3308-u-boot.dtsi"
+
+/ {
+	chosen {
+		u-boot,spl-boot-order = "same-as-spl", &emmc;
+	};
+};
+
+&uart2 {
+	u-boot,dm-pre-reloc;
+	clock-frequency = <24000000>;
+	status = "okay";
+};
diff --git a/arch/arm/dts/rk3308-roc-cc.dts b/arch/arm/dts/rk3308-roc-cc.dts
new file mode 100644
index 0000000000..e10aa638a3
--- /dev/null
+++ b/arch/arm/dts/rk3308-roc-cc.dts
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ */
+
+/dts-v1/;
+#include "rk3308.dtsi"
+
+/ {
+	model = "Firefly ROC-RK3308-CC board";
+	compatible = "firefly,roc-rk3308-cc", "rockchip,rk3308";
+	chosen {
+		stdout-path = "serial2:1500000n8";
+	};
+
+	ir_rx {
+		compatible = "gpio-ir-receiver";
+		gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&ir_recv_pin>;
+	};
+
+	ir_tx {
+		compatible = "pwm-ir-tx";
+		pwms = <&pwm5 0 25000 0>;
+	};
+
+	leds {
+		compatible = "gpio-leds";
+		power {
+			label = "firefly:red:power";
+			linux,default-trigger = "ir-power-click";
+			default-state = "on";
+			gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
+		};
+
+		user {
+			label = "firefly:blue:user";
+			linux,default-trigger = "ir-user-click";
+			default-state = "off";
+			gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>;
+		};
+	};
+
+	typec_vcc5v: typec-vcc5v {
+		compatible = "regulator-fixed";
+		regulator-name = "typec_vcc5v";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+	};
+
+	vcc5v0_sys: vcc5v0-sys {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_sys";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		regulator-always-on;
+		regulator-boot-on;
+		vin-supply = <&typec_vcc5v>;
+	};
+
+	vdd_core: vdd-core {
+		compatible = "pwm-regulator";
+		pwms = <&pwm0 0 5000 1>;
+		regulator-name = "vdd_core";
+		regulator-min-microvolt = <827000>;
+		regulator-max-microvolt = <1340000>;
+		regulator-init-microvolt = <1015000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+	};
+
+	vdd_log: vdd-log {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_log";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1050000>;
+		regulator-max-microvolt = <1050000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_io: vcc-io {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_io";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		regulator-always-on;
+		regulator-boot-on;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_sdmmc: vcc-sdmmc {
+		compatible = "regulator-gpio";
+		regulator-name = "vcc_sdmmc";
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <3300000>;
+		gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_HIGH>;
+		states = <1800000 0x0
+			  3300000 0x1>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_sd: vcc-sd {
+		compatible = "regulator-fixed";
+		gpio = <&gpio4 RK_PD6 GPIO_ACTIVE_LOW>;
+		regulator-name = "vcc_sd";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		regulator-always-on;
+		regulator-boot-on;
+		vim-supply = <&vcc_io>;
+	};
+
+};
+
+&cpu0 {
+	cpu-supply = <&vdd_core>;
+};
+
+&emmc {
+	bus-width = <8>;
+	cap-mmc-highspeed;
+	supports-emmc;
+	disable-wp;
+	non-removable;
+	num-slots = <1>;
+	status = "okay";
+};
+
+&i2c1 {
+	clock-frequency = <400000>;
+	status = "okay";
+
+	rtc: rtc at 51 {
+		compatible = "nxp,pcf8563";
+		reg = <0x51>;
+		#clock-cells = <0>;
+	};
+};
+
+&pwm5 {
+	status = "okay";
+	pinctrl-names = "active";
+	pinctrl-0 = <&pwm5_pin_pull_down>;
+};
+
+&pinctrl {
+	pinctrl-names = "default";
+	pinctrl-0 = <&rtc_32k>;
+
+	ir-receiver {
+		ir_recv_pin: ir-recv-pin  {
+			rockchip,pins = <0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	buttons {
+		pwr_key: pwr-key {
+			rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+};
+
+&pwm0 {
+	status = "okay";
+	pinctrl-0 = <&pwm0_pin_pull_down>;
+};
+
+&sdmmc {
+	bus-width = <4>;
+	cap-mmc-highspeed;
+	cap-sd-highspeed;
+	supports-sd;
+	card-detect-delay = <300>;
+	sd-uhs-sdr25;
+	sd-uhs-sdr50;
+	sd-uhs-sdr104;
+	vmmc-supply = <&vcc_sd>;
+	vqmmc-supply = <&vcc_sdmmc>;
+	status = "okay";
+};
+
+&uart2 {
+	status = "okay";
+};
-- 
2.17.1

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

* [U-Boot] [PATCH v2 8/9] rockchip: rk3308: Add support for ROC-RK3308-CC board
  2019-10-30  8:16 ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Andy Yan
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 6/9] rockchip: mkimage: add support for RK3308 Andy Yan
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 7/9] rockchip: rk3308: Add dts for ROC-RK3308-CC Andy Yan
@ 2019-10-30  8:16   ` Andy Yan
  2019-11-07  9:38     ` Kever Yang
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 9/9] doc: rockchip: Add documentation for rk3308 based boards Andy Yan
  2019-11-07  9:34   ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Kever Yang
  4 siblings, 1 reply; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:16 UTC (permalink / raw)
  To: u-boot

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

---

Changes in v2:
- Add board ROC-rk3308-CC

 arch/arm/mach-rockchip/rk3308/Kconfig        |  5 ++
 board/firefly/firefly-rk3308/Kconfig         | 15 ++++
 board/firefly/firefly-rk3308/MAINTAINERS     |  5 ++
 board/firefly/firefly-rk3308/Makefile        |  7 ++
 board/firefly/firefly-rk3308/roc_rk3308_cc.c | 82 ++++++++++++++++++++
 configs/roc-rk3308-cc_defconfig              | 77 ++++++++++++++++++
 6 files changed, 191 insertions(+)
 create mode 100644 board/firefly/firefly-rk3308/Kconfig
 create mode 100644 board/firefly/firefly-rk3308/MAINTAINERS
 create mode 100644 board/firefly/firefly-rk3308/Makefile
 create mode 100644 board/firefly/firefly-rk3308/roc_rk3308_cc.c
 create mode 100644 configs/roc-rk3308-cc_defconfig

diff --git a/arch/arm/mach-rockchip/rk3308/Kconfig b/arch/arm/mach-rockchip/rk3308/Kconfig
index c74d1fc7f1..b9fdfe2e95 100644
--- a/arch/arm/mach-rockchip/rk3308/Kconfig
+++ b/arch/arm/mach-rockchip/rk3308/Kconfig
@@ -4,6 +4,10 @@ config TARGET_EVB_RK3308
 	bool "EVB_RK3308"
 	select BOARD_LATE_INIT
 
+config TARGET_ROC_RK3308_CC
+       bool "Firefly roc-rk3308-cc"
+	select BOARD_LATE_INIT
+
 config SYS_SOC
 	default "rk3308"
 
@@ -18,5 +22,6 @@ config ROCKCHIP_BOOT_MODE_REG
 
 
 source "board/rockchip/evb_rk3308/Kconfig"
+source "board/firefly/firefly-rk3308/Kconfig"
 
 endif
diff --git a/board/firefly/firefly-rk3308/Kconfig b/board/firefly/firefly-rk3308/Kconfig
new file mode 100644
index 0000000000..7d4d189e54
--- /dev/null
+++ b/board/firefly/firefly-rk3308/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_ROC_RK3308_CC
+
+config SYS_BOARD
+	default "firefly-rk3308"
+
+config SYS_VENDOR
+	default "firefly"
+
+config SYS_CONFIG_NAME
+	default "evb_rk3308"
+
+config BOARD_SPECIFIC_OPTIONS # dummy
+	def_bool y
+
+endif
diff --git a/board/firefly/firefly-rk3308/MAINTAINERS b/board/firefly/firefly-rk3308/MAINTAINERS
new file mode 100644
index 0000000000..8670d8c6a8
--- /dev/null
+++ b/board/firefly/firefly-rk3308/MAINTAINERS
@@ -0,0 +1,5 @@
+ROC-RK3308-CC
+M:      Andy Yan <andy.yan@rock-chips.com>
+S:      Maintained
+F:      board/firefly/firefly-rk3308/roc_rk3308_cc.c
+F:      configs/roc-rk3308-cc_defconfig
diff --git a/board/firefly/firefly-rk3308/Makefile b/board/firefly/firefly-rk3308/Makefile
new file mode 100644
index 0000000000..587d2e6f44
--- /dev/null
+++ b/board/firefly/firefly-rk3308/Makefile
@@ -0,0 +1,7 @@
+#
+# (C) Copyright 2018 Rockchip Electronics Co., Ltd
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y	+= roc_rk3308_cc.o
diff --git a/board/firefly/firefly-rk3308/roc_rk3308_cc.c b/board/firefly/firefly-rk3308/roc_rk3308_cc.c
new file mode 100644
index 0000000000..1deaa39516
--- /dev/null
+++ b/board/firefly/firefly-rk3308/roc_rk3308_cc.c
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2019 Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <adc.h>
+#include <asm/io.h>
+#include <asm/arch/grf_rk3308.h>
+#include <asm/arch-rockchip/hardware.h>
+
+#if defined(CONFIG_DEBUG_UART)
+#define GRF_BASE	0xff000000
+
+enum {
+	GPIO1C7_SHIFT		= 8,
+	GPIO1C7_MASK		= GENMASK(11, 8),
+	GPIO1C7_GPIO		= 0,
+	GPIO1C7_UART1_RTSN,
+	GPIO1C7_UART2_TX_M0,
+	GPIO1C7_SPI2_MOSI,
+	GPIO1C7_JTAG_TMS,
+
+	GPIO1C6_SHIFT		= 4,
+	GPIO1C6_MASK		= GENMASK(7, 4),
+	GPIO1C6_GPIO		= 0,
+	GPIO1C6_UART1_CTSN,
+	GPIO1C6_UART2_RX_M0,
+	GPIO1C6_SPI2_MISO,
+	GPIO1C6_JTAG_TCLK,
+
+	GPIO4D3_SHIFT           = 6,
+	GPIO4D3_MASK            = GENMASK(7, 6),
+	GPIO4D3_GPIO            = 0,
+	GPIO4D3_SDMMC_D3,
+	GPIO4D3_UART2_TX_M1,
+
+	GPIO4D2_SHIFT           = 4,
+	GPIO4D2_MASK            = GENMASK(5, 4),
+	GPIO4D2_GPIO            = 0,
+	GPIO4D2_SDMMC_D2,
+	GPIO4D2_UART2_RX_M1,
+
+	UART2_IO_SEL_SHIFT	= 2,
+	UART2_IO_SEL_MASK	= GENMASK(3, 2),
+	UART2_IO_SEL_M0		= 0,
+	UART2_IO_SEL_M1,
+	UART2_IO_SEL_USB,
+};
+
+void board_debug_uart_init(void)
+{
+	static struct rk3308_grf * const grf = (void *)GRF_BASE;
+
+	/* Enable early UART2 channel m0 on the rk3308 */
+	rk_clrsetreg(&grf->soc_con5, UART2_IO_SEL_MASK,
+		     UART2_IO_SEL_M0 << UART2_IO_SEL_SHIFT);
+	rk_clrsetreg(&grf->gpio1ch_iomux,
+		     GPIO1C6_MASK | GPIO1C7_MASK,
+		     GPIO1C6_UART2_RX_M0 << GPIO1C6_SHIFT |
+		     GPIO1C7_UART2_TX_M0 << GPIO1C7_SHIFT);
+}
+#endif
+
+#define KEY_DOWN_MIN_VAL        0
+#define KEY_DOWN_MAX_VAL        30
+
+int rockchip_dnl_key_pressed(void)
+{
+	unsigned int val;
+
+
+	if (adc_channel_single_shot("saradc", 1, &val)) {
+		printf("%s read adc key val failed\n", __func__);
+		return false;
+	}
+
+	if (val >= KEY_DOWN_MIN_VAL && val <= KEY_DOWN_MAX_VAL)
+		return true;
+	else
+		return false;
+}
diff --git a/configs/roc-rk3308-cc_defconfig b/configs/roc-rk3308-cc_defconfig
new file mode 100644
index 0000000000..82ebe6a786
--- /dev/null
+++ b/configs/roc-rk3308-cc_defconfig
@@ -0,0 +1,77 @@
+CONFIG_ARM=y
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_SYS_TEXT_BASE=0x00600000
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_ROCKCHIP_RK3308=y
+CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_TARGET_ROC_RK3308_CC=y
+CONFIG_SPL_STACK_R_ADDR=0xc00000
+CONFIG_DEBUG_UART_BASE=0xFF0C0000
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_DEBUG_UART=y
+CONFIG_ANDROID_BOOT_IMAGE=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_BOOTDELAY=0
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_SPL_STACK_R=y
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_CONSOLE is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_GPT=y
+# CONFIG_CMD_LOADB is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_MASS_STORAGE=y
+# CONFIG_CMD_ITEST is not set
+# CONFIG_CMD_SETEXPR is not set
+# CONFIG_CMD_MISC is not set
+# CONFIG_DOS_PARTITION is not set
+# CONFIG_ISO_PARTITION is not set
+CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_OF_LIVE=y
+CONFIG_DEFAULT_DEVICE_TREE="rk3308-roc-cc"
+CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
+CONFIG_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_CLK=y
+# CONFIG_USB_FUNCTION_FASTBOOT is not set
+CONFIG_ROCKCHIP_GPIO=y
+CONFIG_SYS_I2C_ROCKCHIP=y
+CONFIG_MMC_DW=y
+CONFIG_MMC_DW_ROCKCHIP=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_GMAC_ROCKCHIP=y
+CONFIG_PHY=y
+CONFIG_PINCTRL=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_PWM_ROCKCHIP=y
+CONFIG_RAM=y
+CONFIG_DM_RESET=y
+CONFIG_BAUDRATE=1500000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_SKIP_INIT=y
+CONFIG_SYSRESET=y
+CONFIG_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_DWC2=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_DWC2_OTG=y
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_SPL_TINY_MEMSET=y
+CONFIG_LZ4=y
+CONFIG_LZO=y
+CONFIG_ERRNO_STR=y
+# CONFIG_EFI_LOADER is not set
-- 
2.17.1

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

* [U-Boot] [PATCH v2 9/9] doc: rockchip: Add documentation for rk3308 based boards
  2019-10-30  8:16 ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Andy Yan
                     ` (2 preceding siblings ...)
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 8/9] rockchip: rk3308: Add support for ROC-RK3308-CC board Andy Yan
@ 2019-10-30  8:16   ` Andy Yan
  2019-11-07  9:55     ` Kever Yang
  2019-11-07  9:34   ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Kever Yang
  4 siblings, 1 reply; 20+ messages in thread
From: Andy Yan @ 2019-10-30  8:16 UTC (permalink / raw)
  To: u-boot

Add build documentation for rk3308 based boards.

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

---

Changes in v2:
- Update doc/README.rockchip

 doc/README.rockchip | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/doc/README.rockchip b/doc/README.rockchip
index d17afeabdd..f9f5ca8ac8 100644
--- a/doc/README.rockchip
+++ b/doc/README.rockchip
@@ -47,6 +47,11 @@ Two RK3036 boards are supported:
    - EVB RK3036 - use evb-rk3036 configuration
    - Kylin - use kylin_rk3036 configuration
 
+Two RK3308 boards are supported:
+
+   - EVB RK3308 - use evb-rk3308 configuration
+   - roc-RK3308-CC - use roc-rk3308-cc configuration
+
 Two RK3328 board are supported:
 
    - EVB RK3328 - use evb-rk3328_defconfig
@@ -94,7 +99,20 @@ For example:
 
     (or you can use another cross compiler if you prefer)
 
-2. To build RK3399 board:
+2. To build RK3308 board:
+   - Get the rkbin
+     => git clone https://github.com/rockchip-linux/rkbin.git
+
+   - Compile U-Boot
+     => cd /path/to/u-boot
+     => export BL31=/path/to/rkbin/bin/rk33/rk3308_bl31_v2.22.elf
+     => make roc-rk3308-cc_defconfig
+     => make CROSS_COMPILE=aarch64-linux-gnu- all
+     => make CROSS_COMPILE=aarch64-linux-gnu- u-boot.itb
+     => ./tools/mkimage -n rk3308 -T rksd -d /path/to/rkbin/bin/rk33/rk3308_ddr_589MHz_uart2_m0_v1.26.bin idbloader.img
+     => cat spl/u-boot-spl.bin  >> idbloader.img
+
+3. To build RK3399 board:
 
    Option 1: Package the image with Rockchip miniloader:
 
-- 
2.17.1

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

* [U-Boot] [PATCH v2 1/9] arm: rockchip: Add RK3308 SOC support
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 1/9] arm: rockchip: Add RK3308 SOC support Andy Yan
@ 2019-11-07  9:30   ` Kever Yang
  0 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-07  9:30 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:11, Andy Yan wrote:
> RK3308 is a quad Cortex A35 based SOC with rich audio
> interfaces(I2S/PCM/TDM/PDM/SPDIF/VAD/HDMI ARC), which
> designed for intelligent voice interaction and audio
> input/output processing.
>
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

Reviewed-by: Kever Yang<kever.yang@rock-chips.com>


Thanks,
- Kever
>
> ---
>
> Changes in v2: None
>
>   arch/arm/include/asm/arch-rk3308/boot0.h      |  11 +
>   arch/arm/include/asm/arch-rk3308/cru_rk3308.h | 290 ++++++++++++++++++
>   arch/arm/include/asm/arch-rk3308/gpio.h       |  11 +
>   arch/arm/include/asm/arch-rk3308/grf_rk3308.h | 197 ++++++++++++
>   arch/arm/mach-rockchip/Kconfig                |  24 ++
>   arch/arm/mach-rockchip/Makefile               |   1 +
>   arch/arm/mach-rockchip/rk3308/Kconfig         |  14 +
>   arch/arm/mach-rockchip/rk3308/Makefile        |   9 +
>   arch/arm/mach-rockchip/rk3308/clk_rk3308.c    |  31 ++
>   arch/arm/mach-rockchip/rk3308/rk3308.c        | 175 +++++++++++
>   arch/arm/mach-rockchip/rk3308/syscon_rk3308.c |  20 ++
>   include/configs/rk3308_common.h               |  58 ++++
>   12 files changed, 841 insertions(+)
>   create mode 100644 arch/arm/include/asm/arch-rk3308/boot0.h
>   create mode 100644 arch/arm/include/asm/arch-rk3308/cru_rk3308.h
>   create mode 100644 arch/arm/include/asm/arch-rk3308/gpio.h
>   create mode 100644 arch/arm/include/asm/arch-rk3308/grf_rk3308.h
>   create mode 100644 arch/arm/mach-rockchip/rk3308/Kconfig
>   create mode 100644 arch/arm/mach-rockchip/rk3308/Makefile
>   create mode 100644 arch/arm/mach-rockchip/rk3308/clk_rk3308.c
>   create mode 100644 arch/arm/mach-rockchip/rk3308/rk3308.c
>   create mode 100644 arch/arm/mach-rockchip/rk3308/syscon_rk3308.c
>   create mode 100644 include/configs/rk3308_common.h
>
> diff --git a/arch/arm/include/asm/arch-rk3308/boot0.h b/arch/arm/include/asm/arch-rk3308/boot0.h
> new file mode 100644
> index 0000000000..2e78b074ad
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-rk3308/boot0.h
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * (C) Copyright 2019 Rockchip Electronics Co., Ltd
> + */
> +
> +#ifndef __ASM_ARCH_BOOT0_H__
> +#define __ASM_ARCH_BOOT0_H__
> +
> +#include <asm/arch-rockchip/boot0.h>
> +
> +#endif
> diff --git a/arch/arm/include/asm/arch-rk3308/cru_rk3308.h b/arch/arm/include/asm/arch-rk3308/cru_rk3308.h
> new file mode 100644
> index 0000000000..a14b64cdb3
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-rk3308/cru_rk3308.h
> @@ -0,0 +1,290 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * (C) Copyright 2018 Rockchip Electronics Co., Ltd.
> + */
> +#ifndef _ASM_ARCH_CRU_RK3308_H
> +#define _ASM_ARCH_CRU_RK3308_H
> +
> +#include <common.h>
> +
> +#define MHz		1000000
> +#define OSC_HZ		(24 * MHz)
> +
> +#define APLL_HZ		(816 * MHz)
> +
> +#define CORE_ACLK_HZ	408000000
> +#define CORE_DBG_HZ	204000000
> +
> +#define BUS_ACLK_HZ	200000000
> +#define BUS_HCLK_HZ	100000000
> +#define BUS_PCLK_HZ	100000000
> +
> +#define PERI_ACLK_HZ	200000000
> +#define PERI_HCLK_HZ	100000000
> +#define PERI_PCLK_HZ	100000000
> +
> +#define AUDIO_HCLK_HZ	100000000
> +#define AUDIO_PCLK_HZ	100000000
> +
> +#define RK3308_PLL_CON(x)	((x) * 0x4)
> +#define RK3308_MODE_CON		0xa0
> +
> +/* RK3308 pll id */
> +enum rk3308_pll_id {
> +	APLL,
> +	DPLL,
> +	VPLL0,
> +	VPLL1,
> +	PLL_COUNT,
> +};
> +
> +struct rk3308_clk_info {
> +	unsigned long id;
> +	char *name;
> +};
> +
> +/* Private data for the clock driver - used by rockchip_get_cru() */
> +struct rk3308_clk_priv {
> +	struct rk3308_cru *cru;
> +	ulong armclk_hz;
> +	ulong dpll_hz;
> +	ulong vpll0_hz;
> +	ulong vpll1_hz;
> +};
> +
> +struct rk3308_cru {
> +	struct rk3308_pll {
> +		unsigned int con0;
> +		unsigned int con1;
> +		unsigned int con2;
> +		unsigned int con3;
> +		unsigned int con4;
> +		unsigned int reserved0[3];
> +	} pll[4];
> +	unsigned int reserved1[8];
> +	unsigned int mode;
> +	unsigned int misc;
> +	unsigned int reserved2[2];
> +	unsigned int glb_cnt_th;
> +	unsigned int glb_rst_st;
> +	unsigned int glb_srst_fst;
> +	unsigned int glb_srst_snd;
> +	unsigned int glb_rst_con;
> +	unsigned int pll_lock;
> +	unsigned int reserved3[6];
> +	unsigned int hwffc_con0;
> +	unsigned int reserved4;
> +	unsigned int hwffc_th;
> +	unsigned int hwffc_intst;
> +	unsigned int apll_con0_s;
> +	unsigned int apll_con1_s;
> +	unsigned int clksel_con0_s;
> +	unsigned int reserved5;
> +	unsigned int clksel_con[74];
> +	unsigned int reserved6[54];
> +	unsigned int clkgate_con[15];
> +	unsigned int reserved7[(0x380 - 0x338) / 4 - 1];
> +	unsigned int ssgtbl[32];
> +	unsigned int softrst_con[10];
> +	unsigned int reserved8[(0x480 - 0x424) / 4 - 1];
> +	unsigned int sdmmc_con[2];
> +	unsigned int sdio_con[2];
> +	unsigned int emmc_con[2];
> +};
> +
> +enum {
> +	/* PLLCON0*/
> +	PLL_BP_SHIFT		= 15,
> +	PLL_POSTDIV1_SHIFT	= 12,
> +	PLL_POSTDIV1_MASK	= 7 << PLL_POSTDIV1_SHIFT,
> +	PLL_FBDIV_SHIFT		= 0,
> +	PLL_FBDIV_MASK		= 0xfff,
> +
> +	/* PLLCON1 */
> +	PLL_PDSEL_SHIFT		= 15,
> +	PLL_PD1_SHIFT		= 14,
> +	PLL_PD_SHIFT		= 13,
> +	PLL_PD_MASK		= 1 << PLL_PD_SHIFT,
> +	PLL_DSMPD_SHIFT		= 12,
> +	PLL_DSMPD_MASK		= 1 << PLL_DSMPD_SHIFT,
> +	PLL_LOCK_STATUS_SHIFT	= 10,
> +	PLL_LOCK_STATUS_MASK	= 1 << PLL_LOCK_STATUS_SHIFT,
> +	PLL_POSTDIV2_SHIFT	= 6,
> +	PLL_POSTDIV2_MASK	= 7 << PLL_POSTDIV2_SHIFT,
> +	PLL_REFDIV_SHIFT	= 0,
> +	PLL_REFDIV_MASK		= 0x3f,
> +
> +	/* PLLCON2 */
> +	PLL_FOUT4PHASEPD_SHIFT	= 27,
> +	PLL_FOUTVCOPD_SHIFT	= 26,
> +	PLL_FOUTPOSTDIVPD_SHIFT	= 25,
> +	PLL_DACPD_SHIFT		= 24,
> +	PLL_FRAC_DIV	= 0xffffff,
> +
> +	/* CRU_MODE */
> +	PLLMUX_FROM_XIN24M	= 0,
> +	PLLMUX_FROM_PLL,
> +	PLLMUX_FROM_RTC32K,
> +	USBPHY480M_MODE_SHIFT	= 8,
> +	USBPHY480M_MODE_MASK	= 3 << USBPHY480M_MODE_SHIFT,
> +	VPLL1_MODE_SHIFT		= 6,
> +	VPLL1_MODE_MASK		= 3 << VPLL1_MODE_SHIFT,
> +	VPLL0_MODE_SHIFT		= 4,
> +	VPLL0_MODE_MASK		= 3 << VPLL0_MODE_SHIFT,
> +	DPLL_MODE_SHIFT		= 2,
> +	DPLL_MODE_MASK		= 3 << DPLL_MODE_SHIFT,
> +	APLL_MODE_SHIFT		= 0,
> +	APLL_MODE_MASK		= 3 << APLL_MODE_SHIFT,
> +
> +	/* CRU_CLK_SEL0_CON */
> +	CORE_ACLK_DIV_SHIFT	= 12,
> +	CORE_ACLK_DIV_MASK	= 0x7 << CORE_ACLK_DIV_SHIFT,
> +	CORE_DBG_DIV_SHIFT	= 8,
> +	CORE_DBG_DIV_MASK	= 0xf << CORE_DBG_DIV_SHIFT,
> +	CORE_CLK_PLL_SEL_SHIFT	= 6,
> +	CORE_CLK_PLL_SEL_MASK	= 0x3 << CORE_CLK_PLL_SEL_SHIFT,
> +	CORE_CLK_PLL_SEL_APLL	= 0,
> +	CORE_CLK_PLL_SEL_VPLL0,
> +	CORE_CLK_PLL_SEL_VPLL1,
> +	CORE_DIV_CON_SHIFT	= 0,
> +	CORE_DIV_CON_MASK	= 0x0f << CORE_DIV_CON_SHIFT,
> +
> +	/* CRU_CLK_SEL5_CON */
> +	BUS_PLL_SEL_SHIFT	= 6,
> +	BUS_PLL_SEL_MASK	= 0x3 << BUS_PLL_SEL_SHIFT,
> +	BUS_PLL_SEL_DPLL	= 0,
> +	BUS_PLL_SEL_VPLL0,
> +	BUS_PLL_SEL_VPLL1,
> +	BUS_ACLK_DIV_SHIFT	= 0,
> +	BUS_ACLK_DIV_MASK	= 0x1f << BUS_ACLK_DIV_SHIFT,
> +
> +	/* CRU_CLK_SEL6_CON */
> +	BUS_PCLK_DIV_SHIFT	= 8,
> +	BUS_PCLK_DIV_MASK	= 0x1f << BUS_PCLK_DIV_SHIFT,
> +	BUS_HCLK_DIV_SHIFT	= 0,
> +	BUS_HCLK_DIV_MASK	= 0x1f << BUS_HCLK_DIV_SHIFT,
> +
> +	/* CRU_CLK_SEL7_CON */
> +	CRYPTO_APK_SEL_SHIFT	= 14,
> +	CRYPTO_APK_PLL_SEL_MASK	= 3 << CRYPTO_APK_SEL_SHIFT,
> +	CRYPTO_PLL_SEL_DPLL	= 0,
> +	CRYPTO_PLL_SEL_VPLL0,
> +	CRYPTO_PLL_SEL_VPLL1	= 0,
> +	CRYPTO_APK_DIV_SHIFT	= 8,
> +	CRYPTO_APK_DIV_MASK	= 0x1f << CRYPTO_APK_DIV_SHIFT,
> +	CRYPTO_PLL_SEL_SHIFT	= 6,
> +	CRYPTO_PLL_SEL_MASK	= 3 << CRYPTO_PLL_SEL_SHIFT,
> +	CRYPTO_DIV_SHIFT	= 0,
> +	CRYPTO_DIV_MASK		= 0x1f << CRYPTO_DIV_SHIFT,
> +
> +	/* CRU_CLK_SEL8_CON */
> +	DCLK_VOP_SEL_SHIFT	= 14,
> +	DCLK_VOP_SEL_MASK	= 0x3 << DCLK_VOP_SEL_SHIFT,
> +	DCLK_VOP_SEL_DIVOUT	= 0,
> +	DCLK_VOP_SEL_FRACOUT,
> +	DCLK_VOP_SEL_24M,
> +	DCLK_VOP_PLL_SEL_SHIFT	= 10,
> +	DCLK_VOP_PLL_SEL_MASK	= 0x3 << DCLK_VOP_PLL_SEL_SHIFT,
> +	DCLK_VOP_PLL_SEL_DPLL	= 0,
> +	DCLK_VOP_PLL_SEL_VPLL0,
> +	DCLK_VOP_PLL_SEL_VPLL1,
> +	DCLK_VOP_DIV_SHIFT	= 0,
> +	DCLK_VOP_DIV_MASK	= 0xff,
> +
> +	/* CRU_CLK_SEL25_CON */
> +	/* CRU_CLK_SEL26_CON */
> +	/* CRU_CLK_SEL27_CON */
> +	/* CRU_CLK_SEL28_CON */
> +	CLK_I2C_PLL_SEL_SHIFT		= 14,
> +	CLK_I2C_PLL_SEL_MASK		= 0x3 << CLK_I2C_PLL_SEL_SHIFT,
> +	CLK_I2C_PLL_SEL_DPLL		= 0,
> +	CLK_I2C_PLL_SEL_VPLL0,
> +	CLK_I2C_PLL_SEL_24M,
> +	CLK_I2C_DIV_CON_SHIFT		= 0,
> +	CLK_I2C_DIV_CON_MASK		= 0x7f << CLK_I2C_DIV_CON_SHIFT,
> +
> +	/* CRU_CLK_SEL29_CON */
> +	CLK_PWM_PLL_SEL_SHIFT		= 14,
> +	CLK_PWM_PLL_SEL_MASK		= 0x3 << CLK_PWM_PLL_SEL_SHIFT,
> +	CLK_PWM_PLL_SEL_DPLL		= 0,
> +	CLK_PWM_PLL_SEL_VPLL0,
> +	CLK_PWM_PLL_SEL_24M,
> +	CLK_PWM_DIV_CON_SHIFT		= 0,
> +	CLK_PWM_DIV_CON_MASK		= 0x7f << CLK_PWM_DIV_CON_SHIFT,
> +
> +	/* CRU_CLK_SEL30_CON */
> +	/* CRU_CLK_SEL31_CON */
> +	/* CRU_CLK_SEL32_CON */
> +	CLK_SPI_PLL_SEL_SHIFT		= 14,
> +	CLK_SPI_PLL_SEL_MASK		= 0x3 << CLK_SPI_PLL_SEL_SHIFT,
> +	CLK_SPI_PLL_SEL_DPLL		= 0,
> +	CLK_SPI_PLL_SEL_VPLL0,
> +	CLK_SPI_PLL_SEL_24M,
> +	CLK_SPI_DIV_CON_SHIFT		= 0,
> +	CLK_SPI_DIV_CON_MASK		= 0x7f << CLK_SPI_DIV_CON_SHIFT,
> +
> +	/* CRU_CLK_SEL34_CON */
> +	CLK_SARADC_DIV_CON_SHIFT	= 0,
> +	CLK_SARADC_DIV_CON_MASK		= 0x7ff << CLK_SARADC_DIV_CON_SHIFT,
> +
> +	/* CRU_CLK_SEL36_CON */
> +	PERI_PLL_SEL_SHIFT	= 6,
> +	PERI_PLL_SEL_MASK	= 0x3 << PERI_PLL_SEL_SHIFT,
> +	PERI_PLL_DPLL		= 0,
> +	PERI_PLL_VPLL0,
> +	PERI_PLL_VPLL1,
> +	PERI_ACLK_DIV_SHIFT	= 0,
> +	PERI_ACLK_DIV_MASK	= 0x1f << PERI_ACLK_DIV_SHIFT,
> +
> +	/* CRU_CLK_SEL37_CON */
> +	PERI_PCLK_DIV_SHIFT	= 8,
> +	PERI_PCLK_DIV_MASK	= 0x1f << PERI_PCLK_DIV_SHIFT,
> +	PERI_HCLK_DIV_SHIFT	= 0,
> +	PERI_HCLK_DIV_MASK	= 0x1f << PERI_HCLK_DIV_SHIFT,
> +
> +	/* CRU_CLKSEL41_CON */
> +	EMMC_CLK_SEL_SHIFT	= 15,
> +	EMMC_CLK_SEL_MASK	= 1 << EMMC_CLK_SEL_SHIFT,
> +	EMMC_CLK_SEL_EMMC	= 0,
> +	EMMC_CLK_SEL_EMMC_DIV50,
> +	EMMC_PLL_SHIFT		= 8,
> +	EMMC_PLL_MASK		= 0x3 << EMMC_PLL_SHIFT,
> +	EMMC_SEL_DPLL		= 0,
> +	EMMC_SEL_VPLL0,
> +	EMMC_SEL_VPLL1,
> +	EMMC_SEL_24M,
> +	EMMC_DIV_SHIFT		= 0,
> +	EMMC_DIV_MASK		= 0xff << EMMC_DIV_SHIFT,
> +
> +	/* CRU_CLKSEL43_CON */
> +	MAC_CLK_SPEED_SEL_SHIFT = 15,
> +	MAC_CLK_SPEED_SEL_MASK = 1 << MAC_CLK_SPEED_SEL_SHIFT,
> +	MAC_CLK_SPEED_SEL_10M = 0,
> +	MAC_CLK_SPEED_SEL_100M,
> +	MAC_CLK_SOURCE_SEL_SHIFT = 14,
> +	MAC_CLK_SOURCE_SEL_MASK = 1 << MAC_CLK_SOURCE_SEL_SHIFT,
> +	MAC_CLK_SOURCE_SEL_INTERNAL	= 0,
> +	MAC_CLK_SOURCE_SEL_EXTERNAL,
> +	MAC_PLL_SHIFT		= 6,
> +	MAC_PLL_MASK		= 0x3 << MAC_PLL_SHIFT,
> +	MAC_SEL_DPLL		= 0,
> +	MAC_SEL_VPLL0,
> +	MAC_SEL_VPLL1,
> +	MAC_DIV_SHIFT		= 0,
> +	MAC_DIV_MASK		= 0x1f << MAC_DIV_SHIFT,
> +
> +	/* CRU_CLK_SEL45_CON */
> +	AUDIO_PCLK_DIV_SHIFT	= 8,
> +	AUDIO_PCLK_DIV_MASK	= 0x1f << AUDIO_PCLK_DIV_SHIFT,
> +	AUDIO_PLL_SEL_SHIFT	= 6,
> +	AUDIO_PLL_SEL_MASK	= 0x3 << AUDIO_PLL_SEL_SHIFT,
> +	AUDIO_PLL_VPLL0		= 0,
> +	AUDIO_PLL_VPLL1,
> +	AUDIO_PLL_24M,
> +	AUDIO_HCLK_DIV_SHIFT	= 0,
> +	AUDIO_HCLK_DIV_MASK	= 0x1f << AUDIO_HCLK_DIV_SHIFT,
> +};
> +
> +check_member(rk3308_cru, emmc_con[1], 0x494);
> +
> +#endif
> diff --git a/arch/arm/include/asm/arch-rk3308/gpio.h b/arch/arm/include/asm/arch-rk3308/gpio.h
> new file mode 100644
> index 0000000000..eca79d5159
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-rk3308/gpio.h
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * (C) Copyright 2019 Rockchip Electronics Co., Ltd
> + */
> +
> +#ifndef __ASM_ARCH_GPIO_H__
> +#define __ASM_ARCH_GPIO_H__
> +
> +#include <asm/arch-rockchip/gpio.h>
> +
> +#endif
> diff --git a/arch/arm/include/asm/arch-rk3308/grf_rk3308.h b/arch/arm/include/asm/arch-rk3308/grf_rk3308.h
> new file mode 100644
> index 0000000000..3e68626d3e
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-rk3308/grf_rk3308.h
> @@ -0,0 +1,197 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + *Copyright 2019 Rockchip Electronics Co., Ltd.
> + */
> +#ifndef _ASM_ARCH_GRF_rk3308_H
> +#define _ASM_ARCH_GRF_rk3308_H
> +
> +#include <common.h>
> +
> +struct rk3308_grf {
> +	unsigned int gpio0a_iomux;
> +	unsigned int reserved0;
> +	unsigned int gpio0b_iomux;
> +	unsigned int reserved1;
> +	unsigned int gpio0c_iomux;
> +	unsigned int reserved2[3];
> +	unsigned int gpio1a_iomux;
> +	unsigned int reserved3;
> +	unsigned int gpio1bl_iomux;
> +	unsigned int gpio1bh_iomux;
> +	unsigned int gpio1cl_iomux;
> +	unsigned int gpio1ch_iomux;
> +	unsigned int gpio1d_iomux;
> +	unsigned int reserved4;
> +	unsigned int gpio2a_iomux;
> +	unsigned int reserved5;
> +	unsigned int gpio2b_iomux;
> +	unsigned int reserved6;
> +	unsigned int gpio2c_iomux;
> +	unsigned int reserved7[3];
> +	unsigned int gpio3a_iomux;
> +	unsigned int reserved8;
> +	unsigned int gpio3b_iomux;
> +	unsigned int reserved9[5];
> +	unsigned int gpio4a_iomux;
> +	unsigned int reserved33;
> +	unsigned int gpio4b_iomux;
> +	unsigned int reserved10;
> +	unsigned int gpio4c_iomux;
> +	unsigned int reserved11;
> +	unsigned int gpio4d_iomux;
> +	unsigned int reserved34;
> +	unsigned int gpio0a_p;
> +	unsigned int gpio0b_p;
> +	unsigned int gpio0c_p;
> +	unsigned int reserved12;
> +	unsigned int gpio1a_p;
> +	unsigned int gpio1b_p;
> +	unsigned int gpio1c_p;
> +	unsigned int gpio1d_p;
> +	unsigned int gpio2a_p;
> +	unsigned int gpio2b_p;
> +	unsigned int gpio2c_p;
> +	unsigned int reserved13;
> +	unsigned int gpio3a_p;
> +	unsigned int gpio3b_p;
> +	unsigned int reserved14[2];
> +	unsigned int gpio4a_p;
> +	unsigned int gpio4b_p;
> +	unsigned int gpio4c_p;
> +	unsigned int gpio4d_p;
> +	unsigned int reserved15[(0x100 - 0xec) / 4 - 1];
> +	unsigned int gpio0a_e;
> +	unsigned int gpio0b_e;
> +	unsigned int gpio0c_e;
> +	unsigned int reserved16;
> +	unsigned int gpio1a_e;
> +	unsigned int gpio1b_e;
> +	unsigned int gpio1c_e;
> +	unsigned int gpio1d_e;
> +	unsigned int gpio2a_e;
> +	unsigned int gpio2b_e;
> +	unsigned int gpio2c_e;
> +	unsigned int reserved17;
> +	unsigned int gpio3a_e;
> +	unsigned int gpio3b_e;
> +	unsigned int reserved18[2];
> +	unsigned int gpio4a_e;
> +	unsigned int gpio4b_e;
> +	unsigned int gpio4c_e;
> +	unsigned int gpio4d_e;
> +	unsigned int gpio0a_sr;
> +	unsigned int gpio0b_sr;
> +	unsigned int gpio0c_sr;
> +	unsigned int reserved19;
> +	unsigned int gpio1a_sr;
> +	unsigned int gpio1b_sr;
> +	unsigned int gpio1c_sr;
> +	unsigned int gpio1d_sr;
> +	unsigned int gpio2a_sr;
> +	unsigned int gpio2b_sr;
> +	unsigned int gpio2c_sr;
> +	unsigned int reserved20;
> +	unsigned int gpio3a_sr;
> +	unsigned int gpio3b_sr;
> +	unsigned int reserved21[2];
> +	unsigned int gpio4a_sr;
> +	unsigned int gpio4b_sr;
> +	unsigned int gpio4c_sr;
> +	unsigned int gpio4d_sr;
> +	unsigned int gpio0a_smt;
> +	unsigned int gpio0b_smt;
> +	unsigned int gpio0c_smt;
> +	unsigned int reserved22;
> +	unsigned int gpio1a_smt;
> +	unsigned int gpio1b_smt;
> +	unsigned int gpio1c_smt;
> +	unsigned int gpio1d_smt;
> +	unsigned int gpio2a_smt;
> +	unsigned int gpio2b_smt;
> +	unsigned int gpio2c_smt;
> +	unsigned int reserved23;
> +	unsigned int gpio3a_smt;
> +	unsigned int gpio3b_smt;
> +	unsigned int reserved35[2];
> +	unsigned int gpio4a_smt;
> +	unsigned int gpio4b_smt;
> +	unsigned int gpio4c_smt;
> +	unsigned int gpio4d_smt;
> +	unsigned int reserved24[(0x300 - 0x1EC) / 4 - 1];
> +	unsigned int soc_con0;
> +	unsigned int soc_con1;
> +	unsigned int soc_con2;
> +	unsigned int soc_con3;
> +	unsigned int soc_con4;
> +	unsigned int soc_con5;
> +	unsigned int soc_con6;
> +	unsigned int soc_con7;
> +	unsigned int soc_con8;
> +	unsigned int soc_con9;
> +	unsigned int soc_con10;
> +	unsigned int reserved25[(0x380 - 0x328) / 4 - 1];
> +	unsigned int soc_status0;
> +	unsigned int reserved26[(0x400 - 0x380) / 4 - 1];
> +	unsigned int cpu_con0;
> +	unsigned int cpu_con1;
> +	unsigned int cpu_con2;
> +	unsigned int reserved27[(0x420 - 0x408) / 4 - 1];
> +	unsigned int cpu_status0;
> +	unsigned int cpu_status1;
> +	unsigned int reserved28[(0x440 - 0x424) / 4 - 1];
> +	unsigned int pvtm_con0;
> +	unsigned int pvtm_con1;
> +	unsigned int pvtm_status0;
> +	unsigned int pvtm_status1;
> +	unsigned int reserved29[(0x460 - 0x44C) / 4 - 1];
> +	unsigned int tsadc_tbl;
> +	unsigned int tsadc_tbh;
> +	unsigned int reserved30[(0x480 - 0x464) / 4 - 1];
> +	unsigned int host0_con0;
> +	unsigned int host0_con1;
> +	unsigned int otg_con0;
> +	unsigned int host0_status0;
> +	unsigned int reserved31[(0x4a0 - 0x48C) / 4 - 1];
> +	unsigned int mac_con0;
> +	unsigned int upctrl_con0;
> +	unsigned int upctrl_status0;
> +	unsigned int reserved32[(0x500 - 0x4A8) / 4 - 1];
> +	unsigned int os_reg0;
> +	unsigned int os_reg1;
> +	unsigned int os_reg2;
> +	unsigned int os_reg3;
> +	unsigned int os_reg4;
> +	unsigned int os_reg5;
> +	unsigned int os_reg6;
> +	unsigned int os_reg7;
> +	unsigned int os_reg8;
> +	unsigned int os_reg9;
> +	unsigned int os_reg10;
> +	unsigned int os_reg11;
> +	unsigned int reserved38[(0x600 - 0x52c) / 4 - 1];
> +	unsigned int soc_con12;
> +	unsigned int reserved39;
> +	unsigned int soc_con13;
> +	unsigned int soc_con14;
> +	unsigned int soc_con15;
> +	unsigned int reserved40[(0x800 - 0x610) / 4 - 1];
> +	unsigned int chip_id;
> +};
> +check_member(rk3308_grf, gpio0a_p, 0xa0);
> +
> +struct rk3308_sgrf {
> +	unsigned int soc_con0;
> +	unsigned int soc_con1;
> +	unsigned int con_tzma_r0size;
> +	unsigned int con_secure0;
> +	unsigned int reserved0;
> +	unsigned int clk_timer_en;
> +	unsigned int clkgat_con;
> +	unsigned int fastboot_addr;
> +	unsigned int fastboot_en;
> +	unsigned int reserved1[(0x30 - 0x24) / 4];
> +	unsigned int srst_con;
> +};
> +check_member(rk3308_sgrf, fastboot_en, 0x20);
> +
> +#endif
> diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
> index f5a80b4f0c..fb199bc910 100644
> --- a/arch/arm/mach-rockchip/Kconfig
> +++ b/arch/arm/mach-rockchip/Kconfig
> @@ -105,6 +105,29 @@ config ROCKCHIP_RK3288
>   	  and video codec support. Peripherals include Gigabit Ethernet,
>   	  USB2 host and OTG, SDIO, I2S, UARTs, SPI, I2C and PWMs.
>   
> +config ROCKCHIP_RK3308
> +	bool "Support Rockchip RK3308"
> +	select ARM64
> +	select DEBUG_UART_BOARD_INIT
> +	select SUPPORT_SPL
> +	select SUPPORT_TPL
> +	select SPL
> +	select SPL_ATF
> +	select SPL_ATF_NO_PLATFORM_PARAM
> +	select SPL_LOAD_FIT
> +	imply ROCKCHIP_COMMON_BOARD
> +	imply SPL_ROCKCHIP_COMMON_BOARD
> +	imply SPL_CLK
> +	imply SPL_REGMAP
> +	imply SPL_SYSCON
> +	imply SPL_RAM
> +	imply SPL_SERIAL_SUPPORT
> +	imply TPL_SERIAL_SUPPORT
> +	imply SPL_SEPARATE_BSS
> +	help
> +	  The Rockchip RK3308 is a ARM-based Soc which embedded with quad
> +	  Cortex-A35 and highly integrated audio interfaces.
> +
>   config ROCKCHIP_RK3328
>   	bool "Support Rockchip RK3328"
>   	select ARM64
> @@ -320,6 +343,7 @@ source "arch/arm/mach-rockchip/rk3128/Kconfig"
>   source "arch/arm/mach-rockchip/rk3188/Kconfig"
>   source "arch/arm/mach-rockchip/rk322x/Kconfig"
>   source "arch/arm/mach-rockchip/rk3288/Kconfig"
> +source "arch/arm/mach-rockchip/rk3308/Kconfig"
>   source "arch/arm/mach-rockchip/rk3328/Kconfig"
>   source "arch/arm/mach-rockchip/rk3368/Kconfig"
>   source "arch/arm/mach-rockchip/rk3399/Kconfig"
> diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
> index 45d9b06233..974fbc138c 100644
> --- a/arch/arm/mach-rockchip/Makefile
> +++ b/arch/arm/mach-rockchip/Makefile
> @@ -32,6 +32,7 @@ obj-$(CONFIG_ROCKCHIP_RK3128) += rk3128/
>   obj-$(CONFIG_ROCKCHIP_RK3188) += rk3188/
>   obj-$(CONFIG_ROCKCHIP_RK322X) += rk322x/
>   obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288/
> +obj-$(CONFIG_ROCKCHIP_RK3308) += rk3308/
>   obj-$(CONFIG_ROCKCHIP_RK3328) += rk3328/
>   obj-$(CONFIG_ROCKCHIP_RK3368) += rk3368/
>   obj-$(CONFIG_ROCKCHIP_RK3399) += rk3399/
> diff --git a/arch/arm/mach-rockchip/rk3308/Kconfig b/arch/arm/mach-rockchip/rk3308/Kconfig
> new file mode 100644
> index 0000000000..9c09661595
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/rk3308/Kconfig
> @@ -0,0 +1,14 @@
> +if ROCKCHIP_RK3308
> +
> +config SYS_SOC
> +	default "rk3308"
> +
> +config SYS_MALLOC_F_LEN
> +	default 0x400
> +
> +config SPL_SERIAL_SUPPORT
> +	default y
> +
> +config ROCKCHIP_BOOT_MODE_REG
> +	default 0xff000500
> +endif
> diff --git a/arch/arm/mach-rockchip/rk3308/Makefile b/arch/arm/mach-rockchip/rk3308/Makefile
> new file mode 100644
> index 0000000000..ce4d44bb34
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/rk3308/Makefile
> @@ -0,0 +1,9 @@
> +#
> +# (C) Copyright 2018 Rockchip Electronics Co., Ltd.
> +#
> +# SPDX-License-Identifier:     GPL-2.0+
> +#
> +
> +obj-y += syscon_rk3308.o
> +obj-y += rk3308.o
> +obj-y += clk_rk3308.o
> diff --git a/arch/arm/mach-rockchip/rk3308/clk_rk3308.c b/arch/arm/mach-rockchip/rk3308/clk_rk3308.c
> new file mode 100644
> index 0000000000..51b43153e8
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/rk3308/clk_rk3308.c
> @@ -0,0 +1,31 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <syscon.h>
> +#include <asm/arch-rockchip/clock.h>
> +#include <asm/arch/cru_rk3308.h>
> +
> +int rockchip_get_clk(struct udevice **devp)
> +{
> +	return uclass_get_device_by_driver(UCLASS_CLK,
> +			DM_GET_DRIVER(rockchip_rk3308_cru), devp);
> +}
> +
> +void *rockchip_get_cru(void)
> +{
> +	struct rk3308_clk_priv *priv;
> +	struct udevice *dev;
> +	int ret;
> +
> +	ret = rockchip_get_clk(&dev);
> +	if (ret)
> +		return ERR_PTR(ret);
> +
> +	priv = dev_get_priv(dev);
> +
> +	return priv->cru;
> +}
> diff --git a/arch/arm/mach-rockchip/rk3308/rk3308.c b/arch/arm/mach-rockchip/rk3308/rk3308.c
> new file mode 100644
> index 0000000000..f27f9e8c0b
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/rk3308/rk3308.c
> @@ -0,0 +1,175 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + *Copyright (c) 2018 Rockchip Electronics Co., Ltd
> + */
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/arch/grf_rk3308.h>
> +#include <asm/arch-rockchip/hardware.h>
> +#include <asm/gpio.h>
> +#include <debug_uart.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#include <asm/armv8/mmu.h>
> +static struct mm_region rk3308_mem_map[] = {
> +	{
> +		.virt = 0x0UL,
> +		.phys = 0x0UL,
> +		.size = 0xff000000UL,
> +		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> +			 PTE_BLOCK_INNER_SHARE
> +	}, {
> +		.virt = 0xff000000UL,
> +		.phys = 0xff000000UL,
> +		.size = 0x01000000UL,
> +		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
> +			 PTE_BLOCK_NON_SHARE |
> +			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
> +	}, {
> +		/* List terminator */
> +		0,
> +	}
> +};
> +
> +struct mm_region *mem_map = rk3308_mem_map;
> +
> +#define GRF_BASE	0xff000000
> +#define SGRF_BASE	0xff2b0000
> +
> +enum {
> +	GPIO1C7_SHIFT		= 8,
> +	GPIO1C7_MASK		= GENMASK(11, 8),
> +	GPIO1C7_GPIO		= 0,
> +	GPIO1C7_UART1_RTSN,
> +	GPIO1C7_UART2_TX_M0,
> +	GPIO1C7_SPI2_MOSI,
> +	GPIO1C7_JTAG_TMS,
> +
> +	GPIO1C6_SHIFT		= 4,
> +	GPIO1C6_MASK		= GENMASK(7, 4),
> +	GPIO1C6_GPIO		= 0,
> +	GPIO1C6_UART1_CTSN,
> +	GPIO1C6_UART2_RX_M0,
> +	GPIO1C6_SPI2_MISO,
> +	GPIO1C6_JTAG_TCLK,
> +
> +	GPIO4D3_SHIFT           = 6,
> +	GPIO4D3_MASK            = GENMASK(7, 6),
> +	GPIO4D3_GPIO            = 0,
> +	GPIO4D3_SDMMC_D3,
> +	GPIO4D3_UART2_TX_M1,
> +
> +	GPIO4D2_SHIFT           = 4,
> +	GPIO4D2_MASK            = GENMASK(5, 4),
> +	GPIO4D2_GPIO            = 0,
> +	GPIO4D2_SDMMC_D2,
> +	GPIO4D2_UART2_RX_M1,
> +
> +	UART2_IO_SEL_SHIFT	= 2,
> +	UART2_IO_SEL_MASK	= GENMASK(3, 2),
> +	UART2_IO_SEL_M0		= 0,
> +	UART2_IO_SEL_M1,
> +	UART2_IO_SEL_USB,
> +
> +	GPIO3B3_SEL_SRC_CTRL_SHIFT	= 7,
> +	GPIO3B3_SEL_SRC_CTRL_MASK	= BIT(7),
> +	GPIO3B3_SEL_SRC_CTRL_IOMUX	= 0,
> +	GPIO3B3_SEL_SRC_CTRL_SEL_PLUS,
> +
> +	GPIO3B3_SEL_PLUS_SHIFT		= 4,
> +	GPIO3B3_SEL_PLUS_MASK		= GENMASK(6, 4),
> +	GPIO3B3_SEL_PLUS_GPIO3_B3	= 0,
> +	GPIO3B3_SEL_PLUS_FLASH_ALE,
> +	GPIO3B3_SEL_PLUS_EMMC_PWREN,
> +	GPIO3B3_SEL_PLUS_SPI1_CLK,
> +	GPIO3B3_SEL_PLUS_LCDC_D23_M1,
> +
> +	GPIO3B2_SEL_SRC_CTRL_SHIFT	= 3,
> +	GPIO3B2_SEL_SRC_CTRL_MASK	= BIT(3),
> +	GPIO3B2_SEL_SRC_CTRL_IOMUX	= 0,
> +	GPIO3B2_SEL_SRC_CTRL_SEL_PLUS,
> +
> +	GPIO3B2_SEL_PLUS_SHIFT		= 0,
> +	GPIO3B2_SEL_PLUS_MASK		= GENMASK(2, 0),
> +	GPIO3B2_SEL_PLUS_GPIO3_B2	= 0,
> +	GPIO3B2_SEL_PLUS_FLASH_RDN,
> +	GPIO3B2_SEL_PLUS_EMMC_RSTN,
> +	GPIO3B2_SEL_PLUS_SPI1_MISO,
> +	GPIO3B2_SEL_PLUS_LCDC_D22_M1,
> +};
> +
> +enum {
> +	IOVSEL3_CTRL_SHIFT	= 8,
> +	IOVSEL3_CTRL_MASK	= BIT(8),
> +	VCCIO3_SEL_BY_GPIO	= 0,
> +	VCCIO3_SEL_BY_IOVSEL3,
> +
> +	IOVSEL3_SHIFT		= 3,
> +	IOVSEL3_MASK		= BIT(3),
> +	VCCIO3_3V3		= 0,
> +	VCCIO3_1V8,
> +};
> +
> +/*
> + * The voltage of VCCIO3(which is the voltage domain of emmc/flash/sfc
> + * interface) can indicated by GPIO0_A4 or io_vsel3. The SOC defaults
> + * use GPIO0_A4 to indicate power supply voltage for VCCIO3 by hardware,
> + * then we can switch to io_vsel3 after system power on, and release GPIO0_A4
> + * for other usage.
> + */
> +
> +#define GPIO0_A4	4
> +
> +int rk_board_init(void)
> +{
> +	static struct rk3308_grf * const grf = (void *)GRF_BASE;
> +	u32 val;
> +	int ret;
> +
> +	ret = gpio_request(GPIO0_A4, "gpio0_a4");
> +	if (ret < 0) {
> +		printf("request for gpio0_a4 failed:%d\n", ret);
> +		return 0;
> +	}
> +
> +	gpio_direction_input(GPIO0_A4);
> +
> +	if (gpio_get_value(GPIO0_A4))
> +		val = VCCIO3_SEL_BY_IOVSEL3 << IOVSEL3_CTRL_SHIFT |
> +		      VCCIO3_1V8 << IOVSEL3_SHIFT;
> +	else
> +		val = VCCIO3_SEL_BY_IOVSEL3 << IOVSEL3_CTRL_SHIFT |
> +		      VCCIO3_3V3 << IOVSEL3_SHIFT;
> +	rk_clrsetreg(&grf->soc_con0, IOVSEL3_CTRL_MASK | IOVSEL3_MASK, val);
> +
> +	gpio_free(GPIO0_A4);
> +	return 0;
> +}
> +
> +#if defined(CONFIG_DEBUG_UART)
> +__weak void board_debug_uart_init(void)
> +{
> +	static struct rk3308_grf * const grf = (void *)GRF_BASE;
> +
> +	/* Enable early UART2 channel m1 on the rk3308 */
> +	rk_clrsetreg(&grf->soc_con5, UART2_IO_SEL_MASK,
> +		     UART2_IO_SEL_M1 << UART2_IO_SEL_SHIFT);
> +	rk_clrsetreg(&grf->gpio4d_iomux,
> +		     GPIO4D3_MASK | GPIO4D2_MASK,
> +		     GPIO4D2_UART2_RX_M1 << GPIO4D2_SHIFT |
> +		     GPIO4D3_UART2_TX_M1 << GPIO4D3_SHIFT);
> +}
> +#endif
> +
> +#if defined(CONFIG_SPL_BUILD)
> +int arch_cpu_init(void)
> +{
> +	static struct rk3308_sgrf * const sgrf = (void *)SGRF_BASE;
> +
> +	/* Set CRYPTO SDMMC EMMC NAND SFC USB master bus to be secure access */
> +	rk_clrreg(&sgrf->con_secure0, 0x2b83);
> +
> +	return 0;
> +}
> +#endif
> diff --git a/arch/arm/mach-rockchip/rk3308/syscon_rk3308.c b/arch/arm/mach-rockchip/rk3308/syscon_rk3308.c
> new file mode 100644
> index 0000000000..b380ff5723
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/rk3308/syscon_rk3308.c
> @@ -0,0 +1,20 @@
> +// SPDX-License-Identifier:     GPL-2.0+
> +/*
> + * (C) Copyright 2018 Rockchip Electronics Co., Ltd
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <syscon.h>
> +#include <asm/arch-rockchip/clock.h>
> +
> +static const struct udevice_id rk3308_syscon_ids[] = {
> +	{ .compatible = "rockchip,rk3308-grf", .data = ROCKCHIP_SYSCON_GRF },
> +	{ }
> +};
> +
> +U_BOOT_DRIVER(syscon_rk3308) = {
> +	.name = "rk3308_syscon",
> +	.id = UCLASS_SYSCON,
> +	.of_match = rk3308_syscon_ids,
> +};
> diff --git a/include/configs/rk3308_common.h b/include/configs/rk3308_common.h
> new file mode 100644
> index 0000000000..a67d3d7d1b
> --- /dev/null
> +++ b/include/configs/rk3308_common.h
> @@ -0,0 +1,58 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * (C) Copyright 2017 Rockchip Electronics Co., Ltd
> + */
> +
> +#ifndef __CONFIG_RK3308_COMMON_H
> +#define __CONFIG_RK3308_COMMON_H
> +
> +#include "rockchip-common.h"
> +
> +#define CONFIG_SYS_CBSIZE		1024
> +#define CONFIG_SKIP_LOWLEVEL_INIT
> +#define CONFIG_SYS_MAX_NAND_DEVICE	1
> +#define CONFIG_SYS_NAND_ONFI_DETECTION
> +#define CONFIG_SYS_NAND_PAGE_SIZE	2048
> +#define CONFIG_SYS_NAND_PAGE_COUNT	64
> +#define CONFIG_SYS_NAND_SIZE		(256 * 1024 * 1024)
> +#define CONFIG_SPL_MAX_SIZE		0x20000
> +#define CONFIG_SPL_BSS_START_ADDR	0x00400000
> +#define CONFIG_SPL_BSS_MAX_SIZE		0x2000
> +#define CONFIG_SYS_SPI_U_BOOT_OFFS	0x8000
> +
> +#define CONFIG_SYS_NS16550_MEM32
> +
> +#define CONFIG_ROCKCHIP_STIMER_BASE	0xff1b00a0
> +#define CONFIG_IRAM_BASE		0xfff80000
> +#define CONFIG_SYS_INIT_SP_ADDR		0x00800000
> +#define CONFIG_SYS_LOAD_ADDR		0x00C00800
> +#define CONFIG_SPL_STACK		0x00400000
> +#define CONFIG_SYS_BOOTM_LEN		(64 << 20)	/* 64M */
> +
> +#define COUNTER_FREQUENCY		24000000
> +
> +#define CONFIG_SYS_BOOTM_LEN	(64 << 20)	/* 64M */
> +
> +#define CONFIG_SYS_SDRAM_BASE		0
> +#define SDRAM_MAX_SIZE			0xff000000
> +#define SDRAM_BANK_SIZE			(2UL << 30)
> +
> +#ifndef CONFIG_SPL_BUILD
> +
> +#define ENV_MEM_LAYOUT_SETTINGS \
> +	"scriptaddr=0x00500000\0" \
> +	"pxefile_addr_r=0x00600000\0" \
> +	"fdt_addr_r=0x01f00000\0" \
> +	"kernel_addr_r=0x00680000\0" \
> +	"ramdisk_addr_r=0x04000000\0"
> +
> +#include <config_distro_bootcmd.h>
> +#define CONFIG_EXTRA_ENV_SETTINGS \
> +	ENV_MEM_LAYOUT_SETTINGS \
> +	"partitions=" PARTS_DEFAULT \
> +	ROCKCHIP_DEVICE_SETTINGS \
> +	BOOTENV
> +
> +#endif
> +
> +#endif

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

* [U-Boot] [PATCH v2 2/9] rockchip: clk: Add clk driver for rk3308
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 2/9] rockchip: clk: Add clk driver for rk3308 Andy Yan
@ 2019-11-07  9:31   ` Kever Yang
  0 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-07  9:31 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:11, Andy Yan wrote:
> From: Finley Xiao <finley.xiao@rock-chips.com>
>
> Add clk controller driver for RK3308 SOC.
>
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

Reviewed-by: Kever Yang<kever.yang@rock-chips.com>


Thanks,
- Kever
> ---
>
> Changes in v2: None
>
>   drivers/clk/rockchip/Makefile          |    1 +
>   drivers/clk/rockchip/clk_rk3308.c      | 1078 ++++++++++++++++++++++++
>   include/dt-bindings/clock/rk3308-cru.h |  387 +++++++++
>   3 files changed, 1466 insertions(+)
>   create mode 100644 drivers/clk/rockchip/clk_rk3308.c
>   create mode 100644 include/dt-bindings/clock/rk3308-cru.h
>
> diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile
> index 03a9fa77ba..f2068a8e94 100644
> --- a/drivers/clk/rockchip/Makefile
> +++ b/drivers/clk/rockchip/Makefile
> @@ -9,6 +9,7 @@ obj-$(CONFIG_ROCKCHIP_RK3128) += clk_rk3128.o
>   obj-$(CONFIG_ROCKCHIP_RK3188) += clk_rk3188.o
>   obj-$(CONFIG_ROCKCHIP_RK322X) += clk_rk322x.o
>   obj-$(CONFIG_ROCKCHIP_RK3288) += clk_rk3288.o
> +obj-$(CONFIG_ROCKCHIP_RK3308) += clk_rk3308.o
>   obj-$(CONFIG_ROCKCHIP_RK3328) += clk_rk3328.o
>   obj-$(CONFIG_ROCKCHIP_RK3368) += clk_rk3368.o
>   obj-$(CONFIG_ROCKCHIP_RK3399) += clk_rk3399.o
> diff --git a/drivers/clk/rockchip/clk_rk3308.c b/drivers/clk/rockchip/clk_rk3308.c
> new file mode 100644
> index 0000000000..e4e213d463
> --- /dev/null
> +++ b/drivers/clk/rockchip/clk_rk3308.c
> @@ -0,0 +1,1078 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * (C) Copyright 2017 Rockchip Electronics Co., Ltd
> + */
> +#include <common.h>
> +#include <bitfield.h>
> +#include <clk-uclass.h>
> +#include <dm.h>
> +#include <div64.h>
> +#include <errno.h>
> +#include <syscon.h>
> +#include <asm/io.h>
> +#include <asm/arch/cru_rk3308.h>
> +#include <asm/arch-rockchip/clock.h>
> +#include <asm/arch-rockchip/hardware.h>
> +#include <dm/lists.h>
> +#include <dt-bindings/clock/rk3308-cru.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +enum {
> +	VCO_MAX_HZ	= 3200U * 1000000,
> +	VCO_MIN_HZ	= 800 * 1000000,
> +	OUTPUT_MAX_HZ	= 3200U * 1000000,
> +	OUTPUT_MIN_HZ	= 24 * 1000000,
> +};
> +
> +#define DIV_TO_RATE(input_rate, div)    ((input_rate) / ((div) + 1))
> +
> +#define RK3308_CPUCLK_RATE(_rate, _aclk_div, _pclk_div)         \
> +{                                                               \
> +	.rate   = _rate##U,                                     \
> +	.aclk_div = _aclk_div,                                  \
> +	.pclk_div = _pclk_div,                                  \
> +}
> +
> +static struct rockchip_pll_rate_table rk3308_pll_rates[] = {
> +	/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
> +	RK3036_PLL_RATE(1300000000, 6, 325, 1, 1, 1, 0),
> +	RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0),
> +	RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
> +	RK3036_PLL_RATE(748000000, 2, 187, 3, 1, 1, 0),
> +};
> +
> +static struct rockchip_cpu_rate_table rk3308_cpu_rates[] = {
> +	RK3308_CPUCLK_RATE(1200000000, 1, 5),
> +	RK3308_CPUCLK_RATE(1008000000, 1, 5),
> +	RK3308_CPUCLK_RATE(816000000, 1, 3),
> +	RK3308_CPUCLK_RATE(600000000, 1, 3),
> +	RK3308_CPUCLK_RATE(408000000, 1, 1),
> +};
> +
> +static struct rockchip_pll_clock rk3308_pll_clks[] = {
> +	[APLL] = PLL(pll_rk3328, PLL_APLL, RK3308_PLL_CON(0),
> +		     RK3308_MODE_CON, 0, 10, 0, rk3308_pll_rates),
> +	[DPLL] = PLL(pll_rk3328, PLL_DPLL, RK3308_PLL_CON(8),
> +		     RK3308_MODE_CON, 2, 10, 0, NULL),
> +	[VPLL0] = PLL(pll_rk3328, PLL_VPLL0, RK3308_PLL_CON(16),
> +		      RK3308_MODE_CON, 4, 10, 0, NULL),
> +	[VPLL1] = PLL(pll_rk3328, PLL_VPLL1, RK3308_PLL_CON(24),
> +		      RK3308_MODE_CON, 6, 10, 0, NULL),
> +};
> +
> +static ulong rk3308_armclk_set_clk(struct rk3308_clk_priv *priv, ulong hz)
> +{
> +	struct rk3308_cru *cru = priv->cru;
> +	const struct rockchip_cpu_rate_table *rate;
> +	ulong old_rate;
> +
> +	rate = rockchip_get_cpu_settings(rk3308_cpu_rates, hz);
> +	if (!rate) {
> +		printf("%s unsupport rate\n", __func__);
> +		return -EINVAL;
> +	}
> +
> +	/*
> +	 * select apll as cpu/core clock pll source and
> +	 * set up dependent divisors for PERI and ACLK clocks.
> +	 * core hz : apll = 1:1
> +	 */
> +	old_rate = rockchip_pll_get_rate(&rk3308_pll_clks[APLL],
> +					 priv->cru, APLL);
> +	if (old_rate > hz) {
> +		if (rockchip_pll_set_rate(&rk3308_pll_clks[APLL],
> +					  priv->cru, APLL, hz))
> +			return -EINVAL;
> +		rk_clrsetreg(&cru->clksel_con[0],
> +			     CORE_CLK_PLL_SEL_MASK | CORE_DIV_CON_MASK |
> +			     CORE_ACLK_DIV_MASK | CORE_DBG_DIV_MASK,
> +			     rate->aclk_div << CORE_ACLK_DIV_SHIFT |
> +			     rate->pclk_div << CORE_DBG_DIV_SHIFT |
> +			     CORE_CLK_PLL_SEL_APLL << CORE_CLK_PLL_SEL_SHIFT |
> +			     0 << CORE_DIV_CON_SHIFT);
> +	} else if (old_rate < hz) {
> +		rk_clrsetreg(&cru->clksel_con[0],
> +			     CORE_CLK_PLL_SEL_MASK | CORE_DIV_CON_MASK |
> +			     CORE_ACLK_DIV_MASK | CORE_DBG_DIV_MASK,
> +			     rate->aclk_div << CORE_ACLK_DIV_SHIFT |
> +			     rate->pclk_div << CORE_DBG_DIV_SHIFT |
> +			     CORE_CLK_PLL_SEL_APLL << CORE_CLK_PLL_SEL_SHIFT |
> +			     0 << CORE_DIV_CON_SHIFT);
> +		if (rockchip_pll_set_rate(&rk3308_pll_clks[APLL],
> +					  priv->cru, APLL, hz))
> +			return -EINVAL;
> +	}
> +
> +	return rockchip_pll_get_rate(&rk3308_pll_clks[APLL], priv->cru, APLL);
> +}
> +
> +static void rk3308_clk_get_pll_rate(struct rk3308_clk_priv *priv)
> +{
> +	if (!priv->dpll_hz)
> +		priv->dpll_hz = rockchip_pll_get_rate(&rk3308_pll_clks[DPLL],
> +						      priv->cru, DPLL);
> +	if (!priv->vpll0_hz)
> +		priv->vpll0_hz = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL0],
> +						       priv->cru, VPLL0);
> +	if (!priv->vpll1_hz)
> +		priv->vpll1_hz = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL1],
> +						       priv->cru, VPLL1);
> +}
> +
> +static ulong rk3308_i2c_get_clk(struct clk *clk)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con, con_id;
> +
> +	switch (clk->id) {
> +	case SCLK_I2C0:
> +		con_id = 25;
> +		break;
> +	case SCLK_I2C1:
> +		con_id = 26;
> +		break;
> +	case SCLK_I2C2:
> +		con_id = 27;
> +		break;
> +	case SCLK_I2C3:
> +		con_id = 28;
> +		break;
> +	default:
> +		printf("do not support this i2c bus\n");
> +		return -EINVAL;
> +	}
> +
> +	con = readl(&cru->clksel_con[con_id]);
> +	div = con >> CLK_I2C_DIV_CON_SHIFT & CLK_I2C_DIV_CON_MASK;
> +
> +	return DIV_TO_RATE(priv->dpll_hz, div);
> +}
> +
> +static ulong rk3308_i2c_set_clk(struct clk *clk, uint hz)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 src_clk_div, con_id;
> +
> +	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
> +	assert(src_clk_div - 1 <= 127);
> +
> +	switch (clk->id) {
> +	case SCLK_I2C0:
> +		con_id = 25;
> +		break;
> +	case SCLK_I2C1:
> +		con_id = 26;
> +		break;
> +	case SCLK_I2C2:
> +		con_id = 27;
> +		break;
> +	case SCLK_I2C3:
> +		con_id = 28;
> +		break;
> +	default:
> +		printf("do not support this i2c bus\n");
> +		return -EINVAL;
> +	}
> +	rk_clrsetreg(&cru->clksel_con[con_id],
> +		     CLK_I2C_PLL_SEL_MASK | CLK_I2C_DIV_CON_MASK,
> +		     CLK_I2C_PLL_SEL_DPLL << CLK_I2C_PLL_SEL_SHIFT |
> +		     (src_clk_div - 1) << CLK_I2C_DIV_CON_SHIFT);
> +
> +	return rk3308_i2c_get_clk(clk);
> +}
> +
> +static ulong rk3308_mac_set_clk(struct clk *clk, uint hz)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 con = readl(&cru->clksel_con[43]);
> +	ulong pll_rate;
> +	u8 div;
> +
> +	if ((con >> MAC_PLL_SHIFT) & MAC_SEL_VPLL0)
> +		pll_rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL0],
> +						 priv->cru, VPLL0);
> +	else if ((con >> MAC_PLL_SHIFT) & MAC_SEL_VPLL1)
> +		pll_rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL1],
> +						 priv->cru, VPLL1);
> +	else
> +		pll_rate = rockchip_pll_get_rate(&rk3308_pll_clks[DPLL],
> +						 priv->cru, DPLL);
> +
> +	/*default set 50MHZ for gmac*/
> +	if (!hz)
> +		hz = 50000000;
> +
> +	div = DIV_ROUND_UP(pll_rate, hz) - 1;
> +	assert(div < 32);
> +	rk_clrsetreg(&cru->clksel_con[43], MAC_DIV_MASK,
> +		     div << MAC_DIV_SHIFT);
> +
> +	return DIV_TO_RATE(pll_rate, div);
> +}
> +
> +static int rk3308_mac_set_speed_clk(struct clk *clk, uint hz)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +
> +	if (hz != 2500000 && hz != 25000000) {
> +		debug("Unsupported mac speed:%d\n", hz);
> +		return -EINVAL;
> +	}
> +
> +	rk_clrsetreg(&cru->clksel_con[43], MAC_CLK_SPEED_SEL_MASK,
> +		     ((hz == 2500000) ? 0 : 1) << MAC_CLK_SPEED_SEL_SHIFT);
> +
> +	return 0;
> +}
> +
> +static ulong rk3308_mmc_get_clk(struct clk *clk)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con, con_id;
> +
> +	switch (clk->id) {
> +	case HCLK_SDMMC:
> +	case SCLK_SDMMC:
> +		con_id = 39;
> +		break;
> +	case HCLK_EMMC:
> +	case SCLK_EMMC:
> +	case SCLK_EMMC_SAMPLE:
> +		con_id = 41;
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	con = readl(&cru->clksel_con[con_id]);
> +	div = (con & EMMC_DIV_MASK) >> EMMC_DIV_SHIFT;
> +
> +	if ((con & EMMC_PLL_MASK) >> EMMC_PLL_SHIFT
> +	    == EMMC_SEL_24M)
> +		return DIV_TO_RATE(OSC_HZ, div) / 2;
> +	else
> +		return DIV_TO_RATE(priv->vpll0_hz, div) / 2;
> +}
> +
> +static ulong rk3308_mmc_set_clk(struct clk *clk, ulong set_rate)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	int src_clk_div;
> +	u32 con_id;
> +
> +	switch (clk->id) {
> +	case HCLK_SDMMC:
> +	case SCLK_SDMMC:
> +		con_id = 39;
> +		break;
> +	case HCLK_EMMC:
> +	case SCLK_EMMC:
> +		con_id = 41;
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +	/* Select clk_sdmmc/emmc source from VPLL0 by default */
> +	/* mmc clock defaulg div 2 internal, need provide double in cru */
> +	src_clk_div = DIV_ROUND_UP(priv->vpll0_hz / 2, set_rate);
> +
> +	if (src_clk_div > 127) {
> +		/* use 24MHz source for 400KHz clock */
> +		src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, set_rate);
> +		rk_clrsetreg(&cru->clksel_con[con_id],
> +			     EMMC_PLL_MASK | EMMC_DIV_MASK | EMMC_CLK_SEL_MASK,
> +			     EMMC_CLK_SEL_EMMC << EMMC_CLK_SEL_SHIFT |
> +			     EMMC_SEL_24M << EMMC_PLL_SHIFT |
> +			     (src_clk_div - 1) << EMMC_DIV_SHIFT);
> +	} else {
> +		rk_clrsetreg(&cru->clksel_con[con_id],
> +			     EMMC_PLL_MASK | EMMC_DIV_MASK | EMMC_CLK_SEL_MASK,
> +			     EMMC_CLK_SEL_EMMC << EMMC_CLK_SEL_SHIFT |
> +			     EMMC_SEL_VPLL0 << EMMC_PLL_SHIFT |
> +			     (src_clk_div - 1) << EMMC_DIV_SHIFT);
> +	}
> +
> +	return rk3308_mmc_get_clk(clk);
> +}
> +
> +static ulong rk3308_saradc_get_clk(struct clk *clk)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con;
> +
> +	con = readl(&cru->clksel_con[34]);
> +	div = con >> CLK_SARADC_DIV_CON_SHIFT & CLK_SARADC_DIV_CON_MASK;
> +
> +	return DIV_TO_RATE(OSC_HZ, div);
> +}
> +
> +static ulong rk3308_saradc_set_clk(struct clk *clk, uint hz)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(OSC_HZ, hz);
> +	assert(src_clk_div - 1 <= 2047);
> +
> +	rk_clrsetreg(&cru->clksel_con[34],
> +		     CLK_SARADC_DIV_CON_MASK,
> +		     (src_clk_div - 1) << CLK_SARADC_DIV_CON_SHIFT);
> +
> +	return rk3308_saradc_get_clk(clk);
> +}
> +
> +static ulong rk3308_tsadc_get_clk(struct clk *clk)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con;
> +
> +	con = readl(&cru->clksel_con[33]);
> +	div = con >> CLK_SARADC_DIV_CON_SHIFT & CLK_SARADC_DIV_CON_MASK;
> +
> +	return DIV_TO_RATE(OSC_HZ, div);
> +}
> +
> +static ulong rk3308_tsadc_set_clk(struct clk *clk, uint hz)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(OSC_HZ, hz);
> +	assert(src_clk_div - 1 <= 2047);
> +
> +	rk_clrsetreg(&cru->clksel_con[33],
> +		     CLK_SARADC_DIV_CON_MASK,
> +		     (src_clk_div - 1) << CLK_SARADC_DIV_CON_SHIFT);
> +
> +	return rk3308_tsadc_get_clk(clk);
> +}
> +
> +static ulong rk3308_spi_get_clk(struct clk *clk)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con, con_id;
> +
> +	switch (clk->id) {
> +	case SCLK_SPI0:
> +		con_id = 30;
> +		break;
> +	case SCLK_SPI1:
> +		con_id = 31;
> +		break;
> +	case SCLK_SPI2:
> +		con_id = 32;
> +		break;
> +	default:
> +		printf("do not support this spi bus\n");
> +		return -EINVAL;
> +	}
> +
> +	con = readl(&cru->clksel_con[con_id]);
> +	div = con >> CLK_SPI_DIV_CON_SHIFT & CLK_SPI_DIV_CON_MASK;
> +
> +	return DIV_TO_RATE(priv->dpll_hz, div);
> +}
> +
> +static ulong rk3308_spi_set_clk(struct clk *clk, uint hz)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 src_clk_div, con_id;
> +
> +	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
> +	assert(src_clk_div - 1 <= 127);
> +
> +	switch (clk->id) {
> +	case SCLK_SPI0:
> +		con_id = 30;
> +		break;
> +	case SCLK_SPI1:
> +		con_id = 31;
> +		break;
> +	case SCLK_SPI2:
> +		con_id = 32;
> +		break;
> +	default:
> +		printf("do not support this spi bus\n");
> +		return -EINVAL;
> +	}
> +
> +	rk_clrsetreg(&cru->clksel_con[con_id],
> +		     CLK_SPI_PLL_SEL_MASK | CLK_SPI_DIV_CON_MASK,
> +		     CLK_SPI_PLL_SEL_DPLL << CLK_SPI_PLL_SEL_SHIFT |
> +		     (src_clk_div - 1) << CLK_SPI_DIV_CON_SHIFT);
> +
> +	return rk3308_spi_get_clk(clk);
> +}
> +
> +static ulong rk3308_pwm_get_clk(struct clk *clk)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con;
> +
> +	con = readl(&cru->clksel_con[29]);
> +	div = con >> CLK_PWM_DIV_CON_SHIFT & CLK_PWM_DIV_CON_MASK;
> +
> +	return DIV_TO_RATE(priv->dpll_hz, div);
> +}
> +
> +static ulong rk3308_pwm_set_clk(struct clk *clk, uint hz)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
> +	assert(src_clk_div - 1 <= 127);
> +
> +	rk_clrsetreg(&cru->clksel_con[29],
> +		     CLK_PWM_PLL_SEL_MASK | CLK_PWM_DIV_CON_MASK,
> +		     CLK_PWM_PLL_SEL_DPLL << CLK_PWM_PLL_SEL_SHIFT |
> +		     (src_clk_div - 1) << CLK_PWM_DIV_CON_SHIFT);
> +
> +	return rk3308_pwm_get_clk(clk);
> +}
> +
> +static ulong rk3308_vop_get_clk(struct clk *clk)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, pll_sel, vol_sel, con, parent;
> +
> +	con = readl(&cru->clksel_con[8]);
> +	vol_sel = (con & DCLK_VOP_SEL_MASK) >> DCLK_VOP_SEL_SHIFT;
> +	pll_sel = (con & DCLK_VOP_PLL_SEL_MASK) >> DCLK_VOP_PLL_SEL_SHIFT;
> +	div = con & DCLK_VOP_DIV_MASK;
> +
> +	if (vol_sel == DCLK_VOP_SEL_24M) {
> +		parent = OSC_HZ;
> +	} else if (vol_sel == DCLK_VOP_SEL_DIVOUT) {
> +		switch (pll_sel) {
> +		case DCLK_VOP_PLL_SEL_DPLL:
> +			parent = priv->dpll_hz;
> +			break;
> +		case DCLK_VOP_PLL_SEL_VPLL0:
> +			parent = priv->vpll0_hz;
> +			break;
> +		case DCLK_VOP_PLL_SEL_VPLL1:
> +			parent = priv->vpll0_hz;
> +			break;
> +		default:
> +			printf("do not support this vop pll sel\n");
> +			return -EINVAL;
> +		}
> +	} else {
> +		printf("do not support this vop sel\n");
> +		return -EINVAL;
> +	}
> +
> +	return DIV_TO_RATE(parent, div);
> +}
> +
> +static ulong rk3308_vop_set_clk(struct clk *clk, ulong hz)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct rk3308_cru *cru = priv->cru;
> +	ulong pll_rate, now, best_rate = 0;
> +	u32 i, div, best_div = 0, best_sel = 0;
> +
> +	for (i = 0; i <= DCLK_VOP_PLL_SEL_VPLL1; i++) {
> +		switch (i) {
> +		case DCLK_VOP_PLL_SEL_DPLL:
> +			pll_rate = priv->dpll_hz;
> +			break;
> +		case DCLK_VOP_PLL_SEL_VPLL0:
> +			pll_rate = priv->vpll0_hz;
> +			break;
> +		case DCLK_VOP_PLL_SEL_VPLL1:
> +			pll_rate = priv->vpll1_hz;
> +			break;
> +		default:
> +			printf("do not support this vop pll sel\n");
> +			return -EINVAL;
> +		}
> +
> +		div = DIV_ROUND_UP(pll_rate, hz);
> +		if (div > 255)
> +			continue;
> +		now = pll_rate / div;
> +		if (abs(hz - now) < abs(hz - best_rate)) {
> +			best_rate = now;
> +			best_div = div;
> +			best_sel = i;
> +		}
> +		debug("pll_rate=%lu, best_rate=%lu, best_div=%u, best_sel=%u\n",
> +		      pll_rate, best_rate, best_div, best_sel);
> +	}
> +
> +	if (best_rate != hz && hz == OSC_HZ) {
> +		rk_clrsetreg(&cru->clksel_con[8],
> +			     DCLK_VOP_SEL_MASK,
> +			     DCLK_VOP_SEL_24M << DCLK_VOP_SEL_SHIFT);
> +	} else if (best_rate) {
> +		rk_clrsetreg(&cru->clksel_con[8],
> +			     DCLK_VOP_SEL_MASK | DCLK_VOP_PLL_SEL_MASK |
> +			     DCLK_VOP_DIV_MASK,
> +			     DCLK_VOP_SEL_DIVOUT << DCLK_VOP_SEL_SHIFT |
> +			     best_sel << DCLK_VOP_PLL_SEL_SHIFT |
> +			     (best_div - 1) << DCLK_VOP_DIV_SHIFT);
> +	} else {
> +		printf("do not support this vop freq\n");
> +		return -EINVAL;
> +	}
> +
> +	return rk3308_vop_get_clk(clk);
> +}
> +
> +static ulong rk3308_bus_get_clk(struct rk3308_clk_priv *priv, ulong clk_id)
> +{
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con, parent = priv->dpll_hz;
> +
> +	switch (clk_id) {
> +	case ACLK_BUS:
> +		con = readl(&cru->clksel_con[5]);
> +		div = (con & BUS_ACLK_DIV_MASK) >> BUS_ACLK_DIV_SHIFT;
> +		break;
> +	case HCLK_BUS:
> +		con = readl(&cru->clksel_con[6]);
> +		div = (con & BUS_HCLK_DIV_MASK) >> BUS_HCLK_DIV_SHIFT;
> +		break;
> +	case PCLK_BUS:
> +	case PCLK_WDT:
> +		con = readl(&cru->clksel_con[6]);
> +		div = (con & BUS_PCLK_DIV_MASK) >> BUS_PCLK_DIV_SHIFT;
> +		break;
> +	default:
> +		return -ENOENT;
> +	}
> +
> +	return DIV_TO_RATE(parent, div);
> +}
> +
> +static ulong rk3308_bus_set_clk(struct rk3308_clk_priv *priv, ulong clk_id,
> +				ulong hz)
> +{
> +	struct rk3308_cru *cru = priv->cru;
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
> +	assert(src_clk_div - 1 <= 31);
> +
> +	/*
> +	 * select dpll as pd_bus bus clock source and
> +	 * set up dependent divisors for PCLK/HCLK and ACLK clocks.
> +	 */
> +	switch (clk_id) {
> +	case ACLK_BUS:
> +		rk_clrsetreg(&cru->clksel_con[5],
> +			     BUS_PLL_SEL_MASK | BUS_ACLK_DIV_MASK,
> +			     BUS_PLL_SEL_DPLL << BUS_PLL_SEL_SHIFT |
> +			     (src_clk_div - 1) << BUS_ACLK_DIV_SHIFT);
> +		break;
> +	case HCLK_BUS:
> +		rk_clrsetreg(&cru->clksel_con[6],
> +			     BUS_HCLK_DIV_MASK,
> +			     (src_clk_div - 1) << BUS_HCLK_DIV_SHIFT);
> +		break;
> +	case PCLK_BUS:
> +		rk_clrsetreg(&cru->clksel_con[6],
> +			     BUS_PCLK_DIV_MASK,
> +			     (src_clk_div - 1) << BUS_PCLK_DIV_SHIFT);
> +		break;
> +	default:
> +		printf("do not support this bus freq\n");
> +		return -EINVAL;
> +	}
> +
> +	return rk3308_bus_get_clk(priv, clk_id);
> +}
> +
> +static ulong rk3308_peri_get_clk(struct rk3308_clk_priv *priv, ulong clk_id)
> +{
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con, parent = priv->dpll_hz;
> +
> +	switch (clk_id) {
> +	case ACLK_PERI:
> +		con = readl(&cru->clksel_con[36]);
> +		div = (con & PERI_ACLK_DIV_MASK) >> PERI_ACLK_DIV_SHIFT;
> +		break;
> +	case HCLK_PERI:
> +		con = readl(&cru->clksel_con[37]);
> +		div = (con & PERI_HCLK_DIV_MASK) >> PERI_HCLK_DIV_SHIFT;
> +		break;
> +	case PCLK_PERI:
> +		con = readl(&cru->clksel_con[37]);
> +		div = (con & PERI_PCLK_DIV_MASK) >> PERI_PCLK_DIV_SHIFT;
> +		break;
> +	default:
> +		return -ENOENT;
> +	}
> +
> +	return DIV_TO_RATE(parent, div);
> +}
> +
> +static ulong rk3308_peri_set_clk(struct rk3308_clk_priv *priv, ulong clk_id,
> +				 ulong hz)
> +{
> +	struct rk3308_cru *cru = priv->cru;
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(priv->dpll_hz, hz);
> +	assert(src_clk_div - 1 <= 31);
> +
> +	/*
> +	 * select dpll as pd_peri bus clock source and
> +	 * set up dependent divisors for PCLK/HCLK and ACLK clocks.
> +	 */
> +	switch (clk_id) {
> +	case ACLK_PERI:
> +		rk_clrsetreg(&cru->clksel_con[36],
> +			     PERI_PLL_SEL_MASK | PERI_ACLK_DIV_MASK,
> +			     PERI_PLL_DPLL << PERI_PLL_SEL_SHIFT |
> +			     (src_clk_div - 1) << PERI_ACLK_DIV_SHIFT);
> +		break;
> +	case HCLK_PERI:
> +		rk_clrsetreg(&cru->clksel_con[37],
> +			     PERI_HCLK_DIV_MASK,
> +			     (src_clk_div - 1) << PERI_HCLK_DIV_SHIFT);
> +		break;
> +	case PCLK_PERI:
> +		rk_clrsetreg(&cru->clksel_con[37],
> +			     PERI_PCLK_DIV_MASK,
> +			     (src_clk_div - 1) << PERI_PCLK_DIV_SHIFT);
> +		break;
> +	default:
> +		printf("do not support this peri freq\n");
> +		return -EINVAL;
> +	}
> +
> +	return rk3308_peri_get_clk(priv, clk_id);
> +}
> +
> +static ulong rk3308_audio_get_clk(struct rk3308_clk_priv *priv, ulong clk_id)
> +{
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con, parent = priv->vpll0_hz;
> +
> +	switch (clk_id) {
> +	case HCLK_AUDIO:
> +		con = readl(&cru->clksel_con[45]);
> +		div = (con & AUDIO_HCLK_DIV_MASK) >> AUDIO_HCLK_DIV_SHIFT;
> +		break;
> +	case PCLK_AUDIO:
> +		con = readl(&cru->clksel_con[45]);
> +		div = (con & AUDIO_PCLK_DIV_MASK) >> AUDIO_PCLK_DIV_SHIFT;
> +		break;
> +	default:
> +		return -ENOENT;
> +	}
> +
> +	return DIV_TO_RATE(parent, div);
> +}
> +
> +static ulong rk3308_audio_set_clk(struct rk3308_clk_priv *priv, ulong clk_id,
> +				  ulong hz)
> +{
> +	struct rk3308_cru *cru = priv->cru;
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(priv->vpll0_hz, hz);
> +	assert(src_clk_div - 1 <= 31);
> +
> +	/*
> +	 * select vpll0 as audio bus clock source and
> +	 * set up dependent divisors for HCLK and PCLK clocks.
> +	 */
> +	switch (clk_id) {
> +	case HCLK_AUDIO:
> +		rk_clrsetreg(&cru->clksel_con[45],
> +			     AUDIO_PLL_SEL_MASK | AUDIO_HCLK_DIV_MASK,
> +			     AUDIO_PLL_VPLL0 << AUDIO_PLL_SEL_SHIFT |
> +			     (src_clk_div - 1) << AUDIO_HCLK_DIV_SHIFT);
> +		break;
> +	case PCLK_AUDIO:
> +		rk_clrsetreg(&cru->clksel_con[45],
> +			     AUDIO_PLL_SEL_MASK | AUDIO_PCLK_DIV_MASK,
> +			     AUDIO_PLL_VPLL0 << AUDIO_PLL_SEL_SHIFT |
> +			     (src_clk_div - 1) << AUDIO_PCLK_DIV_SHIFT);
> +		break;
> +	default:
> +		printf("do not support this audio freq\n");
> +		return -EINVAL;
> +	}
> +
> +	return rk3308_peri_get_clk(priv, clk_id);
> +}
> +
> +static ulong rk3308_crypto_get_clk(struct rk3308_clk_priv *priv, ulong clk_id)
> +{
> +	struct rk3308_cru *cru = priv->cru;
> +	u32 div, con, parent;
> +
> +	switch (clk_id) {
> +	case SCLK_CRYPTO:
> +		con = readl(&cru->clksel_con[7]);
> +		div = (con & CRYPTO_DIV_MASK) >> CRYPTO_DIV_SHIFT;
> +		parent = priv->vpll0_hz;
> +		break;
> +	case SCLK_CRYPTO_APK:
> +		con = readl(&cru->clksel_con[7]);
> +		div = (con & CRYPTO_APK_DIV_MASK) >> CRYPTO_APK_DIV_SHIFT;
> +		parent = priv->vpll0_hz;
> +		break;
> +	default:
> +		return -ENOENT;
> +	}
> +
> +	return DIV_TO_RATE(parent, div);
> +}
> +
> +static ulong rk3308_crypto_set_clk(struct rk3308_clk_priv *priv, ulong clk_id,
> +				   ulong hz)
> +{
> +	struct rk3308_cru *cru = priv->cru;
> +	int src_clk_div;
> +
> +	src_clk_div = DIV_ROUND_UP(priv->vpll0_hz, hz);
> +	assert(src_clk_div - 1 <= 31);
> +
> +	/*
> +	 * select gpll as crypto clock source and
> +	 * set up dependent divisors for crypto clocks.
> +	 */
> +	switch (clk_id) {
> +	case SCLK_CRYPTO:
> +		rk_clrsetreg(&cru->clksel_con[7],
> +			     CRYPTO_PLL_SEL_MASK | CRYPTO_DIV_MASK,
> +			     CRYPTO_PLL_SEL_VPLL0 << CRYPTO_PLL_SEL_SHIFT |
> +			     (src_clk_div - 1) << CRYPTO_DIV_SHIFT);
> +		break;
> +	case SCLK_CRYPTO_APK:
> +		rk_clrsetreg(&cru->clksel_con[7],
> +			     CRYPTO_APK_PLL_SEL_MASK | CRYPTO_APK_DIV_MASK,
> +			     CRYPTO_PLL_SEL_VPLL0 << CRYPTO_APK_SEL_SHIFT |
> +			     (src_clk_div - 1) << CRYPTO_APK_DIV_SHIFT);
> +		break;
> +	default:
> +		printf("do not support this peri freq\n");
> +		return -EINVAL;
> +	}
> +
> +	return rk3308_crypto_get_clk(priv, clk_id);
> +}
> +
> +static ulong rk3308_clk_get_rate(struct clk *clk)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	ulong rate = 0;
> +
> +	debug("%s id:%ld\n", __func__, clk->id);
> +
> +	switch (clk->id) {
> +	case PLL_APLL:
> +	case ARMCLK:
> +		rate = rockchip_pll_get_rate(&rk3308_pll_clks[APLL],
> +					     priv->cru, APLL);
> +		break;
> +	case PLL_DPLL:
> +		rate = rockchip_pll_get_rate(&rk3308_pll_clks[DPLL],
> +					     priv->cru, DPLL);
> +		break;
> +	case PLL_VPLL0:
> +		rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL0],
> +					     priv->cru, VPLL0);
> +		break;
> +	case PLL_VPLL1:
> +		rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL1],
> +					     priv->cru, VPLL1);
> +		break;
> +	case HCLK_SDMMC:
> +	case HCLK_EMMC:
> +	case SCLK_SDMMC:
> +	case SCLK_EMMC:
> +	case SCLK_EMMC_SAMPLE:
> +		rate = rk3308_mmc_get_clk(clk);
> +		break;
> +	case SCLK_I2C0:
> +	case SCLK_I2C1:
> +	case SCLK_I2C2:
> +	case SCLK_I2C3:
> +		rate = rk3308_i2c_get_clk(clk);
> +		break;
> +	case SCLK_SARADC:
> +		rate = rk3308_saradc_get_clk(clk);
> +		break;
> +	case SCLK_TSADC:
> +		rate = rk3308_tsadc_get_clk(clk);
> +		break;
> +	case SCLK_SPI0:
> +	case SCLK_SPI1:
> +		rate = rk3308_spi_get_clk(clk);
> +		break;
> +	case SCLK_PWM0:
> +		rate = rk3308_pwm_get_clk(clk);
> +		break;
> +	case DCLK_VOP:
> +		rate = rk3308_vop_get_clk(clk);
> +		break;
> +	case ACLK_BUS:
> +	case HCLK_BUS:
> +	case PCLK_BUS:
> +	case PCLK_WDT:
> +		rate = rk3308_bus_get_clk(priv, clk->id);
> +		break;
> +	case ACLK_PERI:
> +	case HCLK_PERI:
> +	case PCLK_PERI:
> +		rate = rk3308_peri_get_clk(priv, clk->id);
> +		break;
> +	case HCLK_AUDIO:
> +	case PCLK_AUDIO:
> +		rate = rk3308_audio_get_clk(priv, clk->id);
> +		break;
> +	case SCLK_CRYPTO:
> +	case SCLK_CRYPTO_APK:
> +		rate = rk3308_crypto_get_clk(priv, clk->id);
> +		break;
> +	default:
> +		return -ENOENT;
> +	}
> +
> +	return rate;
> +}
> +
> +static ulong rk3308_clk_set_rate(struct clk *clk, ulong rate)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +	ulong ret = 0;
> +
> +	debug("%s %ld %ld\n", __func__, clk->id, rate);
> +
> +	switch (clk->id) {
> +	case PLL_DPLL:
> +		ret = rockchip_pll_set_rate(&rk3308_pll_clks[DPLL], priv->cru,
> +					    DPLL, rate);
> +		priv->dpll_hz = rockchip_pll_get_rate(&rk3308_pll_clks[DPLL],
> +						      priv->cru, DPLL);
> +		break;
> +	case ARMCLK:
> +		if (priv->armclk_hz)
> +			rk3308_armclk_set_clk(priv, rate);
> +		priv->armclk_hz = rate;
> +		break;
> +	case HCLK_SDMMC:
> +	case HCLK_EMMC:
> +	case SCLK_SDMMC:
> +	case SCLK_EMMC:
> +		ret = rk3308_mmc_set_clk(clk, rate);
> +		break;
> +	case SCLK_I2C0:
> +	case SCLK_I2C1:
> +	case SCLK_I2C2:
> +	case SCLK_I2C3:
> +		ret = rk3308_i2c_set_clk(clk, rate);
> +		break;
> +	case SCLK_MAC:
> +		ret = rk3308_mac_set_clk(clk, rate);
> +		break;
> +	case SCLK_MAC_RMII:
> +		ret = rk3308_mac_set_speed_clk(clk, rate);
> +		break;
> +	case SCLK_SARADC:
> +		ret = rk3308_saradc_set_clk(clk, rate);
> +		break;
> +	case SCLK_TSADC:
> +		ret = rk3308_tsadc_set_clk(clk, rate);
> +		break;
> +	case SCLK_SPI0:
> +	case SCLK_SPI1:
> +		ret = rk3308_spi_set_clk(clk, rate);
> +		break;
> +	case SCLK_PWM0:
> +		ret = rk3308_pwm_set_clk(clk, rate);
> +		break;
> +	case DCLK_VOP:
> +		ret = rk3308_vop_set_clk(clk, rate);
> +		break;
> +	case ACLK_BUS:
> +	case HCLK_BUS:
> +	case PCLK_BUS:
> +		rate = rk3308_bus_set_clk(priv, clk->id, rate);
> +		break;
> +	case ACLK_PERI:
> +	case HCLK_PERI:
> +	case PCLK_PERI:
> +		rate = rk3308_peri_set_clk(priv, clk->id, rate);
> +		break;
> +	case HCLK_AUDIO:
> +	case PCLK_AUDIO:
> +		rate = rk3308_audio_set_clk(priv, clk->id, rate);
> +		break;
> +	case SCLK_CRYPTO:
> +	case SCLK_CRYPTO_APK:
> +		ret = rk3308_crypto_set_clk(priv, clk->id, rate);
> +		break;
> +	default:
> +		return -ENOENT;
> +	}
> +
> +	return ret;
> +}
> +
> +#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
> +static int __maybe_unused rk3308_mac_set_parent(struct clk *clk, struct clk *parent)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
> +
> +	/*
> +	 * If the requested parent is in the same clock-controller and
> +	 * the id is SCLK_MAC_SRC, switch to the internal clock.
> +	 */
> +	if (parent->id == SCLK_MAC_SRC) {
> +		debug("%s: switching RMII to SCLK_MAC\n", __func__);
> +		rk_clrreg(&priv->cru->clksel_con[43], BIT(14));
> +	} else {
> +		debug("%s: switching RMII to CLKIN\n", __func__);
> +		rk_setreg(&priv->cru->clksel_con[43], BIT(14));
> +	}
> +
> +	return 0;
> +}
> +
> +static int __maybe_unused rk3308_clk_set_parent(struct clk *clk, struct clk *parent)
> +{
> +	switch (clk->id) {
> +	case SCLK_MAC:
> +		return rk3308_mac_set_parent(clk, parent);
> +	default:
> +		break;
> +	}
> +
> +	debug("%s: unsupported clk %ld\n", __func__, clk->id);
> +	return -ENOENT;
> +}
> +#endif
> +
> +static struct clk_ops rk3308_clk_ops = {
> +	.get_rate = rk3308_clk_get_rate,
> +	.set_rate = rk3308_clk_set_rate,
> +#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
> +	.set_parent = rk3308_clk_set_parent,
> +#endif
> +};
> +
> +static void rk3308_clk_init(struct udevice *dev)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(dev);
> +	int ret;
> +
> +	if (rockchip_pll_get_rate(&rk3308_pll_clks[APLL],
> +				  priv->cru, APLL) != APLL_HZ) {
> +		ret = rk3308_armclk_set_clk(priv, APLL_HZ);
> +		if (ret < 0)
> +			printf("%s failed to set armclk rate\n", __func__);
> +	}
> +
> +	rk3308_clk_get_pll_rate(priv);
> +
> +	rk3308_bus_set_clk(priv, ACLK_BUS, BUS_ACLK_HZ);
> +	rk3308_bus_set_clk(priv, HCLK_BUS, BUS_HCLK_HZ);
> +	rk3308_bus_set_clk(priv, PCLK_BUS, BUS_PCLK_HZ);
> +
> +	rk3308_peri_set_clk(priv, ACLK_PERI, PERI_ACLK_HZ);
> +	rk3308_peri_set_clk(priv, HCLK_PERI, PERI_HCLK_HZ);
> +	rk3308_peri_set_clk(priv, PCLK_PERI, PERI_PCLK_HZ);
> +
> +	rk3308_audio_set_clk(priv, HCLK_AUDIO, AUDIO_HCLK_HZ);
> +	rk3308_audio_set_clk(priv, PCLK_AUDIO, AUDIO_PCLK_HZ);
> +}
> +
> +static int rk3308_clk_probe(struct udevice *dev)
> +{
> +	int ret;
> +
> +	rk3308_clk_init(dev);
> +
> +	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
> +	ret = clk_set_defaults(dev);
> +	if (ret)
> +		debug("%s clk_set_defaults failed %d\n", __func__, ret);
> +
> +	return ret;
> +}
> +
> +static int rk3308_clk_ofdata_to_platdata(struct udevice *dev)
> +{
> +	struct rk3308_clk_priv *priv = dev_get_priv(dev);
> +
> +	priv->cru = dev_read_addr_ptr(dev);
> +
> +	return 0;
> +}
> +
> +static int rk3308_clk_bind(struct udevice *dev)
> +{
> +	int ret;
> +	struct udevice *sys_child, *sf_child;
> +	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
> +
> +	/* The reset driver does not have a device node, so bind it here */
> +	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> +				 &sys_child);
> +	if (ret) {
> +		debug("Warning: No sysreset driver: ret=%d\n", ret);
> +	} else {
> +		priv = malloc(sizeof(struct sysreset_reg));
> +		priv->glb_srst_fst_value = offsetof(struct rk3308_cru,
> +						    glb_srst_fst);
> +		priv->glb_srst_snd_value = offsetof(struct rk3308_cru,
> +						    glb_srst_snd);
> +		sys_child->priv = priv;
> +	}
> +
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rk3308_cru,
> +						    softrst_con[0]);
> +		sf_priv->sf_reset_num = 12;
> +		sf_child->priv = sf_priv;
> +	}
> +
> +	return 0;
> +}
> +
> +static const struct udevice_id rk3308_clk_ids[] = {
> +	{ .compatible = "rockchip,rk3308-cru" },
> +	{ }
> +};
> +
> +U_BOOT_DRIVER(rockchip_rk3308_cru) = {
> +	.name		= "rockchip_rk3308_cru",
> +	.id		= UCLASS_CLK,
> +	.of_match	= rk3308_clk_ids,
> +	.priv_auto_alloc_size = sizeof(struct rk3308_clk_priv),
> +	.ofdata_to_platdata = rk3308_clk_ofdata_to_platdata,
> +	.ops		= &rk3308_clk_ops,
> +	.bind		= rk3308_clk_bind,
> +	.probe		= rk3308_clk_probe,
> +};
> diff --git a/include/dt-bindings/clock/rk3308-cru.h b/include/dt-bindings/clock/rk3308-cru.h
> new file mode 100644
> index 0000000000..d97840f9ee
> --- /dev/null
> +++ b/include/dt-bindings/clock/rk3308-cru.h
> @@ -0,0 +1,387 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (c) 2019 Rockchip Electronics Co. Ltd.
> + * Author: Finley Xiao <finley.xiao@rock-chips.com>
> + */
> +
> +#ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3308_H
> +#define _DT_BINDINGS_CLK_ROCKCHIP_RK3308_H
> +
> +/* core clocks */
> +#define PLL_APLL		1
> +#define PLL_DPLL		2
> +#define PLL_VPLL0		3
> +#define PLL_VPLL1		4
> +#define ARMCLK			5
> +
> +/* sclk (special clocks) */
> +#define USB480M			14
> +#define SCLK_RTC32K		15
> +#define SCLK_PVTM_CORE		16
> +#define SCLK_UART0		17
> +#define SCLK_UART1		18
> +#define SCLK_UART2		19
> +#define SCLK_UART3		20
> +#define SCLK_UART4		21
> +#define SCLK_I2C0		22
> +#define SCLK_I2C1		23
> +#define SCLK_I2C2		24
> +#define SCLK_I2C3		25
> +#define SCLK_PWM0		26
> +#define SCLK_SPI0		27
> +#define SCLK_SPI1		28
> +#define SCLK_SPI2		29
> +#define SCLK_TIMER0		30
> +#define SCLK_TIMER1		31
> +#define SCLK_TIMER2		32
> +#define SCLK_TIMER3		33
> +#define SCLK_TIMER4		34
> +#define SCLK_TIMER5		35
> +#define SCLK_TSADC		36
> +#define SCLK_SARADC		37
> +#define SCLK_OTP		38
> +#define SCLK_OTP_USR		39
> +#define SCLK_CPU_BOOST		40
> +#define SCLK_CRYPTO		41
> +#define SCLK_CRYPTO_APK		42
> +#define SCLK_NANDC_DIV		43
> +#define SCLK_NANDC_DIV50	44
> +#define SCLK_NANDC		45
> +#define SCLK_SDMMC_DIV		46
> +#define SCLK_SDMMC_DIV50	47
> +#define SCLK_SDMMC		48
> +#define SCLK_SDMMC_DRV		49
> +#define SCLK_SDMMC_SAMPLE	50
> +#define SCLK_SDIO_DIV		51
> +#define SCLK_SDIO_DIV50		52
> +#define SCLK_SDIO		53
> +#define SCLK_SDIO_DRV		54
> +#define SCLK_SDIO_SAMPLE	55
> +#define SCLK_EMMC_DIV		56
> +#define SCLK_EMMC_DIV50		57
> +#define SCLK_EMMC		58
> +#define SCLK_EMMC_DRV		59
> +#define SCLK_EMMC_SAMPLE	60
> +#define SCLK_SFC		61
> +#define SCLK_OTG_ADP		62
> +#define SCLK_MAC_SRC		63
> +#define SCLK_MAC		64
> +#define SCLK_MAC_REF		65
> +#define SCLK_MAC_RX_TX		66
> +#define SCLK_MAC_RMII		67
> +#define SCLK_DDR_MON_TIMER	68
> +#define SCLK_DDR_MON		69
> +#define SCLK_DDRCLK		70
> +#define SCLK_PMU		71
> +#define SCLK_USBPHY_REF		72
> +#define SCLK_WIFI		73
> +#define SCLK_PVTM_PMU		74
> +#define SCLK_PDM		75
> +#define SCLK_I2S0_8CH_TX	76
> +#define SCLK_I2S0_8CH_TX_OUT	77
> +#define SCLK_I2S0_8CH_RX	78
> +#define SCLK_I2S0_8CH_RX_OUT	79
> +#define SCLK_I2S1_8CH_TX	80
> +#define SCLK_I2S1_8CH_TX_OUT	81
> +#define SCLK_I2S1_8CH_RX	82
> +#define SCLK_I2S1_8CH_RX_OUT	83
> +#define SCLK_I2S2_8CH_TX	84
> +#define SCLK_I2S2_8CH_TX_OUT	85
> +#define SCLK_I2S2_8CH_RX	86
> +#define SCLK_I2S2_8CH_RX_OUT	87
> +#define SCLK_I2S3_8CH_TX	88
> +#define SCLK_I2S3_8CH_TX_OUT	89
> +#define SCLK_I2S3_8CH_RX	90
> +#define SCLK_I2S3_8CH_RX_OUT	91
> +#define SCLK_I2S0_2CH		92
> +#define SCLK_I2S0_2CH_OUT	93
> +#define SCLK_I2S1_2CH		94
> +#define SCLK_I2S1_2CH_OUT	95
> +#define SCLK_SPDIF_TX_DIV	96
> +#define SCLK_SPDIF_TX_DIV50	97
> +#define SCLK_SPDIF_TX		98
> +#define SCLK_SPDIF_RX_DIV	99
> +#define SCLK_SPDIF_RX_DIV50	100
> +#define SCLK_SPDIF_RX		101
> +#define SCLK_I2S0_8CH_TX_MUX	102
> +#define SCLK_I2S0_8CH_RX_MUX	103
> +#define SCLK_I2S1_8CH_TX_MUX	104
> +#define SCLK_I2S1_8CH_RX_MUX	105
> +#define SCLK_I2S2_8CH_TX_MUX	106
> +#define SCLK_I2S2_8CH_RX_MUX	107
> +#define SCLK_I2S3_8CH_TX_MUX	108
> +#define SCLK_I2S3_8CH_RX_MUX	109
> +#define SCLK_I2S0_8CH_TX_SRC	110
> +#define SCLK_I2S0_8CH_RX_SRC	111
> +#define SCLK_I2S1_8CH_TX_SRC	112
> +#define SCLK_I2S1_8CH_RX_SRC	113
> +#define SCLK_I2S2_8CH_TX_SRC	114
> +#define SCLK_I2S2_8CH_RX_SRC	115
> +#define SCLK_I2S3_8CH_TX_SRC	116
> +#define SCLK_I2S3_8CH_RX_SRC	117
> +#define SCLK_I2S0_2CH_SRC	118
> +#define SCLK_I2S1_2CH_SRC	119
> +#define SCLK_PWM1		120
> +#define SCLK_PWM2		121
> +#define SCLK_OWIRE		122
> +
> +/* dclk */
> +#define DCLK_VOP		125
> +
> +/* aclk */
> +#define ACLK_BUS_SRC		130
> +#define ACLK_BUS		131
> +#define ACLK_PERI_SRC		132
> +#define ACLK_PERI		133
> +#define ACLK_MAC		134
> +#define ACLK_CRYPTO		135
> +#define ACLK_VOP		136
> +#define ACLK_GIC		137
> +#define ACLK_DMAC0		138
> +#define ACLK_DMAC1		139
> +
> +/* hclk */
> +#define HCLK_BUS		150
> +#define HCLK_PERI		151
> +#define HCLK_AUDIO		152
> +#define HCLK_NANDC		153
> +#define HCLK_SDMMC		154
> +#define HCLK_SDIO		155
> +#define HCLK_EMMC		156
> +#define HCLK_SFC		157
> +#define HCLK_OTG		158
> +#define HCLK_HOST		159
> +#define HCLK_HOST_ARB		160
> +#define HCLK_PDM		161
> +#define HCLK_SPDIFTX		162
> +#define HCLK_SPDIFRX		163
> +#define HCLK_I2S0_8CH		164
> +#define HCLK_I2S1_8CH		165
> +#define HCLK_I2S2_8CH		166
> +#define HCLK_I2S3_8CH		167
> +#define HCLK_I2S0_2CH		168
> +#define HCLK_I2S1_2CH		169
> +#define HCLK_VAD		170
> +#define HCLK_CRYPTO		171
> +#define HCLK_VOP		172
> +
> +/* pclk */
> +#define PCLK_BUS		190
> +#define PCLK_DDR		191
> +#define PCLK_PERI		192
> +#define PCLK_PMU		193
> +#define PCLK_AUDIO		194
> +#define PCLK_MAC		195
> +#define PCLK_ACODEC		196
> +#define PCLK_UART0		197
> +#define PCLK_UART1		198
> +#define PCLK_UART2		199
> +#define PCLK_UART3		200
> +#define PCLK_UART4		201
> +#define PCLK_I2C0		202
> +#define PCLK_I2C1		203
> +#define PCLK_I2C2		204
> +#define PCLK_I2C3		205
> +#define PCLK_PWM0		206
> +#define PCLK_SPI0		207
> +#define PCLK_SPI1		208
> +#define PCLK_SPI2		209
> +#define PCLK_SARADC		210
> +#define PCLK_TSADC		211
> +#define PCLK_TIMER		212
> +#define PCLK_OTP_NS		213
> +#define PCLK_WDT		214
> +#define PCLK_GPIO0		215
> +#define PCLK_GPIO1		216
> +#define PCLK_GPIO2		217
> +#define PCLK_GPIO3		218
> +#define PCLK_GPIO4		219
> +#define PCLK_SGRF		220
> +#define PCLK_GRF		221
> +#define PCLK_USBSD_DET		222
> +#define PCLK_DDR_UPCTL		223
> +#define PCLK_DDR_MON		224
> +#define PCLK_DDRPHY		225
> +#define PCLK_DDR_STDBY		226
> +#define PCLK_USB_GRF		227
> +#define PCLK_CRU		228
> +#define PCLK_OTP_PHY		229
> +#define PCLK_CPU_BOOST		230
> +#define PCLK_PWM1		231
> +#define PCLK_PWM2		232
> +#define PCLK_CAN		233
> +#define PCLK_OWIRE		234
> +
> +#define CLK_NR_CLKS		(PCLK_OWIRE + 1)
> +
> +/* soft-reset indices */
> +
> +/* cru_softrst_con0 */
> +#define SRST_CORE0_PO		0
> +#define SRST_CORE1_PO		1
> +#define SRST_CORE2_PO		2
> +#define SRST_CORE3_PO		3
> +#define SRST_CORE0		4
> +#define SRST_CORE1		5
> +#define SRST_CORE2		6
> +#define SRST_CORE3		7
> +#define SRST_CORE0_DBG		8
> +#define SRST_CORE1_DBG		9
> +#define SRST_CORE2_DBG		10
> +#define SRST_CORE3_DBG		11
> +#define SRST_TOPDBG		12
> +#define SRST_CORE_NOC		13
> +#define SRST_STRC_A		14
> +#define SRST_L2C		15
> +
> +/* cru_softrst_con1 */
> +#define SRST_DAP		16
> +#define SRST_CORE_PVTM		17
> +#define SRST_CORE_PRF		18
> +#define SRST_CORE_GRF		19
> +#define SRST_DDRUPCTL		20
> +#define SRST_DDRUPCTL_P		22
> +#define SRST_MSCH		23
> +#define SRST_DDRMON_P		25
> +#define SRST_DDRSTDBY_P		26
> +#define SRST_DDRSTDBY		27
> +#define SRST_DDRPHY		28
> +#define SRST_DDRPHY_DIV		29
> +#define SRST_DDRPHY_P		30
> +
> +/* cru_softrst_con2 */
> +#define SRST_BUS_NIU_H		32
> +#define SRST_USB_NIU_P		33
> +#define SRST_CRYPTO_A		34
> +#define SRST_CRYPTO_H		35
> +#define SRST_CRYPTO		36
> +#define SRST_CRYPTO_APK		37
> +#define SRST_VOP_A		38
> +#define SRST_VOP_H		39
> +#define SRST_VOP_D		40
> +#define SRST_INTMEM_A		41
> +#define SRST_ROM_H		42
> +#define SRST_GIC_A		43
> +#define SRST_UART0_P		44
> +#define SRST_UART0		45
> +#define SRST_UART1_P		46
> +#define SRST_UART1		47
> +
> +/* cru_softrst_con3 */
> +#define SRST_UART2_P		48
> +#define SRST_UART2		49
> +#define SRST_UART3_P		50
> +#define SRST_UART3		51
> +#define SRST_UART4_P		52
> +#define SRST_UART4		53
> +#define SRST_I2C0_P		54
> +#define SRST_I2C0		55
> +#define SRST_I2C1_P		56
> +#define SRST_I2C1		57
> +#define SRST_I2C2_P		58
> +#define SRST_I2C2		59
> +#define SRST_I2C3_P		60
> +#define SRST_I2C3		61
> +#define SRST_PWM0_P		62
> +#define SRST_PWM0		63
> +
> +/* cru_softrst_con4 */
> +#define SRST_SPI0_P		64
> +#define SRST_SPI0		65
> +#define SRST_SPI1_P		66
> +#define SRST_SPI1		67
> +#define SRST_SPI2_P		68
> +#define SRST_SPI2		69
> +#define SRST_SARADC_P		70
> +#define SRST_TSADC_P		71
> +#define SRST_TSADC		72
> +#define SRST_TIMER0_P		73
> +#define SRST_TIMER0		74
> +#define SRST_TIMER1		75
> +#define SRST_TIMER2		76
> +#define SRST_TIMER3		77
> +#define SRST_TIMER4		78
> +#define SRST_TIMER5		79
> +
> +/* cru_softrst_con5 */
> +#define SRST_OTP_NS_P		80
> +#define SRST_OTP_NS_SBPI	81
> +#define SRST_OTP_NS_USR		82
> +#define SRST_OTP_PHY_P		83
> +#define SRST_OTP_PHY		84
> +#define SRST_GPIO0_P		86
> +#define SRST_GPIO1_P		87
> +#define SRST_GPIO2_P		88
> +#define SRST_GPIO3_P		89
> +#define SRST_GPIO4_P		90
> +#define SRST_GRF_P		91
> +#define SRST_USBSD_DET_P	92
> +#define SRST_PMU		93
> +#define SRST_PMU_PVTM		94
> +#define SRST_USB_GRF_P		95
> +
> +/* cru_softrst_con6 */
> +#define SRST_CPU_BOOST		96
> +#define SRST_CPU_BOOST_P	97
> +#define SRST_PWM1_P		98
> +#define SRST_PWM1		99
> +#define SRST_PWM2_P		100
> +#define SRST_PWM2		101
> +#define SRST_PERI_NIU_A		104
> +#define SRST_PERI_NIU_H		105
> +#define SRST_PERI_NIU_p		106
> +#define SRST_USB2OTG_H		107
> +#define SRST_USB2OTG		108
> +#define SRST_USB2OTG_ADP	109
> +#define SRST_USB2HOST_H		110
> +#define SRST_USB2HOST_ARB_H	111
> +
> +/* cru_softrst_con7 */
> +#define SRST_USB2HOST_AUX_H	112
> +#define SRST_USB2HOST_EHCI	113
> +#define SRST_USB2HOST		114
> +#define SRST_USBPHYPOR		115
> +#define SRST_UTMI0		116
> +#define SRST_UTMI1		117
> +#define SRST_SDIO_H		118
> +#define SRST_EMMC_H		119
> +#define SRST_SFC_H		120
> +#define SRST_SFC		121
> +#define SRST_SD_H		122
> +#define SRST_NANDC_H		123
> +#define SRST_NANDC_N		124
> +#define SRST_MAC_A		125
> +#define SRST_CAN_P		126
> +#define SRST_OWIRE_P		127
> +
> +/* cru_softrst_con8 */
> +#define SRST_AUDIO_NIU_H	128
> +#define SRST_AUDIO_NIU_P	129
> +#define SRST_PDM_H		130
> +#define SRST_PDM_M		131
> +#define SRST_SPDIFTX_H		132
> +#define SRST_SPDIFTX_M		133
> +#define SRST_SPDIFRX_H		134
> +#define SRST_SPDIFRX_M		135
> +#define SRST_I2S0_8CH_H		136
> +#define SRST_I2S0_8CH_TX_M	137
> +#define SRST_I2S0_8CH_RX_M	138
> +#define SRST_I2S1_8CH_H		139
> +#define SRST_I2S1_8CH_TX_M	140
> +#define SRST_I2S1_8CH_RX_M	141
> +#define SRST_I2S2_8CH_H		142
> +#define SRST_I2S2_8CH_TX_M	143
> +
> +/* cru_softrst_con9 */
> +#define SRST_I2S2_8CH_RX_M	144
> +#define SRST_I2S3_8CH_H		145
> +#define SRST_I2S3_8CH_TX_M	146
> +#define SRST_I2S3_8CH_RX_M	147
> +#define SRST_I2S0_2CH_H		148
> +#define SRST_I2S0_2CH_M		149
> +#define SRST_I2S1_2CH_H		150
> +#define SRST_I2S1_2CH_M		151
> +#define SRST_VAD_H		152
> +#define SRST_ACODEC_P		153
> +
> +#endif

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

* [U-Boot] [PATCH v2 3/9] arm: dts: rockchip: Add dts for rk3308 evb
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 3/9] arm: dts: rockchip: Add dts for rk3308 evb Andy Yan
@ 2019-11-07  9:31   ` Kever Yang
  0 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-07  9:31 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:11, Andy Yan wrote:
> Add dts for rk3308 evb, sync from the linux kernel
> upstream list [0].
>
> [0]https://patchwork.kernel.org/patch/11201555/
>
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

Reviewed-by: Kever Yang<kever.yang@rock-chips.com>


Thanks,
- Kever
> ---
>
> Changes in v2: None
>
>   arch/arm/dts/Makefile               |    3 +
>   arch/arm/dts/rk3308-evb-u-boot.dtsi |   17 +
>   arch/arm/dts/rk3308-evb.dts         |  230 ++++
>   arch/arm/dts/rk3308-u-boot.dtsi     |   25 +
>   arch/arm/dts/rk3308.dtsi            | 1829 +++++++++++++++++++++++++++
>   5 files changed, 2104 insertions(+)
>   create mode 100644 arch/arm/dts/rk3308-evb-u-boot.dtsi
>   create mode 100644 arch/arm/dts/rk3308-evb.dts
>   create mode 100644 arch/arm/dts/rk3308-u-boot.dtsi
>   create mode 100644 arch/arm/dts/rk3308.dtsi
>
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> index 11feb0c533..95538b117e 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -93,6 +93,9 @@ dtb-$(CONFIG_ROCKCHIP_RK3288) += \
>   	rk3288-veyron-speedy.dtb \
>   	rk3288-vyasa.dtb
>   
> +dtb-$(CONFIG_ROCKCHIP_RK3308) += \
> +	rk3308-evb.dtb
> +
>   dtb-$(CONFIG_ROCKCHIP_RK3328) += \
>   	rk3328-evb.dtb \
>   	rk3328-rock64.dtb
> diff --git a/arch/arm/dts/rk3308-evb-u-boot.dtsi b/arch/arm/dts/rk3308-evb-u-boot.dtsi
> new file mode 100644
> index 0000000000..c6ea746de0
> --- /dev/null
> +++ b/arch/arm/dts/rk3308-evb-u-boot.dtsi
> @@ -0,0 +1,17 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2018-2019 Rockchip Electronics Co., Ltd
> + */
> +#include "rk3308-u-boot.dtsi"
> +
> +/ {
> +	chosen {
> +		u-boot,spl-boot-order = "same-as-spl", &emmc;
> +	};
> +};
> +
> +&uart4 {
> +	u-boot,dm-pre-reloc;
> +	clock-frequency = <24000000>;
> +	status = "okay";
> +};
> diff --git a/arch/arm/dts/rk3308-evb.dts b/arch/arm/dts/rk3308-evb.dts
> new file mode 100644
> index 0000000000..124a240866
> --- /dev/null
> +++ b/arch/arm/dts/rk3308-evb.dts
> @@ -0,0 +1,230 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +/*
> + * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
> + *
> + */
> +
> +/dts-v1/;
> +#include <dt-bindings/input/input.h>
> +#include "rk3308.dtsi"
> +
> +/ {
> +	model = "Rockchip RK3308 EVB";
> +	compatible = "rockchip,rk3308-evb", "rockchip,rk3308";
> +
> +	chosen {
> +		stdout-path = "serial4:1500000n8";
> +	};
> +
> +	adc-keys0 {
> +		compatible = "adc-keys";
> +		io-channels = <&saradc 0>;
> +		io-channel-names = "buttons";
> +		poll-interval = <100>;
> +		keyup-threshold-microvolt = <1800000>;
> +
> +		func-key {
> +			linux,code = <KEY_FN>;
> +			label = "function";
> +			press-threshold-microvolt = <18000>;
> +		};
> +	};
> +
> +	adc-keys1 {
> +		compatible = "adc-keys";
> +		io-channels = <&saradc 1>;
> +		io-channel-names = "buttons";
> +		poll-interval = <100>;
> +		keyup-threshold-microvolt = <1800000>;
> +
> +		esc-key {
> +			linux,code = <KEY_MICMUTE>;
> +			label = "micmute";
> +			press-threshold-microvolt = <1130000>;
> +		};
> +
> +		home-key {
> +			linux,code = <KEY_MODE>;
> +			label = "mode";
> +			press-threshold-microvolt = <901000>;
> +		};
> +
> +		menu-key {
> +			linux,code = <KEY_PLAY>;
> +			label = "play";
> +			press-threshold-microvolt = <624000>;
> +		};
> +
> +		vol-down-key {
> +			linux,code = <KEY_VOLUMEDOWN>;
> +			label = "volume down";
> +			press-threshold-microvolt = <300000>;
> +		};
> +
> +		vol-up-key {
> +			linux,code = <KEY_VOLUMEUP>;
> +			label = "volume up";
> +			press-threshold-microvolt = <18000>;
> +		};
> +	};
> +
> +	gpio-keys {
> +		compatible = "gpio-keys";
> +		autorepeat;
> +
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwr_key>;
> +
> +		power {
> +			gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_POWER>;
> +			label = "GPIO Key Power";
> +			wakeup-source;
> +			debounce-interval = <100>;
> +		};
> +	};
> +
> +	vcc12v_dcin: vcc12v-dcin {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vcc12v_dcin";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <12000000>;
> +		regulator-max-microvolt = <12000000>;
> +	};
> +
> +	vcc5v0_sys: vcc5v0-sys {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vcc5v0_sys";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <5000000>;
> +		regulator-max-microvolt = <5000000>;
> +		vin-supply = <&vcc12v_dcin>;
> +	};
> +
> +	vdd_core: vdd-core {
> +		compatible = "pwm-regulator";
> +		pwms = <&pwm0 0 5000 1>;
> +		regulator-name = "vdd_core";
> +		regulator-min-microvolt = <827000>;
> +		regulator-max-microvolt = <1340000>;
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-settling-time-up-us = <250>;
> +		pwm-supply = <&vcc5v0_sys>;
> +	};
> +
> +	vdd_log: vdd-log {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vdd_log";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <1050000>;
> +		regulator-max-microvolt = <1050000>;
> +		vin-supply = <&vcc5v0_sys>;
> +	};
> +
> +	vdd_1v0: vdd-1v0 {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vdd_1v0";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <1000000>;
> +		regulator-max-microvolt = <1000000>;
> +		vin-supply = <&vcc5v0_sys>;
> +	};
> +
> +	vccio_sdio: vcc_1v8: vcc-1v8 {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vcc_1v8";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <1800000>;
> +		regulator-max-microvolt = <1800000>;
> +		vin-supply = <&vcc_io>;
> +	};
> +
> +	vcc_ddr: vcc-ddr {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vcc_ddr";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <1500000>;
> +		regulator-max-microvolt = <1500000>;
> +		vin-supply = <&vcc5v0_sys>;
> +	};
> +
> +	vcc_io: vcc-io {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vcc_io";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <3300000>;
> +		regulator-max-microvolt = <3300000>;
> +		vin-supply = <&vcc5v0_sys>;
> +	};
> +
> +	vccio_flash: vccio-flash {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vccio_flash";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <3300000>;
> +		regulator-max-microvolt = <3300000>;
> +		vin-supply = <&vcc_io>;
> +	};
> +
> +	vcc5v0_host: vcc5v0-host {
> +		compatible = "regulator-fixed";
> +		enable-active-high;
> +		gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&usb_drv>;
> +		regulator-name = "vbus_host";
> +		vin-supply = <&vcc5v0_sys>;
> +	};
> +};
> +
> +&cpu0 {
> +	cpu-supply = <&vdd_core>;
> +};
> +
> +&saradc {
> +	status = "okay";
> +	vref-supply = <&vcc_1v8>;
> +};
> +
> +&pinctrl {
> +	pinctrl-names = "default";
> +	pinctrl-0 = <&rtc_32k>;
> +
> +	buttons {
> +		pwr_key: pwr-key {
> +			rockchip,pins = <0 RK_PA6 0 &pcfg_pull_up>;
> +		};
> +	};
> +
> +	usb {
> +		usb_drv: usb-drv {
> +			rockchip,pins = <0 RK_PC5 0 &pcfg_pull_none>;
> +		};
> +	};
> +
> +	sdio-pwrseq {
> +		wifi_enable_h: wifi-enable-h {
> +			rockchip,pins = <0 RK_PA2 0 &pcfg_pull_none>;
> +		};
> +	};
> +};
> +
> +&pwm0 {
> +	status = "okay";
> +	pinctrl-0 = <&pwm0_pin_pull_down>;
> +};
> +
> +&uart4 {
> +	pinctrl-names = "default";
> +	pinctrl-0 = <&uart4_xfer>;
> +	status = "okay";
> +};
> diff --git a/arch/arm/dts/rk3308-u-boot.dtsi b/arch/arm/dts/rk3308-u-boot.dtsi
> new file mode 100644
> index 0000000000..1a68decef3
> --- /dev/null
> +++ b/arch/arm/dts/rk3308-u-boot.dtsi
> @@ -0,0 +1,25 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + *(C) Copyright 2019 Rockchip Electronics Co., Ltd
> + */
> +
> +&cru {
> +	u-boot,dm-pre-reloc;
> +};
> +
> +&dmc {
> +	u-boot,dm-pre-reloc;
> +};
> +
> +&emmc {
> +	u-boot,dm-pre-reloc;
> +};
> +
> +&grf {
> +	u-boot,dm-pre-reloc;
> +};
> +
> +&saradc {
> +	u-boot,dm-pre-reloc;
> +	status = "okay";
> +};
> diff --git a/arch/arm/dts/rk3308.dtsi b/arch/arm/dts/rk3308.dtsi
> new file mode 100644
> index 0000000000..4e703dd3dd
> --- /dev/null
> +++ b/arch/arm/dts/rk3308.dtsi
> @@ -0,0 +1,1829 @@
> +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
> +/*
> + * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
> + *
> + */
> +
> +#include <dt-bindings/clock/rk3308-cru.h>
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/interrupt-controller/arm-gic.h>
> +#include <dt-bindings/interrupt-controller/irq.h>
> +#include <dt-bindings/pinctrl/rockchip.h>
> +#include <dt-bindings/thermal/thermal.h>
> +
> +/ {
> +	compatible = "rockchip,rk3308";
> +
> +	interrupt-parent = <&gic>;
> +	#address-cells = <2>;
> +	#size-cells = <2>;
> +
> +	aliases {
> +		i2c0 = &i2c0;
> +		i2c1 = &i2c1;
> +		i2c2 = &i2c2;
> +		i2c3 = &i2c3;
> +		serial0 = &uart0;
> +		serial1 = &uart1;
> +		serial2 = &uart2;
> +		serial3 = &uart3;
> +		serial4 = &uart4;
> +		spi0 = &spi0;
> +		spi1 = &spi1;
> +		spi2 = &spi2;
> +	};
> +
> +	cpus {
> +		#address-cells = <2>;
> +		#size-cells = <0>;
> +
> +		cpu0: cpu at 0 {
> +			device_type = "cpu";
> +			compatible = "arm,cortex-a35", "arm,armv8";
> +			reg = <0x0 0x0>;
> +			enable-method = "psci";
> +			clocks = <&cru ARMCLK>;
> +			#cooling-cells = <2>;
> +			dynamic-power-coefficient = <90>;
> +			operating-points-v2 = <&cpu0_opp_table>;
> +			cpu-idle-states = <&CPU_SLEEP>;
> +			next-level-cache = <&l2>;
> +		};
> +
> +		cpu1: cpu at 1 {
> +			device_type = "cpu";
> +			compatible = "arm,cortex-a35", "arm,armv8";
> +			reg = <0x0 0x1>;
> +			enable-method = "psci";
> +			operating-points-v2 = <&cpu0_opp_table>;
> +			cpu-idle-states = <&CPU_SLEEP>;
> +			next-level-cache = <&l2>;
> +		};
> +
> +		cpu2: cpu at 2 {
> +			device_type = "cpu";
> +			compatible = "arm,cortex-a35", "arm,armv8";
> +			reg = <0x0 0x2>;
> +			enable-method = "psci";
> +			operating-points-v2 = <&cpu0_opp_table>;
> +			cpu-idle-states = <&CPU_SLEEP>;
> +			next-level-cache = <&l2>;
> +		};
> +
> +		cpu3: cpu at 3 {
> +			device_type = "cpu";
> +			compatible = "arm,cortex-a35", "arm,armv8";
> +			reg = <0x0 0x3>;
> +			enable-method = "psci";
> +			operating-points-v2 = <&cpu0_opp_table>;
> +			cpu-idle-states = <&CPU_SLEEP>;
> +			next-level-cache = <&l2>;
> +		};
> +
> +		idle-states {
> +			entry-method = "psci";
> +
> +			CPU_SLEEP: cpu-sleep {
> +				compatible = "arm,idle-state";
> +				local-timer-stop;
> +				arm,psci-suspend-param = <0x0010000>;
> +				entry-latency-us = <120>;
> +				exit-latency-us = <250>;
> +				min-residency-us = <900>;
> +			};
> +		};
> +
> +		l2: l2-cache {
> +			compatible = "cache";
> +		};
> +	};
> +
> +	cpu0_opp_table: cpu0-opp-table {
> +		compatible = "operating-points-v2";
> +		opp-shared;
> +
> +		opp-408000000 {
> +			opp-hz = /bits/ 64 <408000000>;
> +			opp-microvolt = <950000 950000 1340000>;
> +			clock-latency-ns = <40000>;
> +			opp-suspend;
> +		};
> +		opp-600000000 {
> +			opp-hz = /bits/ 64 <600000000>;
> +			opp-microvolt = <950000 950000 1340000>;
> +			clock-latency-ns = <40000>;
> +		};
> +		opp-816000000 {
> +			opp-hz = /bits/ 64 <816000000>;
> +			opp-microvolt = <1025000 1025000 1340000>;
> +			clock-latency-ns = <40000>;
> +		};
> +		opp-1008000000 {
> +			opp-hz = /bits/ 64 <1008000000>;
> +			opp-microvolt = <1125000 1125000 1340000>;
> +			clock-latency-ns = <40000>;
> +		};
> +	};
> +
> +	arm-pmu {
> +		compatible = "arm,cortex-a53-pmu";
> +		interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>,
> +			     <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>,
> +			     <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>,
> +			     <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
> +		interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
> +	};
> +
> +	mac_clkin: external-mac-clock {
> +		compatible = "fixed-clock";
> +		clock-frequency = <50000000>;
> +		clock-output-names = "mac_clkin";
> +		#clock-cells = <0>;
> +	};
> +
> +	psci {
> +		compatible = "arm,psci-1.0";
> +		method = "smc";
> +	};
> +
> +	timer {
> +		compatible = "arm,armv8-timer";
> +		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
> +			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
> +			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
> +			     <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
> +	};
> +
> +	xin24m: xin24m {
> +		compatible = "fixed-clock";
> +		#clock-cells = <0>;
> +		clock-frequency = <24000000>;
> +		clock-output-names = "xin24m";
> +	};
> +
> +	grf: grf at ff000000 {
> +		compatible = "rockchip,rk3308-grf", "syscon", "simple-mfd";
> +		reg = <0x0 0xff000000 0x0 0x10000>;
> +	};
> +
> +	dmc: dmc at 0xff010000 {
> +		compatible = "rockchip,rk3308-dmc";
> +		reg = <0x0 0xff010000 0x0 0x10000>;
> +	};
> +
> +	detect_grf: syscon at ff00b000 {
> +		compatible = "rockchip,rk3308-detect-grf", "syscon", "simple-mfd";
> +		reg = <0x0 0xff00b000 0x0 0x1000>;
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +	};
> +
> +	core_grf: syscon at ff00c000 {
> +		compatible = "rockchip,rk3308-core-grf", "syscon", "simple-mfd";
> +		reg = <0x0 0xff00c000 0x0 0x1000>;
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +
> +	};
> +
> +	i2c0: i2c at ff040000 {
> +		compatible = "rockchip,rk3308-i2c", "rockchip,rk3399-i2c";
> +		reg = <0x0 0xff040000 0x0 0x1000>;
> +		clocks = <&cru SCLK_I2C0>, <&cru PCLK_I2C0>;
> +		clock-names = "i2c", "pclk";
> +		interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&i2c0_xfer>;
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		status = "disabled";
> +	};
> +
> +	i2c1: i2c at ff050000 {
> +		compatible = "rockchip,rk3308-i2c", "rockchip,rk3399-i2c";
> +		reg = <0x0 0xff050000 0x0 0x1000>;
> +		clocks = <&cru SCLK_I2C1>, <&cru PCLK_I2C1>;
> +		clock-names = "i2c", "pclk";
> +		interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&i2c1_xfer>;
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		status = "disabled";
> +	};
> +
> +	i2c2: i2c at ff060000 {
> +		compatible = "rockchip,rk3308-i2c", "rockchip,rk3399-i2c";
> +		reg = <0x0 0xff060000 0x0 0x1000>;
> +		clocks = <&cru SCLK_I2C2>, <&cru PCLK_I2C2>;
> +		clock-names = "i2c", "pclk";
> +		interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&i2c2_xfer>;
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		status = "disabled";
> +	};
> +
> +	i2c3: i2c at ff070000 {
> +		compatible = "rockchip,rk3308-i2c", "rockchip,rk3399-i2c";
> +		reg = <0x0 0xff070000 0x0 0x1000>;
> +		clocks = <&cru SCLK_I2C3>, <&cru PCLK_I2C3>;
> +		clock-names = "i2c", "pclk";
> +		interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&i2c3m0_xfer>;
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		status = "disabled";
> +	};
> +
> +	wdt: watchdog at ff080000 {
> +		compatible = "snps,dw-wdt";
> +		reg = <0x0 0xff080000 0x0 0x100>;
> +		clocks = <&cru PCLK_WDT>;
> +		interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
> +		status = "disabled";
> +	};
> +
> +	uart0: serial at ff0a0000 {
> +		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
> +		reg = <0x0 0xff0a0000 0x0 0x100>;
> +		interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
> +		clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
> +		clock-names = "baudclk", "apb_pclk";
> +		reg-shift = <2>;
> +		reg-io-width = <4>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>;
> +		status = "disabled";
> +	};
> +
> +	uart1: serial at ff0b0000 {
> +		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
> +		reg = <0x0 0xff0b0000 0x0 0x100>;
> +		interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
> +		clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
> +		clock-names = "baudclk", "apb_pclk";
> +		reg-shift = <2>;
> +		reg-io-width = <4>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&uart1_xfer &uart1_cts &uart1_rts>;
> +		status = "disabled";
> +	};
> +
> +	uart2: serial at ff0c0000 {
> +		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
> +		reg = <0x0 0xff0c0000 0x0 0x100>;
> +		interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
> +		clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
> +		clock-names = "baudclk", "apb_pclk";
> +		reg-shift = <2>;
> +		reg-io-width = <4>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&uart2m0_xfer>;
> +		status = "disabled";
> +	};
> +
> +	uart3: serial at ff0d0000 {
> +		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
> +		reg = <0x0 0xff0d0000 0x0 0x100>;
> +		interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
> +		clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
> +		clock-names = "baudclk", "apb_pclk";
> +		reg-shift = <2>;
> +		reg-io-width = <4>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&uart3_xfer>;
> +		status = "disabled";
> +	};
> +
> +	uart4: serial at ff0e0000 {
> +		compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart";
> +		reg = <0x0 0xff0e0000 0x0 0x100>;
> +		interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
> +		clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
> +		clock-names = "baudclk", "apb_pclk";
> +		reg-shift = <2>;
> +		reg-io-width = <4>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&uart4_xfer &uart4_cts &uart4_rts>;
> +		status = "disabled";
> +	};
> +
> +	spi0: spi at ff120000 {
> +		compatible = "rockchip,rk3308-spi", "rockchip,rk3066-spi";
> +		reg = <0x0 0xff120000 0x0 0x1000>;
> +		interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		clocks = <&cru SCLK_SPI0>, <&cru PCLK_SPI0>;
> +		clock-names = "spiclk", "apb_pclk";
> +		dmas = <&dmac0 0>, <&dmac0 1>;
> +		dma-names = "tx", "rx";
> +		pinctrl-names = "default", "high_speed";
> +		pinctrl-0 = <&spi0_clk &spi0_csn0 &spi0_miso &spi0_mosi>;
> +		pinctrl-1 = <&spi0_clk_hs &spi0_csn0 &spi0_miso_hs &spi0_mosi_hs>;
> +		status = "disabled";
> +	};
> +
> +	spi1: spi at ff130000 {
> +		compatible = "rockchip,rk3308-spi", "rockchip,rk3066-spi";
> +		reg = <0x0 0xff130000 0x0 0x1000>;
> +		interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		clocks = <&cru SCLK_SPI1>, <&cru PCLK_SPI1>;
> +		clock-names = "spiclk", "apb_pclk";
> +		dmas = <&dmac0 2>, <&dmac0 3>;
> +		dma-names = "tx", "rx";
> +		pinctrl-names = "default", "high_speed";
> +		pinctrl-0 = <&spi1_clk &spi1_csn0 &spi1_miso &spi1_mosi>;
> +		pinctrl-1 = <&spi1_clk_hs &spi1_csn0 &spi1_miso_hs &spi1_mosi_hs>;
> +		status = "disabled";
> +	};
> +
> +	spi2: spi at ff140000 {
> +		compatible = "rockchip,rk3308-spi", "rockchip,rk3066-spi";
> +		reg = <0x0 0xff140000 0x0 0x1000>;
> +		interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		clocks = <&cru SCLK_SPI2>, <&cru PCLK_SPI2>;
> +		clock-names = "spiclk", "apb_pclk";
> +		dmas = <&dmac1 16>, <&dmac1 17>;
> +		dma-names = "tx", "rx";
> +		pinctrl-names = "default", "high_speed";
> +		pinctrl-0 = <&spi2_clk &spi2_csn0 &spi2_miso &spi2_mosi>;
> +		pinctrl-1 = <&spi2_clk_hs &spi2_csn0 &spi2_miso_hs &spi2_mosi_hs>;
> +		status = "disabled";
> +	};
> +
> +	pwm8: pwm at ff160000 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff160000 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm8_pin>;
> +		clocks = <&cru SCLK_PWM2>, <&cru PCLK_PWM2>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm9: pwm at ff160010 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff160010 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm9_pin>;
> +		clocks = <&cru SCLK_PWM2>, <&cru PCLK_PWM2>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm10: pwm at ff160020 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff160020 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm10_pin>;
> +		clocks = <&cru SCLK_PWM2>, <&cru PCLK_PWM2>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm11: pwm at ff160030 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff160030 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm11_pin>;
> +		clocks = <&cru SCLK_PWM2>, <&cru PCLK_PWM2>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm4: pwm at ff170000 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff170000 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm4_pin>;
> +		clocks = <&cru SCLK_PWM1>, <&cru PCLK_PWM1>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm5: pwm at ff170010 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff170010 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm5_pin>;
> +		clocks = <&cru SCLK_PWM1>, <&cru PCLK_PWM1>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm6: pwm at ff170020 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff170020 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm6_pin>;
> +		clocks = <&cru SCLK_PWM1>, <&cru PCLK_PWM1>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm7: pwm at ff170030 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff170030 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm7_pin>;
> +		clocks = <&cru SCLK_PWM1>, <&cru PCLK_PWM1>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm0: pwm at ff180000 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff180000 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm0_pin>;
> +		clocks = <&cru SCLK_PWM0>, <&cru PCLK_PWM0>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm1: pwm at ff180010 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff180010 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm1_pin>;
> +		clocks = <&cru SCLK_PWM0>, <&cru PCLK_PWM0>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm2: pwm at ff180020 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff180020 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm2_pin>;
> +		clocks = <&cru SCLK_PWM0>, <&cru PCLK_PWM0>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	pwm3: pwm at ff180030 {
> +		compatible = "rockchip,rk3308-pwm", "rockchip,rk3328-pwm";
> +		reg = <0x0 0xff180030 0x0 0x10>;
> +		#pwm-cells = <3>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pwm3_pin>;
> +		clocks = <&cru SCLK_PWM0>, <&cru PCLK_PWM0>;
> +		clock-names = "pwm", "pclk";
> +		status = "disabled";
> +	};
> +
> +	rktimer: rktimer at ff1a0000 {
> +		compatible = "rockchip,rk3288-timer";
> +		reg = <0x0 0xff1a0000 0x0 0x20>;
> +		interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
> +		clocks = <&cru PCLK_TIMER>, <&cru SCLK_TIMER0>;
> +		clock-names = "pclk", "timer";
> +	};
> +
> +	saradc: saradc at ff1e0000 {
> +		compatible = "rockchip,rk3308-saradc", "rockchip,rk3399-saradc";
> +		reg = <0x0 0xff1e0000 0x0 0x100>;
> +		interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
> +		#io-channel-cells = <1>;
> +		clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
> +		clock-names = "saradc", "apb_pclk";
> +		resets = <&cru SRST_SARADC_P>;
> +		reset-names = "saradc-apb";
> +		status = "disabled";
> +	};
> +
> +	amba {
> +		compatible = "arm,amba-bus";
> +		#address-cells = <2>;
> +		#size-cells = <2>;
> +		ranges;
> +
> +		dmac0: dma-controller at ff2c0000 {
> +			compatible = "arm,pl330", "arm,primecell";
> +			reg = <0x0 0xff2c0000 0x0 0x4000>;
> +			interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
> +				     <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
> +			#dma-cells = <1>;
> +			clocks = <&cru ACLK_DMAC0>;
> +			clock-names = "apb_pclk";
> +			peripherals-req-type-burst;
> +		};
> +
> +		dmac1: dma-controller at ff2d0000 {
> +			compatible = "arm,pl330", "arm,primecell";
> +			reg = <0x0 0xff2d0000 0x0 0x4000>;
> +			interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
> +				     <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
> +			#dma-cells = <1>;
> +			clocks = <&cru ACLK_DMAC1>;
> +			clock-names = "apb_pclk";
> +			peripherals-req-type-burst;
> +		};
> +	};
> +
> +	i2s_2ch_0: i2s at ff350000 {
> +		compatible = "rockchip,rk3308-i2s", "rockchip,rk3066-i2s";
> +		reg = <0x0 0xff350000 0x0 0x1000>;
> +		interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
> +		clocks = <&cru SCLK_I2S0_2CH>, <&cru HCLK_I2S0_2CH>;
> +		clock-names = "i2s_clk", "i2s_hclk";
> +		dmas = <&dmac1 8>, <&dmac1 9>;
> +		dma-names = "tx", "rx";
> +		resets = <&cru SRST_I2S0_2CH_M>, <&cru SRST_I2S0_2CH_H>;
> +		reset-names = "reset-m", "reset-h";
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&i2s_2ch_0_sclk
> +			     &i2s_2ch_0_lrck
> +			     &i2s_2ch_0_sdi
> +			     &i2s_2ch_0_sdo>;
> +		status = "disabled";
> +	};
> +
> +	i2s_2ch_1: i2s at ff360000 {
> +		compatible = "rockchip,rk3308-i2s", "rockchip,rk3066-i2s";
> +		reg = <0x0 0xff360000 0x0 0x1000>;
> +		interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
> +		clocks = <&cru SCLK_I2S1_2CH>, <&cru HCLK_I2S1_2CH>;
> +		clock-names = "i2s_clk", "i2s_hclk";
> +		dmas = <&dmac1 11>;
> +		dma-names = "rx";
> +		resets = <&cru SRST_I2S1_2CH_M>, <&cru SRST_I2S1_2CH_H>;
> +		reset-names = "reset-m", "reset-h";
> +		status = "disabled";
> +	};
> +
> +	spdif_tx: spdif-tx at ff3a0000 {
> +		compatible = "rockchip,rk3308-spdif", "rockchip,rk3328-spdif";
> +		reg = <0x0 0xff3a0000 0x0 0x1000>;
> +		interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
> +		clocks = <&cru SCLK_SPDIF_TX>, <&cru HCLK_SPDIFTX>;
> +		clock-names = "mclk", "hclk";
> +		dmas = <&dmac1 13>;
> +		dma-names = "tx";
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&spdif_out>;
> +		status = "disabled";
> +	};
> +
> +	sdmmc: dwmmc at ff480000 {
> +		compatible = "rockchip,rk3308-dw-mshc", "rockchip,rk3288-dw-mshc";
> +		reg = <0x0 0xff480000 0x0 0x4000>;
> +		max-frequency = <150000000>;
> +		bus-width = <4>;
> +		clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
> +			 <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
> +		clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
> +		fifo-depth = <0x100>;
> +		interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_det &sdmmc_bus4>;
> +		status = "disabled";
> +	};
> +
> +	emmc: dwmmc at ff490000 {
> +		compatible = "rockchip,rk3308-dw-mshc", "rockchip,rk3288-dw-mshc";
> +		reg = <0x0 0xff490000 0x0 0x4000>;
> +		max-frequency = <150000000>;
> +		bus-width = <8>;
> +		clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>,
> +			 <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>;
> +		clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
> +		fifo-depth = <0x100>;
> +		interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
> +		status = "disabled";
> +	};
> +
> +	sdio: dwmmc at ff4a0000 {
> +		compatible = "rockchip,rk3308-dw-mshc", "rockchip,rk3288-dw-mshc";
> +		reg = <0x0 0xff4a0000 0x0 0x4000>;
> +		max-frequency = <150000000>;
> +		bus-width = <4>;
> +		clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>,
> +			 <&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;
> +		clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
> +		fifo-depth = <0x100>;
> +		interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&sdio_bus4 &sdio_cmd &sdio_clk>;
> +		status = "disabled";
> +	};
> +
> +	cru: clock-controller at ff500000 {
> +		compatible = "rockchip,rk3308-cru";
> +		reg = <0x0 0xff500000 0x0 0x1000>;
> +		rockchip,grf = <&grf>;
> +		#clock-cells = <1>;
> +		#reset-cells = <1>;
> +	};
> +
> +	gic: interrupt-controller at ff580000 {
> +		compatible = "arm,gic-400";
> +		#interrupt-cells = <3>;
> +		#address-cells = <0>;
> +		interrupt-controller;
> +
> +		reg = <0x0 0xff581000 0x0 0x1000>,
> +		      <0x0 0xff582000 0x0 0x2000>,
> +		      <0x0 0xff584000 0x0 0x2000>,
> +		      <0x0 0xff586000 0x0 0x2000>;
> +		interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
> +	};
> +
> +	sram: sram at fff80000 {
> +		compatible = "mmio-sram";
> +		reg = <0x0 0xfff80000 0x0 0x40000>;
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		ranges = <0 0x0 0xfff80000 0x40000>;
> +		/* reserved for ddr dvfs and system suspend/resume */
> +		ddr-sram at 0 {
> +			reg = <0x0 0x8000>;
> +		};
> +		/* reserved for vad audio buffer */
> +		vad_sram: vad-sram at 8000 {
> +			reg = <0x8000 0x38000>;
> +		};
> +	};
> +
> +	pinctrl: pinctrl {
> +		compatible = "rockchip,rk3308-pinctrl";
> +		rockchip,grf = <&grf>;
> +		#address-cells = <2>;
> +		#size-cells = <2>;
> +		ranges;
> +		gpio0: gpio0 at ff220000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0x0 0xff220000 0x0 0x100>;
> +			interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_GPIO0>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +
> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +		};
> +
> +		gpio1: gpio1 at ff230000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0x0 0xff230000 0x0 0x100>;
> +			interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_GPIO1>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +
> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +		};
> +
> +		gpio2: gpio2 at ff240000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0x0 0xff240000 0x0 0x100>;
> +			interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_GPIO2>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +
> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +		};
> +
> +		gpio3: gpio3 at ff250000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0x0 0xff250000 0x0 0x100>;
> +			interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_GPIO3>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +
> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +		};
> +
> +		gpio4: gpio4 at ff260000 {
> +			compatible = "rockchip,gpio-bank";
> +			reg = <0x0 0xff260000 0x0 0x100>;
> +			interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru PCLK_GPIO4>;
> +			gpio-controller;
> +			#gpio-cells = <2>;
> +
> +			interrupt-controller;
> +			#interrupt-cells = <2>;
> +		};
> +
> +		pcfg_pull_up: pcfg-pull-up {
> +			bias-pull-up;
> +		};
> +
> +		pcfg_pull_down: pcfg-pull-down {
> +			bias-pull-down;
> +		};
> +
> +		pcfg_pull_none: pcfg-pull-none {
> +			bias-disable;
> +		};
> +
> +		pcfg_pull_none_2ma: pcfg-pull-none-2ma {
> +			bias-disable;
> +			drive-strength = <2>;
> +		};
> +
> +		pcfg_pull_up_2ma: pcfg-pull-up-2ma {
> +			bias-pull-up;
> +			drive-strength = <2>;
> +		};
> +
> +		pcfg_pull_up_4ma: pcfg-pull-up-4ma {
> +			bias-pull-up;
> +			drive-strength = <4>;
> +		};
> +
> +		pcfg_pull_none_4ma: pcfg-pull-none-4ma {
> +			bias-disable;
> +			drive-strength = <4>;
> +		};
> +
> +		pcfg_pull_down_4ma: pcfg-pull-down-4ma {
> +			bias-pull-down;
> +			drive-strength = <4>;
> +		};
> +
> +		pcfg_pull_none_8ma: pcfg-pull-none-8ma {
> +			bias-disable;
> +			drive-strength = <8>;
> +		};
> +
> +		pcfg_pull_up_8ma: pcfg-pull-up-8ma {
> +			bias-pull-up;
> +			drive-strength = <8>;
> +		};
> +
> +		pcfg_pull_none_12ma: pcfg-pull-none-12ma {
> +			bias-disable;
> +			drive-strength = <12>;
> +		};
> +
> +		pcfg_pull_up_12ma: pcfg-pull-up-12ma {
> +			bias-pull-up;
> +			drive-strength = <12>;
> +		};
> +
> +		pcfg_pull_none_smt: pcfg-pull-none-smt {
> +			bias-disable;
> +			input-schmitt-enable;
> +		};
> +
> +		pcfg_output_high: pcfg-output-high {
> +			output-high;
> +		};
> +
> +		pcfg_output_low: pcfg-output-low {
> +			output-low;
> +		};
> +
> +		pcfg_input_high: pcfg-input-high {
> +			bias-pull-up;
> +			input-enable;
> +		};
> +
> +		pcfg_input: pcfg-input {
> +			input-enable;
> +		};
> +
> +		i2c0 {
> +			i2c0_xfer: i2c0-xfer {
> +				rockchip,pins =
> +					<1 RK_PD0 2 &pcfg_pull_none_smt>,
> +					<1 RK_PD1 2 &pcfg_pull_none_smt>;
> +			};
> +		};
> +
> +		i2c1 {
> +			i2c1_xfer: i2c1-xfer {
> +				rockchip,pins =
> +					<0 RK_PB3 1 &pcfg_pull_none_smt>,
> +					<0 RK_PB4 1 &pcfg_pull_none_smt>;
> +			};
> +		};
> +
> +		i2c2 {
> +			i2c2_xfer: i2c2-xfer {
> +				rockchip,pins =
> +					<2 RK_PA2 3 &pcfg_pull_none_smt>,
> +					<2 RK_PA3 3 &pcfg_pull_none_smt>;
> +			};
> +		};
> +
> +		i2c3-m0 {
> +			i2c3m0_xfer: i2c3m0-xfer {
> +				rockchip,pins =
> +					<0 RK_PB7 2 &pcfg_pull_none_smt>,
> +					<0 RK_PC0 2 &pcfg_pull_none_smt>;
> +			};
> +		};
> +
> +		i2c3-m1 {
> +			i2c3m1_xfer: i2c3m1-xfer {
> +				rockchip,pins =
> +					<3 RK_PB4 2 &pcfg_pull_none_smt>,
> +					<3 RK_PB5 2 &pcfg_pull_none_smt>;
> +			};
> +		};
> +
> +		i2c3-m2 {
> +			i2c3m2_xfer: i2c3m2-xfer {
> +				rockchip,pins =
> +					<2 RK_PA1 3 &pcfg_pull_none_smt>,
> +					<2 RK_PA0 3 &pcfg_pull_none_smt>;
> +			};
> +		};
> +
> +		i2s_2ch_0 {
> +			i2s_2ch_0_mclk: i2s-2ch-0-mclk {
> +				rockchip,pins =
> +					<4 RK_PB4 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_2ch_0_sclk: i2s-2ch-0-sclk {
> +				rockchip,pins =
> +					<4 RK_PB5 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_2ch_0_lrck: i2s-2ch-0-lrck {
> +				rockchip,pins =
> +					<4 RK_PB6 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_2ch_0_sdo: i2s-2ch-0-sdo {
> +				rockchip,pins =
> +					<4 RK_PB7 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_2ch_0_sdi: i2s-2ch-0-sdi {
> +				rockchip,pins =
> +					<4 RK_PC0 1 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		i2s_8ch_0 {
> +			i2s_8ch_0_mclk: i2s-8ch-0-mclk {
> +				rockchip,pins =
> +					<2 RK_PA4 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sclktx: i2s-8ch-0-sclktx {
> +				rockchip,pins =
> +					<2 RK_PA5 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sclkrx: i2s-8ch-0-sclkrx {
> +				rockchip,pins =
> +					<2 RK_PA6 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_lrcktx: i2s-8ch-0-lrcktx {
> +				rockchip,pins =
> +					<2 RK_PA7 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_lrckrx: i2s-8ch-0-lrckrx {
> +				rockchip,pins =
> +					<2 RK_PB0 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sdo0: i2s-8ch-0-sdo0 {
> +				rockchip,pins =
> +					<2 RK_PB1 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sdo1: i2s-8ch-0-sdo1 {
> +				rockchip,pins =
> +					<2 RK_PB2 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sdo2: i2s-8ch-0-sdo2 {
> +				rockchip,pins =
> +					<2 RK_PB3 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sdo3: i2s-8ch-0-sdo3 {
> +				rockchip,pins =
> +					<2 RK_PB4 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sdi0: i2s-8ch-0-sdi0 {
> +				rockchip,pins =
> +					<2 RK_PB5 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sdi1: i2s-8ch-0-sdi1 {
> +				rockchip,pins =
> +					<2 RK_PB6 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sdi2: i2s-8ch-0-sdi2 {
> +				rockchip,pins =
> +					<2 RK_PB7 1 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_0_sdi3: i2s-8ch-0-sdi3 {
> +				rockchip,pins =
> +					<2 RK_PC0 1 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		i2s_8ch_1_m0 {
> +			i2s_8ch_1_m0_mclk: i2s-8ch-1-m0-mclk {
> +				rockchip,pins =
> +					<1 RK_PA2 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m0_sclktx: i2s-8ch-1-m0-sclktx {
> +				rockchip,pins =
> +					<1 RK_PA3 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m0_sclkrx: i2s-8ch-1-m0-sclkrx {
> +				rockchip,pins =
> +					<1 RK_PA4 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m0_lrcktx: i2s-8ch-1-m0-lrcktx {
> +				rockchip,pins =
> +					<1 RK_PA5 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m0_lrckrx: i2s-8ch-1-m0-lrckrx {
> +				rockchip,pins =
> +					<1 RK_PA6 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m0_sdo0: i2s-8ch-1-m0-sdo0 {
> +				rockchip,pins =
> +					<1 RK_PA7 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m0_sdo1_sdi3: i2s-8ch-1-m0-sdo1-sdi3 {
> +				rockchip,pins =
> +					<1 RK_PB0 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m0_sdo2_sdi2: i2s-8ch-1-m0-sdo2-sdi2 {
> +				rockchip,pins =
> +					<1 RK_PB1 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m0_sdo3_sdi1: i2s-8ch-1-m0-sdo3_sdi1 {
> +				rockchip,pins =
> +					<1 RK_PB2 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m0_sdi0: i2s-8ch-1-m0-sdi0 {
> +				rockchip,pins =
> +					<1 RK_PB3 2 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		i2s_8ch_1_m1 {
> +			i2s_8ch_1_m1_mclk: i2s-8ch-1-m1-mclk {
> +				rockchip,pins =
> +					<1 RK_PB4 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m1_sclktx: i2s-8ch-1-m1-sclktx {
> +				rockchip,pins =
> +					<1 RK_PB5 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m1_sclkrx: i2s-8ch-1-m1-sclkrx {
> +				rockchip,pins =
> +					<1 RK_PB6 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m1_lrcktx: i2s-8ch-1-m1-lrcktx {
> +				rockchip,pins =
> +					<1 RK_PB7 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m1_lrckrx: i2s-8ch-1-m1-lrckrx {
> +				rockchip,pins =
> +					<1 RK_PC0 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m1_sdo0: i2s-8ch-1-m1-sdo0 {
> +				rockchip,pins =
> +					<1 RK_PC1 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m1_sdo1_sdi3: i2s-8ch-1-m1-sdo1-sdi3 {
> +				rockchip,pins =
> +					<1 RK_PC2 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m1_sdo2_sdi2: i2s-8ch-1-m1-sdo2-sdi2 {
> +				rockchip,pins =
> +					<1 RK_PC3 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m1_sdo3_sdi1: i2s-8ch-1-m1-sdo3_sdi1 {
> +				rockchip,pins =
> +					<1 RK_PC4 2 &pcfg_pull_none>;
> +			};
> +
> +			i2s_8ch_1_m1_sdi0: i2s-8ch-1-m1-sdi0 {
> +				rockchip,pins =
> +					<1 RK_PC5 2 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		pdm_m0 {
> +			pdm_m0_clk: pdm-m0-clk {
> +				rockchip,pins =
> +					<1 RK_PA4 3 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m0_sdi0: pdm-m0-sdi0 {
> +				rockchip,pins =
> +					<1 RK_PB3 3 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m0_sdi1: pdm-m0-sdi1 {
> +				rockchip,pins =
> +					<1 RK_PB2 3 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m0_sdi2: pdm-m0-sdi2 {
> +				rockchip,pins =
> +					<1 RK_PB1 3 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m0_sdi3: pdm-m0-sdi3 {
> +				rockchip,pins =
> +					<1 RK_PB0 3 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		pdm_m1 {
> +			pdm_m1_clk: pdm-m1-clk {
> +				rockchip,pins =
> +					<1 RK_PB6 4 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m1_sdi0: pdm-m1-sdi0 {
> +				rockchip,pins =
> +					<1 RK_PC5 4 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m1_sdi1: pdm-m1-sdi1 {
> +				rockchip,pins =
> +					<1 RK_PC4 4 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m1_sdi2: pdm-m1-sdi2 {
> +				rockchip,pins =
> +					<1 RK_PC3 4 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m1_sdi3: pdm-m1-sdi3 {
> +				rockchip,pins =
> +					<1 RK_PC2 4 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		pdm_m2 {
> +			pdm_m2_clkm: pdm-m2-clkm {
> +				rockchip,pins =
> +					<2 RK_PA4 3 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m2_clk: pdm-m2-clk {
> +				rockchip,pins =
> +					<2 RK_PA6 2 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m2_sdi0: pdm-m2-sdi0 {
> +				rockchip,pins =
> +					<2 RK_PB5 2 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m2_sdi1: pdm-m2-sdi1 {
> +				rockchip,pins =
> +					<2 RK_PB6 2 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m2_sdi2: pdm-m2-sdi2 {
> +				rockchip,pins =
> +					<2 RK_PB7 2 &pcfg_pull_none>;
> +			};
> +
> +			pdm_m2_sdi3: pdm-m2-sdi3 {
> +				rockchip,pins =
> +					<2 RK_PC0 2 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		spdif_in {
> +			spdif_in: spdif-in {
> +				rockchip,pins =
> +					<0 RK_PC2 1 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		spdif_out {
> +			spdif_out: spdif-out {
> +				rockchip,pins =
> +					<0 RK_PC1 1 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		tsadc {
> +			tsadc_otp_gpio: tsadc-otp-gpio {
> +				rockchip,pins =
> +					<0 RK_PB2 0 &pcfg_pull_none>;
> +			};
> +
> +			tsadc_otp_out: tsadc-otp-out {
> +				rockchip,pins =
> +					<0 RK_PB2 1 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		uart0 {
> +			uart0_xfer: uart0-xfer {
> +				rockchip,pins =
> +					<2 RK_PA1 1 &pcfg_pull_up>,
> +					<2 RK_PA0 1 &pcfg_pull_up>;
> +			};
> +
> +			uart0_cts: uart0-cts {
> +				rockchip,pins =
> +					<2 RK_PA2 1 &pcfg_pull_none>;
> +			};
> +
> +			uart0_rts: uart0-rts {
> +				rockchip,pins =
> +					<2 RK_PA3 1 &pcfg_pull_none>;
> +			};
> +
> +			uart0_rts_gpio: uart0-rts-gpio {
> +				rockchip,pins =
> +					<2 RK_PA3 0 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		uart1 {
> +			uart1_xfer: uart1-xfer {
> +				rockchip,pins =
> +					<1 RK_PD1 1 &pcfg_pull_up>,
> +					<1 RK_PD0 1 &pcfg_pull_up>;
> +			};
> +
> +			uart1_cts: uart1-cts {
> +				rockchip,pins =
> +					<1 RK_PC6 1 &pcfg_pull_none>;
> +			};
> +
> +			uart1_rts: uart1-rts {
> +				rockchip,pins =
> +					<1 RK_PC7 1 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		uart2-m0 {
> +			uart2m0_xfer: uart2m0-xfer {
> +				rockchip,pins =
> +					<1 RK_PC7 2 &pcfg_pull_up>,
> +					<1 RK_PC6 2 &pcfg_pull_up>;
> +			};
> +		};
> +
> +		uart2-m1 {
> +			uart2m1_xfer: uart2m1-xfer {
> +				rockchip,pins =
> +					<4 RK_PD3 2 &pcfg_pull_up>,
> +					<4 RK_PD2 2 &pcfg_pull_up>;
> +			};
> +		};
> +
> +		uart3 {
> +			uart3_xfer: uart3-xfer {
> +				rockchip,pins =
> +					<3 RK_PB5 4 &pcfg_pull_up>,
> +					<3 RK_PB4 4 &pcfg_pull_up>;
> +			};
> +		};
> +
> +		uart3-m1 {
> +			uart3m1_xfer: uart3m1-xfer {
> +				rockchip,pins =
> +					<0 RK_PC2 3 &pcfg_pull_up>,
> +					<0 RK_PC1 3 &pcfg_pull_up>;
> +			};
> +		};
> +
> +		uart4 {
> +
> +			uart4_xfer: uart4-xfer {
> +				rockchip,pins =
> +					<4 RK_PB1 1 &pcfg_pull_up>,
> +					<4 RK_PB0 1 &pcfg_pull_up>;
> +			};
> +
> +			uart4_cts: uart4-cts {
> +				rockchip,pins =
> +					<4 RK_PA6 1 &pcfg_pull_none>;
> +
> +			};
> +
> +			uart4_rts: uart4-rts {
> +				rockchip,pins =
> +					<4 RK_PA7 1 &pcfg_pull_none>;
> +			};
> +
> +			uart4_rts_gpio: uart4-rts-gpio {
> +				rockchip,pins =
> +					<4 RK_PA7 0 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		spi0 {
> +			spi0_clk: spi0-clk {
> +				rockchip,pins =
> +					<2 RK_PA2 2 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi0_csn0: spi0-csn0 {
> +				rockchip,pins =
> +					<2 RK_PA3 2 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi0_miso: spi0-miso {
> +				rockchip,pins =
> +					<2 RK_PA0 2 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi0_mosi: spi0-mosi {
> +				rockchip,pins =
> +					<2 RK_PA1 2 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi0_clk_hs: spi0-clk-hs {
> +				rockchip,pins =
> +					<2 RK_PA2 2 &pcfg_pull_up_8ma>;
> +			};
> +
> +			spi0_miso_hs: spi0-miso-hs {
> +				rockchip,pins =
> +					<2 RK_PA0 2 &pcfg_pull_up_8ma>;
> +			};
> +
> +			spi0_mosi_hs: spi0-mosi-hs {
> +				rockchip,pins =
> +					<2 RK_PA1 2 &pcfg_pull_up_8ma>;
> +			};
> +
> +		};
> +
> +		spi1 {
> +			spi1_clk: spi1-clk {
> +				rockchip,pins =
> +					<3 RK_PB3 3 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi1_csn0: spi1-csn0 {
> +				rockchip,pins =
> +					<3 RK_PB5 3 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi1_miso: spi1-miso {
> +				rockchip,pins =
> +					<3 RK_PB2 3 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi1_mosi: spi1-mosi {
> +				rockchip,pins =
> +					<3 RK_PB4 3 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi1_clk_hs: spi1-clk-hs {
> +				rockchip,pins =
> +					<3 RK_PB3 3 &pcfg_pull_up_8ma>;
> +			};
> +
> +			spi1_miso_hs: spi1-miso-hs {
> +				rockchip,pins =
> +					<3 RK_PB2 3 &pcfg_pull_up_8ma>;
> +			};
> +
> +			spi1_mosi_hs: spi1-mosi-hs {
> +				rockchip,pins =
> +					<3 RK_PB4 3 &pcfg_pull_up_8ma>;
> +			};
> +		};
> +
> +		spi1-m1 {
> +			spi1m1_miso: spi1m1-miso {
> +				rockchip,pins =
> +					<2 RK_PA4 2 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi1m1_mosi: spi1m1-mosi {
> +				rockchip,pins =
> +					<2 RK_PA5 2 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi1m1_clk: spi1m1-clk {
> +				rockchip,pins =
> +					<2 RK_PA7 2 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi1m1_csn0: spi1m1-csn0 {
> +				rockchip,pins =
> +					<2 RK_PB1 2 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi1m1_miso_hs: spi1m1-miso-hs {
> +				rockchip,pins =
> +					<2 RK_PA4 2 &pcfg_pull_up_8ma>;
> +			};
> +
> +			spi1m1_mosi_hs: spi1m1-mosi-hs {
> +				rockchip,pins =
> +					<2 RK_PA5 2 &pcfg_pull_up_8ma>;
> +			};
> +
> +			spi1m1_clk_hs: spi1m1-clk-hs {
> +				rockchip,pins =
> +					<2 RK_PA7 2 &pcfg_pull_up_8ma>;
> +			};
> +
> +			spi1m1_csn0_hs: spi1m1-csn0-hs {
> +				rockchip,pins =
> +					<2 RK_PB1 2 &pcfg_pull_up_8ma>;
> +			};
> +		};
> +
> +		spi2 {
> +			spi2_clk: spi2-clk {
> +				rockchip,pins =
> +					<1 RK_PD0 3 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi2_csn0: spi2-csn0 {
> +				rockchip,pins =
> +					<1 RK_PD1 3 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi2_miso: spi2-miso {
> +				rockchip,pins =
> +					<1 RK_PC6 3 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi2_mosi: spi2-mosi {
> +				rockchip,pins =
> +					<1 RK_PC7 3 &pcfg_pull_up_4ma>;
> +			};
> +
> +			spi2_clk_hs: spi2-clk-hs {
> +				rockchip,pins =
> +					<1 RK_PD0 3 &pcfg_pull_up_8ma>;
> +			};
> +
> +			spi2_miso_hs: spi2-miso-hs {
> +				rockchip,pins =
> +					<1 RK_PC6 3 &pcfg_pull_up_8ma>;
> +			};
> +
> +			spi2_mosi_hs: spi2-mosi-hs {
> +				rockchip,pins =
> +					<1 RK_PC7 3 &pcfg_pull_up_8ma>;
> +			};
> +		};
> +
> +		sdmmc {
> +			sdmmc_clk: sdmmc-clk {
> +				rockchip,pins =
> +					<4 RK_PD5 1 &pcfg_pull_none_4ma>;
> +			};
> +
> +			sdmmc_cmd: sdmmc-cmd {
> +				rockchip,pins =
> +					<4 RK_PD4 1 &pcfg_pull_up_4ma>;
> +			};
> +
> +			sdmmc_det: sdmmc-det {
> +				rockchip,pins =
> +					<0 RK_PA3 1 &pcfg_pull_up_4ma>;
> +			};
> +
> +			sdmmc_pwren: sdmmc-pwren {
> +				rockchip,pins =
> +					<4 RK_PD6 1 &pcfg_pull_none_4ma>;
> +			};
> +
> +			sdmmc_bus1: sdmmc-bus1 {
> +				rockchip,pins =
> +					<4 RK_PD0 1 &pcfg_pull_up_4ma>;
> +			};
> +
> +			sdmmc_bus4: sdmmc-bus4 {
> +				rockchip,pins =
> +					<4 RK_PD0 1 &pcfg_pull_up_4ma>,
> +					<4 RK_PD1 1 &pcfg_pull_up_4ma>,
> +					<4 RK_PD2 1 &pcfg_pull_up_4ma>,
> +					<4 RK_PD3 1 &pcfg_pull_up_4ma>;
> +			};
> +
> +			sdmmc_gpio: sdmmc-gpio {
> +				rockchip,pins =
> +					<4 RK_PD0 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PD1 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PD2 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PD3 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PD4 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PD5 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PD6 0 &pcfg_pull_up_4ma>;
> +			};
> +		};
> +
> +		sdio {
> +			sdio_clk: sdio-clk {
> +				rockchip,pins =
> +					<4 RK_PA5 1 &pcfg_pull_none_8ma>;
> +			};
> +
> +			sdio_cmd: sdio-cmd {
> +				rockchip,pins =
> +					<4 RK_PA4 1 &pcfg_pull_up_8ma>;
> +			};
> +
> +			sdio_pwren: sdio-pwren {
> +				rockchip,pins =
> +					<0 RK_PA2 1 &pcfg_pull_none_8ma>;
> +			};
> +
> +			sdio_wrpt: sdio-wrpt {
> +				rockchip,pins =
> +					<0 RK_PA1 1 &pcfg_pull_none_8ma>;
> +			};
> +
> +			sdio_intn: sdio-intn {
> +				rockchip,pins =
> +					<0 RK_PA0 1 &pcfg_pull_none_8ma>;
> +			};
> +
> +			sdio_bus1: sdio-bus1 {
> +				rockchip,pins =
> +					<4 RK_PA0 1 &pcfg_pull_up_8ma>;
> +			};
> +
> +			sdio_bus4: sdio-bus4 {
> +				rockchip,pins =
> +					<4 RK_PA0 1 &pcfg_pull_up_8ma>,
> +					<4 RK_PA1 1 &pcfg_pull_up_8ma>,
> +					<4 RK_PA2 1 &pcfg_pull_up_8ma>,
> +					<4 RK_PA3 1 &pcfg_pull_up_8ma>;
> +			};
> +
> +			sdio_gpio: sdio-gpio {
> +				rockchip,pins =
> +					<4 RK_PA0 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PA1 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PA2 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PA3 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PA4 0 &pcfg_pull_up_4ma>,
> +					<4 RK_PA5 0 &pcfg_pull_up_4ma>;
> +			};
> +		};
> +
> +		emmc {
> +			emmc_clk: emmc-clk {
> +				rockchip,pins =
> +					<3 RK_PB1 2 &pcfg_pull_none_8ma>;
> +			};
> +
> +			emmc_cmd: emmc-cmd {
> +				rockchip,pins =
> +					<3 RK_PB0 2 &pcfg_pull_up_8ma>;
> +			};
> +
> +			emmc_pwren: emmc-pwren {
> +				rockchip,pins =
> +					<3 RK_PB3 2 &pcfg_pull_none>;
> +			};
> +
> +			emmc_rstn: emmc-rstn {
> +				rockchip,pins =
> +					<3 RK_PB2 2 &pcfg_pull_none>;
> +			};
> +
> +			emmc_bus1: emmc-bus1 {
> +				rockchip,pins =
> +					<3 RK_PA0 2 &pcfg_pull_up_8ma>;
> +			};
> +
> +			emmc_bus4: emmc-bus4 {
> +				rockchip,pins =
> +					<3 RK_PA0 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA1 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA2 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA3 2 &pcfg_pull_up_8ma>;
> +			};
> +
> +			emmc_bus8: emmc-bus8 {
> +				rockchip,pins =
> +					<3 RK_PA0 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA1 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA2 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA3 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA4 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA5 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA6 2 &pcfg_pull_up_8ma>,
> +					<3 RK_PA7 2 &pcfg_pull_up_8ma>;
> +			};
> +		};
> +
> +		flash {
> +			flash_csn0: flash-csn0 {
> +				rockchip,pins =
> +					<3 RK_PB5 1 &pcfg_pull_none>;
> +			};
> +
> +			flash_rdy: flash-rdy {
> +				rockchip,pins =
> +					<3 RK_PB4 1 &pcfg_pull_none>;
> +			};
> +
> +			flash_ale: flash-ale {
> +				rockchip,pins =
> +					<3 RK_PB3 1 &pcfg_pull_none>;
> +			};
> +
> +			flash_cle: flash-cle {
> +				rockchip,pins =
> +					<3 RK_PB1 1 &pcfg_pull_none>;
> +			};
> +
> +			flash_wrn: flash-wrn {
> +				rockchip,pins =
> +					<3 RK_PB0 1 &pcfg_pull_none>;
> +			};
> +
> +			flash_rdn: flash-rdn {
> +				rockchip,pins =
> +					<3 RK_PB2 1 &pcfg_pull_none>;
> +			};
> +
> +			flash_bus8: flash-bus8 {
> +				rockchip,pins =
> +					<3 RK_PA0 1 &pcfg_pull_up_12ma>,
> +					<3 RK_PA1 1 &pcfg_pull_up_12ma>,
> +					<3 RK_PA2 1 &pcfg_pull_up_12ma>,
> +					<3 RK_PA3 1 &pcfg_pull_up_12ma>,
> +					<3 RK_PA4 1 &pcfg_pull_up_12ma>,
> +					<3 RK_PA5 1 &pcfg_pull_up_12ma>,
> +					<3 RK_PA6 1 &pcfg_pull_up_12ma>,
> +					<3 RK_PA7 1 &pcfg_pull_up_12ma>;
> +			};
> +		};
> +
> +		pwm0 {
> +			pwm0_pin: pwm0-pin {
> +				rockchip,pins =
> +					<0 RK_PB5 1 &pcfg_pull_none>;
> +			};
> +
> +			pwm0_pin_pull_down: pwm0-pin-pull-down {
> +				rockchip,pins =
> +					<0 RK_PB5 1 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm1 {
> +			pwm1_pin: pwm1-pin {
> +				rockchip,pins =
> +					<0 RK_PB6 1 &pcfg_pull_none>;
> +			};
> +
> +			pwm1_pin_pull_down: pwm1-pin-pull-down {
> +				rockchip,pins =
> +					<0 RK_PB6 1 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm2 {
> +			pwm2_pin: pwm2-pin {
> +				rockchip,pins =
> +					<0 RK_PB7 1 &pcfg_pull_none>;
> +			};
> +
> +			pwm2_pin_pull_down: pwm2-pin-pull-down {
> +				rockchip,pins =
> +					<0 RK_PB7 1 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm3 {
> +			pwm3_pin: pwm3-pin {
> +				rockchip,pins =
> +					<0 RK_PC0 1 &pcfg_pull_none>;
> +			};
> +
> +			pwm3_pin_pull_down: pwm3-pin-pull-down {
> +				rockchip,pins =
> +					<0 RK_PC0 1 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm4 {
> +			pwm4_pin: pwm4-pin {
> +				rockchip,pins =
> +					<0 RK_PA1 2 &pcfg_pull_none>;
> +			};
> +
> +			pwm4_pin_pull_down: pwm4-pin-pull-down {
> +				rockchip,pins =
> +					<0 RK_PA1 2 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm5 {
> +			pwm5_pin: pwm5-pin {
> +				rockchip,pins =
> +					<0 RK_PC1 2 &pcfg_pull_none>;
> +			};
> +
> +			pwm5_pin_pull_down: pwm5-pin-pull-down {
> +				rockchip,pins =
> +					<0 RK_PC1 2 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm6 {
> +			pwm6_pin: pwm6-pin {
> +				rockchip,pins =
> +					<0 RK_PC2 2 &pcfg_pull_none>;
> +			};
> +
> +			pwm6_pin_pull_down: pwm6-pin-pull-down {
> +				rockchip,pins =
> +					<0 RK_PC2 2 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm7 {
> +			pwm7_pin: pwm7-pin {
> +				rockchip,pins =
> +					<2 RK_PB0 2 &pcfg_pull_none>;
> +			};
> +
> +			pwm7_pin_pull_down: pwm7-pin-pull-down {
> +				rockchip,pins =
> +					<2 RK_PB0 2 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm8 {
> +			pwm8_pin: pwm8-pin {
> +				rockchip,pins =
> +					<2 RK_PB2 2 &pcfg_pull_none>;
> +			};
> +
> +			pwm8_pin_pull_down: pwm8-pin-pull-down {
> +				rockchip,pins =
> +					<2 RK_PB2 2 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm9 {
> +			pwm9_pin: pwm9-pin {
> +				rockchip,pins =
> +					<2 RK_PB3 2 &pcfg_pull_none>;
> +			};
> +
> +			pwm9_pin_pull_down: pwm9-pin-pull-down {
> +				rockchip,pins =
> +					<2 RK_PB3 2 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm10 {
> +			pwm10_pin: pwm10-pin {
> +				rockchip,pins =
> +					<2 RK_PB4 2 &pcfg_pull_none>;
> +			};
> +
> +			pwm10_pin_pull_down: pwm10-pin-pull-down {
> +				rockchip,pins =
> +					<2 RK_PB4 2 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		pwm11 {
> +			pwm11_pin: pwm11-pin {
> +				rockchip,pins =
> +					<2 RK_PC0 4 &pcfg_pull_none>;
> +			};
> +
> +			pwm11_pin_pull_down: pwm11-pin-pull-down {
> +				rockchip,pins =
> +					<2 RK_PC0 4 &pcfg_pull_down>;
> +			};
> +		};
> +
> +		gmac {
> +			rmii_pins: rmii-pins {
> +				rockchip,pins =
> +					/* mac_txen */
> +					<1 RK_PC1 3 &pcfg_pull_none_12ma>,
> +					/* mac_txd1 */
> +					<1 RK_PC3 3 &pcfg_pull_none_12ma>,
> +					/* mac_txd0 */
> +					<1 RK_PC2 3 &pcfg_pull_none_12ma>,
> +					/* mac_rxd0 */
> +					<1 RK_PC4 3 &pcfg_pull_none>,
> +					/* mac_rxd1 */
> +					<1 RK_PC5 3 &pcfg_pull_none>,
> +					/* mac_rxer */
> +					<1 RK_PB7 3 &pcfg_pull_none>,
> +					/* mac_rxdv */
> +					<1 RK_PC0 3 &pcfg_pull_none>,
> +					/* mac_mdio */
> +					<1 RK_PB6 3 &pcfg_pull_none>,
> +					/* mac_mdc */
> +					<1 RK_PB5 3 &pcfg_pull_none>;
> +			};
> +
> +			mac_refclk_12ma: mac-refclk-12ma {
> +				rockchip,pins =
> +					<1 RK_PB4 3 &pcfg_pull_none_12ma>;
> +			};
> +
> +			mac_refclk: mac-refclk {
> +				rockchip,pins =
> +					<1 RK_PB4 3 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		gmac-m1 {
> +			rmiim1_pins: rmiim1-pins {
> +				rockchip,pins =
> +					/* mac_txen */
> +					<4 RK_PB7 2 &pcfg_pull_none_12ma>,
> +					/* mac_txd1 */
> +					<4 RK_PA5 2 &pcfg_pull_none_12ma>,
> +					/* mac_txd0 */
> +					<4 RK_PA4 2 &pcfg_pull_none_12ma>,
> +					/* mac_rxd0 */
> +					<4 RK_PA2 2 &pcfg_pull_none>,
> +					/* mac_rxd1 */
> +					<4 RK_PA3 2 &pcfg_pull_none>,
> +					/* mac_rxer */
> +					<4 RK_PA0 2 &pcfg_pull_none>,
> +					/* mac_rxdv */
> +					<4 RK_PA1 2 &pcfg_pull_none>,
> +					/* mac_mdio */
> +					<4 RK_PB6 2 &pcfg_pull_none>,
> +					/* mac_mdc */
> +					<4 RK_PB5 2 &pcfg_pull_none>;
> +			};
> +
> +			macm1_refclk_12ma: macm1-refclk-12ma {
> +				rockchip,pins =
> +					<4 RK_PB4 2 &pcfg_pull_none_12ma>;
> +			};
> +
> +			macm1_refclk: macm1-refclk {
> +				rockchip,pins =
> +					<4 RK_PB4 2 &pcfg_pull_none>;
> +			};
> +		};
> +
> +		rtc {
> +			rtc_32k: rtc-32k {
> +				rockchip,pins =
> +					<0 RK_PC3 1 &pcfg_pull_none>;
> +			};
> +		};
> +
> +	};
> +};

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

* [U-Boot] [PATCH v2 4/9] board: rockchip: Add rk3308 evb support
  2019-10-30  8:11 ` [U-Boot] [PATCH v2 4/9] board: rockchip: Add rk3308 evb support Andy Yan
@ 2019-11-07  9:33   ` Kever Yang
  0 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-07  9:33 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:11, Andy Yan wrote:
> Add support for rk3308 evaluation board.
>
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

Reviewed-by: Kever Yang<kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
>
> Changes in v2: None
>
>   arch/arm/mach-rockchip/rk3308/Kconfig  |  8 +++
>   board/rockchip/evb_rk3308/Kconfig      | 15 +++++
>   board/rockchip/evb_rk3308/MAINTAINERS  |  6 ++
>   board/rockchip/evb_rk3308/Makefile     |  7 +++
>   board/rockchip/evb_rk3308/evb_rk3308.c | 44 +++++++++++++++
>   configs/evb-rk3308_defconfig           | 77 ++++++++++++++++++++++++++
>   include/configs/evb_rk3308.h           | 20 +++++++
>   7 files changed, 177 insertions(+)
>   create mode 100644 board/rockchip/evb_rk3308/Kconfig
>   create mode 100644 board/rockchip/evb_rk3308/MAINTAINERS
>   create mode 100644 board/rockchip/evb_rk3308/Makefile
>   create mode 100644 board/rockchip/evb_rk3308/evb_rk3308.c
>   create mode 100644 configs/evb-rk3308_defconfig
>   create mode 100644 include/configs/evb_rk3308.h
>
> diff --git a/arch/arm/mach-rockchip/rk3308/Kconfig b/arch/arm/mach-rockchip/rk3308/Kconfig
> index 9c09661595..c74d1fc7f1 100644
> --- a/arch/arm/mach-rockchip/rk3308/Kconfig
> +++ b/arch/arm/mach-rockchip/rk3308/Kconfig
> @@ -1,5 +1,9 @@
>   if ROCKCHIP_RK3308
>   
> +config TARGET_EVB_RK3308
> +	bool "EVB_RK3308"
> +	select BOARD_LATE_INIT
> +
>   config SYS_SOC
>   	default "rk3308"
>   
> @@ -11,4 +15,8 @@ config SPL_SERIAL_SUPPORT
>   
>   config ROCKCHIP_BOOT_MODE_REG
>   	default 0xff000500
> +
> +
> +source "board/rockchip/evb_rk3308/Kconfig"
> +
>   endif
> diff --git a/board/rockchip/evb_rk3308/Kconfig b/board/rockchip/evb_rk3308/Kconfig
> new file mode 100644
> index 0000000000..0074429cb6
> --- /dev/null
> +++ b/board/rockchip/evb_rk3308/Kconfig
> @@ -0,0 +1,15 @@
> +if TARGET_EVB_RK3308
> +
> +config SYS_BOARD
> +	default "evb_rk3308"
> +
> +config SYS_VENDOR
> +	default "rockchip"
> +
> +config SYS_CONFIG_NAME
> +	default "evb_rk3308"
> +
> +config BOARD_SPECIFIC_OPTIONS # dummy
> +	def_bool y
> +
> +endif
> diff --git a/board/rockchip/evb_rk3308/MAINTAINERS b/board/rockchip/evb_rk3308/MAINTAINERS
> new file mode 100644
> index 0000000000..0af119ae0a
> --- /dev/null
> +++ b/board/rockchip/evb_rk3308/MAINTAINERS
> @@ -0,0 +1,6 @@
> +EVB-RK3308
> +M:      Andy Yan <andy.yan@rock-chips.com>
> +S:      Maintained
> +F:      board/rockchip/evb_rk3308
> +F:      include/configs/evb_rk3308.h
> +F:      configs/evb-rk3308_defconfig
> diff --git a/board/rockchip/evb_rk3308/Makefile b/board/rockchip/evb_rk3308/Makefile
> new file mode 100644
> index 0000000000..05de5560f1
> --- /dev/null
> +++ b/board/rockchip/evb_rk3308/Makefile
> @@ -0,0 +1,7 @@
> +#
> +# (C) Copyright 2018 Rockchip Electronics Co., Ltd
> +#
> +# SPDX-License-Identifier:     GPL-2.0+
> +#
> +
> +obj-y	+= evb_rk3308.o
> diff --git a/board/rockchip/evb_rk3308/evb_rk3308.c b/board/rockchip/evb_rk3308/evb_rk3308.c
> new file mode 100644
> index 0000000000..180f1fe4f0
> --- /dev/null
> +++ b/board/rockchip/evb_rk3308/evb_rk3308.c
> @@ -0,0 +1,44 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2018 Rockchip Electronics Co., Ltd
> + */
> +
> +#include <common.h>
> +#include <adc.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define KEY_DOWN_MIN_VAL        0
> +#define KEY_DOWN_MAX_VAL        30
> +
> +/*
> + * Two board variants whith adc channel 3 is for board id
> + * v10: 1024, v11: 512
> + * v10: adc channel 0 for dnl key
> + * v11: adc channel 1 for dnl key
> + */
> +int rockchip_dnl_key_pressed(void)
> +{
> +	unsigned int key_val, id_val;
> +	int key_ch;
> +
> +	if (adc_channel_single_shot("saradc", 3, &id_val)) {
> +		printf("%s read board id failed\n", __func__);
> +		return false;
> +	}
> +
> +	if (abs(id_val - 1024) <= 30)
> +		key_ch = 0;
> +	else
> +		key_ch = 1;
> +
> +	if (adc_channel_single_shot("saradc", key_ch, &key_val)) {
> +		printf("%s read adc key val failed\n", __func__);
> +		return false;
> +	}
> +
> +	if (key_val >= KEY_DOWN_MIN_VAL && key_val <= KEY_DOWN_MAX_VAL)
> +		return true;
> +	else
> +		return false;
> +}
> diff --git a/configs/evb-rk3308_defconfig b/configs/evb-rk3308_defconfig
> new file mode 100644
> index 0000000000..36d30dfa80
> --- /dev/null
> +++ b/configs/evb-rk3308_defconfig
> @@ -0,0 +1,77 @@
> +CONFIG_ARM=y
> +CONFIG_ARCH_ROCKCHIP=y
> +CONFIG_SYS_TEXT_BASE=0x00600000
> +CONFIG_SPL_LIBCOMMON_SUPPORT=y
> +CONFIG_SPL_LIBGENERIC_SUPPORT=y
> +CONFIG_SYS_MALLOC_F_LEN=0x2000
> +CONFIG_ROCKCHIP_RK3308=y
> +CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
> +CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
> +CONFIG_TARGET_EVB_RK3308=y
> +CONFIG_SPL_STACK_R_ADDR=0xc00000
> +CONFIG_DEBUG_UART_BASE=0xFF0C0000
> +CONFIG_DEBUG_UART_CLOCK=24000000
> +CONFIG_DEBUG_UART=y
> +CONFIG_ANDROID_BOOT_IMAGE=y
> +CONFIG_FIT=y
> +CONFIG_FIT_VERBOSE=y
> +CONFIG_BOOTDELAY=0
> +CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +# CONFIG_DISPLAY_CPUINFO is not set
> +CONFIG_SPL_STACK_R=y
> +# CONFIG_CMD_BDI is not set
> +# CONFIG_CMD_CONSOLE is not set
> +# CONFIG_CMD_ELF is not set
> +# CONFIG_CMD_IMI is not set
> +# CONFIG_CMD_XIMG is not set
> +# CONFIG_CMD_FLASH is not set
> +CONFIG_CMD_GPT=y
> +# CONFIG_CMD_LOADB is not set
> +# CONFIG_CMD_LOADS is not set
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_USB=y
> +CONFIG_CMD_USB_MASS_STORAGE=y
> +# CONFIG_CMD_ITEST is not set
> +# CONFIG_CMD_SETEXPR is not set
> +# CONFIG_CMD_MISC is not set
> +# CONFIG_DOS_PARTITION is not set
> +# CONFIG_ISO_PARTITION is not set
> +CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
> +CONFIG_SPL_OF_CONTROL=y
> +CONFIG_OF_LIVE=y
> +CONFIG_DEFAULT_DEVICE_TREE="rk3308-evb"
> +CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
> +CONFIG_REGMAP=y
> +CONFIG_SYSCON=y
> +CONFIG_CLK=y
> +# CONFIG_USB_FUNCTION_FASTBOOT is not set
> +CONFIG_ROCKCHIP_GPIO=y
> +CONFIG_SYS_I2C_ROCKCHIP=y
> +CONFIG_MMC_DW=y
> +CONFIG_MMC_DW_ROCKCHIP=y
> +CONFIG_DM_ETH=y
> +CONFIG_ETH_DESIGNWARE=y
> +CONFIG_GMAC_ROCKCHIP=y
> +CONFIG_PHY=y
> +CONFIG_PINCTRL=y
> +CONFIG_REGULATOR_PWM=y
> +CONFIG_DM_REGULATOR_FIXED=y
> +CONFIG_PWM_ROCKCHIP=y
> +CONFIG_RAM=y
> +CONFIG_DM_RESET=y
> +CONFIG_BAUDRATE=1500000
> +CONFIG_DEBUG_UART_SHIFT=2
> +CONFIG_DEBUG_UART_SKIP_INIT=y
> +CONFIG_SYSRESET=y
> +CONFIG_USB=y
> +CONFIG_USB_EHCI_HCD=y
> +CONFIG_USB_EHCI_GENERIC=y
> +CONFIG_USB_DWC2=y
> +CONFIG_USB_GADGET=y
> +CONFIG_USB_GADGET_DWC2_OTG=y
> +CONFIG_USB_GADGET_DOWNLOAD=y
> +CONFIG_SPL_TINY_MEMSET=y
> +CONFIG_LZ4=y
> +CONFIG_LZO=y
> +CONFIG_ERRNO_STR=y
> +# CONFIG_EFI_LOADER is not set
> diff --git a/include/configs/evb_rk3308.h b/include/configs/evb_rk3308.h
> new file mode 100644
> index 0000000000..fb027c7270
> --- /dev/null
> +++ b/include/configs/evb_rk3308.h
> @@ -0,0 +1,20 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2018 Rockchip Electronics Co., Ltd
> + */
> +
> +#ifndef __EVB_RK3308_H
> +#define __EVB_RK3308_H
> +
> +#include <configs/rk3308_common.h>
> +
> +#define CONFIG_SUPPORT_EMMC_RPMB
> +#define CONFIG_SYS_MMC_ENV_DEV 0
> +
> +#define ROCKCHIP_DEVICE_SETTINGS \
> +			"stdout=serial,vidconsole\0" \
> +			"stderr=serial,vidconsole\0"
> +#undef CONFIG_CONSOLE_SCROLL_LINES
> +#define CONFIG_CONSOLE_SCROLL_LINES            10
> +
> +#endif

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

* [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver
  2019-10-30  8:16 ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Andy Yan
                     ` (3 preceding siblings ...)
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 9/9] doc: rockchip: Add documentation for rk3308 based boards Andy Yan
@ 2019-11-07  9:34   ` Kever Yang
  4 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-07  9:34 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:16, Andy Yan wrote:
> A dm based dram driver for rk3308 u-boot
> to get capacity.
>
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

Reviewed-by: Kever Yang<kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
>
> Changes in v2: None
>
>   drivers/ram/rockchip/Makefile       |  1 +
>   drivers/ram/rockchip/sdram_rk3308.c | 55 +++++++++++++++++++++++++++++
>   2 files changed, 56 insertions(+)
>   create mode 100644 drivers/ram/rockchip/sdram_rk3308.c
>
> diff --git a/drivers/ram/rockchip/Makefile b/drivers/ram/rockchip/Makefile
> index feb1f82d00..1adca32dcb 100644
> --- a/drivers/ram/rockchip/Makefile
> +++ b/drivers/ram/rockchip/Makefile
> @@ -9,5 +9,6 @@ obj-$(CONFIG_ROCKCHIP_RK3128) = sdram_rk3128.o
>   obj-$(CONFIG_ROCKCHIP_RK3188) = sdram_rk3188.o
>   obj-$(CONFIG_ROCKCHIP_RK322X) = sdram_rk322x.o
>   obj-$(CONFIG_ROCKCHIP_RK3288) = sdram_rk3288.o
> +obj-$(CONFIG_ROCKCHIP_RK3308) = sdram_rk3308.o
>   obj-$(CONFIG_ROCKCHIP_RK3328) = sdram_rk3328.o
>   obj-$(CONFIG_RAM_RK3399) += sdram_rk3399.o
> diff --git a/drivers/ram/rockchip/sdram_rk3308.c b/drivers/ram/rockchip/sdram_rk3308.c
> new file mode 100644
> index 0000000000..43d44cce62
> --- /dev/null
> +++ b/drivers/ram/rockchip/sdram_rk3308.c
> @@ -0,0 +1,55 @@
> +// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
> +/*
> + * (C) Copyright 2019 Rockchip Electronics Co., Ltd.
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <ram.h>
> +#include <syscon.h>
> +#include <asm/arch/grf_rk3308.h>
> +#include <asm/arch-rockchip/clock.h>
> +#include <asm/arch-rockchip/sdram_common.h>
> +
> +struct dram_info {
> +	struct ram_info info;
> +	struct rk3308_grf *grf;
> +};
> +
> +static int rk3308_dmc_probe(struct udevice *dev)
> +{
> +	struct dram_info *priv = dev_get_priv(dev);
> +
> +	priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
> +	priv->info.base = CONFIG_SYS_SDRAM_BASE;
> +	priv->info.size = rockchip_sdram_size((phys_addr_t)&priv->grf->os_reg2);
> +
> +	return 0;
> +}
> +
> +static int rk3308_dmc_get_info(struct udevice *dev, struct ram_info *info)
> +{
> +	struct dram_info *priv = dev_get_priv(dev);
> +
> +	*info = priv->info;
> +
> +	return 0;
> +}
> +
> +static struct ram_ops rk3308_dmc_ops = {
> +	.get_info = rk3308_dmc_get_info,
> +};
> +
> +static const struct udevice_id rk3308_dmc_ids[] = {
> +	{ .compatible = "rockchip,rk3308-dmc" },
> +	{ }
> +};
> +
> +U_BOOT_DRIVER(dmc_rk3308) = {
> +	.name = "rockchip_rk3308_dmc",
> +	.id = UCLASS_RAM,
> +	.of_match = rk3308_dmc_ids,
> +	.ops = &rk3308_dmc_ops,
> +	.probe = rk3308_dmc_probe,
> +	.priv_auto_alloc_size = sizeof(struct dram_info),
> +};

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

* [U-Boot] [PATCH v2 6/9] rockchip: mkimage: add support for RK3308
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 6/9] rockchip: mkimage: add support for RK3308 Andy Yan
@ 2019-11-07  9:34     ` Kever Yang
  0 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-07  9:34 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:16, Andy Yan wrote:
> Usage:
>
>   (1) tools/mkimage -n rk3308 -T rksd -d tpl/u-boot-tpl.bin idbloader.img
>   (2) cat spl/u-boot-spl.bin >> idbloader.img
>   (3) upgrade_tool wl 0x40 idbloader.img
>
> Note:
>    When use a ddr binary from rkbin as tpl, use it replace u-boot-tpl.bin in (1)
>
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

Reviewed-by: Kever Yang<kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
>
> Changes in v2: None
>
>   tools/rkcommon.c | 1 +
>   1 file changed, 1 insertion(+)
>
> diff --git a/tools/rkcommon.c b/tools/rkcommon.c
> index 831c2ad820..a16f83c1ef 100644
> --- a/tools/rkcommon.c
> +++ b/tools/rkcommon.c
> @@ -72,6 +72,7 @@ static struct spl_info spl_infos[] = {
>   	{ "rk3188", "RK31", 0x8000 - 0x800, true },
>   	{ "rk322x", "RK32", 0x8000 - 0x1000, false },
>   	{ "rk3288", "RK32", 0x8000, false },
> +	{ "rk3308", "RK33", 0x40000 - 0x1000, false},
>   	{ "rk3328", "RK32", 0x8000 - 0x1000, false },
>   	{ "rk3368", "RK33", 0x8000 - 0x1000, false },
>   	{ "rk3399", "RK33", 0x30000 - 0x2000, false },

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

* [U-Boot] [PATCH v2 8/9] rockchip: rk3308: Add support for ROC-RK3308-CC board
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 8/9] rockchip: rk3308: Add support for ROC-RK3308-CC board Andy Yan
@ 2019-11-07  9:38     ` Kever Yang
  0 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-07  9:38 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:16, Andy Yan wrote:
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

Please add commit message.


> ---
>
> Changes in v2:
> - Add board ROC-rk3308-CC
>
>   arch/arm/mach-rockchip/rk3308/Kconfig        |  5 ++
>   board/firefly/firefly-rk3308/Kconfig         | 15 ++++
>   board/firefly/firefly-rk3308/MAINTAINERS     |  5 ++
>   board/firefly/firefly-rk3308/Makefile        |  7 ++
>   board/firefly/firefly-rk3308/roc_rk3308_cc.c | 82 ++++++++++++++++++++
>   configs/roc-rk3308-cc_defconfig              | 77 ++++++++++++++++++
>   6 files changed, 191 insertions(+)
>   create mode 100644 board/firefly/firefly-rk3308/Kconfig
>   create mode 100644 board/firefly/firefly-rk3308/MAINTAINERS
>   create mode 100644 board/firefly/firefly-rk3308/Makefile
>   create mode 100644 board/firefly/firefly-rk3308/roc_rk3308_cc.c
>   create mode 100644 configs/roc-rk3308-cc_defconfig
>
> diff --git a/arch/arm/mach-rockchip/rk3308/Kconfig b/arch/arm/mach-rockchip/rk3308/Kconfig
> index c74d1fc7f1..b9fdfe2e95 100644
> --- a/arch/arm/mach-rockchip/rk3308/Kconfig
> +++ b/arch/arm/mach-rockchip/rk3308/Kconfig
> @@ -4,6 +4,10 @@ config TARGET_EVB_RK3308
>   	bool "EVB_RK3308"
>   	select BOARD_LATE_INIT
>   
> +config TARGET_ROC_RK3308_CC
> +       bool "Firefly roc-rk3308-cc"
> +	select BOARD_LATE_INIT
> +
>   config SYS_SOC
>   	default "rk3308"
>   
> @@ -18,5 +22,6 @@ config ROCKCHIP_BOOT_MODE_REG
>   
>   
>   source "board/rockchip/evb_rk3308/Kconfig"
> +source "board/firefly/firefly-rk3308/Kconfig"
>   
>   endif
> diff --git a/board/firefly/firefly-rk3308/Kconfig b/board/firefly/firefly-rk3308/Kconfig
> new file mode 100644
> index 0000000000..7d4d189e54
> --- /dev/null
> +++ b/board/firefly/firefly-rk3308/Kconfig
> @@ -0,0 +1,15 @@
> +if TARGET_ROC_RK3308_CC
> +
> +config SYS_BOARD
> +	default "firefly-rk3308"
roc-rk3308-cc?
> +
> +config SYS_VENDOR
> +	default "firefly"
> +
> +config SYS_CONFIG_NAME
> +	default "evb_rk3308"

This can update to firefly-rk3308?


Thanks,

- Kever

> +
> +config BOARD_SPECIFIC_OPTIONS # dummy
> +	def_bool y
> +
> +endif
> diff --git a/board/firefly/firefly-rk3308/MAINTAINERS b/board/firefly/firefly-rk3308/MAINTAINERS
> new file mode 100644
> index 0000000000..8670d8c6a8
> --- /dev/null
> +++ b/board/firefly/firefly-rk3308/MAINTAINERS
> @@ -0,0 +1,5 @@
> +ROC-RK3308-CC
> +M:      Andy Yan <andy.yan@rock-chips.com>
> +S:      Maintained
> +F:      board/firefly/firefly-rk3308/roc_rk3308_cc.c
> +F:      configs/roc-rk3308-cc_defconfig
> diff --git a/board/firefly/firefly-rk3308/Makefile b/board/firefly/firefly-rk3308/Makefile
> new file mode 100644
> index 0000000000..587d2e6f44
> --- /dev/null
> +++ b/board/firefly/firefly-rk3308/Makefile
> @@ -0,0 +1,7 @@
> +#
> +# (C) Copyright 2018 Rockchip Electronics Co., Ltd
> +#
> +# SPDX-License-Identifier:     GPL-2.0+
> +#
> +
> +obj-y	+= roc_rk3308_cc.o
> diff --git a/board/firefly/firefly-rk3308/roc_rk3308_cc.c b/board/firefly/firefly-rk3308/roc_rk3308_cc.c
> new file mode 100644
> index 0000000000..1deaa39516
> --- /dev/null
> +++ b/board/firefly/firefly-rk3308/roc_rk3308_cc.c
> @@ -0,0 +1,82 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2019 Rockchip Electronics Co., Ltd
> + */
> +
> +#include <common.h>
> +#include <adc.h>
> +#include <asm/io.h>
> +#include <asm/arch/grf_rk3308.h>
> +#include <asm/arch-rockchip/hardware.h>
> +
> +#if defined(CONFIG_DEBUG_UART)
> +#define GRF_BASE	0xff000000
> +
> +enum {
> +	GPIO1C7_SHIFT		= 8,
> +	GPIO1C7_MASK		= GENMASK(11, 8),
> +	GPIO1C7_GPIO		= 0,
> +	GPIO1C7_UART1_RTSN,
> +	GPIO1C7_UART2_TX_M0,
> +	GPIO1C7_SPI2_MOSI,
> +	GPIO1C7_JTAG_TMS,
> +
> +	GPIO1C6_SHIFT		= 4,
> +	GPIO1C6_MASK		= GENMASK(7, 4),
> +	GPIO1C6_GPIO		= 0,
> +	GPIO1C6_UART1_CTSN,
> +	GPIO1C6_UART2_RX_M0,
> +	GPIO1C6_SPI2_MISO,
> +	GPIO1C6_JTAG_TCLK,
> +
> +	GPIO4D3_SHIFT           = 6,
> +	GPIO4D3_MASK            = GENMASK(7, 6),
> +	GPIO4D3_GPIO            = 0,
> +	GPIO4D3_SDMMC_D3,
> +	GPIO4D3_UART2_TX_M1,
> +
> +	GPIO4D2_SHIFT           = 4,
> +	GPIO4D2_MASK            = GENMASK(5, 4),
> +	GPIO4D2_GPIO            = 0,
> +	GPIO4D2_SDMMC_D2,
> +	GPIO4D2_UART2_RX_M1,
> +
> +	UART2_IO_SEL_SHIFT	= 2,
> +	UART2_IO_SEL_MASK	= GENMASK(3, 2),
> +	UART2_IO_SEL_M0		= 0,
> +	UART2_IO_SEL_M1,
> +	UART2_IO_SEL_USB,
> +};
> +
> +void board_debug_uart_init(void)
> +{
> +	static struct rk3308_grf * const grf = (void *)GRF_BASE;
> +
> +	/* Enable early UART2 channel m0 on the rk3308 */
> +	rk_clrsetreg(&grf->soc_con5, UART2_IO_SEL_MASK,
> +		     UART2_IO_SEL_M0 << UART2_IO_SEL_SHIFT);
> +	rk_clrsetreg(&grf->gpio1ch_iomux,
> +		     GPIO1C6_MASK | GPIO1C7_MASK,
> +		     GPIO1C6_UART2_RX_M0 << GPIO1C6_SHIFT |
> +		     GPIO1C7_UART2_TX_M0 << GPIO1C7_SHIFT);
> +}
> +#endif
> +
> +#define KEY_DOWN_MIN_VAL        0
> +#define KEY_DOWN_MAX_VAL        30
> +
> +int rockchip_dnl_key_pressed(void)
> +{
> +	unsigned int val;
> +
> +
> +	if (adc_channel_single_shot("saradc", 1, &val)) {
> +		printf("%s read adc key val failed\n", __func__);
> +		return false;
> +	}
> +
> +	if (val >= KEY_DOWN_MIN_VAL && val <= KEY_DOWN_MAX_VAL)
> +		return true;
> +	else
> +		return false;
> +}
> diff --git a/configs/roc-rk3308-cc_defconfig b/configs/roc-rk3308-cc_defconfig
> new file mode 100644
> index 0000000000..82ebe6a786
> --- /dev/null
> +++ b/configs/roc-rk3308-cc_defconfig
> @@ -0,0 +1,77 @@
> +CONFIG_ARM=y
> +CONFIG_ARCH_ROCKCHIP=y
> +CONFIG_SYS_TEXT_BASE=0x00600000
> +CONFIG_SPL_LIBCOMMON_SUPPORT=y
> +CONFIG_SPL_LIBGENERIC_SUPPORT=y
> +CONFIG_SYS_MALLOC_F_LEN=0x2000
> +CONFIG_ROCKCHIP_RK3308=y
> +CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
> +CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
> +CONFIG_TARGET_ROC_RK3308_CC=y
> +CONFIG_SPL_STACK_R_ADDR=0xc00000
> +CONFIG_DEBUG_UART_BASE=0xFF0C0000
> +CONFIG_DEBUG_UART_CLOCK=24000000
> +CONFIG_DEBUG_UART=y
> +CONFIG_ANDROID_BOOT_IMAGE=y
> +CONFIG_FIT=y
> +CONFIG_FIT_VERBOSE=y
> +CONFIG_BOOTDELAY=0
> +CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +# CONFIG_DISPLAY_CPUINFO is not set
> +CONFIG_SPL_STACK_R=y
> +# CONFIG_CMD_BDI is not set
> +# CONFIG_CMD_CONSOLE is not set
> +# CONFIG_CMD_ELF is not set
> +# CONFIG_CMD_IMI is not set
> +# CONFIG_CMD_XIMG is not set
> +# CONFIG_CMD_FLASH is not set
> +CONFIG_CMD_GPT=y
> +# CONFIG_CMD_LOADB is not set
> +# CONFIG_CMD_LOADS is not set
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_USB=y
> +CONFIG_CMD_USB_MASS_STORAGE=y
> +# CONFIG_CMD_ITEST is not set
> +# CONFIG_CMD_SETEXPR is not set
> +# CONFIG_CMD_MISC is not set
> +# CONFIG_DOS_PARTITION is not set
> +# CONFIG_ISO_PARTITION is not set
> +CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
> +CONFIG_SPL_OF_CONTROL=y
> +CONFIG_OF_LIVE=y
> +CONFIG_DEFAULT_DEVICE_TREE="rk3308-roc-cc"
> +CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
> +CONFIG_REGMAP=y
> +CONFIG_SYSCON=y
> +CONFIG_CLK=y
> +# CONFIG_USB_FUNCTION_FASTBOOT is not set
> +CONFIG_ROCKCHIP_GPIO=y
> +CONFIG_SYS_I2C_ROCKCHIP=y
> +CONFIG_MMC_DW=y
> +CONFIG_MMC_DW_ROCKCHIP=y
> +CONFIG_DM_ETH=y
> +CONFIG_ETH_DESIGNWARE=y
> +CONFIG_GMAC_ROCKCHIP=y
> +CONFIG_PHY=y
> +CONFIG_PINCTRL=y
> +CONFIG_REGULATOR_PWM=y
> +CONFIG_DM_REGULATOR_FIXED=y
> +CONFIG_PWM_ROCKCHIP=y
> +CONFIG_RAM=y
> +CONFIG_DM_RESET=y
> +CONFIG_BAUDRATE=1500000
> +CONFIG_DEBUG_UART_SHIFT=2
> +CONFIG_DEBUG_UART_SKIP_INIT=y
> +CONFIG_SYSRESET=y
> +CONFIG_USB=y
> +CONFIG_USB_EHCI_HCD=y
> +CONFIG_USB_EHCI_GENERIC=y
> +CONFIG_USB_DWC2=y
> +CONFIG_USB_GADGET=y
> +CONFIG_USB_GADGET_DWC2_OTG=y
> +CONFIG_USB_GADGET_DOWNLOAD=y
> +CONFIG_SPL_TINY_MEMSET=y
> +CONFIG_LZ4=y
> +CONFIG_LZO=y
> +CONFIG_ERRNO_STR=y
> +# CONFIG_EFI_LOADER is not set

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

* [U-Boot] [PATCH v2 7/9] rockchip: rk3308: Add dts for ROC-RK3308-CC
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 7/9] rockchip: rk3308: Add dts for ROC-RK3308-CC Andy Yan
@ 2019-11-07  9:39     ` Kever Yang
  0 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-07  9:39 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:16, Andy Yan wrote:
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

Please add commit message for patch.


Thanks,

- Kever

> ---
>
> Changes in v2: None
>
>   arch/arm/dts/Makefile                  |   3 +-
>   arch/arm/dts/rk3308-roc-cc-u-boot.dtsi |  17 +++
>   arch/arm/dts/rk3308-roc-cc.dts         | 190 +++++++++++++++++++++++++
>   3 files changed, 209 insertions(+), 1 deletion(-)
>   create mode 100644 arch/arm/dts/rk3308-roc-cc-u-boot.dtsi
>   create mode 100644 arch/arm/dts/rk3308-roc-cc.dts
>
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> index 95538b117e..1cb10b5613 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -94,7 +94,8 @@ dtb-$(CONFIG_ROCKCHIP_RK3288) += \
>   	rk3288-vyasa.dtb
>   
>   dtb-$(CONFIG_ROCKCHIP_RK3308) += \
> -	rk3308-evb.dtb
> +	rk3308-evb.dtb \
> +	rk3308-roc-cc.dtb
>   
>   dtb-$(CONFIG_ROCKCHIP_RK3328) += \
>   	rk3328-evb.dtb \
> diff --git a/arch/arm/dts/rk3308-roc-cc-u-boot.dtsi b/arch/arm/dts/rk3308-roc-cc-u-boot.dtsi
> new file mode 100644
> index 0000000000..ffbe742053
> --- /dev/null
> +++ b/arch/arm/dts/rk3308-roc-cc-u-boot.dtsi
> @@ -0,0 +1,17 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2018-2019 Rockchip Electronics Co., Ltd
> + */
> +#include "rk3308-u-boot.dtsi"
> +
> +/ {
> +	chosen {
> +		u-boot,spl-boot-order = "same-as-spl", &emmc;
> +	};
> +};
> +
> +&uart2 {
> +	u-boot,dm-pre-reloc;
> +	clock-frequency = <24000000>;
> +	status = "okay";
> +};
> diff --git a/arch/arm/dts/rk3308-roc-cc.dts b/arch/arm/dts/rk3308-roc-cc.dts
> new file mode 100644
> index 0000000000..e10aa638a3
> --- /dev/null
> +++ b/arch/arm/dts/rk3308-roc-cc.dts
> @@ -0,0 +1,190 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +/*
> + * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
> + */
> +
> +/dts-v1/;
> +#include "rk3308.dtsi"
> +
> +/ {
> +	model = "Firefly ROC-RK3308-CC board";
> +	compatible = "firefly,roc-rk3308-cc", "rockchip,rk3308";
> +	chosen {
> +		stdout-path = "serial2:1500000n8";
> +	};
> +
> +	ir_rx {
> +		compatible = "gpio-ir-receiver";
> +		gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&ir_recv_pin>;
> +	};
> +
> +	ir_tx {
> +		compatible = "pwm-ir-tx";
> +		pwms = <&pwm5 0 25000 0>;
> +	};
> +
> +	leds {
> +		compatible = "gpio-leds";
> +		power {
> +			label = "firefly:red:power";
> +			linux,default-trigger = "ir-power-click";
> +			default-state = "on";
> +			gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
> +		};
> +
> +		user {
> +			label = "firefly:blue:user";
> +			linux,default-trigger = "ir-user-click";
> +			default-state = "off";
> +			gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>;
> +		};
> +	};
> +
> +	typec_vcc5v: typec-vcc5v {
> +		compatible = "regulator-fixed";
> +		regulator-name = "typec_vcc5v";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <5000000>;
> +		regulator-max-microvolt = <5000000>;
> +	};
> +
> +	vcc5v0_sys: vcc5v0-sys {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vcc5v0_sys";
> +		regulator-min-microvolt = <5000000>;
> +		regulator-max-microvolt = <5000000>;
> +		regulator-always-on;
> +		regulator-boot-on;
> +		vin-supply = <&typec_vcc5v>;
> +	};
> +
> +	vdd_core: vdd-core {
> +		compatible = "pwm-regulator";
> +		pwms = <&pwm0 0 5000 1>;
> +		regulator-name = "vdd_core";
> +		regulator-min-microvolt = <827000>;
> +		regulator-max-microvolt = <1340000>;
> +		regulator-init-microvolt = <1015000>;
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-settling-time-up-us = <250>;
> +		pwm-supply = <&vcc5v0_sys>;
> +	};
> +
> +	vdd_log: vdd-log {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vdd_log";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <1050000>;
> +		regulator-max-microvolt = <1050000>;
> +		vin-supply = <&vcc5v0_sys>;
> +	};
> +
> +	vcc_io: vcc-io {
> +		compatible = "regulator-fixed";
> +		regulator-name = "vcc_io";
> +		regulator-min-microvolt = <3300000>;
> +		regulator-max-microvolt = <3300000>;
> +		regulator-always-on;
> +		regulator-boot-on;
> +		vin-supply = <&vcc5v0_sys>;
> +	};
> +
> +	vcc_sdmmc: vcc-sdmmc {
> +		compatible = "regulator-gpio";
> +		regulator-name = "vcc_sdmmc";
> +		regulator-min-microvolt = <1800000>;
> +		regulator-max-microvolt = <3300000>;
> +		gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_HIGH>;
> +		states = <1800000 0x0
> +			  3300000 0x1>;
> +		vin-supply = <&vcc5v0_sys>;
> +	};
> +
> +	vcc_sd: vcc-sd {
> +		compatible = "regulator-fixed";
> +		gpio = <&gpio4 RK_PD6 GPIO_ACTIVE_LOW>;
> +		regulator-name = "vcc_sd";
> +		regulator-min-microvolt = <3300000>;
> +		regulator-max-microvolt = <3300000>;
> +		regulator-always-on;
> +		regulator-boot-on;
> +		vim-supply = <&vcc_io>;
> +	};
> +
> +};
> +
> +&cpu0 {
> +	cpu-supply = <&vdd_core>;
> +};
> +
> +&emmc {
> +	bus-width = <8>;
> +	cap-mmc-highspeed;
> +	supports-emmc;
> +	disable-wp;
> +	non-removable;
> +	num-slots = <1>;
> +	status = "okay";
> +};
> +
> +&i2c1 {
> +	clock-frequency = <400000>;
> +	status = "okay";
> +
> +	rtc: rtc at 51 {
> +		compatible = "nxp,pcf8563";
> +		reg = <0x51>;
> +		#clock-cells = <0>;
> +	};
> +};
> +
> +&pwm5 {
> +	status = "okay";
> +	pinctrl-names = "active";
> +	pinctrl-0 = <&pwm5_pin_pull_down>;
> +};
> +
> +&pinctrl {
> +	pinctrl-names = "default";
> +	pinctrl-0 = <&rtc_32k>;
> +
> +	ir-receiver {
> +		ir_recv_pin: ir-recv-pin  {
> +			rockchip,pins = <0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
> +		};
> +	};
> +
> +	buttons {
> +		pwr_key: pwr-key {
> +			rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;
> +		};
> +	};
> +};
> +
> +&pwm0 {
> +	status = "okay";
> +	pinctrl-0 = <&pwm0_pin_pull_down>;
> +};
> +
> +&sdmmc {
> +	bus-width = <4>;
> +	cap-mmc-highspeed;
> +	cap-sd-highspeed;
> +	supports-sd;
> +	card-detect-delay = <300>;
> +	sd-uhs-sdr25;
> +	sd-uhs-sdr50;
> +	sd-uhs-sdr104;
> +	vmmc-supply = <&vcc_sd>;
> +	vqmmc-supply = <&vcc_sdmmc>;
> +	status = "okay";
> +};
> +
> +&uart2 {
> +	status = "okay";
> +};

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

* [U-Boot] [PATCH v2 9/9] doc: rockchip: Add documentation for rk3308 based boards
  2019-10-30  8:16   ` [U-Boot] [PATCH v2 9/9] doc: rockchip: Add documentation for rk3308 based boards Andy Yan
@ 2019-11-07  9:55     ` Kever Yang
  0 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-07  9:55 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:16, Andy Yan wrote:
> Add build documentation for rk3308 based boards.
>
> Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
>
> ---
>
> Changes in v2:
> - Update doc/README.rockchip
>
>   doc/README.rockchip | 20 +++++++++++++++++++-
>   1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/doc/README.rockchip b/doc/README.rockchip
> index d17afeabdd..f9f5ca8ac8 100644
> --- a/doc/README.rockchip
> +++ b/doc/README.rockchip
> @@ -47,6 +47,11 @@ Two RK3036 boards are supported:
>      - EVB RK3036 - use evb-rk3036 configuration
>      - Kylin - use kylin_rk3036 configuration
>   
> +Two RK3308 boards are supported:
> +
> +   - EVB RK3308 - use evb-rk3308 configuration
> +   - roc-RK3308-CC - use roc-rk3308-cc configuration

ROC-RK3308-CC

Thanks,

- Kever

> +
>   Two RK3328 board are supported:
>   
>      - EVB RK3328 - use evb-rk3328_defconfig
> @@ -94,7 +99,20 @@ For example:
>   
>       (or you can use another cross compiler if you prefer)
>   
> -2. To build RK3399 board:
> +2. To build RK3308 board:
> +   - Get the rkbin
> +     => git clone https://github.com/rockchip-linux/rkbin.git
> +
> +   - Compile U-Boot
> +     => cd /path/to/u-boot
> +     => export BL31=/path/to/rkbin/bin/rk33/rk3308_bl31_v2.22.elf
> +     => make roc-rk3308-cc_defconfig
> +     => make CROSS_COMPILE=aarch64-linux-gnu- all
> +     => make CROSS_COMPILE=aarch64-linux-gnu- u-boot.itb
> +     => ./tools/mkimage -n rk3308 -T rksd -d /path/to/rkbin/bin/rk33/rk3308_ddr_589MHz_uart2_m0_v1.26.bin idbloader.img
> +     => cat spl/u-boot-spl.bin  >> idbloader.img
> +
> +3. To build RK3399 board:
>   
>      Option 1: Package the image with Rockchip miniloader:
>   

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

* [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC
  2019-10-30  8:11 [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Andy Yan
                   ` (4 preceding siblings ...)
  2019-10-30  8:16 ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Andy Yan
@ 2019-11-18  2:55 ` Kever Yang
  5 siblings, 0 replies; 20+ messages in thread
From: Kever Yang @ 2019-11-18  2:55 UTC (permalink / raw)
  To: u-boot


On 2019/10/30 下午4:11, Andy Yan wrote:
> RK3308 is a quad Cortex A35 based SOC with rich audio
> interfaces(I2S/PCM/TDM/PDM/SPDIF/VAD/HDMI ARC), which
> designed for intelligent voice interaction and audio
> input/output processing.
>
> This path set add basic support for it, test with a
> emmc board.
>
> More boards support such as Firefly ROC-RK3308-CC will coming soon.
>
> Changes in v2:
> - Add board ROC-rk3308-CC
> - Update doc/README.rockchip
>
> Andy Yan (8):
>    arm: rockchip: Add RK3308 SOC support
>    arm: dts: rockchip: Add dts for rk3308 evb
>    board: rockchip: Add rk3308 evb support
>    rockchip: rk3308: Add sdram driver
>    rockchip: mkimage: add support for RK3308
>    rockchip: rk3308: Add dts for ROC-RK3308-CC
>    rockchip: rk3308: Add support for ROC-RK3308-CC board
>    doc: rockchip: Add documentation for rk3308 based boards
>
> Finley Xiao (1):
>    rockchip: clk: Add clk driver for rk3308
Applied to u-boot-rockchip master with rebase on  TOF and some 
checkpatch warning fix.

Thanks,
- Kever
>
>   arch/arm/dts/Makefile                         |    4 +
>   arch/arm/dts/rk3308-evb-u-boot.dtsi           |   17 +
>   arch/arm/dts/rk3308-evb.dts                   |  230 +++
>   arch/arm/dts/rk3308-roc-cc-u-boot.dtsi        |   17 +
>   arch/arm/dts/rk3308-roc-cc.dts                |  190 ++
>   arch/arm/dts/rk3308-u-boot.dtsi               |   25 +
>   arch/arm/dts/rk3308.dtsi                      | 1829 +++++++++++++++++
>   arch/arm/include/asm/arch-rk3308/boot0.h      |   11 +
>   arch/arm/include/asm/arch-rk3308/cru_rk3308.h |  290 +++
>   arch/arm/include/asm/arch-rk3308/gpio.h       |   11 +
>   arch/arm/include/asm/arch-rk3308/grf_rk3308.h |  197 ++
>   arch/arm/mach-rockchip/Kconfig                |   24 +
>   arch/arm/mach-rockchip/Makefile               |    1 +
>   arch/arm/mach-rockchip/rk3308/Kconfig         |   27 +
>   arch/arm/mach-rockchip/rk3308/Makefile        |    9 +
>   arch/arm/mach-rockchip/rk3308/clk_rk3308.c    |   31 +
>   arch/arm/mach-rockchip/rk3308/rk3308.c        |  175 ++
>   arch/arm/mach-rockchip/rk3308/syscon_rk3308.c |   20 +
>   board/firefly/firefly-rk3308/Kconfig          |   15 +
>   board/firefly/firefly-rk3308/MAINTAINERS      |    5 +
>   board/firefly/firefly-rk3308/Makefile         |    7 +
>   board/firefly/firefly-rk3308/roc_rk3308_cc.c  |   82 +
>   board/rockchip/evb_rk3308/Kconfig             |   15 +
>   board/rockchip/evb_rk3308/MAINTAINERS         |    6 +
>   board/rockchip/evb_rk3308/Makefile            |    7 +
>   board/rockchip/evb_rk3308/evb_rk3308.c        |   44 +
>   configs/evb-rk3308_defconfig                  |   77 +
>   configs/roc-rk3308-cc_defconfig               |   77 +
>   doc/README.rockchip                           |   20 +-
>   drivers/clk/rockchip/Makefile                 |    1 +
>   drivers/clk/rockchip/clk_rk3308.c             | 1078 ++++++++++
>   drivers/ram/rockchip/Makefile                 |    1 +
>   drivers/ram/rockchip/sdram_rk3308.c           |   55 +
>   include/configs/evb_rk3308.h                  |   20 +
>   include/configs/rk3308_common.h               |   58 +
>   include/dt-bindings/clock/rk3308-cru.h        |  387 ++++
>   tools/rkcommon.c                              |    1 +
>   37 files changed, 5063 insertions(+), 1 deletion(-)
>   create mode 100644 arch/arm/dts/rk3308-evb-u-boot.dtsi
>   create mode 100644 arch/arm/dts/rk3308-evb.dts
>   create mode 100644 arch/arm/dts/rk3308-roc-cc-u-boot.dtsi
>   create mode 100644 arch/arm/dts/rk3308-roc-cc.dts
>   create mode 100644 arch/arm/dts/rk3308-u-boot.dtsi
>   create mode 100644 arch/arm/dts/rk3308.dtsi
>   create mode 100644 arch/arm/include/asm/arch-rk3308/boot0.h
>   create mode 100644 arch/arm/include/asm/arch-rk3308/cru_rk3308.h
>   create mode 100644 arch/arm/include/asm/arch-rk3308/gpio.h
>   create mode 100644 arch/arm/include/asm/arch-rk3308/grf_rk3308.h
>   create mode 100644 arch/arm/mach-rockchip/rk3308/Kconfig
>   create mode 100644 arch/arm/mach-rockchip/rk3308/Makefile
>   create mode 100644 arch/arm/mach-rockchip/rk3308/clk_rk3308.c
>   create mode 100644 arch/arm/mach-rockchip/rk3308/rk3308.c
>   create mode 100644 arch/arm/mach-rockchip/rk3308/syscon_rk3308.c
>   create mode 100644 board/firefly/firefly-rk3308/Kconfig
>   create mode 100644 board/firefly/firefly-rk3308/MAINTAINERS
>   create mode 100644 board/firefly/firefly-rk3308/Makefile
>   create mode 100644 board/firefly/firefly-rk3308/roc_rk3308_cc.c
>   create mode 100644 board/rockchip/evb_rk3308/Kconfig
>   create mode 100644 board/rockchip/evb_rk3308/MAINTAINERS
>   create mode 100644 board/rockchip/evb_rk3308/Makefile
>   create mode 100644 board/rockchip/evb_rk3308/evb_rk3308.c
>   create mode 100644 configs/evb-rk3308_defconfig
>   create mode 100644 configs/roc-rk3308-cc_defconfig
>   create mode 100644 drivers/clk/rockchip/clk_rk3308.c
>   create mode 100644 drivers/ram/rockchip/sdram_rk3308.c
>   create mode 100644 include/configs/evb_rk3308.h
>   create mode 100644 include/configs/rk3308_common.h
>   create mode 100644 include/dt-bindings/clock/rk3308-cru.h
>

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

end of thread, other threads:[~2019-11-18  2:55 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-30  8:11 [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Andy Yan
2019-10-30  8:11 ` [U-Boot] [PATCH v2 1/9] arm: rockchip: Add RK3308 SOC support Andy Yan
2019-11-07  9:30   ` Kever Yang
2019-10-30  8:11 ` [U-Boot] [PATCH v2 2/9] rockchip: clk: Add clk driver for rk3308 Andy Yan
2019-11-07  9:31   ` Kever Yang
2019-10-30  8:11 ` [U-Boot] [PATCH v2 3/9] arm: dts: rockchip: Add dts for rk3308 evb Andy Yan
2019-11-07  9:31   ` Kever Yang
2019-10-30  8:11 ` [U-Boot] [PATCH v2 4/9] board: rockchip: Add rk3308 evb support Andy Yan
2019-11-07  9:33   ` Kever Yang
2019-10-30  8:16 ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Andy Yan
2019-10-30  8:16   ` [U-Boot] [PATCH v2 6/9] rockchip: mkimage: add support for RK3308 Andy Yan
2019-11-07  9:34     ` Kever Yang
2019-10-30  8:16   ` [U-Boot] [PATCH v2 7/9] rockchip: rk3308: Add dts for ROC-RK3308-CC Andy Yan
2019-11-07  9:39     ` Kever Yang
2019-10-30  8:16   ` [U-Boot] [PATCH v2 8/9] rockchip: rk3308: Add support for ROC-RK3308-CC board Andy Yan
2019-11-07  9:38     ` Kever Yang
2019-10-30  8:16   ` [U-Boot] [PATCH v2 9/9] doc: rockchip: Add documentation for rk3308 based boards Andy Yan
2019-11-07  9:55     ` Kever Yang
2019-11-07  9:34   ` [U-Boot] [PATCH v2 5/9] rockchip: rk3308: Add sdram driver Kever Yang
2019-11-18  2:55 ` [U-Boot] [PATCH v2 0/9] Add support for RK3308 SOC Kever Yang

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.