xref: /linux/drivers/clk/rockchip/clk-rv1106.c (revision 502d45774af09f1c681c754c4b7cdfb5d7f72fd9)
1*b520d056SSimon Glass // SPDX-License-Identifier: GPL-2.0
2*b520d056SSimon Glass /*
3*b520d056SSimon Glass  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
4*b520d056SSimon Glass  * Author: Elaine Zhang <zhangqing@rock-chips.com>
5*b520d056SSimon Glass  */
6*b520d056SSimon Glass 
7*b520d056SSimon Glass #include <linux/clk-provider.h>
8*b520d056SSimon Glass #include <linux/of.h>
9*b520d056SSimon Glass #include <linux/platform_device.h>
10*b520d056SSimon Glass #include <linux/regmap.h>
11*b520d056SSimon Glass #include <dt-bindings/clock/rockchip,rv1106-cru.h>
12*b520d056SSimon Glass #include "clk.h"
13*b520d056SSimon Glass 
14*b520d056SSimon Glass /*
15*b520d056SSimon Glass  * Register offsets inside the CRU region. The RV1106 CRU is split into
16*b520d056SSimon Glass  * several sub-blocks, one per power domain, all accessed through a
17*b520d056SSimon Glass  * single register window.
18*b520d056SSimon Glass  */
19*b520d056SSimon Glass #define RV1106_TOPCRU_BASE		0x10000
20*b520d056SSimon Glass #define RV1106_PERICRU_BASE		0x12000
21*b520d056SSimon Glass #define RV1106_VICRU_BASE		0x14000
22*b520d056SSimon Glass #define RV1106_NPUCRU_BASE		0x16000
23*b520d056SSimon Glass #define RV1106_CORECRU_BASE		0x18000
24*b520d056SSimon Glass #define RV1106_VEPUCRU_BASE		0x1a000
25*b520d056SSimon Glass #define RV1106_VOCRU_BASE		0x1c000
26*b520d056SSimon Glass #define RV1106_DDRCRU_BASE		0x1e000
27*b520d056SSimon Glass #define RV1106_SUBDDRCRU_BASE		0x1f000
28*b520d056SSimon Glass 
29*b520d056SSimon Glass #define RV1106_PMUCLKSEL_CON(x)		((x) * 0x4 + 0x300)
30*b520d056SSimon Glass #define RV1106_PMUCLKGATE_CON(x)	((x) * 0x4 + 0x800)
31*b520d056SSimon Glass #define RV1106_PLL_CON(x)		((x) * 0x4 + RV1106_TOPCRU_BASE)
32*b520d056SSimon Glass #define RV1106_MODE_CON			(0x280 + RV1106_TOPCRU_BASE)
33*b520d056SSimon Glass #define RV1106_CLKSEL_CON(x)		((x) * 0x4 + 0x300 + RV1106_TOPCRU_BASE)
34*b520d056SSimon Glass #define RV1106_CLKGATE_CON(x)		((x) * 0x4 + 0x800 + RV1106_TOPCRU_BASE)
35*b520d056SSimon Glass #define RV1106_GLB_SRST_FST		(0xc08 + RV1106_TOPCRU_BASE)
36*b520d056SSimon Glass #define RV1106_PERICLKSEL_CON(x)	((x) * 0x4 + 0x300 + RV1106_PERICRU_BASE)
37*b520d056SSimon Glass #define RV1106_PERICLKGATE_CON(x)	((x) * 0x4 + 0x800 + RV1106_PERICRU_BASE)
38*b520d056SSimon Glass #define RV1106_VICLKSEL_CON(x)		((x) * 0x4 + 0x300 + RV1106_VICRU_BASE)
39*b520d056SSimon Glass #define RV1106_VICLKGATE_CON(x)		((x) * 0x4 + 0x800 + RV1106_VICRU_BASE)
40*b520d056SSimon Glass #define RV1106_NPUCLKSEL_CON(x)		((x) * 0x4 + 0x300 + RV1106_NPUCRU_BASE)
41*b520d056SSimon Glass #define RV1106_NPUCLKGATE_CON(x)	((x) * 0x4 + 0x800 + RV1106_NPUCRU_BASE)
42*b520d056SSimon Glass #define RV1106_CORECLKSEL_CON(x)	((x) * 0x4 + 0x300 + RV1106_CORECRU_BASE)
43*b520d056SSimon Glass #define RV1106_CORECLKGATE_CON(x)	((x) * 0x4 + 0x800 + RV1106_CORECRU_BASE)
44*b520d056SSimon Glass #define RV1106_VEPUCLKSEL_CON(x)	((x) * 0x4 + 0x300 + RV1106_VEPUCRU_BASE)
45*b520d056SSimon Glass #define RV1106_VEPUCLKGATE_CON(x)	((x) * 0x4 + 0x800 + RV1106_VEPUCRU_BASE)
46*b520d056SSimon Glass #define RV1106_VOCLKSEL_CON(x)		((x) * 0x4 + 0x300 + RV1106_VOCRU_BASE)
47*b520d056SSimon Glass #define RV1106_VOCLKGATE_CON(x)		((x) * 0x4 + 0x800 + RV1106_VOCRU_BASE)
48*b520d056SSimon Glass #define RV1106_DDRCLKSEL_CON(x)		((x) * 0x4 + 0x300 + RV1106_DDRCRU_BASE)
49*b520d056SSimon Glass #define RV1106_DDRCLKGATE_CON(x)	((x) * 0x4 + 0x800 + RV1106_DDRCRU_BASE)
50*b520d056SSimon Glass #define RV1106_SUBDDRCLKSEL_CON(x)	((x) * 0x4 + 0x300 + RV1106_SUBDDRCRU_BASE)
51*b520d056SSimon Glass #define RV1106_SUBDDRCLKGATE_CON(x)	((x) * 0x4 + 0x800 + RV1106_SUBDDRCRU_BASE)
52*b520d056SSimon Glass #define RV1106_SUBDDRMODE_CON		(0x280 + RV1106_SUBDDRCRU_BASE)
53*b520d056SSimon Glass 
54*b520d056SSimon Glass /* Register offsets inside the GRF region for the MMC phase clocks */
55*b520d056SSimon Glass #define RV1106_VI_GRF_BASE		0x50000
56*b520d056SSimon Glass #define RV1106_VO_GRF_BASE		0x60000
57*b520d056SSimon Glass 
58*b520d056SSimon Glass #define RV1106_EMMC_CON0		0x20
59*b520d056SSimon Glass #define RV1106_EMMC_CON1		0x24
60*b520d056SSimon Glass #define RV1106_SDMMC_CON0		(0x4 + RV1106_VI_GRF_BASE)
61*b520d056SSimon Glass #define RV1106_SDMMC_CON1		(0x8 + RV1106_VI_GRF_BASE)
62*b520d056SSimon Glass #define RV1106_SDIO_CON0		(0x1c + RV1106_VO_GRF_BASE)
63*b520d056SSimon Glass #define RV1106_SDIO_CON1		(0x20 + RV1106_VO_GRF_BASE)
64*b520d056SSimon Glass 
65*b520d056SSimon Glass #define CRU_PVTPLL0_CON0_L		0x11000
66*b520d056SSimon Glass #define CRU_PVTPLL0_CON0_H		0x11004
67*b520d056SSimon Glass #define CRU_PVTPLL0_CON1_L		0x11008
68*b520d056SSimon Glass #define CRU_PVTPLL0_CON2_H		0x11014
69*b520d056SSimon Glass 
70*b520d056SSimon Glass #define CRU_PVTPLL1_CON0_L		0x11030
71*b520d056SSimon Glass #define CRU_PVTPLL1_CON0_H		0x11034
72*b520d056SSimon Glass #define CRU_PVTPLL1_CON1_L		0x11038
73*b520d056SSimon Glass #define CRU_PVTPLL1_CON2_H		0x11044
74*b520d056SSimon Glass 
75*b520d056SSimon Glass #define RV1106_GRF_SOC_STATUS0		0x10
76*b520d056SSimon Glass #define CPU_PVTPLL_CON0_L		0x40000
77*b520d056SSimon Glass #define CPU_PVTPLL_CON0_H		0x40004
78*b520d056SSimon Glass 
79*b520d056SSimon Glass #define PVTPLL_RING_SEL_MASK		0x7
80*b520d056SSimon Glass #define PVTPLL_RING_SEL_SHIFT		8
81*b520d056SSimon Glass #define PVTPLL_EN_MASK			0x3
82*b520d056SSimon Glass #define PVTPLL_EN_SHIFT			0
83*b520d056SSimon Glass #define PVTPLL_LENGTH_SEL_MASK		0x7f
84*b520d056SSimon Glass #define PVTPLL_LENGTH_SEL_SHIFT		0
85*b520d056SSimon Glass 
86*b520d056SSimon Glass #define CPU_CLK_PATH_BASE		RV1106_CORECLKSEL_CON(0)
87*b520d056SSimon Glass #define CPU_PVTPLL_PATH_CORE		(BIT(12) | BIT(28))
88*b520d056SSimon Glass 
89*b520d056SSimon Glass #define RV1106_FRAC_MAX_PRATE		1200000000
90*b520d056SSimon Glass 
91*b520d056SSimon Glass enum rv1106_plls {
92*b520d056SSimon Glass 	apll, dpll, cpll, gpll,
93*b520d056SSimon Glass };
94*b520d056SSimon Glass 
95*b520d056SSimon Glass static struct rockchip_pll_rate_table rv1106_pll_rates[] = {
96*b520d056SSimon Glass 	/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
97*b520d056SSimon Glass 	RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0),
98*b520d056SSimon Glass 	RK3036_PLL_RATE(1600000000, 3, 200, 1, 1, 1, 0),
99*b520d056SSimon Glass 	RK3036_PLL_RATE(1584000000, 1, 132, 2, 1, 1, 0),
100*b520d056SSimon Glass 	RK3036_PLL_RATE(1560000000, 1, 130, 2, 1, 1, 0),
101*b520d056SSimon Glass 	RK3036_PLL_RATE(1536000000, 1, 128, 2, 1, 1, 0),
102*b520d056SSimon Glass 	RK3036_PLL_RATE(1512000000, 1, 126, 2, 1, 1, 0),
103*b520d056SSimon Glass 	RK3036_PLL_RATE(1488000000, 1, 124, 2, 1, 1, 0),
104*b520d056SSimon Glass 	RK3036_PLL_RATE(1464000000, 1, 122, 2, 1, 1, 0),
105*b520d056SSimon Glass 	RK3036_PLL_RATE(1440000000, 1, 120, 2, 1, 1, 0),
106*b520d056SSimon Glass 	RK3036_PLL_RATE(1416000000, 1, 118, 2, 1, 1, 0),
107*b520d056SSimon Glass 	RK3036_PLL_RATE(1400000000, 3, 350, 2, 1, 1, 0),
108*b520d056SSimon Glass 	RK3036_PLL_RATE(1392000000, 1, 116, 2, 1, 1, 0),
109*b520d056SSimon Glass 	RK3036_PLL_RATE(1368000000, 1, 114, 2, 1, 1, 0),
110*b520d056SSimon Glass 	RK3036_PLL_RATE(1344000000, 1, 112, 2, 1, 1, 0),
111*b520d056SSimon Glass 	RK3036_PLL_RATE(1320000000, 1, 110, 2, 1, 1, 0),
112*b520d056SSimon Glass 	RK3036_PLL_RATE(1296000000, 1, 108, 2, 1, 1, 0),
113*b520d056SSimon Glass 	RK3036_PLL_RATE(1272000000, 1, 106, 2, 1, 1, 0),
114*b520d056SSimon Glass 	RK3036_PLL_RATE(1248000000, 1, 104, 2, 1, 1, 0),
115*b520d056SSimon Glass 	RK3036_PLL_RATE(1200000000, 1, 100, 2, 1, 1, 0),
116*b520d056SSimon Glass 	RK3036_PLL_RATE(1188000000, 1, 99, 2, 1, 1, 0),
117*b520d056SSimon Glass 	RK3036_PLL_RATE(1104000000, 1, 92, 2, 1, 1, 0),
118*b520d056SSimon Glass 	RK3036_PLL_RATE(1100000000, 3, 275, 2, 1, 1, 0),
119*b520d056SSimon Glass 	RK3036_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0),
120*b520d056SSimon Glass 	RK3036_PLL_RATE(1000000000, 3, 250, 2, 1, 1, 0),
121*b520d056SSimon Glass 	RK3036_PLL_RATE(993484800, 1, 124, 3, 1, 0, 3113851),
122*b520d056SSimon Glass 	RK3036_PLL_RATE(984000000, 1, 82, 2, 1, 1, 0),
123*b520d056SSimon Glass 	RK3036_PLL_RATE(983040000, 1, 81, 2, 1, 0, 15435038),
124*b520d056SSimon Glass 	RK3036_PLL_RATE(960000000, 1, 80, 2, 1, 1, 0),
125*b520d056SSimon Glass 	RK3036_PLL_RATE(936000000, 1, 78, 2, 1, 1, 0),
126*b520d056SSimon Glass 	RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0),
127*b520d056SSimon Glass 	RK3036_PLL_RATE(900000000, 1, 75, 2, 1, 1, 0),
128*b520d056SSimon Glass 	RK3036_PLL_RATE(888000000, 1, 74, 2, 1, 1, 0),
129*b520d056SSimon Glass 	RK3036_PLL_RATE(864000000, 1, 72, 2, 1, 1, 0),
130*b520d056SSimon Glass 	RK3036_PLL_RATE(840000000, 1, 70, 2, 1, 1, 0),
131*b520d056SSimon Glass 	RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
132*b520d056SSimon Glass 	RK3036_PLL_RATE(800000000, 3, 200, 2, 1, 1, 0),
133*b520d056SSimon Glass 	RK3036_PLL_RATE(700000000, 3, 350, 4, 1, 1, 0),
134*b520d056SSimon Glass 	RK3036_PLL_RATE(696000000, 1, 116, 4, 1, 1, 0),
135*b520d056SSimon Glass 	RK3036_PLL_RATE(624000000, 1, 104, 4, 1, 1, 0),
136*b520d056SSimon Glass 	RK3036_PLL_RATE(600000000, 1, 100, 4, 1, 1, 0),
137*b520d056SSimon Glass 	RK3036_PLL_RATE(594000000, 1, 99, 4, 1, 1, 0),
138*b520d056SSimon Glass 	RK3036_PLL_RATE(504000000, 1, 84, 4, 1, 1, 0),
139*b520d056SSimon Glass 	RK3036_PLL_RATE(500000000, 1, 125, 6, 1, 1, 0),
140*b520d056SSimon Glass 	RK3036_PLL_RATE(496742400, 1, 124, 6, 1, 0, 3113851),
141*b520d056SSimon Glass 	RK3036_PLL_RATE(491520000, 1, 40, 2, 1, 0, 16106127),
142*b520d056SSimon Glass 	RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),
143*b520d056SSimon Glass 	RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0),
144*b520d056SSimon Glass 	RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),
145*b520d056SSimon Glass 	RK3036_PLL_RATE(96000000, 1, 96, 6, 4, 1, 0),
146*b520d056SSimon Glass 	{ /* sentinel */ },
147*b520d056SSimon Glass };
148*b520d056SSimon Glass 
149*b520d056SSimon Glass #define RV1106_DIV_ACLK_CORE_MASK	0x1f
150*b520d056SSimon Glass #define RV1106_DIV_ACLK_CORE_SHIFT	7
151*b520d056SSimon Glass #define RV1106_DIV_PCLK_DBG_MASK	0x1f
152*b520d056SSimon Glass #define RV1106_DIV_PCLK_DBG_SHIFT	0
153*b520d056SSimon Glass #define RV1106_CORE_SEL_MASK		0x3
154*b520d056SSimon Glass #define RV1106_CORE_SEL_SHIFT		5
155*b520d056SSimon Glass 
156*b520d056SSimon Glass #define RV1106_CLKSEL0(_aclk_core)					\
157*b520d056SSimon Glass {									\
158*b520d056SSimon Glass 	.reg = RV1106_CORECLKSEL_CON(0),				\
159*b520d056SSimon Glass 	.val = HIWORD_UPDATE(_aclk_core, RV1106_DIV_ACLK_CORE_MASK,	\
160*b520d056SSimon Glass 			     RV1106_DIV_ACLK_CORE_SHIFT),		\
161*b520d056SSimon Glass }
162*b520d056SSimon Glass 
163*b520d056SSimon Glass #define RV1106_CLKSEL1(_pclk_dbg)					\
164*b520d056SSimon Glass {									\
165*b520d056SSimon Glass 	.reg = RV1106_CORECLKSEL_CON(1),				\
166*b520d056SSimon Glass 	.val = HIWORD_UPDATE(_pclk_dbg, RV1106_DIV_PCLK_DBG_MASK,	\
167*b520d056SSimon Glass 			     RV1106_DIV_PCLK_DBG_SHIFT),		\
168*b520d056SSimon Glass }
169*b520d056SSimon Glass 
170*b520d056SSimon Glass #define RV1106_CLKSEL2(_is_pvtpll)					\
171*b520d056SSimon Glass {									\
172*b520d056SSimon Glass 	.reg = RV1106_CORECLKSEL_CON(0),				\
173*b520d056SSimon Glass 	.val = HIWORD_UPDATE(_is_pvtpll, RV1106_CORE_SEL_MASK,		\
174*b520d056SSimon Glass 			     RV1106_CORE_SEL_SHIFT),			\
175*b520d056SSimon Glass }
176*b520d056SSimon Glass 
177*b520d056SSimon Glass #define RV1106_CPUCLK_RATE(_prate, _aclk_core, _pclk_dbg, _is_pvtpll)	\
178*b520d056SSimon Glass {									\
179*b520d056SSimon Glass 	.prate = _prate,						\
180*b520d056SSimon Glass 	.divs = {							\
181*b520d056SSimon Glass 		RV1106_CLKSEL0(_aclk_core),				\
182*b520d056SSimon Glass 		RV1106_CLKSEL1(_pclk_dbg),				\
183*b520d056SSimon Glass 	},								\
184*b520d056SSimon Glass 	.post_muxs = {							\
185*b520d056SSimon Glass 		RV1106_CLKSEL2(_is_pvtpll),				\
186*b520d056SSimon Glass 	},								\
187*b520d056SSimon Glass }
188*b520d056SSimon Glass 
189*b520d056SSimon Glass static struct rockchip_cpuclk_rate_table rv1106_cpuclk_rates[] __initdata = {
190*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1608000000, 3, 7, 1),
191*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1584000000, 3, 7, 1),
192*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1560000000, 3, 7, 1),
193*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1536000000, 3, 7, 1),
194*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1512000000, 3, 7, 1),
195*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1488000000, 2, 5, 1),
196*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1464000000, 2, 5, 1),
197*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1440000000, 2, 5, 1),
198*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1416000000, 2, 5, 1),
199*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1392000000, 2, 5, 1),
200*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1368000000, 2, 5, 1),
201*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1344000000, 2, 5, 1),
202*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1320000000, 2, 5, 1),
203*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1296000000, 2, 5, 1),
204*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1272000000, 2, 5, 1),
205*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1248000000, 2, 5, 1),
206*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1224000000, 2, 5, 1),
207*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1200000000, 2, 5, 1),
208*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1104000000, 2, 5, 1),
209*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1096000000, 2, 5, 1),
210*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(1008000000, 1, 5, 1),
211*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(912000000, 1, 5, 1),
212*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(816000000, 1, 3, 1),
213*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(696000000, 1, 3, 0),
214*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(600000000, 1, 3, 0),
215*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(408000000, 1, 1, 0),
216*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(312000000, 1, 1, 0),
217*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(216000000,  1, 1, 0),
218*b520d056SSimon Glass 	RV1106_CPUCLK_RATE(96000000, 1, 1, 0),
219*b520d056SSimon Glass };
220*b520d056SSimon Glass 
221*b520d056SSimon Glass static const struct rockchip_cpuclk_reg_data rv1106_cpuclk_data = {
222*b520d056SSimon Glass 	.core_reg[0] = RV1106_CORECLKSEL_CON(0),
223*b520d056SSimon Glass 	.div_core_shift[0] = 0,
224*b520d056SSimon Glass 	.div_core_mask[0] = 0x1f,
225*b520d056SSimon Glass 	.num_cores = 1,
226*b520d056SSimon Glass 	.mux_core_alt = 2,
227*b520d056SSimon Glass 	.mux_core_main = 0,
228*b520d056SSimon Glass 	.mux_core_shift = 5,
229*b520d056SSimon Glass 	.mux_core_mask = 0x3,
230*b520d056SSimon Glass };
231*b520d056SSimon Glass 
232*b520d056SSimon Glass PNAME(mux_pll_p)			= { "xin24m" };
233*b520d056SSimon Glass PNAME(mux_armclk_p)			= { "apll", "cpu_pvtpll", "gpll" };
234*b520d056SSimon Glass PNAME(mux_24m_32k_p)			= { "xin24m", "clk_rtc_32k" };
235*b520d056SSimon Glass PNAME(mux_gpll_cpll_p)			= { "gpll", "cpll" };
236*b520d056SSimon Glass PNAME(mux_gpll_24m_p)			= { "gpll", "xin24m" };
237*b520d056SSimon Glass PNAME(mux_100m_50m_24m_p)		= { "clk_100m_src", "clk_50m_src", "xin24m" };
238*b520d056SSimon Glass PNAME(mux_150m_100m_50m_24m_p)		= { "clk_150m_src", "clk_100m_src", "clk_50m_src", "xin24m" };
239*b520d056SSimon Glass PNAME(mux_500m_300m_100m_24m_p)		= { "clk_500m_src", "clk_300m_src", "clk_100m_src", "xin24m" };
240*b520d056SSimon Glass PNAME(mux_400m_300m_pvtpll0_pvtpll1_p)	= { "clk_400m_src", "clk_300m_src", "clk_pvtpll_0", "clk_pvtpll_1" };
241*b520d056SSimon Glass PNAME(mux_500m_300m_pvtpll0_pvtpll1_p)	= { "clk_500m_src", "clk_300m_src", "clk_pvtpll_0", "clk_pvtpll_1" };
242*b520d056SSimon Glass PNAME(mux_339m_200m_pvtpll0_pvtpll1_p)	= { "clk_339m_src", "clk_200m_src", "clk_pvtpll_0", "clk_pvtpll_1" };
243*b520d056SSimon Glass PNAME(mux_400m_200m_100m_24m_p)		= { "clk_400m_src", "clk_200m_src", "clk_100m_src", "xin24m" };
244*b520d056SSimon Glass PNAME(mux_200m_100m_50m_24m_p)		= { "clk_200m_src", "clk_100m_src", "clk_50m_src", "xin24m" };
245*b520d056SSimon Glass PNAME(mux_300m_200m_100m_24m_p)		= { "clk_300m_src", "clk_200m_src", "clk_100m_src", "xin24m" };
246*b520d056SSimon Glass PNAME(mux_500m_300m_200m_24m_p)		= { "clk_500m_src", "clk_300m_src", "clk_200m_src", "xin24m" };
247*b520d056SSimon Glass PNAME(mux_50m_24m_p)			= { "clk_50m_src", "xin24m" };
248*b520d056SSimon Glass PNAME(mux_400m_24m_p)			= { "clk_400m_src", "xin24m" };
249*b520d056SSimon Glass PNAME(clk_rtc32k_pmu_p)			= { "clk_rtc32k_frac", "xin32k", "clk_pvtm_32k" };
250*b520d056SSimon Glass PNAME(mux_200m_100m_24m_32k_p)		= { "clk_200m_src", "clk_100m_src", "xin24m", "clk_rtc_32k" };
251*b520d056SSimon Glass PNAME(mux_100m_pmu_24m_p)		= { "clk_100m_pmu", "xin24m" };
252*b520d056SSimon Glass PNAME(mux_200m_100m_24m_p)		= { "clk_200m_src", "clk_100m_pmu", "xin24m" };
253*b520d056SSimon Glass PNAME(mux_339m_200m_100m_24m_p)		= { "clk_339m_src", "clk_200m_src", "clk_100m_pmu", "xin24m" };
254*b520d056SSimon Glass PNAME(mux_dpll_300m_p)			= { "dpll", "clk_300m_src" };
255*b520d056SSimon Glass PNAME(clk_i2s0_8ch_tx_p)		= { "clk_i2s0_8ch_tx_src", "clk_i2s0_8ch_tx_frac", "i2s0_mclkin", "xin_osc0_half" };
256*b520d056SSimon Glass PNAME(clk_i2s0_8ch_rx_p)		= { "clk_i2s0_8ch_rx_src", "clk_i2s0_8ch_rx_frac", "i2s0_mclkin", "xin_osc0_half" };
257*b520d056SSimon Glass PNAME(i2s0_8ch_mclkout_p)		= { "mclk_i2s0_8ch_tx", "mclk_i2s0_8ch_rx", "xin_osc0_half" };
258*b520d056SSimon Glass PNAME(clk_ref_mipi0_p)			= { "clk_ref_mipi0_src", "clk_ref_mipi0_frac", "xin24m" };
259*b520d056SSimon Glass PNAME(clk_ref_mipi1_p)			= { "clk_ref_mipi1_src", "clk_ref_mipi1_frac", "xin24m" };
260*b520d056SSimon Glass PNAME(clk_uart0_p)			= { "clk_uart0_src", "clk_uart0_frac", "xin24m" };
261*b520d056SSimon Glass PNAME(clk_uart1_p)			= { "clk_uart1_src", "clk_uart1_frac", "xin24m" };
262*b520d056SSimon Glass PNAME(clk_uart2_p)			= { "clk_uart2_src", "clk_uart2_frac", "xin24m" };
263*b520d056SSimon Glass PNAME(clk_uart3_p)			= { "clk_uart3_src", "clk_uart3_frac", "xin24m" };
264*b520d056SSimon Glass PNAME(clk_uart4_p)			= { "clk_uart4_src", "clk_uart4_frac", "xin24m" };
265*b520d056SSimon Glass PNAME(clk_uart5_p)			= { "clk_uart5_src", "clk_uart5_frac", "xin24m" };
266*b520d056SSimon Glass PNAME(clk_vicap_m0_p)			= { "clk_vicap_m0_src", "clk_vicap_m0_frac", "xin24m" };
267*b520d056SSimon Glass PNAME(clk_vicap_m1_p)			= { "clk_vicap_m1_src", "clk_vicap_m1_frac", "xin24m" };
268*b520d056SSimon Glass 
269*b520d056SSimon Glass static struct rockchip_pll_clock rv1106_pll_clks[] __initdata = {
270*b520d056SSimon Glass 	[apll] = PLL(pll_rk3328, PLL_APLL, "apll", mux_pll_p,
271*b520d056SSimon Glass 		     CLK_IGNORE_UNUSED, RV1106_PLL_CON(0),
272*b520d056SSimon Glass 		     RV1106_MODE_CON, 0, 10, 0, rv1106_pll_rates),
273*b520d056SSimon Glass 	[cpll] = PLL(pll_rk3328, PLL_CPLL, "cpll", mux_pll_p,
274*b520d056SSimon Glass 		     0, RV1106_PLL_CON(8),
275*b520d056SSimon Glass 		     RV1106_MODE_CON, 2, 10, 0, rv1106_pll_rates),
276*b520d056SSimon Glass 	[dpll] = PLL(pll_rk3328, PLL_DPLL, "dpll", mux_pll_p,
277*b520d056SSimon Glass 		     CLK_IGNORE_UNUSED, RV1106_PLL_CON(16),
278*b520d056SSimon Glass 		     RV1106_SUBDDRMODE_CON, 0, 10, 0, NULL),
279*b520d056SSimon Glass 	[gpll] = PLL(pll_rk3328, PLL_GPLL, "gpll", mux_pll_p,
280*b520d056SSimon Glass 		     0, RV1106_PLL_CON(24),
281*b520d056SSimon Glass 		     RV1106_MODE_CON, 4, 10, 0, rv1106_pll_rates),
282*b520d056SSimon Glass };
283*b520d056SSimon Glass 
284*b520d056SSimon Glass #define MFLAGS CLK_MUX_HIWORD_MASK
285*b520d056SSimon Glass #define DFLAGS CLK_DIVIDER_HIWORD_MASK
286*b520d056SSimon Glass #define GFLAGS (CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE)
287*b520d056SSimon Glass 
288*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_rtc32k_pmu_fracmux __initdata =
289*b520d056SSimon Glass 	MUX(CLK_RTC_32K, "clk_rtc_32k", clk_rtc32k_pmu_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
290*b520d056SSimon Glass 			RV1106_PMUCLKSEL_CON(0), 6, 2, MFLAGS);
291*b520d056SSimon Glass 
292*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_i2s0_8ch_tx_fracmux __initdata =
293*b520d056SSimon Glass 	MUX(CLK_I2S0_8CH_TX, "clk_i2s0_8ch_tx", clk_i2s0_8ch_tx_p, CLK_SET_RATE_PARENT,
294*b520d056SSimon Glass 			RV1106_CLKSEL_CON(19), 0, 2, MFLAGS);
295*b520d056SSimon Glass 
296*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_i2s0_8ch_rx_fracmux __initdata =
297*b520d056SSimon Glass 	MUX(CLK_I2S0_8CH_RX, "clk_i2s0_8ch_rx", clk_i2s0_8ch_rx_p, CLK_SET_RATE_PARENT,
298*b520d056SSimon Glass 			RV1106_CLKSEL_CON(21), 0, 2, MFLAGS);
299*b520d056SSimon Glass 
300*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_ref_mipi0_fracmux __initdata =
301*b520d056SSimon Glass 	MUX(CLK_REF_MIPI0, "clk_ref_mipi0", clk_ref_mipi0_p, CLK_SET_RATE_PARENT,
302*b520d056SSimon Glass 			RV1106_CLKSEL_CON(27), 0, 2, MFLAGS);
303*b520d056SSimon Glass 
304*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_ref_mipi1_fracmux __initdata =
305*b520d056SSimon Glass 	MUX(CLK_REF_MIPI1, "clk_ref_mipi1", clk_ref_mipi1_p, CLK_SET_RATE_PARENT,
306*b520d056SSimon Glass 			RV1106_CLKSEL_CON(29), 0, 2, MFLAGS);
307*b520d056SSimon Glass 
308*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_uart0_fracmux __initdata =
309*b520d056SSimon Glass 	MUX(CLK_UART0, "clk_uart0", clk_uart0_p, CLK_SET_RATE_PARENT,
310*b520d056SSimon Glass 			RV1106_CLKSEL_CON(7), 0, 2, MFLAGS);
311*b520d056SSimon Glass 
312*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_uart1_fracmux __initdata =
313*b520d056SSimon Glass 	MUX(CLK_UART1, "clk_uart1", clk_uart1_p, CLK_SET_RATE_PARENT,
314*b520d056SSimon Glass 			RV1106_CLKSEL_CON(9), 0, 2, MFLAGS);
315*b520d056SSimon Glass 
316*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_uart2_fracmux __initdata =
317*b520d056SSimon Glass 	MUX(CLK_UART2, "clk_uart2", clk_uart2_p, CLK_SET_RATE_PARENT,
318*b520d056SSimon Glass 			RV1106_CLKSEL_CON(11), 0, 2, MFLAGS);
319*b520d056SSimon Glass 
320*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_uart3_fracmux __initdata =
321*b520d056SSimon Glass 	MUX(CLK_UART3, "clk_uart3", clk_uart3_p, CLK_SET_RATE_PARENT,
322*b520d056SSimon Glass 			RV1106_CLKSEL_CON(13), 0, 2, MFLAGS);
323*b520d056SSimon Glass 
324*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_uart4_fracmux __initdata =
325*b520d056SSimon Glass 	MUX(CLK_UART4, "clk_uart4", clk_uart4_p, CLK_SET_RATE_PARENT,
326*b520d056SSimon Glass 			RV1106_CLKSEL_CON(15), 0, 2, MFLAGS);
327*b520d056SSimon Glass 
328*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_uart5_fracmux __initdata =
329*b520d056SSimon Glass 	MUX(CLK_UART5, "clk_uart5", clk_uart5_p, CLK_SET_RATE_PARENT,
330*b520d056SSimon Glass 			RV1106_CLKSEL_CON(17), 0, 2, MFLAGS);
331*b520d056SSimon Glass 
332*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_vicap_m0_fracmux __initdata =
333*b520d056SSimon Glass 	MUX(CLK_VICAP_M0, "clk_vicap_m0", clk_vicap_m0_p, CLK_SET_RATE_PARENT,
334*b520d056SSimon Glass 			RV1106_CLKSEL_CON(31), 0, 2, MFLAGS);
335*b520d056SSimon Glass 
336*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_vicap_m1_fracmux __initdata =
337*b520d056SSimon Glass 	MUX(CLK_VICAP_M1, "clk_vicap_m1", clk_vicap_m1_p, CLK_SET_RATE_PARENT,
338*b520d056SSimon Glass 			RV1106_CLKSEL_CON(33), 0, 2, MFLAGS);
339*b520d056SSimon Glass 
340*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_clk_branches[] __initdata = {
341*b520d056SSimon Glass 
342*b520d056SSimon Glass 	FACTOR(XIN_OSC0_HALF, "xin_osc0_half", "xin24m", 0, 1, 2),
343*b520d056SSimon Glass 
344*b520d056SSimon Glass 	/* PD_CORE */
345*b520d056SSimon Glass 	GATE(CLK_PVTM_CORE, "clk_pvtm_core", "xin24m", 0,
346*b520d056SSimon Glass 			RV1106_CORECLKGATE_CON(0), 14, GFLAGS),
347*b520d056SSimon Glass 	GATE(CLK_CORE_MCU_RTC, "clk_core_mcu_rtc", "xin24m", 0,
348*b520d056SSimon Glass 			RV1106_CORECLKGATE_CON(1), 6, GFLAGS),
349*b520d056SSimon Glass 	COMPOSITE(HCLK_CPU, "hclk_cpu", mux_gpll_24m_p, CLK_IS_CRITICAL,
350*b520d056SSimon Glass 			RV1106_CORECLKSEL_CON(2), 5, 1, MFLAGS, 0, 5, DFLAGS,
351*b520d056SSimon Glass 			RV1106_CORECLKGATE_CON(0), 12, GFLAGS),
352*b520d056SSimon Glass 	COMPOSITE(CLK_CORE_MCU, "clk_core_mcu", mux_gpll_24m_p, 0,
353*b520d056SSimon Glass 			RV1106_CORECLKSEL_CON(3), 11, 1, MFLAGS, 6, 5, DFLAGS,
354*b520d056SSimon Glass 			RV1106_CORECLKGATE_CON(1), 1, GFLAGS),
355*b520d056SSimon Glass 	COMPOSITE_NOMUX(PCLK_DBG, "pclk_dbg", "armclk", CLK_IS_CRITICAL,
356*b520d056SSimon Glass 			RV1106_CORECLKSEL_CON(1), 0, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
357*b520d056SSimon Glass 			RV1106_CORECLKGATE_CON(0), 6, GFLAGS),
358*b520d056SSimon Glass 	GATE(PCLK_CPU_ROOT, "pclk_cpu_root", "pclk_dbg", CLK_IS_CRITICAL,
359*b520d056SSimon Glass 			RV1106_CORECLKGATE_CON(0), 10, GFLAGS),
360*b520d056SSimon Glass 	GATE(PCLK_MAILBOX, "pclk_mailbox", "pclk_cpu_root", 0,
361*b520d056SSimon Glass 			RV1106_CORECLKGATE_CON(1), 8, GFLAGS),
362*b520d056SSimon Glass 
363*b520d056SSimon Glass 	/* PD _TOP */
364*b520d056SSimon Glass 	COMPOSITE(CLK_50M_SRC, "clk_50m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
365*b520d056SSimon Glass 			RV1106_CLKSEL_CON(0), 5, 1, MFLAGS, 0, 5, DFLAGS,
366*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 1, GFLAGS),
367*b520d056SSimon Glass 	COMPOSITE(CLK_100M_SRC, "clk_100m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
368*b520d056SSimon Glass 			RV1106_CLKSEL_CON(0), 11, 1, MFLAGS, 6, 5, DFLAGS,
369*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 2, GFLAGS),
370*b520d056SSimon Glass 	COMPOSITE(CLK_150M_SRC, "clk_150m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
371*b520d056SSimon Glass 			RV1106_CLKSEL_CON(1), 5, 1, MFLAGS, 0, 5, DFLAGS,
372*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 3, GFLAGS),
373*b520d056SSimon Glass 	COMPOSITE(CLK_200M_SRC, "clk_200m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
374*b520d056SSimon Glass 			RV1106_CLKSEL_CON(1), 11, 1, MFLAGS, 6, 5, DFLAGS,
375*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 4, GFLAGS),
376*b520d056SSimon Glass 	COMPOSITE(CLK_250M_SRC, "clk_250m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
377*b520d056SSimon Glass 			RV1106_CLKSEL_CON(2), 5, 1, MFLAGS, 0, 5, DFLAGS,
378*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 5, GFLAGS),
379*b520d056SSimon Glass 	COMPOSITE(CLK_300M_SRC, "clk_300m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
380*b520d056SSimon Glass 			RV1106_CLKSEL_CON(2), 11, 1, MFLAGS, 6, 5, DFLAGS,
381*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 6, GFLAGS),
382*b520d056SSimon Glass 	COMPOSITE_HALFDIV(CLK_339M_SRC, "clk_339m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
383*b520d056SSimon Glass 			RV1106_CLKSEL_CON(3), 5, 1, MFLAGS, 0, 5, DFLAGS,
384*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 7, GFLAGS),
385*b520d056SSimon Glass 	COMPOSITE(CLK_400M_SRC, "clk_400m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
386*b520d056SSimon Glass 			RV1106_CLKSEL_CON(3), 11, 1, MFLAGS, 6, 5, DFLAGS,
387*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 8, GFLAGS),
388*b520d056SSimon Glass 	COMPOSITE_HALFDIV(CLK_450M_SRC, "clk_450m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
389*b520d056SSimon Glass 			RV1106_CLKSEL_CON(4), 5, 1, MFLAGS, 0, 5, DFLAGS,
390*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 9, GFLAGS),
391*b520d056SSimon Glass 	COMPOSITE(CLK_500M_SRC, "clk_500m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
392*b520d056SSimon Glass 			RV1106_CLKSEL_CON(4), 11, 1, MFLAGS, 6, 5, DFLAGS,
393*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 10, GFLAGS),
394*b520d056SSimon Glass 
395*b520d056SSimon Glass 	COMPOSITE_NODIV(PCLK_TOP_ROOT, "pclk_top_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
396*b520d056SSimon Glass 			RV1106_CLKSEL_CON(24), 5, 2, MFLAGS,
397*b520d056SSimon Glass 			RV1106_CLKGATE_CON(2), 9, GFLAGS),
398*b520d056SSimon Glass 
399*b520d056SSimon Glass 	COMPOSITE(CLK_I2S0_8CH_TX_SRC, "clk_i2s0_8ch_tx_src", mux_gpll_cpll_p, 0,
400*b520d056SSimon Glass 			RV1106_CLKSEL_CON(17), 7, 1, MFLAGS, 2, 5, DFLAGS,
401*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 13, GFLAGS),
402*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_I2S0_8CH_TX_FRAC, "clk_i2s0_8ch_tx_frac", "clk_i2s0_8ch_tx_src", CLK_SET_RATE_PARENT,
403*b520d056SSimon Glass 			RV1106_CLKSEL_CON(18), 0,
404*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 14, GFLAGS,
405*b520d056SSimon Glass 			&rv1106_i2s0_8ch_tx_fracmux),
406*b520d056SSimon Glass 	GATE(MCLK_I2S0_8CH_TX, "mclk_i2s0_8ch_tx", "clk_i2s0_8ch_tx", 0,
407*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 15, GFLAGS),
408*b520d056SSimon Glass 	COMPOSITE(CLK_I2S0_8CH_RX_SRC, "clk_i2s0_8ch_rx_src", mux_gpll_cpll_p, 0,
409*b520d056SSimon Glass 			RV1106_CLKSEL_CON(19), 7, 1, MFLAGS, 2, 5, DFLAGS,
410*b520d056SSimon Glass 			RV1106_CLKGATE_CON(2), 0, GFLAGS),
411*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_I2S0_8CH_RX_FRAC, "clk_i2s0_8ch_rx_frac", "clk_i2s0_8ch_rx_src", CLK_SET_RATE_PARENT,
412*b520d056SSimon Glass 			RV1106_CLKSEL_CON(20), 0,
413*b520d056SSimon Glass 			RV1106_CLKGATE_CON(2), 1, GFLAGS,
414*b520d056SSimon Glass 			&rv1106_i2s0_8ch_rx_fracmux),
415*b520d056SSimon Glass 	GATE(MCLK_I2S0_8CH_RX, "mclk_i2s0_8ch_rx", "clk_i2s0_8ch_rx", 0,
416*b520d056SSimon Glass 			RV1106_CLKGATE_CON(2), 2, GFLAGS),
417*b520d056SSimon Glass 	MUX(I2S0_8CH_MCLKOUT, "i2s0_8ch_mclkout", i2s0_8ch_mclkout_p, CLK_SET_RATE_PARENT,
418*b520d056SSimon Glass 			RV1106_CLKSEL_CON(21), 2, 2, MFLAGS),
419*b520d056SSimon Glass 	COMPOSITE(CLK_REF_MIPI0_SRC, "clk_ref_mipi0_src", mux_gpll_cpll_p, 0,
420*b520d056SSimon Glass 			RV1106_CLKSEL_CON(25), 7, 1, MFLAGS, 2, 5, DFLAGS,
421*b520d056SSimon Glass 			RV1106_CLKGATE_CON(3), 4, GFLAGS),
422*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_REF_MIPI0_FRAC, "clk_ref_mipi0_frac", "clk_ref_mipi0_src", CLK_SET_RATE_PARENT,
423*b520d056SSimon Glass 			RV1106_CLKSEL_CON(26), 0,
424*b520d056SSimon Glass 			RV1106_CLKGATE_CON(3), 5, GFLAGS,
425*b520d056SSimon Glass 			&rv1106_clk_ref_mipi0_fracmux),
426*b520d056SSimon Glass 	GATE(MCLK_REF_MIPI0, "mclk_ref_mipi0", "clk_ref_mipi0", 0,
427*b520d056SSimon Glass 			 RV1106_CLKGATE_CON(3), 6, GFLAGS),
428*b520d056SSimon Glass 	COMPOSITE(CLK_REF_MIPI1_SRC, "clk_ref_mipi1_src", mux_gpll_cpll_p, 0,
429*b520d056SSimon Glass 			RV1106_CLKSEL_CON(27), 7, 1, MFLAGS, 2, 5, DFLAGS,
430*b520d056SSimon Glass 			RV1106_CLKGATE_CON(3), 7, GFLAGS),
431*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_REF_MIPI1_FRAC, "clk_ref_mipi1_frac", "clk_ref_mipi1_src", CLK_SET_RATE_PARENT,
432*b520d056SSimon Glass 			RV1106_CLKSEL_CON(28), 0,
433*b520d056SSimon Glass 			RV1106_CLKGATE_CON(3), 8, GFLAGS,
434*b520d056SSimon Glass 			&rv1106_clk_ref_mipi1_fracmux),
435*b520d056SSimon Glass 	GATE(MCLK_REF_MIPI1, "mclk_ref_mipi1", "clk_ref_mipi1", 0,
436*b520d056SSimon Glass 			 RV1106_CLKGATE_CON(3), 9, GFLAGS),
437*b520d056SSimon Glass 	COMPOSITE(CLK_UART0_SRC, "clk_uart0_src", mux_gpll_cpll_p, 0,
438*b520d056SSimon Glass 			RV1106_CLKSEL_CON(5), 5, 1, MFLAGS, 0, 5, DFLAGS,
439*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 11, GFLAGS),
440*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_UART0_FRAC, "clk_uart0_frac", "clk_uart0_src", CLK_SET_RATE_PARENT,
441*b520d056SSimon Glass 			RV1106_CLKSEL_CON(6), 0,
442*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 12, GFLAGS,
443*b520d056SSimon Glass 			&rv1106_clk_uart0_fracmux),
444*b520d056SSimon Glass 	GATE(SCLK_UART0, "sclk_uart0", "clk_uart0", 0,
445*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 13, GFLAGS),
446*b520d056SSimon Glass 	COMPOSITE(CLK_UART1_SRC, "clk_uart1_src", mux_gpll_cpll_p, 0,
447*b520d056SSimon Glass 			RV1106_CLKSEL_CON(7), 7, 1, MFLAGS, 2, 5, DFLAGS,
448*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 14, GFLAGS),
449*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_UART1_FRAC, "clk_uart1_frac", "clk_uart1_src", CLK_SET_RATE_PARENT,
450*b520d056SSimon Glass 			RV1106_CLKSEL_CON(8), 0,
451*b520d056SSimon Glass 			RV1106_CLKGATE_CON(0), 15, GFLAGS,
452*b520d056SSimon Glass 			&rv1106_clk_uart1_fracmux),
453*b520d056SSimon Glass 	GATE(SCLK_UART1, "sclk_uart1", "clk_uart1", 0,
454*b520d056SSimon Glass 			 RV1106_CLKGATE_CON(1), 0, GFLAGS),
455*b520d056SSimon Glass 	COMPOSITE(CLK_UART2_SRC, "clk_uart2_src", mux_gpll_cpll_p, 0,
456*b520d056SSimon Glass 			RV1106_CLKSEL_CON(9), 7, 1, MFLAGS, 2, 5, DFLAGS,
457*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 1, GFLAGS),
458*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_UART2_FRAC, "clk_uart2_frac", "clk_uart2_src", CLK_SET_RATE_PARENT,
459*b520d056SSimon Glass 			RV1106_CLKSEL_CON(10), 0,
460*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 2, GFLAGS,
461*b520d056SSimon Glass 			&rv1106_clk_uart2_fracmux),
462*b520d056SSimon Glass 	GATE(SCLK_UART2, "sclk_uart2", "clk_uart2", 0,
463*b520d056SSimon Glass 			 RV1106_CLKGATE_CON(1), 3, GFLAGS),
464*b520d056SSimon Glass 	COMPOSITE(CLK_UART3_SRC, "clk_uart3_src", mux_gpll_cpll_p, 0,
465*b520d056SSimon Glass 			RV1106_CLKSEL_CON(11), 7, 1, MFLAGS, 2, 5, DFLAGS,
466*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 4, GFLAGS),
467*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_UART3_FRAC, "clk_uart3_frac", "clk_uart3_src", CLK_SET_RATE_PARENT,
468*b520d056SSimon Glass 			RV1106_CLKSEL_CON(12), 0,
469*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 5, GFLAGS,
470*b520d056SSimon Glass 			&rv1106_clk_uart3_fracmux),
471*b520d056SSimon Glass 	GATE(SCLK_UART3, "sclk_uart3", "clk_uart3", 0,
472*b520d056SSimon Glass 			 RV1106_CLKGATE_CON(1), 6, GFLAGS),
473*b520d056SSimon Glass 	COMPOSITE(CLK_UART4_SRC, "clk_uart4_src", mux_gpll_cpll_p, 0,
474*b520d056SSimon Glass 			RV1106_CLKSEL_CON(13), 7, 1, MFLAGS, 2, 5, DFLAGS,
475*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 7, GFLAGS),
476*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_UART4_FRAC, "clk_uart4_frac", "clk_uart4_src", CLK_SET_RATE_PARENT,
477*b520d056SSimon Glass 			RV1106_CLKSEL_CON(14), 0,
478*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 8, GFLAGS,
479*b520d056SSimon Glass 			&rv1106_clk_uart4_fracmux),
480*b520d056SSimon Glass 	GATE(SCLK_UART4, "sclk_uart4", "clk_uart4", 0,
481*b520d056SSimon Glass 			 RV1106_CLKGATE_CON(1), 9, GFLAGS),
482*b520d056SSimon Glass 	COMPOSITE(CLK_UART5_SRC, "clk_uart5_src", mux_gpll_cpll_p, 0,
483*b520d056SSimon Glass 			RV1106_CLKSEL_CON(15), 7, 1, MFLAGS, 2, 5, DFLAGS,
484*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 10, GFLAGS),
485*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_UART5_FRAC, "clk_uart5_frac", "clk_uart5_src", CLK_SET_RATE_PARENT,
486*b520d056SSimon Glass 			RV1106_CLKSEL_CON(16), 0,
487*b520d056SSimon Glass 			RV1106_CLKGATE_CON(1), 11, GFLAGS,
488*b520d056SSimon Glass 			&rv1106_clk_uart5_fracmux),
489*b520d056SSimon Glass 	GATE(SCLK_UART5, "sclk_uart5", "clk_uart5", 0,
490*b520d056SSimon Glass 			 RV1106_CLKGATE_CON(1), 12, GFLAGS),
491*b520d056SSimon Glass 	COMPOSITE(CLK_VICAP_M0_SRC, "clk_vicap_m0_src", mux_gpll_cpll_p, 0,
492*b520d056SSimon Glass 			RV1106_CLKSEL_CON(29), 7, 1, MFLAGS, 2, 5, DFLAGS,
493*b520d056SSimon Glass 			RV1106_CLKGATE_CON(3), 10, GFLAGS),
494*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_VICAP_M0_FRAC, "clk_vicap_m0_frac", "clk_vicap_m0_src", CLK_SET_RATE_PARENT,
495*b520d056SSimon Glass 			RV1106_CLKSEL_CON(30), 0,
496*b520d056SSimon Glass 			RV1106_CLKGATE_CON(3), 11, GFLAGS,
497*b520d056SSimon Glass 			&rv1106_clk_vicap_m0_fracmux),
498*b520d056SSimon Glass 	GATE(SCLK_VICAP_M0, "sclk_vicap_m0", "clk_vicap_m0", 0,
499*b520d056SSimon Glass 			 RV1106_CLKGATE_CON(3), 12, GFLAGS),
500*b520d056SSimon Glass 	COMPOSITE(CLK_VICAP_M1_SRC, "clk_vicap_m1_src", mux_gpll_cpll_p, 0,
501*b520d056SSimon Glass 			RV1106_CLKSEL_CON(31), 7, 1, MFLAGS, 2, 5, DFLAGS,
502*b520d056SSimon Glass 			RV1106_CLKGATE_CON(3), 13, GFLAGS),
503*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_VICAP_M1_FRAC, "clk_vicap_m1_frac", "clk_vicap_m1_src", CLK_SET_RATE_PARENT,
504*b520d056SSimon Glass 			RV1106_CLKSEL_CON(32), 0,
505*b520d056SSimon Glass 			RV1106_CLKGATE_CON(3), 14, GFLAGS,
506*b520d056SSimon Glass 			&rv1106_clk_vicap_m1_fracmux),
507*b520d056SSimon Glass 	GATE(SCLK_VICAP_M1, "sclk_vicap_m1", "clk_vicap_m1", 0,
508*b520d056SSimon Glass 			 RV1106_CLKGATE_CON(3), 15, GFLAGS),
509*b520d056SSimon Glass 	COMPOSITE(DCLK_VOP_SRC, "dclk_vop_src", mux_gpll_cpll_p, 0,
510*b520d056SSimon Glass 			RV1106_CLKSEL_CON(23), 8, 1, MFLAGS, 3, 5, DFLAGS,
511*b520d056SSimon Glass 			RV1106_CLKGATE_CON(2), 6, GFLAGS),
512*b520d056SSimon Glass 
513*b520d056SSimon Glass 	/* PD_DDR */
514*b520d056SSimon Glass 	COMPOSITE_NODIV(PCLK_DDR_ROOT, "pclk_ddr_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
515*b520d056SSimon Glass 			RV1106_DDRCLKSEL_CON(0), 0, 2, MFLAGS,
516*b520d056SSimon Glass 			RV1106_DDRCLKGATE_CON(0), 0, GFLAGS),
517*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_DDR_ROOT, "aclk_ddr_root", mux_500m_300m_100m_24m_p, CLK_IS_CRITICAL,
518*b520d056SSimon Glass 			RV1106_DDRCLKSEL_CON(0), 8, 2, MFLAGS,
519*b520d056SSimon Glass 			RV1106_DDRCLKGATE_CON(0), 12, GFLAGS),
520*b520d056SSimon Glass 	GATE(PCLK_DDRPHY, "pclk_ddrphy", "pclk_ddr_root", CLK_IGNORE_UNUSED,
521*b520d056SSimon Glass 			RV1106_DDRCLKGATE_CON(1), 3, GFLAGS),
522*b520d056SSimon Glass 	GATE(PCLK_DDR_HWLP, "pclk_ddr_hwlp", "pclk_ddr_root", CLK_IGNORE_UNUSED,
523*b520d056SSimon Glass 			RV1106_DDRCLKGATE_CON(1), 2, GFLAGS),
524*b520d056SSimon Glass 	GATE(PCLK_DDRMON, "pclk_ddrmon", "pclk_ddr_root", 0,
525*b520d056SSimon Glass 			RV1106_DDRCLKGATE_CON(0), 7, GFLAGS),
526*b520d056SSimon Glass 	GATE(CLK_TIMER_DDRMON, "clk_timer_ddrmon", "xin24m", 0,
527*b520d056SSimon Glass 			RV1106_DDRCLKGATE_CON(0), 8, GFLAGS),
528*b520d056SSimon Glass 	GATE(PCLK_DDRC, "pclk_ddrc", "pclk_ddr_root", CLK_IGNORE_UNUSED,
529*b520d056SSimon Glass 			RV1106_DDRCLKGATE_CON(0), 5, GFLAGS),
530*b520d056SSimon Glass 	GATE(PCLK_DFICTRL, "pclk_dfictrl", "pclk_ddr_root", CLK_IS_CRITICAL,
531*b520d056SSimon Glass 			RV1106_DDRCLKGATE_CON(0), 11, GFLAGS),
532*b520d056SSimon Glass 	GATE(ACLK_SYS_SHRM, "aclk_sys_shrm", "aclk_ddr_root", CLK_IS_CRITICAL,
533*b520d056SSimon Glass 			RV1106_DDRCLKGATE_CON(0), 13, GFLAGS),
534*b520d056SSimon Glass 
535*b520d056SSimon Glass 	/* PD_NPU */
536*b520d056SSimon Glass 	COMPOSITE_NODIV(HCLK_NPU_ROOT, "hclk_npu_root", mux_150m_100m_50m_24m_p, CLK_IS_CRITICAL,
537*b520d056SSimon Glass 			RV1106_NPUCLKSEL_CON(0), 0, 2, MFLAGS,
538*b520d056SSimon Glass 			RV1106_NPUCLKGATE_CON(0), 0, GFLAGS),
539*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_NPU_ROOT, "aclk_npu_root", mux_500m_300m_pvtpll0_pvtpll1_p, CLK_IS_CRITICAL,
540*b520d056SSimon Glass 			RV1106_NPUCLKSEL_CON(0), 2, 2, MFLAGS,
541*b520d056SSimon Glass 			RV1106_NPUCLKGATE_CON(0), 1, GFLAGS),
542*b520d056SSimon Glass 	COMPOSITE_NODIV(PCLK_NPU_ROOT, "pclk_npu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
543*b520d056SSimon Glass 			RV1106_NPUCLKSEL_CON(0), 4, 2, MFLAGS,
544*b520d056SSimon Glass 			RV1106_NPUCLKGATE_CON(0), 2, GFLAGS),
545*b520d056SSimon Glass 	GATE(HCLK_RKNN, "hclk_rknn", "hclk_npu_root", 0,
546*b520d056SSimon Glass 			RV1106_NPUCLKGATE_CON(0), 9, GFLAGS),
547*b520d056SSimon Glass 	GATE(ACLK_RKNN, "aclk_rknn", "aclk_npu_root", 0,
548*b520d056SSimon Glass 			RV1106_NPUCLKGATE_CON(0), 10, GFLAGS),
549*b520d056SSimon Glass 
550*b520d056SSimon Glass 	/* PD_PERI */
551*b520d056SSimon Glass 	COMPOSITE_NODIV(PCLK_PERI_ROOT, "pclk_peri_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
552*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(1), 0, 2, MFLAGS,
553*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 0, GFLAGS),
554*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_PERI_ROOT, "aclk_peri_root", mux_400m_200m_100m_24m_p, CLK_IS_CRITICAL,
555*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(1), 2, 2, MFLAGS,
556*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 1, GFLAGS),
557*b520d056SSimon Glass 	COMPOSITE_NODIV(HCLK_PERI_ROOT, "hclk_peri_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
558*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(1), 4, 2, MFLAGS,
559*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 2, GFLAGS),
560*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_BUS_ROOT, "aclk_bus_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
561*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(9), 0, 2, MFLAGS,
562*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 8, GFLAGS),
563*b520d056SSimon Glass 	GATE(PCLK_ACODEC, "pclk_acodec", "pclk_peri_root", 0,
564*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 3, GFLAGS),
565*b520d056SSimon Glass 	COMPOSITE_NOMUX(MCLK_ACODEC_TX, "mclk_acodec_tx", "mclk_i2s0_8ch_tx", 0,
566*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(8), 0, 8, DFLAGS,
567*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 4, GFLAGS),
568*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_CORE_CRYPTO, "clk_core_crypto", mux_300m_200m_100m_24m_p, 0,
569*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(6), 5, 2, MFLAGS,
570*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 11, GFLAGS),
571*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_PKA_CRYPTO, "clk_pka_crypto", mux_300m_200m_100m_24m_p, 0,
572*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(6), 7, 2, MFLAGS,
573*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 12, GFLAGS),
574*b520d056SSimon Glass 	GATE(ACLK_CRYPTO, "aclk_crypto", "aclk_bus_root", 0,
575*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 13, GFLAGS),
576*b520d056SSimon Glass 	GATE(HCLK_CRYPTO, "hclk_crypto", "hclk_peri_root", 0,
577*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 14, GFLAGS),
578*b520d056SSimon Glass 	GATE(ACLK_DECOM, "aclk_decom", "aclk_peri_root", 0,
579*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(5), 9, GFLAGS),
580*b520d056SSimon Glass 	GATE(PCLK_DECOM, "pclk_decom", "pclk_peri_root", 0,
581*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(5), 10, GFLAGS),
582*b520d056SSimon Glass 	COMPOSITE_NODIV(DCLK_DECOM, "dclk_decom", mux_400m_200m_100m_24m_p, 0,
583*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(7), 14, 2, MFLAGS,
584*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(5), 11, GFLAGS),
585*b520d056SSimon Glass 	GATE(ACLK_DMAC, "aclk_dmac", "aclk_bus_root", 0,
586*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(5), 8, GFLAGS),
587*b520d056SSimon Glass 	GATE(PCLK_DSM, "pclk_dsm", "pclk_peri_root", 0,
588*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 2, GFLAGS),
589*b520d056SSimon Glass 	GATE(MCLK_DSM, "mclk_dsm", "mclk_i2s0_8ch_tx", 0,
590*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 1, GFLAGS),
591*b520d056SSimon Glass 	COMPOSITE(CCLK_SRC_EMMC, "cclk_src_emmc", mux_400m_24m_p, 0,
592*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(7), 6, 1, MFLAGS, 0, 6, DFLAGS,
593*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 12, GFLAGS),
594*b520d056SSimon Glass 	GATE(HCLK_EMMC, "hclk_emmc", "hclk_peri_root", 0,
595*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 13, GFLAGS),
596*b520d056SSimon Glass 	GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_peri_root", 0,
597*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(2), 0, GFLAGS),
598*b520d056SSimon Glass 	GATE(DBCLK_GPIO4, "dbclk_gpio4", "xin24m", 0,
599*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(2), 1, GFLAGS),
600*b520d056SSimon Glass 	GATE(PCLK_I2C0, "pclk_i2c0", "pclk_peri_root", 0,
601*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 6, GFLAGS),
602*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_I2C0, "clk_i2c0", mux_200m_100m_50m_24m_p, 0,
603*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(1), 8, 2, MFLAGS,
604*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 7, GFLAGS),
605*b520d056SSimon Glass 	GATE(PCLK_I2C2, "pclk_i2c2", "pclk_peri_root", 0,
606*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 10, GFLAGS),
607*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_I2C2, "clk_i2c2", mux_200m_100m_50m_24m_p, 0,
608*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(1), 12, 2, MFLAGS,
609*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 11, GFLAGS),
610*b520d056SSimon Glass 	GATE(PCLK_I2C3, "pclk_i2c3", "pclk_peri_root", 0,
611*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 12, GFLAGS),
612*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_I2C3, "clk_i2c3", mux_200m_100m_50m_24m_p, 0,
613*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(1), 14, 2, MFLAGS,
614*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 13, GFLAGS),
615*b520d056SSimon Glass 	GATE(PCLK_I2C4, "pclk_i2c4", "pclk_peri_root", 0,
616*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 14, GFLAGS),
617*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_I2C4, "clk_i2c4", mux_200m_100m_50m_24m_p, 0,
618*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(2), 0, 2, MFLAGS,
619*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 15, GFLAGS),
620*b520d056SSimon Glass 	GATE(HCLK_I2S0, "hclk_i2s0", "hclk_peri_root", 0,
621*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 0, GFLAGS),
622*b520d056SSimon Glass 	GATE(PCLK_DFT2APB, "pclk_dft2apb", "pclk_peri_root", CLK_IGNORE_UNUSED,
623*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 7, GFLAGS),
624*b520d056SSimon Glass 	GATE(HCLK_IVE, "hclk_ive", "hclk_peri_root", 0,
625*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 9, GFLAGS),
626*b520d056SSimon Glass 	GATE(ACLK_IVE, "aclk_ive", "aclk_peri_root", 0,
627*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 10, GFLAGS),
628*b520d056SSimon Glass 	GATE(PCLK_PWM0_PERI, "pclk_pwm0_peri", "pclk_peri_root", 0,
629*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(7), 3, GFLAGS),
630*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_PWM0_PERI, "clk_pwm0_peri", mux_100m_50m_24m_p, 0,
631*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(11), 0, 2, MFLAGS,
632*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(7), 4, GFLAGS),
633*b520d056SSimon Glass 	GATE(CLK_CAPTURE_PWM0_PERI, "clk_capture_pwm0_peri", "xin24m", 0,
634*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(7), 5, GFLAGS),
635*b520d056SSimon Glass 	GATE(CLK_TIMER_ROOT, "clk_timer_root", "xin24m", 0,
636*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 3, GFLAGS),
637*b520d056SSimon Glass 	GATE(HCLK_SFC, "hclk_sfc", "hclk_peri_root", 0,
638*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 14, GFLAGS),
639*b520d056SSimon Glass 	COMPOSITE(SCLK_SFC, "sclk_sfc", mux_500m_300m_200m_24m_p, 0,
640*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(7), 12, 2, MFLAGS, 7, 5, DFLAGS,
641*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(5), 0, GFLAGS),
642*b520d056SSimon Glass 	GATE(PCLK_UART0, "pclk_uart0", "pclk_peri_root", 0,
643*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 11, GFLAGS),
644*b520d056SSimon Glass 	GATE(PCLK_UART1, "pclk_uart1", "pclk_peri_root", 0,
645*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(6), 15, GFLAGS),
646*b520d056SSimon Glass 	GATE(PCLK_PWM1_PERI, "pclk_pwm1_peri", "pclk_peri_root", 0,
647*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 15, GFLAGS),
648*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_PWM1_PERI, "clk_pwm1_peri", mux_100m_50m_24m_p, 0,
649*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(6), 9, 2, MFLAGS,
650*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 0, GFLAGS),
651*b520d056SSimon Glass 	GATE(CLK_CAPTURE_PWM1_PERI, "clk_capture_pwm1_peri", "xin24m", 0,
652*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 1, GFLAGS),
653*b520d056SSimon Glass 	GATE(PCLK_PWM2_PERI, "pclk_pwm2_peri", "pclk_peri_root", 0,
654*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 2, GFLAGS),
655*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_PWM2_PERI, "clk_pwm2_peri", mux_100m_50m_24m_p, 0,
656*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(6), 11, 2, MFLAGS,
657*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 3, GFLAGS),
658*b520d056SSimon Glass 	GATE(CLK_CAPTURE_PWM2_PERI, "clk_capture_pwm2_peri", "xin24m", 0,
659*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 4, GFLAGS),
660*b520d056SSimon Glass 	GATE(HCLK_BOOTROM, "hclk_bootrom", "hclk_peri_root", 0,
661*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 7, GFLAGS),
662*b520d056SSimon Glass 	GATE(HCLK_SAI, "hclk_sai", "hclk_peri_root", 0,
663*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(5), 13, GFLAGS),
664*b520d056SSimon Glass 	GATE(MCLK_SAI, "mclk_sai", "mclk_i2s0_8ch_tx", 0,
665*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(5), 14, GFLAGS),
666*b520d056SSimon Glass 	GATE(PCLK_SARADC, "pclk_saradc", "pclk_peri_root", 0,
667*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 3, GFLAGS),
668*b520d056SSimon Glass 	COMPOSITE_NOMUX(CLK_SARADC, "clk_saradc", "xin24m", 0,
669*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(6), 0, 3, DFLAGS,
670*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 4, GFLAGS),
671*b520d056SSimon Glass 	GATE(PCLK_SPI1, "pclk_spi1", "pclk_peri_root", 0,
672*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 6, GFLAGS),
673*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_SPI1, "clk_spi1", mux_200m_100m_50m_24m_p, 0,
674*b520d056SSimon Glass 			RV1106_PERICLKSEL_CON(6), 3, 2, MFLAGS,
675*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 7, GFLAGS),
676*b520d056SSimon Glass 	GATE(PCLK_STIMER, "pclk_stimer", "pclk_peri_root", 0,
677*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 15, GFLAGS),
678*b520d056SSimon Glass 	GATE(CLK_STIMER0, "clk_stimer0", "clk_timer_root", 0,
679*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 0, GFLAGS),
680*b520d056SSimon Glass 	GATE(CLK_STIMER1, "clk_stimer1", "clk_timer_root", 0,
681*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 1, GFLAGS),
682*b520d056SSimon Glass 	GATE(PCLK_TIMER, "pclk_timer", "pclk_peri_root", 0,
683*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 8, GFLAGS),
684*b520d056SSimon Glass 	GATE(CLK_TIMER0, "clk_timer0", "clk_timer_root", 0,
685*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 9, GFLAGS),
686*b520d056SSimon Glass 	GATE(CLK_TIMER1, "clk_timer1", "clk_timer_root", 0,
687*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 10, GFLAGS),
688*b520d056SSimon Glass 	GATE(CLK_TIMER2, "clk_timer2", "clk_timer_root", 0,
689*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 11, GFLAGS),
690*b520d056SSimon Glass 	GATE(CLK_TIMER3, "clk_timer3", "clk_timer_root", 0,
691*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 12, GFLAGS),
692*b520d056SSimon Glass 	GATE(CLK_TIMER4, "clk_timer4", "clk_timer_root", 0,
693*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 13, GFLAGS),
694*b520d056SSimon Glass 	GATE(CLK_TIMER5, "clk_timer5", "clk_timer_root", 0,
695*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(0), 14, GFLAGS),
696*b520d056SSimon Glass 	GATE(HCLK_TRNG_NS, "hclk_trng_ns", "hclk_peri_root", 0,
697*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 9, GFLAGS),
698*b520d056SSimon Glass 	GATE(HCLK_TRNG_S, "hclk_trng_s", "hclk_peri_root", 0,
699*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(3), 10, GFLAGS),
700*b520d056SSimon Glass 	GATE(PCLK_UART2, "pclk_uart2", "pclk_peri_root", 0,
701*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(2), 3, GFLAGS),
702*b520d056SSimon Glass 	GATE(PCLK_UART3, "pclk_uart3", "pclk_peri_root", 0,
703*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(2), 7, GFLAGS),
704*b520d056SSimon Glass 	GATE(PCLK_UART4, "pclk_uart4", "pclk_peri_root", 0,
705*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(2), 11, GFLAGS),
706*b520d056SSimon Glass 	GATE(PCLK_UART5, "pclk_uart5", "pclk_peri_root", 0,
707*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(2), 15, GFLAGS),
708*b520d056SSimon Glass 	GATE(ACLK_USBOTG, "aclk_usbotg", "aclk_bus_root", 0,
709*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 7, GFLAGS),
710*b520d056SSimon Glass 	GATE(CLK_REF_USBOTG, "clk_ref_usbotg", "xin24m", 0,
711*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 8, GFLAGS),
712*b520d056SSimon Glass 	GATE(PCLK_USBPHY, "pclk_usbphy", "pclk_peri_root", 0,
713*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(5), 1, GFLAGS),
714*b520d056SSimon Glass 	GATE(CLK_REF_USBPHY, "clk_ref_usbphy", "xin24m", 0,
715*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(5), 2, GFLAGS),
716*b520d056SSimon Glass 	GATE(PCLK_WDT_NS, "pclk_wdt_ns", "pclk_peri_root", 0,
717*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 2, GFLAGS),
718*b520d056SSimon Glass 	GATE(TCLK_WDT_NS, "tclk_wdt_ns", "xin24m", 0,
719*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 3, GFLAGS),
720*b520d056SSimon Glass 	GATE(PCLK_WDT_S, "pclk_wdt_s", "pclk_peri_root", 0,
721*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 4, GFLAGS),
722*b520d056SSimon Glass 	GATE(TCLK_WDT_S, "tclk_wdt_s", "xin24m", 0,
723*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(1), 5, GFLAGS),
724*b520d056SSimon Glass 
725*b520d056SSimon Glass 	/* PD_PMU */
726*b520d056SSimon Glass 	COMPOSITE_FRACMUX(CLK_RTC32K_FRAC, "clk_rtc32k_frac", "xin24m", CLK_IGNORE_UNUSED,
727*b520d056SSimon Glass 			RV1106_PMUCLKSEL_CON(6), 0,
728*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(1), 14, GFLAGS,
729*b520d056SSimon Glass 			&rv1106_rtc32k_pmu_fracmux),
730*b520d056SSimon Glass 	DIV(CLK_100M_PMU, "clk_100m_pmu", "clk_200m_src", 0,
731*b520d056SSimon Glass 			RV1106_PMUCLKSEL_CON(0), 0, 3, DFLAGS),
732*b520d056SSimon Glass 	COMPOSITE_NODIV(PCLK_PMU_ROOT, "pclk_pmu_root", mux_100m_pmu_24m_p, CLK_IS_CRITICAL,
733*b520d056SSimon Glass 			RV1106_PMUCLKSEL_CON(0), 3, 1, MFLAGS,
734*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(0), 1, GFLAGS),
735*b520d056SSimon Glass 	COMPOSITE_NODIV(HCLK_PMU_ROOT, "hclk_pmu_root", mux_200m_100m_24m_p, CLK_IS_CRITICAL,
736*b520d056SSimon Glass 			RV1106_PMUCLKSEL_CON(0), 4, 2, MFLAGS,
737*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(0), 2, GFLAGS),
738*b520d056SSimon Glass 	GATE(CLK_PMU, "clk_pmu", "xin24m", CLK_IS_CRITICAL,
739*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(1), 0, GFLAGS),
740*b520d056SSimon Glass 	GATE(PCLK_PMU, "pclk_pmu", "pclk_pmu_root", CLK_IS_CRITICAL,
741*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(1), 1, GFLAGS),
742*b520d056SSimon Glass 	GATE(CLK_DDR_FAIL_SAFE, "clk_ddr_fail_safe", "clk_pmu", 0,
743*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(1), 15, GFLAGS),
744*b520d056SSimon Glass 	GATE(PCLK_PMU_GPIO0, "pclk_pmu_gpio0", "pclk_pmu_root", 0,
745*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(1), 2, GFLAGS),
746*b520d056SSimon Glass 	COMPOSITE_NODIV(DBCLK_PMU_GPIO0, "dbclk_pmu_gpio0", mux_24m_32k_p, 0,
747*b520d056SSimon Glass 			RV1106_PMUCLKSEL_CON(0), 15, 1, MFLAGS,
748*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(1), 3, GFLAGS),
749*b520d056SSimon Glass 	GATE(PCLK_I2C1, "pclk_i2c1", "pclk_pmu_root", 0,
750*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(0), 3, GFLAGS),
751*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_I2C1, "clk_i2c1", mux_200m_100m_24m_32k_p, 0,
752*b520d056SSimon Glass 			RV1106_PMUCLKSEL_CON(0), 6, 2, MFLAGS,
753*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(0), 4, GFLAGS),
754*b520d056SSimon Glass 	GATE(PCLK_PMU_MAILBOX, "pclk_pmu_mailbox", "pclk_pmu_root", 0,
755*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(2), 10, GFLAGS),
756*b520d056SSimon Glass 	GATE(CLK_PMU_MCU, "clk_pmu_mcu", "hclk_pmu_root", 0,
757*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(0), 9, GFLAGS),
758*b520d056SSimon Glass 	GATE(CLK_PMU_MCU_RTC, "clk_pmu_mcu_rtc", "xin24m", 0,
759*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(0), 13, GFLAGS),
760*b520d056SSimon Glass 	COMPOSITE_NOMUX(CLK_PVTM_PMU, "clk_pvtm_pmu", "xin24m", 0,
761*b520d056SSimon Glass 			RV1106_PMUCLKSEL_CON(1), 0, 5, DFLAGS,
762*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(1), 4, GFLAGS),
763*b520d056SSimon Glass 	GATE(PCLK_PVTM_PMU, "pclk_pvtm_pmu", "pclk_pmu_root", 0,
764*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(1), 5, GFLAGS),
765*b520d056SSimon Glass 	GATE(CLK_REFOUT, "clk_refout", "xin24m", 0,
766*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(2), 13, GFLAGS),
767*b520d056SSimon Glass 	GATE(HCLK_PMU_SRAM, "hclk_pmu_sram", "hclk_pmu_root", CLK_IGNORE_UNUSED,
768*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(0), 8, GFLAGS),
769*b520d056SSimon Glass 	GATE(PCLK_PMU_WDT, "pclk_pmu_wdt", "pclk_pmu_root", 0,
770*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(2), 8, GFLAGS),
771*b520d056SSimon Glass 	COMPOSITE_NODIV(TCLK_PMU_WDT, "tclk_pmu_wdt", mux_24m_32k_p, 0,
772*b520d056SSimon Glass 			RV1106_PMUCLKSEL_CON(7), 2, 1, MFLAGS,
773*b520d056SSimon Glass 			RV1106_PMUCLKGATE_CON(2), 9, GFLAGS),
774*b520d056SSimon Glass 
775*b520d056SSimon Glass 	/* PD_SUBDDR */
776*b520d056SSimon Glass 	COMPOSITE(CLK_CORE_DDRC_SRC, "clk_core_ddrc_src", mux_dpll_300m_p, CLK_IGNORE_UNUSED,
777*b520d056SSimon Glass 			RV1106_SUBDDRCLKSEL_CON(0), 5, 1, MFLAGS, 0, 5, DFLAGS,
778*b520d056SSimon Glass 			RV1106_SUBDDRCLKGATE_CON(0), 2, GFLAGS),
779*b520d056SSimon Glass 	GATE(CLK_DFICTRL, "clk_dfictrl", "clk_core_ddrc_src", CLK_IGNORE_UNUSED,
780*b520d056SSimon Glass 			RV1106_SUBDDRCLKGATE_CON(0), 5, GFLAGS),
781*b520d056SSimon Glass 	GATE(CLK_DDRMON, "clk_ddrmon", "clk_core_ddrc_src", CLK_IGNORE_UNUSED,
782*b520d056SSimon Glass 			RV1106_SUBDDRCLKGATE_CON(0), 4, GFLAGS),
783*b520d056SSimon Glass 	GATE(CLK_DDR_PHY, "clk_ddr_phy", "clk_core_ddrc_src", CLK_IGNORE_UNUSED,
784*b520d056SSimon Glass 			RV1106_SUBDDRCLKGATE_CON(0), 6, GFLAGS),
785*b520d056SSimon Glass 	GATE(ACLK_DDRC, "aclk_ddrc", "clk_core_ddrc_src", CLK_IS_CRITICAL,
786*b520d056SSimon Glass 			RV1106_SUBDDRCLKGATE_CON(0), 1, GFLAGS),
787*b520d056SSimon Glass 	GATE(CLK_CORE_DDRC, "clk_core_ddrc", "clk_core_ddrc_src", CLK_IS_CRITICAL,
788*b520d056SSimon Glass 			RV1106_SUBDDRCLKGATE_CON(0), 3, GFLAGS),
789*b520d056SSimon Glass 
790*b520d056SSimon Glass 	/* PD_VEPU */
791*b520d056SSimon Glass 	COMPOSITE_NODIV(HCLK_VEPU_ROOT, "hclk_vepu_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
792*b520d056SSimon Glass 			RV1106_VEPUCLKSEL_CON(0), 0, 2, MFLAGS,
793*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 0, GFLAGS),
794*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_VEPU_COM_ROOT, "aclk_vepu_com_root", mux_400m_200m_100m_24m_p, CLK_IS_CRITICAL,
795*b520d056SSimon Glass 			RV1106_VEPUCLKSEL_CON(0), 2, 2, MFLAGS,
796*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 1, GFLAGS),
797*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_VEPU_ROOT, "aclk_vepu_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
798*b520d056SSimon Glass 			RV1106_VEPUCLKSEL_CON(0), 4, 2, MFLAGS,
799*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 2, GFLAGS),
800*b520d056SSimon Glass 	COMPOSITE_NODIV(PCLK_VEPU_ROOT, "pclk_vepu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
801*b520d056SSimon Glass 			RV1106_VEPUCLKSEL_CON(0), 6, 2, MFLAGS,
802*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 3, GFLAGS),
803*b520d056SSimon Glass 	GATE(PCLK_SPI0, "pclk_spi0", "pclk_vepu_root", 0,
804*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(1), 2, GFLAGS),
805*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_SPI0, "clk_spi0", mux_200m_100m_50m_24m_p, 0,
806*b520d056SSimon Glass 			RV1106_VEPUCLKSEL_CON(0), 12, 2, MFLAGS,
807*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(1), 3, GFLAGS),
808*b520d056SSimon Glass 	GATE(CLK_UART_DETN_FLT, "clk_uart_detn_flt", "xin24m", 0,
809*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(1), 8, GFLAGS),
810*b520d056SSimon Glass 	GATE(HCLK_VEPU, "hclk_vepu", "hclk_vepu_root", 0,
811*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 8, GFLAGS),
812*b520d056SSimon Glass 	GATE(ACLK_VEPU, "aclk_vepu", "aclk_vepu_root", 0,
813*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 9, GFLAGS),
814*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_CORE_VEPU, "clk_core_vepu", mux_400m_300m_pvtpll0_pvtpll1_p, 0,
815*b520d056SSimon Glass 			RV1106_VEPUCLKSEL_CON(0), 8, 2, MFLAGS,
816*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 10, GFLAGS),
817*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_CORE_VEPU_DVBM, "clk_core_vepu_dvbm", mux_200m_100m_50m_24m_p, 0,
818*b520d056SSimon Glass 			RV1106_VEPUCLKSEL_CON(0), 10, 2, MFLAGS,
819*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 13, GFLAGS),
820*b520d056SSimon Glass 	GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_vepu_root", 0,
821*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 15, GFLAGS),
822*b520d056SSimon Glass 	GATE(DBCLK_GPIO1, "dbclk_gpio1", "xin24m", 0,
823*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(1), 0, GFLAGS),
824*b520d056SSimon Glass 	GATE(HCLK_VEPU_PP, "hclk_vepu_pp", "hclk_vepu_root", 0,
825*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 11, GFLAGS),
826*b520d056SSimon Glass 	GATE(ACLK_VEPU_PP, "aclk_vepu_pp", "aclk_vepu_root", 0,
827*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 12, GFLAGS),
828*b520d056SSimon Glass 
829*b520d056SSimon Glass 	/* PD_VI */
830*b520d056SSimon Glass 	COMPOSITE_NODIV(HCLK_VI_ROOT, "hclk_vi_root", mux_150m_100m_50m_24m_p, CLK_IS_CRITICAL,
831*b520d056SSimon Glass 			RV1106_VICLKSEL_CON(0), 0, 2, MFLAGS,
832*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 0, GFLAGS),
833*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_VI_ROOT, "aclk_vi_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
834*b520d056SSimon Glass 			RV1106_VICLKSEL_CON(0), 2, 2, MFLAGS,
835*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 1, GFLAGS),
836*b520d056SSimon Glass 	COMPOSITE_NODIV(PCLK_VI_ROOT, "pclk_vi_root", mux_150m_100m_50m_24m_p, CLK_IS_CRITICAL,
837*b520d056SSimon Glass 			RV1106_VICLKSEL_CON(0), 4, 2, MFLAGS,
838*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 2, GFLAGS),
839*b520d056SSimon Glass 	COMPOSITE_NODIV(PCLK_VI_RTC_ROOT, "pclk_vi_rtc_root", mux_50m_24m_p, 0,
840*b520d056SSimon Glass 			RV1106_VICLKSEL_CON(0), 6, 1, MFLAGS,
841*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 3, GFLAGS),
842*b520d056SSimon Glass 
843*b520d056SSimon Glass 	GATE(PCLK_CSIHOST0, "pclk_csihost0", "pclk_vi_root", 0,
844*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 3, GFLAGS),
845*b520d056SSimon Glass 	GATE(PCLK_CSIHOST1, "pclk_csihost1", "pclk_vi_root", 0,
846*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 5, GFLAGS),
847*b520d056SSimon Glass 	GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_vi_root", 0,
848*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 15, GFLAGS),
849*b520d056SSimon Glass 	GATE(DBCLK_GPIO3, "dbclk_gpio3", "xin24m", 0,
850*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(2), 0, GFLAGS),
851*b520d056SSimon Glass 	GATE(HCLK_ISP3P2, "hclk_isp3p2", "hclk_vi_root", 0,
852*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 7, GFLAGS),
853*b520d056SSimon Glass 	GATE(ACLK_ISP3P2, "aclk_isp3p2", "aclk_vi_root", 0,
854*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 8, GFLAGS),
855*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_CORE_ISP3P2, "clk_core_isp3p2", mux_339m_200m_pvtpll0_pvtpll1_p, 0,
856*b520d056SSimon Glass 			RV1106_VICLKSEL_CON(0), 7, 2, MFLAGS,
857*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 9, GFLAGS),
858*b520d056SSimon Glass 	GATE(PCLK_MIPICSIPHY, "pclk_mipicsiphy", "pclk_vi_root", 0,
859*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 14, GFLAGS),
860*b520d056SSimon Glass 	COMPOSITE(CCLK_SRC_SDMMC, "cclk_src_sdmmc", mux_400m_24m_p, 0,
861*b520d056SSimon Glass 			RV1106_VICLKSEL_CON(1), 14, 1, MFLAGS, 8, 6, DFLAGS,
862*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 11, GFLAGS),
863*b520d056SSimon Glass 	GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_vi_root", 0,
864*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 12, GFLAGS),
865*b520d056SSimon Glass 	GATE(CLK_SDMMC_DETN_FLT, "clk_sdmmc_detn_flt", "xin24m", 0,
866*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 13, GFLAGS),
867*b520d056SSimon Glass 	GATE(PCLK_VI_RTC_TEST, "pclk_vi_rtc_test", "pclk_vi_rtc_root", 0,
868*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(2), 5, GFLAGS),
869*b520d056SSimon Glass 	GATE(PCLK_VI_RTC_PHY, "pclk_vi_rtc_phy", "pclk_vi_rtc_root", 0,
870*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(2), 6, GFLAGS),
871*b520d056SSimon Glass 	COMPOSITE_NODIV(DCLK_VICAP, "dclk_vicap", mux_339m_200m_100m_24m_p, 0,
872*b520d056SSimon Glass 			RV1106_VICLKSEL_CON(0), 9, 2, MFLAGS,
873*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 10, GFLAGS),
874*b520d056SSimon Glass 	GATE(ACLK_VICAP, "aclk_vicap", "aclk_vi_root", 0,
875*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 12, GFLAGS),
876*b520d056SSimon Glass 	GATE(HCLK_VICAP, "hclk_vicap", "hclk_vi_root", 0,
877*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 13, GFLAGS),
878*b520d056SSimon Glass 
879*b520d056SSimon Glass 	/* PD_VO */
880*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_MAC_ROOT, "aclk_mac_root", mux_300m_200m_100m_24m_p, 0,
881*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(1), 12, 2, MFLAGS,
882*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(1), 4, GFLAGS),
883*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_VO_ROOT, "aclk_vo_root", mux_400m_200m_100m_24m_p, CLK_IS_CRITICAL,
884*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(0), 0, 2, MFLAGS,
885*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 0, GFLAGS),
886*b520d056SSimon Glass 	COMPOSITE_NODIV(HCLK_VO_ROOT, "hclk_vo_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
887*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(0), 2, 2, MFLAGS,
888*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 1, GFLAGS),
889*b520d056SSimon Glass 	COMPOSITE_NODIV(PCLK_VO_ROOT, "pclk_vo_root", mux_150m_100m_50m_24m_p, CLK_IS_CRITICAL,
890*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(0), 4, 2, MFLAGS,
891*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 2, GFLAGS),
892*b520d056SSimon Glass 	COMPOSITE_NODIV(ACLK_VOP_ROOT, "aclk_vop_root", mux_300m_200m_100m_24m_p, 0,
893*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(1), 10, 2, MFLAGS,
894*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 11, GFLAGS),
895*b520d056SSimon Glass 
896*b520d056SSimon Glass 	GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_vo_root", 0,
897*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(3), 0, GFLAGS),
898*b520d056SSimon Glass 	GATE(DBCLK_GPIO2, "dbclk_gpio2", "xin24m", 0,
899*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(3), 1, GFLAGS),
900*b520d056SSimon Glass 	GATE(ACLK_MAC, "aclk_mac", "aclk_mac_root", 0,
901*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(1), 8, GFLAGS),
902*b520d056SSimon Glass 	GATE(PCLK_MAC, "pclk_mac", "pclk_vo_root", 0,
903*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(1), 9, GFLAGS),
904*b520d056SSimon Glass 	FACTOR(CLK_GMAC0_50M_O, "clk_gmac0_50m_o", "clk_50m_src", 0, 1, 1),
905*b520d056SSimon Glass 	FACTOR(CLK_GMAC0_REF_50M, "clk_gmac0_ref_50m", "clk_gmac0_50m_o", 0, 1, 1),
906*b520d056SSimon Glass 	DIV(CLK_GMAC0_TX_50M_O, "clk_gmac0_tx_50m_o", "clk_gmac0_50m_o", 0,
907*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(2), 1, 6, DFLAGS),
908*b520d056SSimon Glass 	GATE(CLK_MACPHY, "clk_macphy", "xin24m", 0,
909*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 13, GFLAGS),
910*b520d056SSimon Glass 	GATE(CLK_OTPC_ARB, "clk_otpc_arb", "xin24m", 0,
911*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 11, GFLAGS),
912*b520d056SSimon Glass 	GATE(PCLK_OTPC_NS, "pclk_otpc_ns", "pclk_vo_root", 0,
913*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 3, GFLAGS),
914*b520d056SSimon Glass 	GATE(CLK_SBPI_OTPC_NS, "clk_sbpi_otpc_ns", "xin24m", 0,
915*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 5, GFLAGS),
916*b520d056SSimon Glass 	COMPOSITE_NOMUX(CLK_USER_OTPC_NS, "clk_user_otpc_ns", "xin24m", 0,
917*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(3), 10, 3, DFLAGS,
918*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 6, GFLAGS),
919*b520d056SSimon Glass 	GATE(PCLK_OTPC_S, "pclk_otpc_s", "pclk_vo_root", 0,
920*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 7, GFLAGS),
921*b520d056SSimon Glass 	GATE(CLK_SBPI_OTPC_S, "clk_sbpi_otpc_s", "xin24m", 0,
922*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 9, GFLAGS),
923*b520d056SSimon Glass 	COMPOSITE_NOMUX(CLK_USER_OTPC_S, "clk_user_otpc_s", "xin24m", 0,
924*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(3), 13, 3, DFLAGS,
925*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 10, GFLAGS),
926*b520d056SSimon Glass 	GATE(PCLK_OTP_MASK, "pclk_otp_mask", "pclk_vo_root", 0,
927*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 14, GFLAGS),
928*b520d056SSimon Glass 	GATE(CLK_PMC_OTP, "clk_pmc_otp", "clk_sbpi_otpc_s", 0,
929*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 15, GFLAGS),
930*b520d056SSimon Glass 	GATE(HCLK_RGA2E, "hclk_rga2e", "hclk_vo_root", 0,
931*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 7, GFLAGS),
932*b520d056SSimon Glass 	GATE(ACLK_RGA2E, "aclk_rga2e", "aclk_vo_root", 0,
933*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 8, GFLAGS),
934*b520d056SSimon Glass 	COMPOSITE_NODIV(CLK_CORE_RGA2E, "clk_core_rga2e", mux_400m_200m_100m_24m_p, 0,
935*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(1), 8, 2, MFLAGS,
936*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 9, GFLAGS),
937*b520d056SSimon Glass 	COMPOSITE(CCLK_SRC_SDIO, "cclk_src_sdio", mux_400m_24m_p, 0,
938*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(2), 13, 1, MFLAGS, 7, 6, DFLAGS,
939*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(1), 14, GFLAGS),
940*b520d056SSimon Glass 	GATE(HCLK_SDIO, "hclk_sdio", "hclk_vo_root", 0,
941*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(1), 15, GFLAGS),
942*b520d056SSimon Glass 	GATE(PCLK_TSADC, "pclk_tsadc", "pclk_vo_root", 0,
943*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 0, GFLAGS),
944*b520d056SSimon Glass 	COMPOSITE_NOMUX(CLK_TSADC, "clk_tsadc", "xin24m", 0,
945*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(3), 0, 5, DFLAGS,
946*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 1, GFLAGS),
947*b520d056SSimon Glass 	COMPOSITE_NOMUX(CLK_TSADC_TSEN, "clk_tsadc_tsen", "xin24m", 0,
948*b520d056SSimon Glass 			RV1106_VOCLKSEL_CON(3), 5, 5, DFLAGS,
949*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(2), 2, GFLAGS),
950*b520d056SSimon Glass 	GATE(HCLK_VOP, "hclk_vop", "hclk_vo_root", 0,
951*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 13, GFLAGS),
952*b520d056SSimon Glass 	GATE(DCLK_VOP, "dclk_vop", "dclk_vop_src", 0,
953*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 14, GFLAGS),
954*b520d056SSimon Glass 	GATE(ACLK_VOP, "aclk_vop", "aclk_vop_root", 0,
955*b520d056SSimon Glass 			RV1106_VOCLKGATE_CON(0), 15, GFLAGS),
956*b520d056SSimon Glass 
957*b520d056SSimon Glass 	/* IO CLK */
958*b520d056SSimon Glass 	GATE(RX0PCLK_VICAP, "rx0pclk_vicap", "rx0pclk_vicap_io", 0,
959*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 0, GFLAGS),
960*b520d056SSimon Glass 	GATE(RX1PCLK_VICAP, "rx1pclk_vicap", "rx1pclk_vicap_io", 0,
961*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 1, GFLAGS),
962*b520d056SSimon Glass 	GATE(ISP0CLK_VICAP, "isp0clk_vicap", "isp0clk_vicap_io", 0,
963*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 2, GFLAGS),
964*b520d056SSimon Glass 	GATE(I0CLK_VICAP, "i0clk_vicap", "i0clk_vicap_io", 0,
965*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 14, GFLAGS),
966*b520d056SSimon Glass 	GATE(I1CLK_VICAP, "i1clk_vicap", "i1clk_vicap_io", 0,
967*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 15, GFLAGS),
968*b520d056SSimon Glass 	GATE(PCLK_VICAP, "pclk_vicap", "pclk_vicap_io", 0,
969*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(0), 11, GFLAGS),
970*b520d056SSimon Glass 	GATE(CLK_RXBYTECLKHS_0, "clk_rxbyteclkhs_0", "clk_rxbyteclkhs_0_io", 0,
971*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 4, GFLAGS),
972*b520d056SSimon Glass 	GATE(CLK_RXBYTECLKHS_1, "clk_rxbyteclkhs_1", "clk_rxbyteclkhs_1_io", 0,
973*b520d056SSimon Glass 			RV1106_VICLKGATE_CON(1), 6, GFLAGS),
974*b520d056SSimon Glass 
975*b520d056SSimon Glass 	GATE(PCLK_VICAP_VEPU, "pclk_vicap_vepu", "pclk_vicap_vepu_io", 0,
976*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(0), 14, GFLAGS),
977*b520d056SSimon Glass 	GATE(SCLK_IN_SPI0, "sclk_in_spi0", "sclk_in_spi0_io", 0,
978*b520d056SSimon Glass 			RV1106_VEPUCLKGATE_CON(1), 4, GFLAGS),
979*b520d056SSimon Glass 
980*b520d056SSimon Glass 	GATE(CLK_UTMI_USBOTG, "clk_utmi_usbotg", "clk_utmi_usbotg_io", 0,
981*b520d056SSimon Glass 			RV1106_PERICLKGATE_CON(4), 9, GFLAGS),
982*b520d056SSimon Glass };
983*b520d056SSimon Glass 
984*b520d056SSimon Glass static struct rockchip_clk_branch rv1106_grf_clk_branches[] __initdata = {
985*b520d056SSimon Glass 	MMC_GRF(SCLK_EMMC_DRV, "emmc_drv", "cclk_src_emmc",
986*b520d056SSimon Glass 		RV1106_EMMC_CON0, 1, grf_type_sys),
987*b520d056SSimon Glass 	MMC_GRF(SCLK_EMMC_SAMPLE, "emmc_sample", "cclk_src_emmc",
988*b520d056SSimon Glass 		RV1106_EMMC_CON1, 1, grf_type_sys),
989*b520d056SSimon Glass 	MMC_GRF(SCLK_SDMMC_DRV, "sdmmc_drv", "cclk_src_sdmmc",
990*b520d056SSimon Glass 		RV1106_SDMMC_CON0, 1, grf_type_sys),
991*b520d056SSimon Glass 	MMC_GRF(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "cclk_src_sdmmc",
992*b520d056SSimon Glass 		RV1106_SDMMC_CON1, 1, grf_type_sys),
993*b520d056SSimon Glass 	MMC_GRF(SCLK_SDIO_DRV, "sdio_drv", "cclk_src_sdio",
994*b520d056SSimon Glass 		RV1106_SDIO_CON0, 1, grf_type_sys),
995*b520d056SSimon Glass 	MMC_GRF(SCLK_SDIO_SAMPLE, "sdio_sample", "cclk_src_sdio",
996*b520d056SSimon Glass 		RV1106_SDIO_CON1, 1, grf_type_sys),
997*b520d056SSimon Glass };
998*b520d056SSimon Glass 
rv1106_pvtpll_init(struct rockchip_clk_provider * ctx)999*b520d056SSimon Glass static void __init rv1106_pvtpll_init(struct rockchip_clk_provider *ctx)
1000*b520d056SSimon Glass {
1001*b520d056SSimon Glass 	/* set pvtpll ref clk mux */
1002*b520d056SSimon Glass 	writel_relaxed(CPU_PVTPLL_PATH_CORE, ctx->reg_base + CPU_CLK_PATH_BASE);
1003*b520d056SSimon Glass 
1004*b520d056SSimon Glass 	if (!IS_ERR(ctx->grf)) {
1005*b520d056SSimon Glass 		regmap_write(ctx->grf, CPU_PVTPLL_CON0_H,
1006*b520d056SSimon Glass 			     HIWORD_UPDATE(0x7, PVTPLL_LENGTH_SEL_MASK,
1007*b520d056SSimon Glass 					   PVTPLL_LENGTH_SEL_SHIFT));
1008*b520d056SSimon Glass 		regmap_write(ctx->grf, CPU_PVTPLL_CON0_L,
1009*b520d056SSimon Glass 			     HIWORD_UPDATE(0x1, PVTPLL_RING_SEL_MASK,
1010*b520d056SSimon Glass 					   PVTPLL_RING_SEL_SHIFT));
1011*b520d056SSimon Glass 		regmap_write(ctx->grf, CPU_PVTPLL_CON0_L,
1012*b520d056SSimon Glass 			     HIWORD_UPDATE(0x3, PVTPLL_EN_MASK,
1013*b520d056SSimon Glass 					   PVTPLL_EN_SHIFT));
1014*b520d056SSimon Glass 	}
1015*b520d056SSimon Glass 
1016*b520d056SSimon Glass 	writel_relaxed(0x007f0000, ctx->reg_base + CRU_PVTPLL0_CON0_H);
1017*b520d056SSimon Glass 	writel_relaxed(0xffff0018, ctx->reg_base + CRU_PVTPLL0_CON1_L);
1018*b520d056SSimon Glass 	writel_relaxed(0xffff0004, ctx->reg_base + CRU_PVTPLL0_CON2_H);
1019*b520d056SSimon Glass 	writel_relaxed(0x00030003, ctx->reg_base + CRU_PVTPLL0_CON0_L);
1020*b520d056SSimon Glass 
1021*b520d056SSimon Glass 	writel_relaxed(0x007f0000, ctx->reg_base + CRU_PVTPLL1_CON0_H);
1022*b520d056SSimon Glass 	writel_relaxed(0xffff0018, ctx->reg_base + CRU_PVTPLL1_CON1_L);
1023*b520d056SSimon Glass 	writel_relaxed(0xffff0004, ctx->reg_base + CRU_PVTPLL1_CON2_H);
1024*b520d056SSimon Glass 	writel_relaxed(0x00030003, ctx->reg_base + CRU_PVTPLL1_CON0_L);
1025*b520d056SSimon Glass }
1026*b520d056SSimon Glass 
clk_rv1106_probe(struct platform_device * pdev)1027*b520d056SSimon Glass static int __init clk_rv1106_probe(struct platform_device *pdev)
1028*b520d056SSimon Glass {
1029*b520d056SSimon Glass 	struct device *dev = &pdev->dev;
1030*b520d056SSimon Glass 	struct device_node *np = dev->of_node;
1031*b520d056SSimon Glass 	struct rockchip_clk_provider *ctx;
1032*b520d056SSimon Glass 	unsigned long clk_nr;
1033*b520d056SSimon Glass 	void __iomem *reg_base;
1034*b520d056SSimon Glass 	int ret;
1035*b520d056SSimon Glass 
1036*b520d056SSimon Glass 	clk_nr = rockchip_clk_find_max_clk_id(rv1106_clk_branches,
1037*b520d056SSimon Glass 					      ARRAY_SIZE(rv1106_clk_branches)) + 1;
1038*b520d056SSimon Glass 	clk_nr = max(clk_nr,
1039*b520d056SSimon Glass 		     rockchip_clk_find_max_clk_id(rv1106_grf_clk_branches,
1040*b520d056SSimon Glass 					ARRAY_SIZE(rv1106_grf_clk_branches)) + 1);
1041*b520d056SSimon Glass 	reg_base = devm_platform_ioremap_resource(pdev, 0);
1042*b520d056SSimon Glass 	if (IS_ERR(reg_base))
1043*b520d056SSimon Glass 		return dev_err_probe(dev, PTR_ERR(reg_base),
1044*b520d056SSimon Glass 				     "could not map cru region");
1045*b520d056SSimon Glass 
1046*b520d056SSimon Glass 	ctx = rockchip_clk_init(np, reg_base, clk_nr);
1047*b520d056SSimon Glass 	if (IS_ERR(ctx))
1048*b520d056SSimon Glass 		return dev_err_probe(dev, PTR_ERR(ctx),
1049*b520d056SSimon Glass 				     "rockchip clk init failed");
1050*b520d056SSimon Glass 
1051*b520d056SSimon Glass 	rv1106_pvtpll_init(ctx);
1052*b520d056SSimon Glass 
1053*b520d056SSimon Glass 	rockchip_clk_register_plls(ctx, rv1106_pll_clks,
1054*b520d056SSimon Glass 				   ARRAY_SIZE(rv1106_pll_clks),
1055*b520d056SSimon Glass 				   RV1106_GRF_SOC_STATUS0);
1056*b520d056SSimon Glass 
1057*b520d056SSimon Glass 	rockchip_clk_register_armclk(ctx, ARMCLK, "armclk",
1058*b520d056SSimon Glass 				     mux_armclk_p, ARRAY_SIZE(mux_armclk_p),
1059*b520d056SSimon Glass 				     &rv1106_cpuclk_data, rv1106_cpuclk_rates,
1060*b520d056SSimon Glass 				     ARRAY_SIZE(rv1106_cpuclk_rates));
1061*b520d056SSimon Glass 
1062*b520d056SSimon Glass 	rockchip_clk_register_branches(ctx, rv1106_clk_branches,
1063*b520d056SSimon Glass 				       ARRAY_SIZE(rv1106_clk_branches));
1064*b520d056SSimon Glass 
1065*b520d056SSimon Glass 	/*
1066*b520d056SSimon Glass 	 * The MMC drive and sample phase clocks have their control
1067*b520d056SSimon Glass 	 * registers in the GRF region, so they can only be provided when
1068*b520d056SSimon Glass 	 * the rockchip,grf property points at a valid syscon.
1069*b520d056SSimon Glass 	 */
1070*b520d056SSimon Glass 	if (!IS_ERR(ctx->grf)) {
1071*b520d056SSimon Glass 		ret = rockchip_clk_add_grf(ctx, ctx->grf, grf_type_sys);
1072*b520d056SSimon Glass 		if (ret)
1073*b520d056SSimon Glass 			dev_err(dev, "failed to add grf: %d\n", ret);
1074*b520d056SSimon Glass 		else
1075*b520d056SSimon Glass 			rockchip_clk_register_branches(ctx,
1076*b520d056SSimon Glass 					rv1106_grf_clk_branches,
1077*b520d056SSimon Glass 					ARRAY_SIZE(rv1106_grf_clk_branches));
1078*b520d056SSimon Glass 	}
1079*b520d056SSimon Glass 
1080*b520d056SSimon Glass 	rockchip_register_restart_notifier(ctx, RV1106_GLB_SRST_FST, NULL);
1081*b520d056SSimon Glass 
1082*b520d056SSimon Glass 	rockchip_clk_of_add_provider(np, ctx);
1083*b520d056SSimon Glass 
1084*b520d056SSimon Glass 	return 0;
1085*b520d056SSimon Glass }
1086*b520d056SSimon Glass 
1087*b520d056SSimon Glass static const struct of_device_id clk_rv1106_match_table[] = {
1088*b520d056SSimon Glass 	{ .compatible = "rockchip,rv1106-cru" },
1089*b520d056SSimon Glass 	{ /* end */ }
1090*b520d056SSimon Glass };
1091*b520d056SSimon Glass 
1092*b520d056SSimon Glass static struct platform_driver clk_rv1106_driver = {
1093*b520d056SSimon Glass 	.driver = {
1094*b520d056SSimon Glass 		.name			= "clk-rv1106",
1095*b520d056SSimon Glass 		.of_match_table		= clk_rv1106_match_table,
1096*b520d056SSimon Glass 		.suppress_bind_attrs	= true,
1097*b520d056SSimon Glass 	},
1098*b520d056SSimon Glass };
1099*b520d056SSimon Glass builtin_platform_driver_probe(clk_rv1106_driver, clk_rv1106_probe);
1100