xref: /linux/drivers/clk/rockchip/clk-rk3528.c (revision 9f32a03e3e0d372c520d829dd4da6022fe88832a)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
4  * Copyright (c) 2024 Yao Zi <ziyao@disroot.org>
5  * Author: Joseph Chen <chenjh@rock-chips.com>
6  */
7 
8 #include <linux/clk-provider.h>
9 #include <linux/module.h>
10 #include <linux/of.h>
11 #include <linux/of_device.h>
12 #include <linux/platform_device.h>
13 #include <linux/mfd/syscon.h>
14 #include <linux/minmax.h>
15 #include <linux/slab.h>
16 
17 #include <dt-bindings/clock/rockchip,rk3528-cru.h>
18 
19 #include "clk.h"
20 
21 #define RK3528_GRF_SOC_STATUS0		0x1a0
22 
23 enum rk3528_plls {
24 	apll, cpll, gpll, ppll, dpll,
25 };
26 
27 static struct rockchip_pll_rate_table rk3528_pll_rates[] = {
28 	RK3036_PLL_RATE(1896000000, 1, 79, 1, 1, 1, 0),
29 	RK3036_PLL_RATE(1800000000, 1, 75, 1, 1, 1, 0),
30 	RK3036_PLL_RATE(1704000000, 1, 71, 1, 1, 1, 0),
31 	RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0),
32 	RK3036_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0),
33 	RK3036_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0),
34 	RK3036_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0),
35 	RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0),
36 	RK3036_PLL_RATE(1188000000, 1, 99, 2, 1, 1, 0),		/* GPLL */
37 	RK3036_PLL_RATE(1092000000, 2, 91, 1, 1, 1, 0),
38 	RK3036_PLL_RATE(1008000000, 1, 42, 1, 1, 1, 0),
39 	RK3036_PLL_RATE(1000000000, 1, 125, 3, 1, 1, 0),	/* PPLL */
40 	RK3036_PLL_RATE(996000000, 2, 83, 1, 1, 1, 0),		/* CPLL */
41 	RK3036_PLL_RATE(960000000, 1, 40, 1, 1, 1, 0),
42 	RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0),
43 	RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
44 	RK3036_PLL_RATE(600000000, 1, 50, 2, 1, 1, 0),
45 	RK3036_PLL_RATE(594000000, 2, 99, 2, 1, 1, 0),
46 	RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),
47 	RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0),
48 	RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),
49 	RK3036_PLL_RATE(96000000, 1, 24, 3, 2, 1, 0),
50 	{ /* sentinel */ },
51 };
52 
53 #define RK3528_DIV_ACLK_M_CORE_MASK	0x1f
54 #define RK3528_DIV_ACLK_M_CORE_SHIFT	11
55 #define RK3528_DIV_PCLK_DBG_MASK	0x1f
56 #define RK3528_DIV_PCLK_DBG_SHIFT	1
57 
58 #define RK3528_CLKSEL39(_aclk_m_core)					\
59 {									\
60 	.reg = RK3528_CLKSEL_CON(39),					\
61 	.val = HIWORD_UPDATE(_aclk_m_core, RK3528_DIV_ACLK_M_CORE_MASK,	\
62 			     RK3528_DIV_ACLK_M_CORE_SHIFT),		\
63 }
64 
65 #define RK3528_CLKSEL40(_pclk_dbg)					\
66 {									\
67 	.reg = RK3528_CLKSEL_CON(40),					\
68 	.val = HIWORD_UPDATE(_pclk_dbg, RK3528_DIV_PCLK_DBG_MASK,	\
69 			     RK3528_DIV_PCLK_DBG_SHIFT),		\
70 }
71 
72 #define RK3528_CPUCLK_RATE(_prate, _aclk_m_core, _pclk_dbg)		\
73 {									\
74 	.prate = _prate,						\
75 	.divs = {							\
76 		RK3528_CLKSEL39(_aclk_m_core),				\
77 		RK3528_CLKSEL40(_pclk_dbg),				\
78 	},								\
79 }
80 
81 static struct rockchip_cpuclk_rate_table rk3528_cpuclk_rates[] __initdata = {
82 	RK3528_CPUCLK_RATE(1896000000, 1, 13),
83 	RK3528_CPUCLK_RATE(1800000000, 1, 12),
84 	RK3528_CPUCLK_RATE(1704000000, 1, 11),
85 	RK3528_CPUCLK_RATE(1608000000, 1, 11),
86 	RK3528_CPUCLK_RATE(1512000000, 1, 11),
87 	RK3528_CPUCLK_RATE(1416000000, 1, 9),
88 	RK3528_CPUCLK_RATE(1296000000, 1, 8),
89 	RK3528_CPUCLK_RATE(1200000000, 1, 8),
90 	RK3528_CPUCLK_RATE(1188000000, 1, 8),
91 	RK3528_CPUCLK_RATE(1092000000, 1, 7),
92 	RK3528_CPUCLK_RATE(1008000000, 1, 6),
93 	RK3528_CPUCLK_RATE(1000000000, 1, 6),
94 	RK3528_CPUCLK_RATE(996000000, 1, 6),
95 	RK3528_CPUCLK_RATE(960000000, 1, 6),
96 	RK3528_CPUCLK_RATE(912000000, 1, 6),
97 	RK3528_CPUCLK_RATE(816000000, 1, 5),
98 	RK3528_CPUCLK_RATE(600000000, 1, 3),
99 	RK3528_CPUCLK_RATE(594000000, 1, 3),
100 	RK3528_CPUCLK_RATE(408000000, 1, 2),
101 	RK3528_CPUCLK_RATE(312000000, 1, 2),
102 	RK3528_CPUCLK_RATE(216000000, 1, 1),
103 	RK3528_CPUCLK_RATE(96000000, 1, 0),
104 };
105 
106 static const struct rockchip_cpuclk_reg_data rk3528_cpuclk_data = {
107 	.core_reg[0] = RK3528_CLKSEL_CON(39),
108 	.div_core_shift[0] = 5,
109 	.div_core_mask[0] = 0x1f,
110 	.num_cores = 1,
111 	.mux_core_alt = 1,
112 	.mux_core_main = 0,
113 	.mux_core_shift = 10,
114 	.mux_core_mask = 0x1,
115 };
116 
117 PNAME(mux_pll_p)                        = { "xin24m" };
118 PNAME(mux_armclk)			= { "apll", "gpll" };
119 PNAME(mux_24m_32k_p)                    = { "xin24m", "clk_32k" };
120 PNAME(mux_gpll_cpll_p)                  = { "gpll", "cpll" };
121 PNAME(mux_gpll_cpll_xin24m_p)           = { "gpll", "cpll", "xin24m" };
122 PNAME(mux_100m_50m_24m_p)               = { "clk_100m_src", "clk_50m_src",
123 					    "xin24m" };
124 PNAME(mux_150m_100m_24m_p)              = { "clk_150m_src", "clk_100m_src",
125 					    "xin24m" };
126 PNAME(mux_200m_100m_24m_p)              = { "clk_200m_src", "clk_100m_src",
127 					    "xin24m" };
128 PNAME(mux_200m_100m_50m_24m_p)          = { "clk_200m_src", "clk_100m_src",
129 					    "clk_50m_src", "xin24m" };
130 PNAME(mux_300m_200m_100m_24m_p)         = { "clk_300m_src", "clk_200m_src",
131 					    "clk_100m_src", "xin24m" };
132 PNAME(mux_339m_200m_100m_24m_p)         = { "clk_339m_src", "clk_200m_src",
133 					    "clk_100m_src", "xin24m" };
134 PNAME(mux_500m_200m_100m_24m_p)         = { "clk_500m_src", "clk_200m_src",
135 					    "clk_100m_src", "xin24m" };
136 PNAME(mux_500m_300m_100m_24m_p)         = { "clk_500m_src", "clk_300m_src",
137 					    "clk_100m_src", "xin24m" };
138 PNAME(mux_600m_300m_200m_24m_p)         = { "clk_600m_src", "clk_300m_src",
139 					    "clk_200m_src", "xin24m" };
140 PNAME(aclk_gpu_p)                       = { "aclk_gpu_root",
141 					    "clk_gpu_pvtpll_src" };
142 PNAME(aclk_rkvdec_pvtmux_root_p)        = { "aclk_rkvdec_root",
143 					    "clk_rkvdec_pvtpll_src" };
144 PNAME(clk_i2c2_p)                       = { "clk_200m_src", "clk_100m_src",
145 					    "xin24m", "clk_32k" };
146 PNAME(clk_ref_pcie_inner_phy_p)         = { "clk_ppll_100m_src", "xin24m" };
147 PNAME(dclk_vop0_p)                      = { "dclk_vop_src0",
148 					    "clk_hdmiphy_pixel_io" };
149 PNAME(mclk_i2s0_2ch_sai_src_p)          = { "clk_i2s0_2ch_src",
150 					    "clk_i2s0_2ch_frac", "xin12m" };
151 PNAME(mclk_i2s1_8ch_sai_src_p)          = { "clk_i2s1_8ch_src",
152 					    "clk_i2s1_8ch_frac", "xin12m" };
153 PNAME(mclk_i2s2_2ch_sai_src_p)          = { "clk_i2s2_2ch_src",
154 					    "clk_i2s2_2ch_frac", "xin12m" };
155 PNAME(mclk_i2s3_8ch_sai_src_p)          = { "clk_i2s3_8ch_src",
156 					    "clk_i2s3_8ch_frac", "xin12m" };
157 PNAME(mclk_sai_i2s0_p)                  = { "mclk_i2s0_2ch_sai_src",
158 					    "i2s0_mclkin" };
159 PNAME(mclk_sai_i2s1_p)                  = { "mclk_i2s1_8ch_sai_src",
160 					    "i2s1_mclkin" };
161 PNAME(mclk_spdif_src_p)                 = { "clk_spdif_src", "clk_spdif_frac",
162 					    "xin12m" };
163 PNAME(sclk_uart0_src_p)                 = { "clk_uart0_src", "clk_uart0_frac",
164 					    "xin24m" };
165 PNAME(sclk_uart1_src_p)                 = { "clk_uart1_src", "clk_uart1_frac",
166 					    "xin24m" };
167 PNAME(sclk_uart2_src_p)                 = { "clk_uart2_src", "clk_uart2_frac",
168 					    "xin24m" };
169 PNAME(sclk_uart3_src_p)                 = { "clk_uart3_src", "clk_uart3_frac",
170 					    "xin24m" };
171 PNAME(sclk_uart4_src_p)                 = { "clk_uart4_src", "clk_uart4_frac",
172 					    "xin24m" };
173 PNAME(sclk_uart5_src_p)                 = { "clk_uart5_src", "clk_uart5_frac",
174 					    "xin24m" };
175 PNAME(sclk_uart6_src_p)                 = { "clk_uart6_src", "clk_uart6_frac",
176 					     "xin24m" };
177 PNAME(sclk_uart7_src_p)                 = { "clk_uart7_src", "clk_uart7_frac",
178 					    "xin24m" };
179 PNAME(clk_32k_p)                        = { "xin_osc0_div", "clk_pvtm_32k" };
180 
181 static struct rockchip_pll_clock rk3528_pll_clks[] __initdata = {
182 	[apll] = PLL(pll_rk3328, PLL_APLL, "apll", mux_pll_p,
183 			CLK_IS_CRITICAL, RK3528_PLL_CON(0),
184 			RK3528_MODE_CON, 0, 0, 0, rk3528_pll_rates),
185 
186 	[cpll] = PLL(pll_rk3328, PLL_CPLL, "cpll", mux_pll_p,
187 			CLK_IS_CRITICAL, RK3528_PLL_CON(8),
188 			RK3528_MODE_CON, 2, 0, 0, rk3528_pll_rates),
189 
190 	[gpll] = PLL(pll_rk3328, PLL_GPLL, "gpll", mux_pll_p,
191 			CLK_IS_CRITICAL, RK3528_PLL_CON(24),
192 			RK3528_MODE_CON, 4, 0, 0, rk3528_pll_rates),
193 
194 	[ppll] = PLL(pll_rk3328, PLL_PPLL, "ppll", mux_pll_p,
195 			CLK_IS_CRITICAL, RK3528_PCIE_PLL_CON(32),
196 			RK3528_MODE_CON, 6, 0, ROCKCHIP_PLL_FIXED_MODE, rk3528_pll_rates),
197 
198 	[dpll] = PLL(pll_rk3328, PLL_DPLL, "dpll", mux_pll_p,
199 			CLK_IGNORE_UNUSED, RK3528_DDRPHY_PLL_CON(16),
200 			RK3528_DDRPHY_MODE_CON, 0, 0, 0, rk3528_pll_rates),
201 };
202 
203 #define MFLAGS CLK_MUX_HIWORD_MASK
204 #define DFLAGS CLK_DIVIDER_HIWORD_MASK
205 #define GFLAGS (CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE)
206 
207 static struct rockchip_clk_branch rk3528_uart0_fracmux __initdata =
208 	MUX(CLK_UART0, "clk_uart0", sclk_uart0_src_p, CLK_SET_RATE_PARENT,
209 			RK3528_CLKSEL_CON(6), 0, 2, MFLAGS);
210 
211 static struct rockchip_clk_branch rk3528_uart1_fracmux __initdata =
212 	MUX(CLK_UART1, "clk_uart1", sclk_uart1_src_p, CLK_SET_RATE_PARENT,
213 			RK3528_CLKSEL_CON(8), 0, 2, MFLAGS);
214 
215 static struct rockchip_clk_branch rk3528_uart2_fracmux __initdata =
216 	MUX(CLK_UART2, "clk_uart2", sclk_uart2_src_p, CLK_SET_RATE_PARENT,
217 			RK3528_CLKSEL_CON(10), 0, 2, MFLAGS);
218 
219 static struct rockchip_clk_branch rk3528_uart3_fracmux __initdata =
220 	MUX(CLK_UART3, "clk_uart3", sclk_uart3_src_p, CLK_SET_RATE_PARENT,
221 			RK3528_CLKSEL_CON(12), 0, 2, MFLAGS);
222 
223 static struct rockchip_clk_branch rk3528_uart4_fracmux __initdata =
224 	MUX(CLK_UART4, "clk_uart4", sclk_uart4_src_p, CLK_SET_RATE_PARENT,
225 			RK3528_CLKSEL_CON(14), 0, 2, MFLAGS);
226 
227 static struct rockchip_clk_branch rk3528_uart5_fracmux __initdata =
228 	MUX(CLK_UART5, "clk_uart5", sclk_uart5_src_p, CLK_SET_RATE_PARENT,
229 			RK3528_CLKSEL_CON(16), 0, 2, MFLAGS);
230 
231 static struct rockchip_clk_branch rk3528_uart6_fracmux __initdata =
232 	MUX(CLK_UART6, "clk_uart6", sclk_uart6_src_p, CLK_SET_RATE_PARENT,
233 			RK3528_CLKSEL_CON(18), 0, 2, MFLAGS);
234 
235 static struct rockchip_clk_branch rk3528_uart7_fracmux __initdata =
236 	MUX(CLK_UART7, "clk_uart7", sclk_uart7_src_p, CLK_SET_RATE_PARENT,
237 			RK3528_CLKSEL_CON(20), 0, 2, MFLAGS);
238 
239 static struct rockchip_clk_branch mclk_i2s0_2ch_sai_src_fracmux __initdata =
240 	MUX(MCLK_I2S0_2CH_SAI_SRC_PRE, "mclk_i2s0_2ch_sai_src_pre", mclk_i2s0_2ch_sai_src_p, CLK_SET_RATE_PARENT,
241 			RK3528_CLKSEL_CON(22), 0, 2, MFLAGS);
242 
243 static struct rockchip_clk_branch mclk_i2s1_8ch_sai_src_fracmux __initdata =
244 	MUX(MCLK_I2S1_8CH_SAI_SRC_PRE, "mclk_i2s1_8ch_sai_src_pre", mclk_i2s1_8ch_sai_src_p, CLK_SET_RATE_PARENT,
245 			RK3528_CLKSEL_CON(26), 0, 2, MFLAGS);
246 
247 static struct rockchip_clk_branch mclk_i2s2_2ch_sai_src_fracmux __initdata =
248 	MUX(MCLK_I2S2_2CH_SAI_SRC_PRE, "mclk_i2s2_2ch_sai_src_pre", mclk_i2s2_2ch_sai_src_p, CLK_SET_RATE_PARENT,
249 			RK3528_CLKSEL_CON(28), 0, 2, MFLAGS);
250 
251 static struct rockchip_clk_branch mclk_i2s3_8ch_sai_src_fracmux __initdata =
252 	MUX(MCLK_I2S3_8CH_SAI_SRC_PRE, "mclk_i2s3_8ch_sai_src_pre", mclk_i2s3_8ch_sai_src_p, CLK_SET_RATE_PARENT,
253 			RK3528_CLKSEL_CON(24), 0, 2, MFLAGS);
254 
255 static struct rockchip_clk_branch mclk_spdif_src_fracmux __initdata =
256 	MUX(MCLK_SDPDIF_SRC_PRE, "mclk_spdif_src_pre", mclk_spdif_src_p, CLK_SET_RATE_PARENT,
257 			RK3528_CLKSEL_CON(32), 0, 2, MFLAGS);
258 
259 static struct rockchip_clk_branch rk3528_clk_branches[] __initdata = {
260 	/* top */
261 	FACTOR(0, "xin12m", "xin24m", 0, 1, 2),
262 
263 	COMPOSITE(CLK_MATRIX_250M_SRC, "clk_250m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
264 			RK3528_CLKSEL_CON(1), 15, 1, MFLAGS, 10, 5, DFLAGS,
265 			RK3528_CLKGATE_CON(0), 5, GFLAGS),
266 	COMPOSITE(CLK_MATRIX_500M_SRC, "clk_500m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
267 			RK3528_CLKSEL_CON(3), 11, 1, MFLAGS, 6, 5, DFLAGS,
268 			RK3528_CLKGATE_CON(0), 10, GFLAGS),
269 	COMPOSITE_NOMUX(CLK_MATRIX_50M_SRC, "clk_50m_src", "cpll", CLK_IS_CRITICAL,
270 			RK3528_CLKSEL_CON(0), 2, 5, DFLAGS,
271 			RK3528_CLKGATE_CON(0), 1, GFLAGS),
272 	COMPOSITE_NOMUX(CLK_MATRIX_100M_SRC, "clk_100m_src", "cpll", CLK_IS_CRITICAL,
273 			RK3528_CLKSEL_CON(0), 7, 5, DFLAGS,
274 			RK3528_CLKGATE_CON(0), 2, GFLAGS),
275 	COMPOSITE_NOMUX(CLK_MATRIX_150M_SRC, "clk_150m_src", "gpll", CLK_IS_CRITICAL,
276 			RK3528_CLKSEL_CON(1), 0, 5, DFLAGS,
277 			RK3528_CLKGATE_CON(0), 3, GFLAGS),
278 	COMPOSITE_NOMUX(CLK_MATRIX_200M_SRC, "clk_200m_src", "gpll", CLK_IS_CRITICAL,
279 			RK3528_CLKSEL_CON(1), 5, 5, DFLAGS,
280 			RK3528_CLKGATE_CON(0), 4, GFLAGS),
281 	COMPOSITE_NOMUX(CLK_MATRIX_300M_SRC, "clk_300m_src", "gpll", CLK_IS_CRITICAL,
282 			RK3528_CLKSEL_CON(2), 0, 5, DFLAGS,
283 			RK3528_CLKGATE_CON(0), 6, GFLAGS),
284 	COMPOSITE_NOMUX_HALFDIV(CLK_MATRIX_339M_SRC, "clk_339m_src", "gpll", CLK_IS_CRITICAL,
285 			RK3528_CLKSEL_CON(2), 5, 5, DFLAGS,
286 			RK3528_CLKGATE_CON(0), 7, GFLAGS),
287 	COMPOSITE_NOMUX(CLK_MATRIX_400M_SRC, "clk_400m_src", "gpll", CLK_IS_CRITICAL,
288 			RK3528_CLKSEL_CON(2), 10, 5, DFLAGS,
289 			RK3528_CLKGATE_CON(0), 8, GFLAGS),
290 	COMPOSITE_NOMUX(CLK_MATRIX_600M_SRC, "clk_600m_src", "gpll", CLK_IS_CRITICAL,
291 			RK3528_CLKSEL_CON(4), 0, 5, DFLAGS,
292 			RK3528_CLKGATE_CON(0), 11, GFLAGS),
293 	COMPOSITE(DCLK_VOP_SRC0, "dclk_vop_src0", mux_gpll_cpll_p, 0,
294 			RK3528_CLKSEL_CON(32), 10, 1, MFLAGS, 2, 8, DFLAGS,
295 			RK3528_CLKGATE_CON(3), 7, GFLAGS),
296 	COMPOSITE(DCLK_VOP_SRC1, "dclk_vop_src1", mux_gpll_cpll_p, 0,
297 			RK3528_CLKSEL_CON(33), 8, 1, MFLAGS, 0, 8, DFLAGS,
298 			RK3528_CLKGATE_CON(3), 8, GFLAGS),
299 	COMPOSITE_NOMUX(CLK_HSM, "clk_hsm", "xin24m", 0,
300 			RK3528_CLKSEL_CON(36), 5, 5, DFLAGS,
301 			RK3528_CLKGATE_CON(3), 13, GFLAGS),
302 
303 	COMPOSITE_NOMUX(CLK_UART0_SRC, "clk_uart0_src", "gpll", 0,
304 			RK3528_CLKSEL_CON(4), 5, 5, DFLAGS,
305 			RK3528_CLKGATE_CON(0), 12, GFLAGS),
306 	COMPOSITE_FRACMUX(CLK_UART0_FRAC, "clk_uart0_frac", "clk_uart0_src", CLK_SET_RATE_PARENT,
307 			RK3528_CLKSEL_CON(5), 0,
308 			RK3528_CLKGATE_CON(0), 13, GFLAGS,
309 			&rk3528_uart0_fracmux),
310 	GATE(SCLK_UART0, "sclk_uart0", "clk_uart0", 0,
311 			RK3528_CLKGATE_CON(0), 14, GFLAGS),
312 
313 	COMPOSITE_NOMUX(CLK_UART1_SRC, "clk_uart1_src", "gpll", 0,
314 			RK3528_CLKSEL_CON(6), 2, 5, DFLAGS,
315 			RK3528_CLKGATE_CON(0), 15, GFLAGS),
316 	COMPOSITE_FRACMUX(CLK_UART1_FRAC, "clk_uart1_frac", "clk_uart1_src", CLK_SET_RATE_PARENT,
317 			RK3528_CLKSEL_CON(7), 0,
318 			RK3528_CLKGATE_CON(1), 0, GFLAGS,
319 			&rk3528_uart1_fracmux),
320 	GATE(SCLK_UART1, "sclk_uart1", "clk_uart1", 0,
321 			RK3528_CLKGATE_CON(1), 1, GFLAGS),
322 
323 	COMPOSITE_NOMUX(CLK_UART2_SRC, "clk_uart2_src", "gpll", 0,
324 			RK3528_CLKSEL_CON(8), 2, 5, DFLAGS,
325 			RK3528_CLKGATE_CON(1), 2, GFLAGS),
326 	COMPOSITE_FRACMUX(CLK_UART2_FRAC, "clk_uart2_frac", "clk_uart2_src", CLK_SET_RATE_PARENT,
327 			RK3528_CLKSEL_CON(9), 0,
328 			RK3528_CLKGATE_CON(1), 3, GFLAGS,
329 			&rk3528_uart2_fracmux),
330 	GATE(SCLK_UART2, "sclk_uart2", "clk_uart2", 0,
331 			RK3528_CLKGATE_CON(1), 4, GFLAGS),
332 
333 	COMPOSITE_NOMUX(CLK_UART3_SRC, "clk_uart3_src", "gpll", 0,
334 			RK3528_CLKSEL_CON(10), 2, 5, DFLAGS,
335 			RK3528_CLKGATE_CON(1), 5, GFLAGS),
336 	COMPOSITE_FRACMUX(CLK_UART3_FRAC, "clk_uart3_frac", "clk_uart3_src", CLK_SET_RATE_PARENT,
337 			RK3528_CLKSEL_CON(11), 0,
338 			RK3528_CLKGATE_CON(1), 6, GFLAGS,
339 			&rk3528_uart3_fracmux),
340 	GATE(SCLK_UART3, "sclk_uart3", "clk_uart3", 0,
341 			RK3528_CLKGATE_CON(1), 7, GFLAGS),
342 
343 	COMPOSITE_NOMUX(CLK_UART4_SRC, "clk_uart4_src", "gpll", 0,
344 			RK3528_CLKSEL_CON(12), 2, 5, DFLAGS,
345 			RK3528_CLKGATE_CON(1), 8, GFLAGS),
346 	COMPOSITE_FRACMUX(CLK_UART4_FRAC, "clk_uart4_frac", "clk_uart4_src", CLK_SET_RATE_PARENT,
347 			RK3528_CLKSEL_CON(13), 0,
348 			RK3528_CLKGATE_CON(1), 9, GFLAGS,
349 			&rk3528_uart4_fracmux),
350 	GATE(SCLK_UART4, "sclk_uart4", "clk_uart4", 0,
351 			RK3528_CLKGATE_CON(1), 10, GFLAGS),
352 
353 	COMPOSITE_NOMUX(CLK_UART5_SRC, "clk_uart5_src", "gpll", 0,
354 			RK3528_CLKSEL_CON(14), 2, 5, DFLAGS,
355 			RK3528_CLKGATE_CON(1), 11, GFLAGS),
356 	COMPOSITE_FRACMUX(CLK_UART5_FRAC, "clk_uart5_frac", "clk_uart5_src", CLK_SET_RATE_PARENT,
357 			RK3528_CLKSEL_CON(15), 0,
358 			RK3528_CLKGATE_CON(1), 12, GFLAGS,
359 			&rk3528_uart5_fracmux),
360 	GATE(SCLK_UART5, "sclk_uart5", "clk_uart5", 0,
361 			RK3528_CLKGATE_CON(1), 13, GFLAGS),
362 
363 	COMPOSITE_NOMUX(CLK_UART6_SRC, "clk_uart6_src", "gpll", 0,
364 			RK3528_CLKSEL_CON(16), 2, 5, DFLAGS,
365 			RK3528_CLKGATE_CON(1), 14, GFLAGS),
366 	COMPOSITE_FRACMUX(CLK_UART6_FRAC, "clk_uart6_frac", "clk_uart6_src", CLK_SET_RATE_PARENT,
367 			RK3528_CLKSEL_CON(17), 0,
368 			RK3528_CLKGATE_CON(1), 15, GFLAGS,
369 			&rk3528_uart6_fracmux),
370 	GATE(SCLK_UART6, "sclk_uart6", "clk_uart6", 0,
371 			RK3528_CLKGATE_CON(2), 0, GFLAGS),
372 
373 	COMPOSITE_NOMUX(CLK_UART7_SRC, "clk_uart7_src", "gpll", 0,
374 			RK3528_CLKSEL_CON(18), 2, 5, DFLAGS,
375 			RK3528_CLKGATE_CON(2), 1, GFLAGS),
376 	COMPOSITE_FRACMUX(CLK_UART7_FRAC, "clk_uart7_frac", "clk_uart7_src", CLK_SET_RATE_PARENT,
377 			RK3528_CLKSEL_CON(19), 0,
378 			RK3528_CLKGATE_CON(2), 2, GFLAGS,
379 			&rk3528_uart7_fracmux),
380 	GATE(SCLK_UART7, "sclk_uart7", "clk_uart7", 0,
381 			RK3528_CLKGATE_CON(2), 3, GFLAGS),
382 
383 	COMPOSITE_NOMUX(CLK_I2S0_2CH_SRC, "clk_i2s0_2ch_src", "gpll", 0,
384 			RK3528_CLKSEL_CON(20), 8, 5, DFLAGS,
385 			RK3528_CLKGATE_CON(2), 5, GFLAGS),
386 	COMPOSITE_FRACMUX(CLK_I2S0_2CH_FRAC, "clk_i2s0_2ch_frac", "clk_i2s0_2ch_src", CLK_SET_RATE_PARENT,
387 			RK3528_CLKSEL_CON(21), 0,
388 			RK3528_CLKGATE_CON(2), 6, GFLAGS,
389 			&mclk_i2s0_2ch_sai_src_fracmux),
390 	GATE(MCLK_I2S0_2CH_SAI_SRC, "mclk_i2s0_2ch_sai_src", "mclk_i2s0_2ch_sai_src_pre", 0,
391 			RK3528_CLKGATE_CON(2), 7, GFLAGS),
392 
393 	COMPOSITE_NOMUX(CLK_I2S1_8CH_SRC, "clk_i2s1_8ch_src", "gpll", 0,
394 			RK3528_CLKSEL_CON(24), 3, 5, DFLAGS,
395 			RK3528_CLKGATE_CON(2), 11, GFLAGS),
396 	COMPOSITE_FRACMUX(CLK_I2S1_8CH_FRAC, "clk_i2s1_8ch_frac", "clk_i2s1_8ch_src", CLK_SET_RATE_PARENT,
397 			RK3528_CLKSEL_CON(25), 0,
398 			RK3528_CLKGATE_CON(2), 12, GFLAGS,
399 			&mclk_i2s1_8ch_sai_src_fracmux),
400 	GATE(MCLK_I2S1_8CH_SAI_SRC, "mclk_i2s1_8ch_sai_src", "mclk_i2s1_8ch_sai_src_pre", 0,
401 			RK3528_CLKGATE_CON(2), 13, GFLAGS),
402 
403 	COMPOSITE_NOMUX(CLK_I2S2_2CH_SRC, "clk_i2s2_2ch_src", "gpll", 0,
404 			RK3528_CLKSEL_CON(26), 3, 5, DFLAGS,
405 			RK3528_CLKGATE_CON(2), 14, GFLAGS),
406 	COMPOSITE_FRACMUX(CLK_I2S2_2CH_FRAC, "clk_i2s2_2ch_frac", "clk_i2s2_2ch_src", CLK_SET_RATE_PARENT,
407 			RK3528_CLKSEL_CON(27), 0,
408 			RK3528_CLKGATE_CON(2), 15, GFLAGS,
409 			&mclk_i2s2_2ch_sai_src_fracmux),
410 	GATE(MCLK_I2S2_2CH_SAI_SRC, "mclk_i2s2_2ch_sai_src", "mclk_i2s2_2ch_sai_src_pre", 0,
411 			RK3528_CLKGATE_CON(3), 0, GFLAGS),
412 
413 	COMPOSITE_NOMUX(CLK_I2S3_8CH_SRC, "clk_i2s3_8ch_src", "gpll", 0,
414 			RK3528_CLKSEL_CON(22), 3, 5, DFLAGS,
415 			RK3528_CLKGATE_CON(2), 8, GFLAGS),
416 	COMPOSITE_FRACMUX(CLK_I2S3_8CH_FRAC, "clk_i2s3_8ch_frac", "clk_i2s3_8ch_src", CLK_SET_RATE_PARENT,
417 			RK3528_CLKSEL_CON(23), 0,
418 			RK3528_CLKGATE_CON(2), 9, GFLAGS,
419 			&mclk_i2s3_8ch_sai_src_fracmux),
420 	GATE(MCLK_I2S3_8CH_SAI_SRC, "mclk_i2s3_8ch_sai_src", "mclk_i2s3_8ch_sai_src_pre", 0,
421 			RK3528_CLKGATE_CON(2), 10, GFLAGS),
422 
423 	COMPOSITE_NOMUX(CLK_SPDIF_SRC, "clk_spdif_src", "gpll", 0,
424 			RK3528_CLKSEL_CON(30), 2, 5, DFLAGS,
425 			RK3528_CLKGATE_CON(3), 4, GFLAGS),
426 	COMPOSITE_FRACMUX(CLK_SPDIF_FRAC, "clk_spdif_frac", "clk_spdif_src", CLK_SET_RATE_PARENT,
427 			RK3528_CLKSEL_CON(31), 0,
428 			RK3528_CLKGATE_CON(3), 5, GFLAGS,
429 			&mclk_spdif_src_fracmux),
430 	GATE(MCLK_SPDIF_SRC, "mclk_spdif_src", "mclk_spdif_src_pre", 0,
431 			RK3528_CLKGATE_CON(3), 6, GFLAGS),
432 
433 	/* bus */
434 	COMPOSITE_NODIV(ACLK_BUS_M_ROOT, "aclk_bus_m_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
435 			RK3528_CLKSEL_CON(43), 12, 2, MFLAGS,
436 			RK3528_CLKGATE_CON(8), 7, GFLAGS),
437 	GATE(ACLK_GIC, "aclk_gic", "aclk_bus_m_root", CLK_IS_CRITICAL,
438 			RK3528_CLKGATE_CON(9), 1, GFLAGS),
439 
440 	COMPOSITE_NODIV(ACLK_BUS_ROOT, "aclk_bus_root", mux_200m_100m_24m_p, CLK_IS_CRITICAL,
441 			RK3528_CLKSEL_CON(43), 6, 2, MFLAGS,
442 			RK3528_CLKGATE_CON(8), 4, GFLAGS),
443 	GATE(ACLK_SPINLOCK, "aclk_spinlock", "aclk_bus_root", 0,
444 			RK3528_CLKGATE_CON(9), 2, GFLAGS),
445 	GATE(ACLK_DMAC, "aclk_dmac", "aclk_bus_root", 0,
446 			RK3528_CLKGATE_CON(9), 4, GFLAGS),
447 	GATE(ACLK_DCF, "aclk_dcf", "aclk_bus_root", 0,
448 			RK3528_CLKGATE_CON(11), 11, GFLAGS),
449 	COMPOSITE(ACLK_BUS_VOPGL_ROOT, "aclk_bus_vopgl_root", mux_gpll_cpll_p, CLK_IS_CRITICAL,
450 			RK3528_CLKSEL_CON(43), 3, 1, MFLAGS, 0, 3, DFLAGS,
451 			RK3528_CLKGATE_CON(8), 0, GFLAGS),
452 	COMPOSITE_NODIV(ACLK_BUS_H_ROOT, "aclk_bus_h_root", mux_500m_200m_100m_24m_p, CLK_IS_CRITICAL,
453 			RK3528_CLKSEL_CON(43), 4, 2, MFLAGS,
454 			RK3528_CLKGATE_CON(8), 2, GFLAGS),
455 	GATE(ACLK_DMA2DDR, "aclk_dma2ddr", "aclk_bus_h_root", 0,
456 			RK3528_CLKGATE_CON(10), 14, GFLAGS),
457 
458 	COMPOSITE_NODIV(HCLK_BUS_ROOT, "hclk_bus_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
459 			RK3528_CLKSEL_CON(43), 8, 2, MFLAGS,
460 			RK3528_CLKGATE_CON(8), 5, GFLAGS),
461 
462 	COMPOSITE_NODIV(PCLK_BUS_ROOT, "pclk_bus_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
463 			RK3528_CLKSEL_CON(43), 10, 2, MFLAGS,
464 			RK3528_CLKGATE_CON(8), 6, GFLAGS),
465 	GATE(PCLK_DFT2APB, "pclk_dft2apb", "pclk_bus_root", 0,
466 			RK3528_CLKGATE_CON(8), 13, GFLAGS),
467 	GATE(PCLK_BUS_GRF, "pclk_bus_grf", "pclk_bus_root", CLK_IS_CRITICAL,
468 			RK3528_CLKGATE_CON(8), 15, GFLAGS),
469 	GATE(PCLK_TIMER, "pclk_timer", "pclk_bus_root", 0,
470 			RK3528_CLKGATE_CON(9), 5, GFLAGS),
471 	GATE(PCLK_JDBCK_DAP, "pclk_jdbck_dap", "pclk_bus_root", 0,
472 			RK3528_CLKGATE_CON(9), 12, GFLAGS),
473 	GATE(PCLK_WDT_NS, "pclk_wdt_ns", "pclk_bus_root", 0,
474 			RK3528_CLKGATE_CON(9), 15, GFLAGS),
475 	GATE(PCLK_UART0, "pclk_uart0", "pclk_bus_root", 0,
476 			RK3528_CLKGATE_CON(10), 7, GFLAGS),
477 	GATE(PCLK_PWM0, "pclk_pwm0", "pclk_bus_root", 0,
478 			RK3528_CLKGATE_CON(11), 4, GFLAGS),
479 	GATE(PCLK_PWM1, "pclk_pwm1", "pclk_bus_root", 0,
480 			RK3528_CLKGATE_CON(11), 7, GFLAGS),
481 	GATE(PCLK_DMA2DDR, "pclk_dma2ddr", "pclk_bus_root", 0,
482 			RK3528_CLKGATE_CON(10), 13, GFLAGS),
483 	GATE(PCLK_SCR, "pclk_scr", "pclk_bus_root", 0,
484 			RK3528_CLKGATE_CON(11), 10, GFLAGS),
485 	GATE(PCLK_INTMUX, "pclk_intmux", "pclk_bus_root", CLK_IGNORE_UNUSED,
486 			RK3528_CLKGATE_CON(11), 12, GFLAGS),
487 
488 	COMPOSITE_NODIV(CLK_PWM0, "clk_pwm0", mux_100m_50m_24m_p, 0,
489 			RK3528_CLKSEL_CON(44), 6, 2, MFLAGS,
490 			RK3528_CLKGATE_CON(11), 5, GFLAGS),
491 	COMPOSITE_NODIV(CLK_PWM1, "clk_pwm1", mux_100m_50m_24m_p, 0,
492 			RK3528_CLKSEL_CON(44), 8, 2, MFLAGS,
493 			RK3528_CLKGATE_CON(11), 8, GFLAGS),
494 
495 	GATE(CLK_CAPTURE_PWM1, "clk_capture_pwm1", "xin24m", 0,
496 			RK3528_CLKGATE_CON(11), 9, GFLAGS),
497 	GATE(CLK_CAPTURE_PWM0, "clk_capture_pwm0", "xin24m", 0,
498 			RK3528_CLKGATE_CON(11), 6, GFLAGS),
499 	GATE(CLK_JDBCK_DAP, "clk_jdbck_dap", "xin24m", 0,
500 			RK3528_CLKGATE_CON(9), 13, GFLAGS),
501 	GATE(TCLK_WDT_NS, "tclk_wdt_ns", "xin24m", 0,
502 			RK3528_CLKGATE_CON(10), 0, GFLAGS),
503 
504 	GATE(CLK_TIMER_ROOT, "clk_timer_root", "xin24m", 0,
505 			RK3528_CLKGATE_CON(8), 9, GFLAGS),
506 	GATE(CLK_TIMER0, "clk_timer0", "clk_timer_root", 0,
507 			RK3528_CLKGATE_CON(9), 6, GFLAGS),
508 	GATE(CLK_TIMER1, "clk_timer1", "clk_timer_root", 0,
509 			RK3528_CLKGATE_CON(9), 7, GFLAGS),
510 	GATE(CLK_TIMER2, "clk_timer2", "clk_timer_root", 0,
511 			RK3528_CLKGATE_CON(9), 8, GFLAGS),
512 	GATE(CLK_TIMER3, "clk_timer3", "clk_timer_root", 0,
513 			RK3528_CLKGATE_CON(9), 9, GFLAGS),
514 	GATE(CLK_TIMER4, "clk_timer4", "clk_timer_root", 0,
515 			RK3528_CLKGATE_CON(9), 10, GFLAGS),
516 	GATE(CLK_TIMER5, "clk_timer5", "clk_timer_root", 0,
517 			RK3528_CLKGATE_CON(9), 11, GFLAGS),
518 
519 	/* pmu */
520 	GATE(HCLK_PMU_ROOT, "hclk_pmu_root", "clk_100m_src", CLK_IGNORE_UNUSED,
521 			RK3528_PMU_CLKGATE_CON(0), 1, GFLAGS),
522 	GATE(PCLK_PMU_ROOT, "pclk_pmu_root", "clk_100m_src", CLK_IGNORE_UNUSED,
523 			RK3528_PMU_CLKGATE_CON(0), 0, GFLAGS),
524 
525 	GATE(FCLK_MCU, "fclk_mcu", "hclk_pmu_root", 0,
526 			RK3528_PMU_CLKGATE_CON(0), 7, GFLAGS),
527 	GATE(HCLK_PMU_SRAM, "hclk_pmu_sram", "hclk_pmu_root", CLK_IS_CRITICAL,
528 			RK3528_PMU_CLKGATE_CON(5), 4, GFLAGS),
529 
530 	GATE(PCLK_I2C2, "pclk_i2c2", "pclk_pmu_root", 0,
531 			RK3528_PMU_CLKGATE_CON(0), 2, GFLAGS),
532 	GATE(PCLK_PMU_HP_TIMER, "pclk_pmu_hp_timer", "pclk_pmu_root", 0,
533 			RK3528_PMU_CLKGATE_CON(1), 2, GFLAGS),
534 	GATE(PCLK_PMU_IOC, "pclk_pmu_ioc", "pclk_pmu_root", CLK_IS_CRITICAL,
535 			RK3528_PMU_CLKGATE_CON(1), 5, GFLAGS),
536 	GATE(PCLK_PMU_CRU, "pclk_pmu_cru", "pclk_pmu_root", CLK_IS_CRITICAL,
537 			RK3528_PMU_CLKGATE_CON(1), 6, GFLAGS),
538 	GATE(PCLK_PMU_GRF, "pclk_pmu_grf", "pclk_pmu_root", CLK_IS_CRITICAL,
539 			RK3528_PMU_CLKGATE_CON(1), 7, GFLAGS),
540 	GATE(PCLK_PMU_WDT, "pclk_pmu_wdt", "pclk_pmu_root", 0,
541 			RK3528_PMU_CLKGATE_CON(1), 10, GFLAGS),
542 	GATE(PCLK_PMU, "pclk_pmu", "pclk_pmu_root", CLK_IS_CRITICAL,
543 			RK3528_PMU_CLKGATE_CON(0), 13, GFLAGS),
544 	GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pmu_root", 0,
545 			RK3528_PMU_CLKGATE_CON(0), 14, GFLAGS),
546 	GATE(PCLK_OSCCHK, "pclk_oscchk", "pclk_pmu_root", 0,
547 			RK3528_PMU_CLKGATE_CON(0), 9, GFLAGS),
548 	GATE(PCLK_PMU_MAILBOX, "pclk_pmu_mailbox", "pclk_pmu_root", 0,
549 			RK3528_PMU_CLKGATE_CON(1), 12, GFLAGS),
550 	GATE(PCLK_SCRKEYGEN, "pclk_scrkeygen", "pclk_pmu_root", 0,
551 			RK3528_PMU_CLKGATE_CON(1), 15, GFLAGS),
552 	GATE(PCLK_PVTM_PMU, "pclk_pvtm_pmu", "pclk_pmu_root", 0,
553 			RK3528_PMU_CLKGATE_CON(5), 1, GFLAGS),
554 
555 	COMPOSITE_NODIV(CLK_I2C2, "clk_i2c2", clk_i2c2_p, 0,
556 			RK3528_PMU_CLKSEL_CON(0), 0, 2, MFLAGS,
557 			RK3528_PMU_CLKGATE_CON(0), 3, GFLAGS),
558 
559 	GATE(CLK_REFOUT, "clk_refout", "xin24m", 0,
560 			RK3528_PMU_CLKGATE_CON(2), 4, GFLAGS),
561 	COMPOSITE_NOMUX(CLK_PVTM_PMU, "clk_pvtm_pmu", "xin24m", 0,
562 			RK3528_PMU_CLKSEL_CON(5), 0, 5, DFLAGS,
563 			RK3528_PMU_CLKGATE_CON(5), 0, GFLAGS),
564 
565 	COMPOSITE_FRAC(XIN_OSC0_DIV, "xin_osc0_div", "xin24m", 0,
566 			RK3528_PMU_CLKSEL_CON(1), 0,
567 			RK3528_PMU_CLKGATE_CON(1), 0, GFLAGS),
568 	/* clk_32k: internal! No path from external osc 32k */
569 	MUX(CLK_DEEPSLOW, "clk_32k", clk_32k_p, CLK_IS_CRITICAL,
570 			RK3528_PMU_CLKSEL_CON(2), 0, 1, MFLAGS),
571 	GATE(RTC_CLK_MCU, "rtc_clk_mcu", "clk_32k", 0,
572 			RK3528_PMU_CLKGATE_CON(0), 8, GFLAGS),
573 	GATE(CLK_DDR_FAIL_SAFE, "clk_ddr_fail_safe", "xin24m", CLK_IGNORE_UNUSED,
574 			RK3528_PMU_CLKGATE_CON(1), 1, GFLAGS),
575 
576 	COMPOSITE_NODIV(DBCLK_GPIO0, "dbclk_gpio0", mux_24m_32k_p, 0,
577 			RK3528_PMU_CLKSEL_CON(0), 2, 1, MFLAGS,
578 			RK3528_PMU_CLKGATE_CON(0), 15, GFLAGS),
579 	COMPOSITE_NODIV(TCLK_PMU_WDT, "tclk_pmu_wdt", mux_24m_32k_p, 0,
580 			RK3528_PMU_CLKSEL_CON(2), 1, 1, MFLAGS,
581 			RK3528_PMU_CLKGATE_CON(1), 11, GFLAGS),
582 
583 	/* core */
584 	COMPOSITE_NOMUX(ACLK_M_CORE_BIU, "aclk_m_core", "armclk", CLK_IS_CRITICAL,
585 			RK3528_CLKSEL_CON(39), 11, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
586 			RK3528_CLKGATE_CON(5), 12, GFLAGS),
587 	COMPOSITE_NOMUX(PCLK_DBG, "pclk_dbg", "armclk", CLK_IS_CRITICAL,
588 			RK3528_CLKSEL_CON(40), 1, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
589 			RK3528_CLKGATE_CON(5), 13, GFLAGS),
590 	GATE(PCLK_CPU_ROOT, "pclk_cpu_root", "pclk_dbg", CLK_IS_CRITICAL,
591 			RK3528_CLKGATE_CON(6), 1, GFLAGS),
592 	GATE(PCLK_CORE_GRF, "pclk_core_grf", "pclk_cpu_root", CLK_IS_CRITICAL,
593 			RK3528_CLKGATE_CON(6), 2, GFLAGS),
594 
595 	/* ddr */
596 	GATE(CLK_DDRC_SRC, "clk_ddrc_src", "dpll", CLK_IS_CRITICAL,
597 			RK3528_DDRPHY_CLKGATE_CON(0), 0, GFLAGS),
598 	GATE(CLK_DDR_PHY, "clk_ddr_phy", "dpll", CLK_IS_CRITICAL,
599 			RK3528_DDRPHY_CLKGATE_CON(0), 1, GFLAGS),
600 
601 	COMPOSITE_NODIV(PCLK_DDR_ROOT, "pclk_ddr_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
602 			RK3528_CLKSEL_CON(90), 0, 2, MFLAGS,
603 			RK3528_CLKGATE_CON(45), 0, GFLAGS),
604 	GATE(PCLK_DDRMON, "pclk_ddrmon", "pclk_ddr_root", CLK_IGNORE_UNUSED,
605 			RK3528_CLKGATE_CON(45), 3, GFLAGS),
606 	GATE(PCLK_DDR_HWLP, "pclk_ddr_hwlp", "pclk_ddr_root", CLK_IGNORE_UNUSED,
607 			RK3528_CLKGATE_CON(45), 8, GFLAGS),
608 	GATE(CLK_TIMER_DDRMON, "clk_timer_ddrmon", "xin24m", CLK_IGNORE_UNUSED,
609 			RK3528_CLKGATE_CON(45), 4, GFLAGS),
610 
611 	GATE(PCLK_DDRC, "pclk_ddrc", "pclk_ddr_root", CLK_IS_CRITICAL,
612 			RK3528_CLKGATE_CON(45), 2, GFLAGS),
613 	GATE(PCLK_DDR_GRF, "pclk_ddr_grf", "pclk_ddr_root", CLK_IS_CRITICAL,
614 			RK3528_CLKGATE_CON(45), 6, GFLAGS),
615 	GATE(PCLK_DDRPHY, "pclk_ddrphy", "pclk_ddr_root", CLK_IS_CRITICAL,
616 			RK3528_CLKGATE_CON(45), 9, GFLAGS),
617 
618 	GATE(ACLK_DDR_UPCTL, "aclk_ddr_upctl", "clk_ddrc_src", CLK_IS_CRITICAL,
619 			RK3528_CLKGATE_CON(45), 11, GFLAGS),
620 	GATE(CLK_DDR_UPCTL, "clk_ddr_upctl", "clk_ddrc_src", CLK_IS_CRITICAL,
621 			RK3528_CLKGATE_CON(45), 12, GFLAGS),
622 	GATE(CLK_DDRMON, "clk_ddrmon", "clk_ddrc_src", CLK_IS_CRITICAL,
623 			RK3528_CLKGATE_CON(45), 13, GFLAGS),
624 	GATE(ACLK_DDR_SCRAMBLE, "aclk_ddr_scramble", "clk_ddrc_src", CLK_IS_CRITICAL,
625 			RK3528_CLKGATE_CON(45), 14, GFLAGS),
626 	GATE(ACLK_SPLIT, "aclk_split", "clk_ddrc_src", CLK_IS_CRITICAL,
627 			RK3528_CLKGATE_CON(45), 15, GFLAGS),
628 
629 	/* gpu */
630 	COMPOSITE_NODIV(ACLK_GPU_ROOT, "aclk_gpu_root", mux_500m_300m_100m_24m_p, CLK_IS_CRITICAL,
631 			RK3528_CLKSEL_CON(76), 0, 2, MFLAGS,
632 			RK3528_CLKGATE_CON(34), 0, GFLAGS),
633 	COMPOSITE_NODIV(ACLK_GPU, "aclk_gpu", aclk_gpu_p, CLK_SET_RATE_PARENT,
634 			RK3528_CLKSEL_CON(76), 6, 1, MFLAGS,
635 			RK3528_CLKGATE_CON(34), 7, GFLAGS),
636 	GATE(ACLK_GPU_MALI, "aclk_gpu_mali", "aclk_gpu", 0,
637 			RK3528_CLKGATE_CON(34), 8, GFLAGS),
638 	COMPOSITE_NODIV(PCLK_GPU_ROOT, "pclk_gpu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
639 			RK3528_CLKSEL_CON(76), 4, 2, MFLAGS,
640 			RK3528_CLKGATE_CON(34), 2, GFLAGS),
641 
642 	/* rkvdec */
643 	COMPOSITE_NODIV(ACLK_RKVDEC_ROOT_NDFT, "aclk_rkvdec_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
644 			RK3528_CLKSEL_CON(88), 6, 2, MFLAGS,
645 			RK3528_CLKGATE_CON(44), 3, GFLAGS),
646 	COMPOSITE_NODIV(HCLK_RKVDEC_ROOT, "hclk_rkvdec_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
647 			RK3528_CLKSEL_CON(88), 4, 2, MFLAGS,
648 			RK3528_CLKGATE_CON(44), 2, GFLAGS),
649 	GATE(PCLK_DDRPHY_CRU, "pclk_ddrphy_cru", "hclk_rkvdec_root", CLK_IS_CRITICAL,
650 			RK3528_CLKGATE_CON(44), 4, GFLAGS),
651 	GATE(HCLK_RKVDEC, "hclk_rkvdec", "hclk_rkvdec_root", 0,
652 			RK3528_CLKGATE_CON(44), 9, GFLAGS),
653 	COMPOSITE_NODIV(CLK_HEVC_CA_RKVDEC, "clk_hevc_ca_rkvdec", mux_600m_300m_200m_24m_p, 0,
654 			RK3528_CLKSEL_CON(88), 11, 2, MFLAGS,
655 			RK3528_CLKGATE_CON(44), 11, GFLAGS),
656 	MUX(ACLK_RKVDEC_PVTMUX_ROOT, "aclk_rkvdec_pvtmux_root", aclk_rkvdec_pvtmux_root_p, CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
657 			RK3528_CLKSEL_CON(88), 13, 1, MFLAGS),
658 	GATE(ACLK_RKVDEC, "aclk_rkvdec", "aclk_rkvdec_pvtmux_root", 0,
659 			RK3528_CLKGATE_CON(44), 8, GFLAGS),
660 
661 	/* rkvenc */
662 	COMPOSITE_NODIV(ACLK_RKVENC_ROOT, "aclk_rkvenc_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
663 			RK3528_CLKSEL_CON(79), 2, 2, MFLAGS,
664 			RK3528_CLKGATE_CON(36), 1, GFLAGS),
665 	GATE(ACLK_RKVENC, "aclk_rkvenc", "aclk_rkvenc_root", 0,
666 			RK3528_CLKGATE_CON(36), 7, GFLAGS),
667 
668 	COMPOSITE_NODIV(PCLK_RKVENC_ROOT, "pclk_rkvenc_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
669 			RK3528_CLKSEL_CON(79), 4, 2, MFLAGS,
670 			RK3528_CLKGATE_CON(36), 2, GFLAGS),
671 	GATE(PCLK_RKVENC_IOC, "pclk_rkvenc_ioc", "pclk_rkvenc_root", CLK_IS_CRITICAL,
672 			RK3528_CLKGATE_CON(37), 10, GFLAGS),
673 	GATE(PCLK_RKVENC_GRF, "pclk_rkvenc_grf", "pclk_rkvenc_root", CLK_IS_CRITICAL,
674 			RK3528_CLKGATE_CON(38), 6, GFLAGS),
675 	GATE(PCLK_I2C1, "pclk_i2c1", "pclk_rkvenc_root", 0,
676 			RK3528_CLKGATE_CON(36), 11, GFLAGS),
677 	GATE(PCLK_I2C0, "pclk_i2c0", "pclk_rkvenc_root", 0,
678 			RK3528_CLKGATE_CON(36), 13, GFLAGS),
679 	GATE(PCLK_SPI0, "pclk_spi0", "pclk_rkvenc_root", 0,
680 			RK3528_CLKGATE_CON(37), 2, GFLAGS),
681 	GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_rkvenc_root", 0,
682 			RK3528_CLKGATE_CON(37), 8, GFLAGS),
683 	GATE(PCLK_UART1, "pclk_uart1", "pclk_rkvenc_root", 0,
684 			RK3528_CLKGATE_CON(38), 2, GFLAGS),
685 	GATE(PCLK_UART3, "pclk_uart3", "pclk_rkvenc_root", 0,
686 			RK3528_CLKGATE_CON(38), 4, GFLAGS),
687 	GATE(PCLK_CAN0, "pclk_can0", "pclk_rkvenc_root", 0,
688 			RK3528_CLKGATE_CON(38), 7, GFLAGS),
689 	GATE(PCLK_CAN1, "pclk_can1", "pclk_rkvenc_root", 0,
690 			RK3528_CLKGATE_CON(38), 9, GFLAGS),
691 
692 	COMPOSITE_NODIV(MCLK_PDM, "mclk_pdm", mux_150m_100m_24m_p, 0,
693 			RK3528_CLKSEL_CON(80), 12, 2, MFLAGS,
694 			RK3528_CLKGATE_CON(38), 1, GFLAGS),
695 	COMPOSITE(CLK_CAN0, "clk_can0", mux_gpll_cpll_p, 0,
696 			RK3528_CLKSEL_CON(81), 6, 1, MFLAGS, 0, 6, DFLAGS,
697 			RK3528_CLKGATE_CON(38), 8, GFLAGS),
698 	COMPOSITE(CLK_CAN1, "clk_can1", mux_gpll_cpll_p, 0,
699 			RK3528_CLKSEL_CON(81), 13, 1, MFLAGS, 7, 6, DFLAGS,
700 			RK3528_CLKGATE_CON(38), 10, GFLAGS),
701 
702 	COMPOSITE_NODIV(HCLK_RKVENC_ROOT, "hclk_rkvenc_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
703 			RK3528_CLKSEL_CON(79), 0, 2, MFLAGS,
704 			RK3528_CLKGATE_CON(36), 0, GFLAGS),
705 	GATE(HCLK_SAI_I2S1, "hclk_sai_i2s1", "hclk_rkvenc_root", 0,
706 			RK3528_CLKGATE_CON(36), 9, GFLAGS),
707 	GATE(HCLK_SPDIF, "hclk_spdif", "hclk_rkvenc_root", 0,
708 			RK3528_CLKGATE_CON(37), 14, GFLAGS),
709 	GATE(HCLK_PDM, "hclk_pdm", "hclk_rkvenc_root", 0,
710 			RK3528_CLKGATE_CON(38), 0, GFLAGS),
711 	GATE(HCLK_RKVENC, "hclk_rkvenc", "hclk_rkvenc_root", 0,
712 			RK3528_CLKGATE_CON(36), 6, GFLAGS),
713 
714 	COMPOSITE_NODIV(CLK_CORE_RKVENC, "clk_core_rkvenc", mux_300m_200m_100m_24m_p, 0,
715 			RK3528_CLKSEL_CON(79), 6, 2, MFLAGS,
716 			RK3528_CLKGATE_CON(36), 8, GFLAGS),
717 	COMPOSITE_NODIV(CLK_I2C0, "clk_i2c0", mux_200m_100m_50m_24m_p, 0,
718 			RK3528_CLKSEL_CON(79), 11, 2, MFLAGS,
719 			RK3528_CLKGATE_CON(36), 14, GFLAGS),
720 	COMPOSITE_NODIV(CLK_I2C1, "clk_i2c1", mux_200m_100m_50m_24m_p, 0,
721 			RK3528_CLKSEL_CON(79), 9, 2, MFLAGS,
722 			RK3528_CLKGATE_CON(36), 12, GFLAGS),
723 
724 	COMPOSITE_NODIV(CLK_SPI0, "clk_spi0", mux_200m_100m_50m_24m_p, 0,
725 			RK3528_CLKSEL_CON(79), 13, 2, MFLAGS,
726 			RK3528_CLKGATE_CON(37), 3, GFLAGS),
727 	COMPOSITE_NODIV(MCLK_SAI_I2S1, "mclk_sai_i2s1", mclk_sai_i2s1_p, CLK_SET_RATE_PARENT,
728 			RK3528_CLKSEL_CON(79), 8, 1, MFLAGS,
729 			RK3528_CLKGATE_CON(36), 10, GFLAGS),
730 	GATE(DBCLK_GPIO4, "dbclk_gpio4", "xin24m", 0,
731 			RK3528_CLKGATE_CON(37), 9, GFLAGS),
732 
733 	/* vo */
734 	COMPOSITE_NODIV(HCLK_VO_ROOT, "hclk_vo_root", mux_150m_100m_24m_p, CLK_IS_CRITICAL,
735 			RK3528_CLKSEL_CON(83), 2, 2, MFLAGS,
736 			RK3528_CLKGATE_CON(39), 1, GFLAGS),
737 	GATE(HCLK_VOP, "hclk_vop", "hclk_vo_root", 0,
738 			RK3528_CLKGATE_CON(40), 2, GFLAGS),
739 	GATE(HCLK_USBHOST, "hclk_usbhost", "hclk_vo_root", 0,
740 			RK3528_CLKGATE_CON(43), 3, GFLAGS),
741 	GATE(HCLK_JPEG_DECODER, "hclk_jpeg_decoder", "hclk_vo_root", 0,
742 			RK3528_CLKGATE_CON(41), 7, GFLAGS),
743 	GATE(HCLK_VDPP, "hclk_vdpp", "hclk_vo_root", 0,
744 			RK3528_CLKGATE_CON(39), 10, GFLAGS),
745 	GATE(HCLK_CVBS, "hclk_cvbs", "hclk_vo_root", 0,
746 			RK3528_CLKGATE_CON(41), 3, GFLAGS),
747 	GATE(HCLK_USBHOST_ARB, "hclk_usbhost_arb", "hclk_vo_root", 0,
748 			RK3528_CLKGATE_CON(43), 4, GFLAGS),
749 	GATE(HCLK_SAI_I2S3, "hclk_sai_i2s3", "hclk_vo_root", 0,
750 			RK3528_CLKGATE_CON(42), 1, GFLAGS),
751 	GATE(HCLK_HDCP, "hclk_hdcp", "hclk_vo_root", 0,
752 			RK3528_CLKGATE_CON(41), 1, GFLAGS),
753 	GATE(HCLK_RGA2E, "hclk_rga2e", "hclk_vo_root", 0,
754 			RK3528_CLKGATE_CON(39), 7, GFLAGS),
755 	GATE(HCLK_SDMMC0, "hclk_sdmmc0", "hclk_vo_root", 0,
756 			RK3528_CLKGATE_CON(42), 9, GFLAGS),
757 	GATE(HCLK_HDCP_KEY, "hclk_hdcp_key", "hclk_vo_root", 0,
758 			RK3528_CLKGATE_CON(40), 15, GFLAGS),
759 
760 	COMPOSITE_NODIV(ACLK_VO_L_ROOT, "aclk_vo_l_root", mux_150m_100m_24m_p, CLK_IS_CRITICAL,
761 			RK3528_CLKSEL_CON(84), 1, 2, MFLAGS,
762 			RK3528_CLKGATE_CON(41), 8, GFLAGS),
763 	GATE(ACLK_MAC_VO, "aclk_gmac0", "aclk_vo_l_root", 0,
764 			RK3528_CLKGATE_CON(41), 10, GFLAGS),
765 
766 	COMPOSITE_NODIV(PCLK_VO_ROOT, "pclk_vo_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
767 			RK3528_CLKSEL_CON(83), 4, 2, MFLAGS,
768 			RK3528_CLKGATE_CON(39), 2, GFLAGS),
769 	GATE(PCLK_MAC_VO, "pclk_gmac0", "pclk_vo_root", 0,
770 			RK3528_CLKGATE_CON(41), 11, GFLAGS),
771 	GATE(PCLK_VCDCPHY, "pclk_vcdcphy", "pclk_vo_root", 0,
772 			RK3528_CLKGATE_CON(42), 4, GFLAGS),
773 	GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_vo_root", 0,
774 			RK3528_CLKGATE_CON(42), 5, GFLAGS),
775 	GATE(PCLK_VO_IOC, "pclk_vo_ioc", "pclk_vo_root", CLK_IS_CRITICAL,
776 			RK3528_CLKGATE_CON(42), 7, GFLAGS),
777 	GATE(PCLK_OTPC_NS, "pclk_otpc_ns", "pclk_vo_root", 0,
778 			RK3528_CLKGATE_CON(42), 11, GFLAGS),
779 	GATE(PCLK_UART4, "pclk_uart4", "pclk_vo_root", 0,
780 			RK3528_CLKGATE_CON(43), 7, GFLAGS),
781 	GATE(PCLK_I2C4, "pclk_i2c4", "pclk_vo_root", 0,
782 			RK3528_CLKGATE_CON(43), 9, GFLAGS),
783 	GATE(PCLK_I2C7, "pclk_i2c7", "pclk_vo_root", 0,
784 			RK3528_CLKGATE_CON(43), 11, GFLAGS),
785 
786 	GATE(PCLK_USBPHY, "pclk_usbphy", "pclk_vo_root", 0,
787 			RK3528_CLKGATE_CON(43), 13, GFLAGS),
788 
789 	GATE(PCLK_VO_GRF, "pclk_vo_grf", "pclk_vo_root", CLK_IS_CRITICAL,
790 			RK3528_CLKGATE_CON(39), 13, GFLAGS),
791 	GATE(PCLK_CRU, "pclk_cru", "pclk_vo_root", CLK_IS_CRITICAL,
792 			RK3528_CLKGATE_CON(39), 15, GFLAGS),
793 	GATE(PCLK_HDMI, "pclk_hdmi", "pclk_vo_root", 0,
794 			RK3528_CLKGATE_CON(40), 6, GFLAGS),
795 	GATE(PCLK_HDMIPHY, "pclk_hdmiphy", "pclk_vo_root", 0,
796 			RK3528_CLKGATE_CON(40), 14, GFLAGS),
797 	GATE(PCLK_HDCP, "pclk_hdcp", "pclk_vo_root", 0,
798 			RK3528_CLKGATE_CON(41), 2, GFLAGS),
799 
800 	COMPOSITE_NODIV(CLK_CORE_VDPP, "clk_core_vdpp", mux_339m_200m_100m_24m_p, 0,
801 			RK3528_CLKSEL_CON(83), 10, 2, MFLAGS,
802 			RK3528_CLKGATE_CON(39), 12, GFLAGS),
803 	COMPOSITE_NODIV(CLK_CORE_RGA2E, "clk_core_rga2e", mux_339m_200m_100m_24m_p, 0,
804 			RK3528_CLKSEL_CON(83), 8, 2, MFLAGS,
805 			RK3528_CLKGATE_CON(39), 9, GFLAGS),
806 	COMPOSITE_NODIV(ACLK_JPEG_ROOT, "aclk_jpeg_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
807 			RK3528_CLKSEL_CON(84), 9, 2, MFLAGS,
808 			RK3528_CLKGATE_CON(41), 15, GFLAGS),
809 	GATE(ACLK_JPEG_DECODER, "aclk_jpeg_decoder", "aclk_jpeg_root", 0,
810 			RK3528_CLKGATE_CON(41), 6, GFLAGS),
811 
812 	COMPOSITE_NODIV(ACLK_VO_ROOT, "aclk_vo_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
813 			RK3528_CLKSEL_CON(83), 0, 2, MFLAGS,
814 			RK3528_CLKGATE_CON(39), 0, GFLAGS),
815 	GATE(ACLK_RGA2E, "aclk_rga2e", "aclk_vo_root", 0,
816 			RK3528_CLKGATE_CON(39), 8, GFLAGS),
817 	GATE(ACLK_VDPP, "aclk_vdpp", "aclk_vo_root", 0,
818 			RK3528_CLKGATE_CON(39), 11, GFLAGS),
819 	GATE(ACLK_HDCP, "aclk_hdcp", "aclk_vo_root", 0,
820 			RK3528_CLKGATE_CON(41), 0, GFLAGS),
821 
822 	COMPOSITE(CCLK_SRC_SDMMC0, "cclk_src_sdmmc0", mux_gpll_cpll_xin24m_p, 0,
823 			RK3528_CLKSEL_CON(85), 6, 2, MFLAGS, 0, 6, DFLAGS,
824 			RK3528_CLKGATE_CON(42), 8, GFLAGS),
825 
826 	COMPOSITE(ACLK_VOP_ROOT, "aclk_vop_root", mux_gpll_cpll_p, CLK_IS_CRITICAL,
827 			RK3528_CLKSEL_CON(83), 15, 1, MFLAGS, 12, 3, DFLAGS,
828 			RK3528_CLKGATE_CON(40), 0, GFLAGS),
829 	GATE(ACLK_VOP, "aclk_vop", "aclk_vop_root", 0,
830 			RK3528_CLKGATE_CON(40), 5, GFLAGS),
831 
832 	COMPOSITE_NODIV(CLK_I2C4, "clk_i2c4", mux_200m_100m_50m_24m_p, 0,
833 			RK3528_CLKSEL_CON(85), 13, 2, MFLAGS,
834 			RK3528_CLKGATE_CON(43), 10, GFLAGS),
835 	COMPOSITE_NODIV(CLK_I2C7, "clk_i2c7", mux_200m_100m_50m_24m_p, 0,
836 			RK3528_CLKSEL_CON(86), 0, 2, MFLAGS,
837 			RK3528_CLKGATE_CON(43), 12, GFLAGS),
838 	GATE(DBCLK_GPIO2, "dbclk_gpio2", "xin24m", 0,
839 			RK3528_CLKGATE_CON(42), 6, GFLAGS),
840 
841 	GATE(CLK_HDMIHDP0, "clk_hdmihdp0", "xin24m", 0,
842 			RK3528_CLKGATE_CON(43), 2, GFLAGS),
843 	GATE(CLK_MACPHY, "clk_macphy", "xin24m", 0,
844 			RK3528_CLKGATE_CON(42), 3, GFLAGS),
845 	GATE(CLK_REF_USBPHY, "clk_ref_usbphy", "xin24m", 0,
846 			RK3528_CLKGATE_CON(43), 14, GFLAGS),
847 	GATE(CLK_SBPI_OTPC_NS, "clk_sbpi_otpc_ns", "xin24m", 0,
848 			RK3528_CLKGATE_CON(42), 12, GFLAGS),
849 	FACTOR(CLK_USER_OTPC_NS, "clk_user_otpc_ns", "clk_sbpi_otpc_ns",
850 			0, 1, 2),
851 
852 	GATE(MCLK_SAI_I2S3, "mclk_sai_i2s3", "mclk_i2s3_8ch_sai_src", 0,
853 			RK3528_CLKGATE_CON(42), 2, GFLAGS),
854 	COMPOSITE_NODIV(DCLK_VOP0, "dclk_vop0", dclk_vop0_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
855 			RK3528_CLKSEL_CON(84), 0, 1, MFLAGS,
856 			RK3528_CLKGATE_CON(40), 3, GFLAGS),
857 	GATE(DCLK_VOP1, "dclk_vop1", "dclk_vop_src1", CLK_SET_RATE_PARENT,
858 			RK3528_CLKGATE_CON(40), 4, GFLAGS),
859 	FACTOR_GATE(DCLK_CVBS, "dclk_cvbs", "dclk_vop1", 0, 1, 4,
860 			RK3528_CLKGATE_CON(41), 4, GFLAGS),
861 	GATE(DCLK_4X_CVBS, "dclk_4x_cvbs", "dclk_vop1", 0,
862 			RK3528_CLKGATE_CON(41), 5, GFLAGS),
863 
864 	FACTOR_GATE(CLK_SFR_HDMI, "clk_sfr_hdmi", "dclk_vop_src1", 0, 1, 4,
865 			RK3528_CLKGATE_CON(40), 7, GFLAGS),
866 
867 	GATE(CLK_SPDIF_HDMI, "clk_spdif_hdmi", "mclk_spdif_src", 0,
868 			RK3528_CLKGATE_CON(40), 10, GFLAGS),
869 	GATE(MCLK_SPDIF, "mclk_spdif", "mclk_spdif_src", 0,
870 			RK3528_CLKGATE_CON(37), 15, GFLAGS),
871 	GATE(CLK_CEC_HDMI, "clk_cec_hdmi", "clk_32k", 0,
872 			RK3528_CLKGATE_CON(40), 8, GFLAGS),
873 
874 	/* vpu */
875 	GATE(DBCLK_GPIO1, "dbclk_gpio1", "xin24m", 0,
876 			RK3528_CLKGATE_CON(26), 5, GFLAGS),
877 	GATE(DBCLK_GPIO3, "dbclk_gpio3", "xin24m", 0,
878 			RK3528_CLKGATE_CON(27), 1, GFLAGS),
879 	GATE(CLK_SUSPEND_USB3OTG, "clk_suspend_usb3otg", "xin24m", 0,
880 			RK3528_CLKGATE_CON(33), 4, GFLAGS),
881 	GATE(CLK_PCIE_AUX, "clk_pcie_aux", "xin24m", 0,
882 			RK3528_CLKGATE_CON(30), 2, GFLAGS),
883 	GATE(TCLK_EMMC, "tclk_emmc", "xin24m", 0,
884 			RK3528_CLKGATE_CON(26), 3, GFLAGS),
885 	GATE(CLK_REF_USB3OTG, "clk_ref_usb3otg", "xin24m", 0,
886 			RK3528_CLKGATE_CON(33), 2, GFLAGS),
887 	COMPOSITE(CCLK_SRC_SDIO0, "cclk_src_sdio0", mux_gpll_cpll_xin24m_p, 0,
888 			RK3528_CLKSEL_CON(72), 6, 2, MFLAGS, 0, 6, DFLAGS,
889 			RK3528_CLKGATE_CON(32), 1, GFLAGS),
890 
891 	COMPOSITE_NODIV(PCLK_VPU_ROOT, "pclk_vpu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
892 			RK3528_CLKSEL_CON(61), 4, 2, MFLAGS,
893 			RK3528_CLKGATE_CON(25), 5, GFLAGS),
894 	GATE(PCLK_VPU_GRF, "pclk_vpu_grf", "pclk_vpu_root", CLK_IS_CRITICAL,
895 			RK3528_CLKGATE_CON(25), 12, GFLAGS),
896 	GATE(PCLK_CRU_PCIE, "pclk_cru_pcie", "pclk_vpu_root", CLK_IS_CRITICAL,
897 			RK3528_CLKGATE_CON(25), 11, GFLAGS),
898 	GATE(PCLK_UART6, "pclk_uart6", "pclk_vpu_root", 0,
899 			RK3528_CLKGATE_CON(27), 11, GFLAGS),
900 	GATE(PCLK_CAN2, "pclk_can2", "pclk_vpu_root", 0,
901 			RK3528_CLKGATE_CON(32), 7, GFLAGS),
902 	GATE(PCLK_SPI1, "pclk_spi1", "pclk_vpu_root", 0,
903 			RK3528_CLKGATE_CON(27), 4, GFLAGS),
904 	GATE(PCLK_CAN3, "pclk_can3", "pclk_vpu_root", 0,
905 			RK3528_CLKGATE_CON(32), 9, GFLAGS),
906 	GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_vpu_root", 0,
907 			RK3528_CLKGATE_CON(27), 0, GFLAGS),
908 	GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_vpu_root", 0,
909 			RK3528_CLKGATE_CON(26), 4, GFLAGS),
910 	GATE(PCLK_SARADC, "pclk_saradc", "pclk_vpu_root", 0,
911 			RK3528_CLKGATE_CON(32), 11, GFLAGS),
912 	GATE(PCLK_ACODEC, "pclk_acodec", "pclk_vpu_root", 0,
913 			RK3528_CLKGATE_CON(26), 13, GFLAGS),
914 	GATE(PCLK_UART7, "pclk_uart7", "pclk_vpu_root", 0,
915 			RK3528_CLKGATE_CON(27), 13, GFLAGS),
916 	GATE(PCLK_UART5, "pclk_uart5", "pclk_vpu_root", 0,
917 			RK3528_CLKGATE_CON(27), 9, GFLAGS),
918 	GATE(PCLK_TSADC, "pclk_tsadc", "pclk_vpu_root", 0,
919 			RK3528_CLKGATE_CON(32), 14, GFLAGS),
920 	GATE(PCLK_PCIE, "pclk_pcie", "pclk_vpu_root", 0,
921 			RK3528_CLKGATE_CON(30), 1, GFLAGS),
922 	GATE(PCLK_UART2, "pclk_uart2", "pclk_vpu_root", 0,
923 			RK3528_CLKGATE_CON(27), 7, GFLAGS),
924 	GATE(PCLK_VPU_IOC, "pclk_vpu_ioc", "pclk_vpu_root", CLK_IS_CRITICAL,
925 			RK3528_CLKGATE_CON(26), 8, GFLAGS),
926 	GATE(PCLK_PIPE_GRF, "pclk_pipe_grf", "pclk_vpu_root", CLK_IS_CRITICAL,
927 			RK3528_CLKGATE_CON(30), 7, GFLAGS),
928 	GATE(PCLK_I2C5, "pclk_i2c5", "pclk_vpu_root", 0,
929 			RK3528_CLKGATE_CON(28), 1, GFLAGS),
930 	GATE(PCLK_PCIE_PHY, "pclk_pcie_phy", "pclk_vpu_root", 0,
931 			RK3528_CLKGATE_CON(30), 6, GFLAGS),
932 	GATE(PCLK_I2C3, "pclk_i2c3", "pclk_vpu_root", 0,
933 			RK3528_CLKGATE_CON(27), 15, GFLAGS),
934 	GATE(PCLK_MAC_VPU, "pclk_gmac1", "pclk_vpu_root", CLK_IS_CRITICAL,
935 			RK3528_CLKGATE_CON(28), 6, GFLAGS),
936 	GATE(PCLK_I2C6, "pclk_i2c6", "pclk_vpu_root", 0,
937 			RK3528_CLKGATE_CON(28), 3, GFLAGS),
938 
939 	COMPOSITE_NODIV(ACLK_VPU_L_ROOT, "aclk_vpu_l_root", mux_200m_100m_24m_p, CLK_IS_CRITICAL,
940 			RK3528_CLKSEL_CON(60), 0, 2, MFLAGS,
941 			RK3528_CLKGATE_CON(25), 0, GFLAGS),
942 	GATE(ACLK_EMMC, "aclk_emmc", "aclk_vpu_l_root", 0,
943 			RK3528_CLKGATE_CON(26), 1, GFLAGS),
944 	GATE(ACLK_MAC_VPU, "aclk_gmac1", "aclk_vpu_l_root", 0,
945 			RK3528_CLKGATE_CON(28), 5, GFLAGS),
946 	GATE(ACLK_PCIE, "aclk_pcie", "aclk_vpu_l_root", 0,
947 			RK3528_CLKGATE_CON(30), 3, GFLAGS),
948 
949 	GATE(ACLK_USB3OTG, "aclk_usb3otg", "aclk_vpu_l_root", 0,
950 			RK3528_CLKGATE_CON(33), 1, GFLAGS),
951 
952 	COMPOSITE_NODIV(HCLK_VPU_ROOT, "hclk_vpu_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
953 			RK3528_CLKSEL_CON(61), 2, 2, MFLAGS,
954 			RK3528_CLKGATE_CON(25), 4, GFLAGS),
955 	GATE(HCLK_VPU, "hclk_vpu", "hclk_vpu_root", 0,
956 			RK3528_CLKGATE_CON(25), 10, GFLAGS),
957 	GATE(HCLK_SFC, "hclk_sfc", "hclk_vpu_root", 0,
958 			RK3528_CLKGATE_CON(25), 13, GFLAGS),
959 	GATE(HCLK_EMMC, "hclk_emmc", "hclk_vpu_root", 0,
960 			RK3528_CLKGATE_CON(26), 0, GFLAGS),
961 	GATE(HCLK_SAI_I2S0, "hclk_sai_i2s0", "hclk_vpu_root", 0,
962 			RK3528_CLKGATE_CON(26), 9, GFLAGS),
963 	GATE(HCLK_SAI_I2S2, "hclk_sai_i2s2", "hclk_vpu_root", 0,
964 			RK3528_CLKGATE_CON(26), 11, GFLAGS),
965 
966 	GATE(HCLK_PCIE_SLV, "hclk_pcie_slv", "hclk_vpu_root", 0,
967 			RK3528_CLKGATE_CON(30), 4, GFLAGS),
968 	GATE(HCLK_PCIE_DBI, "hclk_pcie_dbi", "hclk_vpu_root", 0,
969 			RK3528_CLKGATE_CON(30), 5, GFLAGS),
970 	GATE(HCLK_SDIO0, "hclk_sdio0", "hclk_vpu_root", 0,
971 			RK3528_CLKGATE_CON(32), 2, GFLAGS),
972 	GATE(HCLK_SDIO1, "hclk_sdio1", "hclk_vpu_root", 0,
973 			RK3528_CLKGATE_CON(32), 4, GFLAGS),
974 
975 	COMPOSITE_NOMUX(CLK_GMAC1_VPU_25M, "clk_gmac1_25m", "ppll", 0,
976 			RK3528_CLKSEL_CON(60), 2, 8, DFLAGS,
977 			RK3528_CLKGATE_CON(25), 1, GFLAGS),
978 	COMPOSITE_NOMUX(CLK_PPLL_125M_MATRIX, "clk_ppll_125m_src", "ppll", 0,
979 			RK3528_CLKSEL_CON(60), 10, 5, DFLAGS,
980 			RK3528_CLKGATE_CON(25), 2, GFLAGS),
981 
982 	COMPOSITE(CLK_CAN3, "clk_can3", mux_gpll_cpll_p, 0,
983 			RK3528_CLKSEL_CON(73), 13, 1, MFLAGS, 7, 6, DFLAGS,
984 			RK3528_CLKGATE_CON(32), 10, GFLAGS),
985 	COMPOSITE_NODIV(CLK_I2C6, "clk_i2c6", mux_200m_100m_50m_24m_p, 0,
986 			RK3528_CLKSEL_CON(64), 0, 2, MFLAGS,
987 			RK3528_CLKGATE_CON(28), 4, GFLAGS),
988 
989 	COMPOSITE(SCLK_SFC, "sclk_sfc", mux_gpll_cpll_xin24m_p, 0,
990 			RK3528_CLKSEL_CON(61), 12, 2, MFLAGS, 6, 6, DFLAGS,
991 			RK3528_CLKGATE_CON(25), 14, GFLAGS),
992 	COMPOSITE(CCLK_SRC_EMMC, "cclk_src_emmc", mux_gpll_cpll_xin24m_p, 0,
993 			RK3528_CLKSEL_CON(62), 6, 2, MFLAGS, 0, 6, DFLAGS,
994 			RK3528_CLKGATE_CON(25), 15, GFLAGS),
995 
996 	COMPOSITE_NODIV(ACLK_VPU_ROOT, "aclk_vpu_root",
997 			mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
998 			RK3528_CLKSEL_CON(61), 0, 2, MFLAGS,
999 			RK3528_CLKGATE_CON(25), 3, GFLAGS),
1000 	GATE(ACLK_VPU, "aclk_vpu", "aclk_vpu_root", 0,
1001 			RK3528_CLKGATE_CON(25), 9, GFLAGS),
1002 
1003 	COMPOSITE_NODIV(CLK_SPI1, "clk_spi1", mux_200m_100m_50m_24m_p, 0,
1004 			RK3528_CLKSEL_CON(63), 10, 2, MFLAGS,
1005 			RK3528_CLKGATE_CON(27), 5, GFLAGS),
1006 	COMPOSITE(CCLK_SRC_SDIO1, "cclk_src_sdio1", mux_gpll_cpll_xin24m_p, 0,
1007 			RK3528_CLKSEL_CON(72), 14, 2, MFLAGS, 8, 6, DFLAGS,
1008 			RK3528_CLKGATE_CON(32), 3, GFLAGS),
1009 	COMPOSITE(CLK_CAN2, "clk_can2", mux_gpll_cpll_p, 0,
1010 			RK3528_CLKSEL_CON(73), 6, 1, MFLAGS, 0, 6, DFLAGS,
1011 			RK3528_CLKGATE_CON(32), 8, GFLAGS),
1012 	COMPOSITE_NOMUX(CLK_TSADC, "clk_tsadc", "xin24m", 0,
1013 			RK3528_CLKSEL_CON(74), 3, 5, DFLAGS,
1014 			RK3528_CLKGATE_CON(32), 15, GFLAGS),
1015 	COMPOSITE_NOMUX(CLK_SARADC, "clk_saradc", "xin24m", 0,
1016 			RK3528_CLKSEL_CON(74), 0, 3, DFLAGS,
1017 			RK3528_CLKGATE_CON(32), 12, GFLAGS),
1018 	COMPOSITE_NOMUX(CLK_TSADC_TSEN, "clk_tsadc_tsen", "xin24m", 0,
1019 			RK3528_CLKSEL_CON(74), 8, 5, DFLAGS,
1020 			RK3528_CLKGATE_CON(33), 0, GFLAGS),
1021 	COMPOSITE_NODIV(BCLK_EMMC, "bclk_emmc", mux_200m_100m_50m_24m_p, 0,
1022 			RK3528_CLKSEL_CON(62), 8, 2, MFLAGS,
1023 			RK3528_CLKGATE_CON(26), 2, GFLAGS),
1024 	COMPOSITE_NOMUX(MCLK_ACODEC_TX, "mclk_acodec_tx", "mclk_i2s2_2ch_sai_src", 0,
1025 			RK3528_CLKSEL_CON(63), 0, 8, DFLAGS,
1026 			RK3528_CLKGATE_CON(26), 14, GFLAGS),
1027 	COMPOSITE_NODIV(CLK_I2C3, "clk_i2c3", mux_200m_100m_50m_24m_p, 0,
1028 			RK3528_CLKSEL_CON(63), 12, 2, MFLAGS,
1029 			RK3528_CLKGATE_CON(28), 0, GFLAGS),
1030 	COMPOSITE_NODIV(CLK_I2C5, "clk_i2c5", mux_200m_100m_50m_24m_p, 0,
1031 			RK3528_CLKSEL_CON(63), 14, 2, MFLAGS,
1032 			RK3528_CLKGATE_CON(28), 2, GFLAGS),
1033 	COMPOSITE_NODIV(MCLK_SAI_I2S0, "mclk_sai_i2s0", mclk_sai_i2s0_p, CLK_SET_RATE_PARENT,
1034 			RK3528_CLKSEL_CON(62), 10, 1, MFLAGS,
1035 			RK3528_CLKGATE_CON(26), 10, GFLAGS),
1036 	GATE(MCLK_SAI_I2S2, "mclk_sai_i2s2", "mclk_i2s2_2ch_sai_src", 0,
1037 			RK3528_CLKGATE_CON(26), 12, GFLAGS),
1038 
1039 	/* pcie */
1040 	COMPOSITE_NOMUX(CLK_PPLL_100M_MATRIX, "clk_ppll_100m_src", "ppll", CLK_IS_CRITICAL,
1041 			RK3528_PCIE_CLKSEL_CON(1), 2, 5, DFLAGS,
1042 			RK3528_PCIE_CLKGATE_CON(0), 1, GFLAGS),
1043 	COMPOSITE_NOMUX(CLK_PPLL_50M_MATRIX, "clk_ppll_50m_src", "ppll", CLK_IS_CRITICAL,
1044 			RK3528_PCIE_CLKSEL_CON(1), 7, 5, DFLAGS,
1045 			RK3528_PCIE_CLKGATE_CON(0), 2, GFLAGS),
1046 	MUX(CLK_REF_PCIE_INNER_PHY, "clk_ref_pcie_inner_phy", clk_ref_pcie_inner_phy_p, 0,
1047 			RK3528_PCIE_CLKSEL_CON(1), 13, 1, MFLAGS),
1048 	FACTOR(CLK_REF_PCIE_100M_PHY, "clk_ref_pcie_100m_phy", "clk_ppll_100m_src",
1049 			0, 1, 1),
1050 
1051 	/* gmac */
1052 	DIV(CLK_GMAC0_SRC, "clk_gmac0_src", "gmac0", 0,
1053 			RK3528_CLKSEL_CON(84), 3, 6, DFLAGS),
1054 	GATE(CLK_GMAC0_TX, "clk_gmac0_tx", "clk_gmac0_src", 0,
1055 			RK3528_CLKGATE_CON(41), 13, GFLAGS),
1056 	GATE(CLK_GMAC0_RX, "clk_gmac0_rx", "clk_gmac0_src", 0,
1057 			RK3528_CLKGATE_CON(41), 14, GFLAGS),
1058 	GATE(CLK_GMAC0_RMII_50M, "clk_gmac0_rmii_50m", "gmac0", 0,
1059 			RK3528_CLKGATE_CON(41), 12, GFLAGS),
1060 
1061 	FACTOR(CLK_GMAC1_RMII_VPU, "clk_gmac1_50m", "clk_ppll_50m_src",
1062 			0, 1, 1),
1063 	FACTOR(CLK_GMAC1_SRC_VPU, "clk_gmac1_125m", "clk_ppll_125m_src",
1064 			0, 1, 1),
1065 };
1066 
1067 static struct rockchip_clk_branch rk3528_vo_clk_branches[] __initdata = {
1068 	MMC_GRF(SCLK_SDMMC_DRV, "sdmmc_drv", "cclk_src_sdmmc0",
1069 			RK3528_SDMMC_CON(0), 1, grf_type_vo),
1070 	MMC_GRF(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "cclk_src_sdmmc0",
1071 			RK3528_SDMMC_CON(1), 1, grf_type_vo),
1072 };
1073 
1074 static struct rockchip_clk_branch rk3528_vpu_clk_branches[] __initdata = {
1075 	MMC_GRF(SCLK_SDIO0_DRV, "sdio0_drv", "cclk_src_sdio0",
1076 			RK3528_SDIO0_CON(0), 1, grf_type_vpu),
1077 	MMC_GRF(SCLK_SDIO0_SAMPLE, "sdio0_sample", "cclk_src_sdio0",
1078 			RK3528_SDIO0_CON(1), 1, grf_type_vpu),
1079 	MMC_GRF(SCLK_SDIO1_DRV, "sdio1_drv", "cclk_src_sdio1",
1080 			RK3528_SDIO1_CON(0), 1, grf_type_vpu),
1081 	MMC_GRF(SCLK_SDIO1_SAMPLE, "sdio1_sample", "cclk_src_sdio1",
1082 			RK3528_SDIO1_CON(1), 1, grf_type_vpu),
1083 };
1084 
clk_rk3528_probe(struct platform_device * pdev)1085 static int __init clk_rk3528_probe(struct platform_device *pdev)
1086 {
1087 	unsigned long nr_vpu_branches = ARRAY_SIZE(rk3528_vpu_clk_branches);
1088 	unsigned long nr_vo_branches = ARRAY_SIZE(rk3528_vo_clk_branches);
1089 	unsigned long nr_branches = ARRAY_SIZE(rk3528_clk_branches);
1090 	unsigned long nr_clks, nr_vo_clks, nr_vpu_clks;
1091 	struct rockchip_aux_grf *vo_grf_e, *vpu_grf_e;
1092 	struct regmap *vo_grf, *vpu_grf;
1093 	struct device *dev = &pdev->dev;
1094 	struct device_node *np = dev->of_node;
1095 	struct rockchip_clk_provider *ctx;
1096 	void __iomem *reg_base;
1097 
1098 	reg_base = devm_platform_ioremap_resource(pdev, 0);
1099 	if (IS_ERR(reg_base))
1100 		return dev_err_probe(dev, PTR_ERR(reg_base),
1101 				     "could not map cru region");
1102 
1103 	nr_clks = rockchip_clk_find_max_clk_id(rk3528_clk_branches,
1104 					       nr_branches) + 1;
1105 
1106 	vo_grf = syscon_regmap_lookup_by_compatible("rockchip,rk3528-vo-grf");
1107 	if (!IS_ERR(vo_grf)) {
1108 		nr_vo_clks = rockchip_clk_find_max_clk_id(rk3528_vo_clk_branches,
1109 							  nr_vo_branches) + 1;
1110 		nr_clks = max(nr_clks, nr_vo_clks);
1111 	} else if (PTR_ERR(vo_grf) != -ENODEV) {
1112 		return dev_err_probe(dev, PTR_ERR(vo_grf),
1113 				     "failed to look up VO GRF\n");
1114 	}
1115 
1116 	vpu_grf = syscon_regmap_lookup_by_compatible("rockchip,rk3528-vpu-grf");
1117 	if (!IS_ERR(vpu_grf)) {
1118 		nr_vpu_clks = rockchip_clk_find_max_clk_id(rk3528_vpu_clk_branches,
1119 							   nr_vpu_branches) + 1;
1120 		nr_clks = max(nr_clks, nr_vpu_clks);
1121 	} else if (PTR_ERR(vpu_grf) != -ENODEV) {
1122 		return dev_err_probe(dev, PTR_ERR(vpu_grf),
1123 				     "failed to look up VPU GRF\n");
1124 	}
1125 
1126 	ctx = rockchip_clk_init(np, reg_base, nr_clks);
1127 	if (IS_ERR(ctx))
1128 		return dev_err_probe(dev, PTR_ERR(ctx),
1129 				     "rockchip clk init failed");
1130 
1131 	rockchip_clk_register_plls(ctx, rk3528_pll_clks,
1132 				   ARRAY_SIZE(rk3528_pll_clks),
1133 				   RK3528_GRF_SOC_STATUS0);
1134 	rockchip_clk_register_armclk(ctx, ARMCLK, "armclk",
1135 				     mux_armclk, ARRAY_SIZE(mux_armclk),
1136 				     &rk3528_cpuclk_data, rk3528_cpuclk_rates,
1137 				     ARRAY_SIZE(rk3528_cpuclk_rates));
1138 	rockchip_clk_register_branches(ctx, rk3528_clk_branches, nr_branches);
1139 
1140 	if (!IS_ERR(vo_grf)) {
1141 		vo_grf_e = devm_kzalloc(dev, sizeof(*vo_grf_e), GFP_KERNEL);
1142 		if (!vo_grf_e)
1143 			return -ENOMEM;
1144 
1145 		vo_grf_e->grf	= vo_grf;
1146 		vo_grf_e->type	= grf_type_vo;
1147 		hash_add(ctx->aux_grf_table, &vo_grf_e->node, grf_type_vo);
1148 
1149 		rockchip_clk_register_branches(ctx, rk3528_vo_clk_branches,
1150 					       nr_vo_branches);
1151 	}
1152 
1153 	if (!IS_ERR(vpu_grf)) {
1154 		vpu_grf_e = devm_kzalloc(dev, sizeof(*vpu_grf_e), GFP_KERNEL);
1155 		if (!vpu_grf_e)
1156 			return -ENOMEM;
1157 
1158 		vpu_grf_e->grf	= vpu_grf;
1159 		vpu_grf_e->type	= grf_type_vpu;
1160 		hash_add(ctx->aux_grf_table, &vpu_grf_e->node, grf_type_vpu);
1161 
1162 		rockchip_clk_register_branches(ctx, rk3528_vpu_clk_branches,
1163 					       nr_vpu_branches);
1164 	}
1165 
1166 	rk3528_rst_init(np, reg_base);
1167 
1168 	rockchip_register_restart_notifier(ctx, RK3528_GLB_SRST_FST, NULL);
1169 
1170 	rockchip_clk_of_add_provider(np, ctx);
1171 
1172 	return 0;
1173 }
1174 
1175 static const struct of_device_id clk_rk3528_match_table[] = {
1176 	{ .compatible = "rockchip,rk3528-cru" },
1177 	{ /* end */ }
1178 };
1179 
1180 static struct platform_driver clk_rk3528_driver = {
1181 	.driver = {
1182 		.name			= "clk-rk3528",
1183 		.of_match_table		= clk_rk3528_match_table,
1184 		.suppress_bind_attrs	= true,
1185 	},
1186 };
1187 builtin_platform_driver_probe(clk_rk3528_driver, clk_rk3528_probe);
1188