xref: /linux/drivers/clk/qcom/mmcc-msm8994.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org>
4  */
5 
6 #include <linux/kernel.h>
7 #include <linux/bitops.h>
8 #include <linux/err.h>
9 #include <linux/platform_device.h>
10 #include <linux/module.h>
11 #include <linux/of.h>
12 #include <linux/clk-provider.h>
13 #include <linux/regmap.h>
14 #include <linux/reset-controller.h>
15 #include <linux/clk.h>
16 
17 #include <dt-bindings/clock/qcom,mmcc-msm8994.h>
18 
19 #include "common.h"
20 #include "clk-regmap.h"
21 #include "clk-regmap-divider.h"
22 #include "clk-alpha-pll.h"
23 #include "clk-rcg.h"
24 #include "clk-branch.h"
25 #include "reset.h"
26 #include "gdsc.h"
27 
28 
29 enum {
30 	P_XO,
31 	P_GPLL0,
32 	P_MMPLL0,
33 	P_MMPLL1,
34 	P_MMPLL3,
35 	P_MMPLL4,
36 	P_MMPLL5, /* Is this one even used by anything? Downstream doesn't tell. */
37 	P_DSI0PLL,
38 	P_DSI1PLL,
39 	P_DSI0PLL_BYTE,
40 	P_DSI1PLL_BYTE,
41 	P_HDMIPLL,
42 };
43 static const struct parent_map mmcc_xo_gpll0_map[] = {
44 	{ P_XO, 0 },
45 	{ P_GPLL0, 5 }
46 };
47 
48 static const struct clk_parent_data mmcc_xo_gpll0[] = {
49 	{ .fw_name = "xo" },
50 	{ .fw_name = "gpll0" },
51 };
52 
53 static const struct parent_map mmss_xo_hdmi_map[] = {
54 	{ P_XO, 0 },
55 	{ P_HDMIPLL, 3 }
56 };
57 
58 static const struct clk_parent_data mmss_xo_hdmi[] = {
59 	{ .fw_name = "xo" },
60 	{ .fw_name = "hdmipll" },
61 };
62 
63 static const struct parent_map mmcc_xo_dsi0pll_dsi1pll_map[] = {
64 	{ P_XO, 0 },
65 	{ P_DSI0PLL, 1 },
66 	{ P_DSI1PLL, 2 }
67 };
68 
69 static const struct clk_parent_data mmcc_xo_dsi0pll_dsi1pll[] = {
70 	{ .fw_name = "xo" },
71 	{ .fw_name = "dsi0pll" },
72 	{ .fw_name = "dsi1pll" },
73 };
74 
75 static const struct parent_map mmcc_xo_dsibyte_map[] = {
76 	{ P_XO, 0 },
77 	{ P_DSI0PLL_BYTE, 1 },
78 	{ P_DSI1PLL_BYTE, 2 }
79 };
80 
81 static const struct clk_parent_data mmcc_xo_dsibyte[] = {
82 	{ .fw_name = "xo" },
83 	{ .fw_name = "dsi0pllbyte" },
84 	{ .fw_name = "dsi1pllbyte" },
85 };
86 
87 static const struct pll_vco mmpll_p_vco[] = {
88 	{ 250000000, 500000000, 3 },
89 	{ 500000000, 1000000000, 2 },
90 	{ 1000000000, 1500000000, 1 },
91 	{ 1500000000, 2000000000, 0 },
92 };
93 
94 static const struct pll_vco mmpll_t_vco[] = {
95 	{ 500000000, 1500000000, 0 },
96 };
97 
98 static const struct alpha_pll_config mmpll_p_config = {
99 	.post_div_mask = 0xf00,
100 };
101 
102 static struct clk_alpha_pll mmpll0_early = {
103 	.offset = 0x0,
104 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
105 	.vco_table = mmpll_p_vco,
106 	.num_vco = ARRAY_SIZE(mmpll_p_vco),
107 	.clkr = {
108 		.enable_reg = 0x100,
109 		.enable_mask = BIT(0),
110 		.hw.init = &(struct clk_init_data){
111 			.name = "mmpll0_early",
112 			.parent_data = &(const struct clk_parent_data){
113 				.fw_name = "xo",
114 			},
115 			.num_parents = 1,
116 			.ops = &clk_alpha_pll_ops,
117 		},
118 	},
119 };
120 
121 static struct clk_alpha_pll_postdiv mmpll0 = {
122 	.offset = 0x0,
123 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
124 	.width = 4,
125 	.clkr.hw.init = &(struct clk_init_data){
126 		.name = "mmpll0",
127 		.parent_hws = (const struct clk_hw *[]){ &mmpll0_early.clkr.hw },
128 		.num_parents = 1,
129 		.ops = &clk_alpha_pll_postdiv_ops,
130 		.flags = CLK_SET_RATE_PARENT,
131 	},
132 };
133 
134 static struct clk_alpha_pll mmpll1_early = {
135 	.offset = 0x30,
136 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
137 	.vco_table = mmpll_p_vco,
138 	.num_vco = ARRAY_SIZE(mmpll_p_vco),
139 	.clkr = {
140 		.enable_reg = 0x100,
141 		.enable_mask = BIT(1),
142 		.hw.init = &(struct clk_init_data){
143 			.name = "mmpll1_early",
144 			.parent_data = &(const struct clk_parent_data){
145 				.fw_name = "xo",
146 			},
147 			.num_parents = 1,
148 			.ops = &clk_alpha_pll_ops,
149 		}
150 	},
151 };
152 
153 static struct clk_alpha_pll_postdiv mmpll1 = {
154 	.offset = 0x30,
155 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
156 	.width = 4,
157 	.clkr.hw.init = &(struct clk_init_data){
158 		.name = "mmpll1",
159 		.parent_hws = (const struct clk_hw *[]){ &mmpll1_early.clkr.hw },
160 		.num_parents = 1,
161 		.ops = &clk_alpha_pll_postdiv_ops,
162 		.flags = CLK_SET_RATE_PARENT,
163 	},
164 };
165 
166 static struct clk_alpha_pll mmpll3_early = {
167 	.offset = 0x60,
168 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
169 	.vco_table = mmpll_p_vco,
170 	.num_vco = ARRAY_SIZE(mmpll_p_vco),
171 	.clkr.hw.init = &(struct clk_init_data){
172 		.name = "mmpll3_early",
173 		.parent_data = &(const struct clk_parent_data){
174 				.fw_name = "xo",
175 		},
176 		.num_parents = 1,
177 		.ops = &clk_alpha_pll_ops,
178 	},
179 };
180 
181 static struct clk_alpha_pll_postdiv mmpll3 = {
182 	.offset = 0x60,
183 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
184 	.width = 4,
185 	.clkr.hw.init = &(struct clk_init_data){
186 		.name = "mmpll3",
187 		.parent_hws = (const struct clk_hw *[]){ &mmpll3_early.clkr.hw },
188 		.num_parents = 1,
189 		.ops = &clk_alpha_pll_postdiv_ops,
190 		.flags = CLK_SET_RATE_PARENT,
191 	},
192 };
193 
194 static struct clk_alpha_pll mmpll4_early = {
195 	.offset = 0x90,
196 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
197 	.vco_table = mmpll_t_vco,
198 	.num_vco = ARRAY_SIZE(mmpll_t_vco),
199 	.clkr.hw.init = &(struct clk_init_data){
200 		.name = "mmpll4_early",
201 		.parent_data = &(const struct clk_parent_data){
202 				.fw_name = "xo",
203 		},
204 		.num_parents = 1,
205 		.ops = &clk_alpha_pll_ops,
206 	},
207 };
208 
209 static struct clk_alpha_pll_postdiv mmpll4 = {
210 	.offset = 0x90,
211 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
212 	.width = 2,
213 	.clkr.hw.init = &(struct clk_init_data){
214 		.name = "mmpll4",
215 		.parent_hws = (const struct clk_hw *[]){ &mmpll4_early.clkr.hw },
216 		.num_parents = 1,
217 		.ops = &clk_alpha_pll_postdiv_ops,
218 		.flags = CLK_SET_RATE_PARENT,
219 	},
220 };
221 
222 static const struct parent_map mmcc_xo_gpll0_mmpll1_map[] = {
223 	{ P_XO, 0 },
224 	{ P_GPLL0, 5 },
225 	{ P_MMPLL1, 2 }
226 };
227 
228 static const struct clk_parent_data mmcc_xo_gpll0_mmpll1[] = {
229 	{ .fw_name = "xo" },
230 	{ .fw_name = "gpll0" },
231 	{ .hw = &mmpll1.clkr.hw },
232 };
233 
234 static const struct parent_map mmcc_xo_gpll0_mmpll0_map[] = {
235 	{ P_XO, 0 },
236 	{ P_GPLL0, 5 },
237 	{ P_MMPLL0, 1 }
238 };
239 
240 static const struct clk_parent_data mmcc_xo_gpll0_mmpll0[] = {
241 	{ .fw_name = "xo" },
242 	{ .fw_name = "gpll0" },
243 	{ .hw = &mmpll0.clkr.hw },
244 };
245 
246 static const struct parent_map mmcc_xo_gpll0_mmpll0_mmpll3_map[] = {
247 	{ P_XO, 0 },
248 	{ P_GPLL0, 5 },
249 	{ P_MMPLL0, 1 },
250 	{ P_MMPLL3, 3 }
251 };
252 
253 static const struct clk_parent_data mmcc_xo_gpll0_mmpll0_mmpll3[] = {
254 	{ .fw_name = "xo" },
255 	{ .fw_name = "gpll0" },
256 	{ .hw = &mmpll0.clkr.hw },
257 	{ .hw = &mmpll3.clkr.hw },
258 };
259 
260 static const struct parent_map mmcc_xo_gpll0_mmpll0_mmpll4_map[] = {
261 	{ P_XO, 0 },
262 	{ P_GPLL0, 5 },
263 	{ P_MMPLL0, 1 },
264 	{ P_MMPLL4, 3 }
265 };
266 
267 static const struct clk_parent_data mmcc_xo_gpll0_mmpll0_mmpll4[] = {
268 	{ .fw_name = "xo" },
269 	{ .fw_name = "gpll0" },
270 	{ .hw = &mmpll0.clkr.hw },
271 	{ .hw = &mmpll4.clkr.hw },
272 };
273 
274 static struct clk_alpha_pll mmpll5_early = {
275 	.offset = 0xc0,
276 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
277 	.vco_table = mmpll_p_vco,
278 	.num_vco = ARRAY_SIZE(mmpll_p_vco),
279 	.clkr.hw.init = &(struct clk_init_data){
280 		.name = "mmpll5_early",
281 		.parent_data = &(const struct clk_parent_data){
282 				.fw_name = "xo",
283 		},
284 		.num_parents = 1,
285 		.ops = &clk_alpha_pll_ops,
286 	},
287 };
288 
289 static struct clk_alpha_pll_postdiv mmpll5 = {
290 	.offset = 0xc0,
291 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
292 	.width = 4,
293 	.clkr.hw.init = &(struct clk_init_data){
294 		.name = "mmpll5",
295 		.parent_hws = (const struct clk_hw *[]){ &mmpll5_early.clkr.hw },
296 		.num_parents = 1,
297 		.ops = &clk_alpha_pll_postdiv_ops,
298 		.flags = CLK_SET_RATE_PARENT,
299 	},
300 };
301 
302 static const struct freq_tbl ftbl_ahb_clk_src[] = {
303 	/* Note: There might be more frequencies desired here. */
304 	F(19200000, P_XO, 1, 0, 0),
305 	F(40000000, P_GPLL0, 15, 0, 0),
306 	F(80000000, P_MMPLL0, 10, 0, 0),
307 	{ }
308 };
309 
310 static struct clk_rcg2 ahb_clk_src = {
311 	.cmd_rcgr = 0x5000,
312 	.hid_width = 5,
313 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
314 	.freq_tbl = ftbl_ahb_clk_src,
315 	.clkr.hw.init = &(struct clk_init_data){
316 		.name = "ahb_clk_src",
317 		.parent_data = mmcc_xo_gpll0_mmpll0,
318 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
319 		.ops = &clk_rcg2_ops,
320 	},
321 };
322 
323 static const struct freq_tbl ftbl_axi_clk_src[] = {
324 	F(75000000, P_GPLL0, 8, 0, 0),
325 	F(150000000, P_GPLL0, 4, 0, 0),
326 	F(333430000, P_MMPLL1, 3.5, 0, 0),
327 	F(466800000, P_MMPLL1, 2.5, 0, 0),
328 	{ }
329 };
330 
331 static const struct freq_tbl ftbl_axi_clk_src_8992[] = {
332 	F(75000000, P_GPLL0, 8, 0, 0),
333 	F(150000000, P_GPLL0, 4, 0, 0),
334 	F(300000000, P_GPLL0, 2, 0, 0),
335 	F(404000000, P_MMPLL1, 2, 0, 0),
336 	{ }
337 };
338 
339 static struct clk_rcg2 axi_clk_src = {
340 	.cmd_rcgr = 0x5040,
341 	.hid_width = 5,
342 	.parent_map = mmcc_xo_gpll0_mmpll1_map,
343 	.freq_tbl = ftbl_axi_clk_src,
344 	.clkr.hw.init = &(struct clk_init_data){
345 		.name = "axi_clk_src",
346 		.parent_data = mmcc_xo_gpll0_mmpll1,
347 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll1),
348 		.ops = &clk_rcg2_ops,
349 	},
350 };
351 
352 static const struct freq_tbl ftbl_csi0_1_2_3_clk_src[] = {
353 	F(100000000, P_GPLL0, 6, 0, 0),
354 	F(240000000, P_GPLL0, 2.5, 0, 0),
355 	F(266670000, P_MMPLL0, 3, 0, 0),
356 	{ }
357 };
358 
359 static const struct freq_tbl ftbl_csi0_1_2_3_clk_src_8992[] = {
360 	F(100000000, P_GPLL0, 6, 0, 0),
361 	F(266670000, P_MMPLL0, 3, 0, 0),
362 	{ }
363 };
364 
365 static struct clk_rcg2 csi0_clk_src = {
366 	.cmd_rcgr = 0x3090,
367 	.hid_width = 5,
368 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
369 	.freq_tbl = ftbl_csi0_1_2_3_clk_src,
370 	.clkr.hw.init = &(struct clk_init_data){
371 		.name = "csi0_clk_src",
372 		.parent_data = mmcc_xo_gpll0_mmpll0,
373 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
374 		.ops = &clk_rcg2_ops,
375 	},
376 };
377 
378 static const struct freq_tbl ftbl_vcodec0_clk_src[] = {
379 	F(66670000, P_GPLL0, 9, 0, 0),
380 	F(100000000, P_GPLL0, 6, 0, 0),
381 	F(133330000, P_GPLL0, 4.5, 0, 0),
382 	F(150000000, P_GPLL0, 4, 0, 0),
383 	F(200000000, P_MMPLL0, 4, 0, 0),
384 	F(240000000, P_GPLL0, 2.5, 0, 0),
385 	F(266670000, P_MMPLL0, 3, 0, 0),
386 	F(320000000, P_MMPLL0, 2.5, 0, 0),
387 	F(510000000, P_MMPLL3, 2, 0, 0),
388 	{ }
389 };
390 
391 static const struct freq_tbl ftbl_vcodec0_clk_src_8992[] = {
392 	F(66670000, P_GPLL0, 9, 0, 0),
393 	F(100000000, P_GPLL0, 6, 0, 0),
394 	F(133330000, P_GPLL0, 4.5, 0, 0),
395 	F(200000000, P_MMPLL0, 4, 0, 0),
396 	F(320000000, P_MMPLL0, 2.5, 0, 0),
397 	F(510000000, P_MMPLL3, 2, 0, 0),
398 	{ }
399 };
400 
401 static struct clk_rcg2 vcodec0_clk_src = {
402 	.cmd_rcgr = 0x1000,
403 	.mnd_width = 8,
404 	.hid_width = 5,
405 	.parent_map = mmcc_xo_gpll0_mmpll0_mmpll3_map,
406 	.freq_tbl = ftbl_vcodec0_clk_src,
407 	.clkr.hw.init = &(struct clk_init_data){
408 		.name = "vcodec0_clk_src",
409 		.parent_data = mmcc_xo_gpll0_mmpll0_mmpll3,
410 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll3),
411 		.ops = &clk_rcg2_ops,
412 	},
413 };
414 
415 static struct clk_rcg2 csi1_clk_src = {
416 	.cmd_rcgr = 0x3100,
417 	.hid_width = 5,
418 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
419 	.freq_tbl = ftbl_csi0_1_2_3_clk_src,
420 	.clkr.hw.init = &(struct clk_init_data){
421 		.name = "csi1_clk_src",
422 		.parent_data = mmcc_xo_gpll0_mmpll0,
423 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
424 		.ops = &clk_rcg2_ops,
425 	},
426 };
427 
428 static struct clk_rcg2 csi2_clk_src = {
429 	.cmd_rcgr = 0x3160,
430 	.hid_width = 5,
431 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
432 	.freq_tbl = ftbl_csi0_1_2_3_clk_src,
433 	.clkr.hw.init = &(struct clk_init_data){
434 		.name = "csi2_clk_src",
435 		.parent_data = mmcc_xo_gpll0_mmpll0,
436 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
437 		.ops = &clk_rcg2_ops,
438 	},
439 };
440 
441 static struct clk_rcg2 csi3_clk_src = {
442 	.cmd_rcgr = 0x31c0,
443 	.hid_width = 5,
444 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
445 	.freq_tbl = ftbl_csi0_1_2_3_clk_src,
446 	.clkr.hw.init = &(struct clk_init_data){
447 		.name = "csi3_clk_src",
448 		.parent_data = mmcc_xo_gpll0_mmpll0,
449 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
450 		.ops = &clk_rcg2_ops,
451 	},
452 };
453 
454 static const struct freq_tbl ftbl_vfe0_clk_src[] = {
455 	F(80000000, P_GPLL0, 7.5, 0, 0),
456 	F(100000000, P_GPLL0, 6, 0, 0),
457 	F(200000000, P_GPLL0, 3, 0, 0),
458 	F(320000000, P_MMPLL0, 2.5, 0, 0),
459 	F(400000000, P_MMPLL0, 2, 0, 0),
460 	F(480000000, P_MMPLL4, 2, 0, 0),
461 	F(533330000, P_MMPLL0, 1.5, 0, 0),
462 	F(600000000, P_GPLL0, 1, 0, 0),
463 	{ }
464 };
465 
466 static const struct freq_tbl ftbl_vfe0_1_clk_src_8992[] = {
467 	F(80000000, P_GPLL0, 7.5, 0, 0),
468 	F(100000000, P_GPLL0, 6, 0, 0),
469 	F(200000000, P_GPLL0, 3, 0, 0),
470 	F(320000000, P_MMPLL0, 2.5, 0, 0),
471 	F(480000000, P_MMPLL4, 2, 0, 0),
472 	F(600000000, P_GPLL0, 1, 0, 0),
473 	{ }
474 };
475 
476 static struct clk_rcg2 vfe0_clk_src = {
477 	.cmd_rcgr = 0x3600,
478 	.hid_width = 5,
479 	.parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
480 	.freq_tbl = ftbl_vfe0_clk_src,
481 	.clkr.hw.init = &(struct clk_init_data){
482 		.name = "vfe0_clk_src",
483 		.parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
484 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
485 		.ops = &clk_rcg2_ops,
486 	},
487 };
488 
489 static const struct freq_tbl ftbl_vfe1_clk_src[] = {
490 	F(80000000, P_GPLL0, 7.5, 0, 0),
491 	F(100000000, P_GPLL0, 6, 0, 0),
492 	F(200000000, P_GPLL0, 3, 0, 0),
493 	F(320000000, P_MMPLL0, 2.5, 0, 0),
494 	F(400000000, P_MMPLL0, 2, 0, 0),
495 	F(533330000, P_MMPLL0, 1.5, 0, 0),
496 	{ }
497 };
498 
499 static struct clk_rcg2 vfe1_clk_src = {
500 	.cmd_rcgr = 0x3620,
501 	.hid_width = 5,
502 	.parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
503 	.freq_tbl = ftbl_vfe1_clk_src,
504 	.clkr.hw.init = &(struct clk_init_data){
505 		.name = "vfe1_clk_src",
506 		.parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
507 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
508 		.ops = &clk_rcg2_ops,
509 	},
510 };
511 
512 static const struct freq_tbl ftbl_cpp_clk_src[] = {
513 	F(100000000, P_GPLL0, 6, 0, 0),
514 	F(200000000, P_GPLL0, 3, 0, 0),
515 	F(320000000, P_MMPLL0, 2.5, 0, 0),
516 	F(480000000, P_MMPLL4, 2, 0, 0),
517 	F(600000000, P_GPLL0, 1, 0, 0),
518 	F(640000000, P_MMPLL4, 1.5, 0, 0),
519 	{ }
520 };
521 
522 static const struct freq_tbl ftbl_cpp_clk_src_8992[] = {
523 	F(100000000, P_GPLL0, 6, 0, 0),
524 	F(200000000, P_GPLL0, 3, 0, 0),
525 	F(320000000, P_MMPLL0, 2.5, 0, 0),
526 	F(480000000, P_MMPLL4, 2, 0, 0),
527 	F(640000000, P_MMPLL4, 1.5, 0, 0),
528 	{ }
529 };
530 
531 static struct clk_rcg2 cpp_clk_src = {
532 	.cmd_rcgr = 0x3640,
533 	.hid_width = 5,
534 	.parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
535 	.freq_tbl = ftbl_cpp_clk_src,
536 	.clkr.hw.init = &(struct clk_init_data){
537 		.name = "cpp_clk_src",
538 		.parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
539 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
540 		.ops = &clk_rcg2_ops,
541 	},
542 };
543 
544 static const struct freq_tbl ftbl_jpeg0_1_clk_src[] = {
545 	F(75000000, P_GPLL0, 8, 0, 0),
546 	F(150000000, P_GPLL0, 4, 0, 0),
547 	F(228570000, P_MMPLL0, 3.5, 0, 0),
548 	F(266670000, P_MMPLL0, 3, 0, 0),
549 	F(320000000, P_MMPLL0, 2.5, 0, 0),
550 	F(480000000, P_MMPLL4, 2, 0, 0),
551 	{ }
552 };
553 
554 static struct clk_rcg2 jpeg1_clk_src = {
555 	.cmd_rcgr = 0x3520,
556 	.hid_width = 5,
557 	.parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
558 	.freq_tbl = ftbl_jpeg0_1_clk_src,
559 	.clkr.hw.init = &(struct clk_init_data){
560 		.name = "jpeg1_clk_src",
561 		.parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
562 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
563 		.ops = &clk_rcg2_ops,
564 	},
565 };
566 
567 static const struct freq_tbl ftbl_jpeg2_clk_src[] = {
568 	F(75000000, P_GPLL0, 8, 0, 0),
569 	F(133330000, P_GPLL0, 4.5, 0, 0),
570 	F(150000000, P_GPLL0, 4, 0, 0),
571 	F(228570000, P_MMPLL0, 3.5, 0, 0),
572 	F(266670000, P_MMPLL0, 3, 0, 0),
573 	F(320000000, P_MMPLL0, 2.5, 0, 0),
574 	{ }
575 };
576 
577 static struct clk_rcg2 jpeg2_clk_src = {
578 	.cmd_rcgr = 0x3540,
579 	.hid_width = 5,
580 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
581 	.freq_tbl = ftbl_jpeg2_clk_src,
582 	.clkr.hw.init = &(struct clk_init_data){
583 		.name = "jpeg2_clk_src",
584 		.parent_data = mmcc_xo_gpll0_mmpll0,
585 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
586 		.ops = &clk_rcg2_ops,
587 	},
588 };
589 
590 static const struct freq_tbl ftbl_csi2phytimer_clk_src[] = {
591 	F(50000000, P_GPLL0, 12, 0, 0),
592 	F(100000000, P_GPLL0, 6, 0, 0),
593 	F(200000000, P_MMPLL0, 4, 0, 0),
594 	{ }
595 };
596 
597 static struct clk_rcg2 csi2phytimer_clk_src = {
598 	.cmd_rcgr = 0x3060,
599 	.hid_width = 5,
600 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
601 	.freq_tbl = ftbl_csi2phytimer_clk_src,
602 	.clkr.hw.init = &(struct clk_init_data){
603 		.name = "csi2phytimer_clk_src",
604 		.parent_data = mmcc_xo_gpll0_mmpll0,
605 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
606 		.ops = &clk_rcg2_ops,
607 	},
608 };
609 
610 static const struct freq_tbl ftbl_fd_core_clk_src[] = {
611 	F(60000000, P_GPLL0, 10, 0, 0),
612 	F(200000000, P_GPLL0, 3, 0, 0),
613 	F(320000000, P_MMPLL0, 2.5, 0, 0),
614 	F(400000000, P_MMPLL0, 2, 0, 0),
615 	{ }
616 };
617 
618 static struct clk_rcg2 fd_core_clk_src = {
619 	.cmd_rcgr = 0x3b00,
620 	.hid_width = 5,
621 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
622 	.freq_tbl = ftbl_fd_core_clk_src,
623 	.clkr.hw.init = &(struct clk_init_data){
624 		.name = "fd_core_clk_src",
625 		.parent_data = mmcc_xo_gpll0_mmpll0,
626 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
627 		.ops = &clk_rcg2_ops,
628 	},
629 };
630 
631 static const struct freq_tbl ftbl_mdp_clk_src[] = {
632 	F(85710000, P_GPLL0, 7, 0, 0),
633 	F(100000000, P_GPLL0, 6, 0, 0),
634 	F(120000000, P_GPLL0, 5, 0, 0),
635 	F(150000000, P_GPLL0, 4, 0, 0),
636 	F(171430000, P_GPLL0, 3.5, 0, 0),
637 	F(200000000, P_GPLL0, 3, 0, 0),
638 	F(240000000, P_GPLL0, 2.5, 0, 0),
639 	F(266670000, P_MMPLL0, 3, 0, 0),
640 	F(300000000, P_GPLL0, 2, 0, 0),
641 	F(320000000, P_MMPLL0, 2.5, 0, 0),
642 	F(400000000, P_MMPLL0, 2, 0, 0),
643 	{ }
644 };
645 
646 static const struct freq_tbl ftbl_mdp_clk_src_8992[] = {
647 	F(85710000, P_GPLL0, 7, 0, 0),
648 	F(171430000, P_GPLL0, 3.5, 0, 0),
649 	F(200000000, P_GPLL0, 3, 0, 0),
650 	F(240000000, P_GPLL0, 2.5, 0, 0),
651 	F(266670000, P_MMPLL0, 3, 0, 0),
652 	F(320000000, P_MMPLL0, 2.5, 0, 0),
653 	F(400000000, P_MMPLL0, 2, 0, 0),
654 	{ }
655 };
656 
657 static struct clk_rcg2 mdp_clk_src = {
658 	.cmd_rcgr = 0x2040,
659 	.hid_width = 5,
660 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
661 	.freq_tbl = ftbl_mdp_clk_src,
662 	.clkr.hw.init = &(struct clk_init_data){
663 		.name = "mdp_clk_src",
664 		.parent_data = mmcc_xo_gpll0_mmpll0,
665 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
666 		.ops = &clk_rcg2_ops,
667 	},
668 };
669 
670 static struct clk_rcg2 pclk0_clk_src = {
671 	.cmd_rcgr = 0x2000,
672 	.mnd_width = 8,
673 	.hid_width = 5,
674 	.parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
675 	.clkr.hw.init = &(struct clk_init_data){
676 		.name = "pclk0_clk_src",
677 		.parent_data = mmcc_xo_dsi0pll_dsi1pll,
678 		.num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
679 		.ops = &clk_pixel_ops,
680 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
681 	},
682 };
683 
684 static struct clk_rcg2 pclk1_clk_src = {
685 	.cmd_rcgr = 0x2020,
686 	.mnd_width = 8,
687 	.hid_width = 5,
688 	.parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
689 	.clkr.hw.init = &(struct clk_init_data){
690 		.name = "pclk1_clk_src",
691 		.parent_data = mmcc_xo_dsi0pll_dsi1pll,
692 		.num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
693 		.ops = &clk_pixel_ops,
694 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
695 	},
696 };
697 
698 static const struct freq_tbl ftbl_ocmemnoc_clk_src[] = {
699 	F(19200000, P_XO, 1, 0, 0),
700 	F(75000000, P_GPLL0, 8, 0, 0),
701 	F(100000000, P_GPLL0, 6, 0, 0),
702 	F(150000000, P_GPLL0, 4, 0, 0),
703 	F(228570000, P_MMPLL0, 3.5, 0, 0),
704 	F(266670000, P_MMPLL0, 3, 0, 0),
705 	F(320000000, P_MMPLL0, 2.5, 0, 0),
706 	F(400000000, P_MMPLL0, 2, 0, 0),
707 	{ }
708 };
709 
710 static const struct freq_tbl ftbl_ocmemnoc_clk_src_8992[] = {
711 	F(19200000, P_XO, 1, 0, 0),
712 	F(75000000, P_GPLL0, 8, 0, 0),
713 	F(100000000, P_GPLL0, 6, 0, 0),
714 	F(150000000, P_GPLL0, 4, 0, 0),
715 	F(320000000, P_MMPLL0, 2.5, 0, 0),
716 	F(400000000, P_MMPLL0, 2, 0, 0),
717 	{ }
718 };
719 
720 static struct clk_rcg2 ocmemnoc_clk_src = {
721 	.cmd_rcgr = 0x5090,
722 	.hid_width = 5,
723 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
724 	.freq_tbl = ftbl_ocmemnoc_clk_src,
725 	.clkr.hw.init = &(struct clk_init_data){
726 		.name = "ocmemnoc_clk_src",
727 		.parent_data = mmcc_xo_gpll0_mmpll0,
728 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
729 		.ops = &clk_rcg2_ops,
730 	},
731 };
732 
733 static const struct freq_tbl ftbl_cci_clk_src[] = {
734 	F(19200000, P_XO, 1, 0, 0),
735 	F(37500000, P_GPLL0, 16, 0, 0),
736 	F(50000000, P_GPLL0, 12, 0, 0),
737 	F(100000000, P_GPLL0, 6, 0, 0),
738 	{ }
739 };
740 
741 static struct clk_rcg2 cci_clk_src = {
742 	.cmd_rcgr = 0x3300,
743 	.mnd_width = 8,
744 	.hid_width = 5,
745 	.parent_map = mmcc_xo_gpll0_map,
746 	.freq_tbl = ftbl_cci_clk_src,
747 	.clkr.hw.init = &(struct clk_init_data){
748 		.name = "cci_clk_src",
749 		.parent_data = mmcc_xo_gpll0,
750 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
751 		.ops = &clk_rcg2_ops,
752 	},
753 };
754 
755 static const struct freq_tbl ftbl_mmss_gp0_1_clk_src[] = {
756 	F(10000, P_XO, 16, 10, 120),
757 	F(24000, P_GPLL0, 16, 1, 50),
758 	F(6000000, P_GPLL0, 10, 1, 10),
759 	F(12000000, P_GPLL0, 10, 1, 5),
760 	F(13000000, P_GPLL0, 4, 13, 150),
761 	F(24000000, P_GPLL0, 5, 1, 5),
762 	{ }
763 };
764 
765 static struct clk_rcg2 mmss_gp0_clk_src = {
766 	.cmd_rcgr = 0x3420,
767 	.mnd_width = 8,
768 	.hid_width = 5,
769 	.parent_map = mmcc_xo_gpll0_map,
770 	.freq_tbl = ftbl_mmss_gp0_1_clk_src,
771 	.clkr.hw.init = &(struct clk_init_data){
772 		.name = "mmss_gp0_clk_src",
773 		.parent_data = mmcc_xo_gpll0,
774 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
775 		.ops = &clk_rcg2_ops,
776 	},
777 };
778 
779 static struct clk_rcg2 mmss_gp1_clk_src = {
780 	.cmd_rcgr = 0x3450,
781 	.mnd_width = 8,
782 	.hid_width = 5,
783 	.parent_map = mmcc_xo_gpll0_map,
784 	.freq_tbl = ftbl_mmss_gp0_1_clk_src,
785 	.clkr.hw.init = &(struct clk_init_data){
786 		.name = "mmss_gp1_clk_src",
787 		.parent_data = mmcc_xo_gpll0,
788 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
789 		.ops = &clk_rcg2_ops,
790 	},
791 };
792 
793 static struct clk_rcg2 jpeg0_clk_src = {
794 	.cmd_rcgr = 0x3500,
795 	.hid_width = 5,
796 	.parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
797 	.freq_tbl = ftbl_jpeg0_1_clk_src,
798 	.clkr.hw.init = &(struct clk_init_data){
799 		.name = "jpeg0_clk_src",
800 		.parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
801 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
802 		.ops = &clk_rcg2_ops,
803 	},
804 };
805 
806 static struct clk_rcg2 jpeg_dma_clk_src = {
807 	.cmd_rcgr = 0x3560,
808 	.hid_width = 5,
809 	.parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
810 	.freq_tbl = ftbl_jpeg0_1_clk_src,
811 	.clkr.hw.init = &(struct clk_init_data){
812 		.name = "jpeg_dma_clk_src",
813 		.parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
814 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
815 		.ops = &clk_rcg2_ops,
816 	},
817 };
818 
819 static const struct freq_tbl ftbl_mclk0_1_2_3_clk_src[] = {
820 	F(4800000, P_XO, 4, 0, 0),
821 	F(6000000, P_GPLL0, 10, 1, 10),
822 	F(8000000, P_GPLL0, 15, 1, 5),
823 	F(9600000, P_XO, 2, 0, 0),
824 	F(16000000, P_MMPLL0, 10, 1, 5),
825 	F(19200000, P_XO, 1, 0, 0),
826 	F(24000000, P_GPLL0, 5, 1, 5),
827 	F(32000000, P_MMPLL0, 5, 1, 5),
828 	F(48000000, P_GPLL0, 12.5, 0, 0),
829 	F(64000000, P_MMPLL0, 12.5, 0, 0),
830 	{ }
831 };
832 
833 static const struct freq_tbl ftbl_mclk0_clk_src_8992[] = {
834 	F(4800000, P_XO, 4, 0, 0),
835 	F(6000000, P_MMPLL4, 10, 1, 16),
836 	F(8000000, P_MMPLL4, 10, 1, 12),
837 	F(9600000, P_XO, 2, 0, 0),
838 	F(12000000, P_MMPLL4, 10, 1, 8),
839 	F(16000000, P_MMPLL4, 10, 1, 6),
840 	F(19200000, P_XO, 1, 0, 0),
841 	F(24000000, P_MMPLL4, 10, 1, 4),
842 	F(32000000, P_MMPLL4, 10, 1, 3),
843 	F(48000000, P_MMPLL4, 10, 1, 2),
844 	F(64000000, P_MMPLL4, 15, 0, 0),
845 	{ }
846 };
847 
848 static const struct freq_tbl ftbl_mclk1_2_3_clk_src_8992[] = {
849 	F(4800000, P_XO, 4, 0, 0),
850 	F(6000000, P_MMPLL4, 10, 1, 16),
851 	F(8000000, P_MMPLL4, 10, 1, 12),
852 	F(9600000, P_XO, 2, 0, 0),
853 	F(16000000, P_MMPLL4, 10, 1, 6),
854 	F(19200000, P_XO, 1, 0, 0),
855 	F(24000000, P_MMPLL4, 10, 1, 4),
856 	F(32000000, P_MMPLL4, 10, 1, 3),
857 	F(48000000, P_MMPLL4, 10, 1, 2),
858 	F(64000000, P_MMPLL4, 15, 0, 0),
859 	{ }
860 };
861 
862 static struct clk_rcg2 mclk0_clk_src = {
863 	.cmd_rcgr = 0x3360,
864 	.mnd_width = 8,
865 	.hid_width = 5,
866 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
867 	.freq_tbl = ftbl_mclk0_1_2_3_clk_src,
868 	.clkr.hw.init = &(struct clk_init_data){
869 		.name = "mclk0_clk_src",
870 		.parent_data = mmcc_xo_gpll0_mmpll0,
871 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
872 		.ops = &clk_rcg2_ops,
873 	},
874 };
875 
876 static struct clk_rcg2 mclk1_clk_src = {
877 	.cmd_rcgr = 0x3390,
878 	.mnd_width = 8,
879 	.hid_width = 5,
880 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
881 	.freq_tbl = ftbl_mclk0_1_2_3_clk_src,
882 	.clkr.hw.init = &(struct clk_init_data){
883 		.name = "mclk1_clk_src",
884 		.parent_data = mmcc_xo_gpll0_mmpll0,
885 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
886 		.ops = &clk_rcg2_ops,
887 	},
888 };
889 
890 static struct clk_rcg2 mclk2_clk_src = {
891 	.cmd_rcgr = 0x33c0,
892 	.mnd_width = 8,
893 	.hid_width = 5,
894 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
895 	.freq_tbl = ftbl_mclk0_1_2_3_clk_src,
896 	.clkr.hw.init = &(struct clk_init_data){
897 		.name = "mclk2_clk_src",
898 		.parent_data = mmcc_xo_gpll0_mmpll0,
899 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
900 		.ops = &clk_rcg2_ops,
901 	},
902 };
903 
904 static struct clk_rcg2 mclk3_clk_src = {
905 	.cmd_rcgr = 0x33f0,
906 	.mnd_width = 8,
907 	.hid_width = 5,
908 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
909 	.freq_tbl = ftbl_mclk0_1_2_3_clk_src,
910 	.clkr.hw.init = &(struct clk_init_data){
911 		.name = "mclk3_clk_src",
912 		.parent_data = mmcc_xo_gpll0_mmpll0,
913 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
914 		.ops = &clk_rcg2_ops,
915 	},
916 };
917 
918 static const struct freq_tbl ftbl_csi0_1phytimer_clk_src[] = {
919 	F(50000000, P_GPLL0, 12, 0, 0),
920 	F(100000000, P_GPLL0, 6, 0, 0),
921 	F(200000000, P_MMPLL0, 4, 0, 0),
922 	{ }
923 };
924 
925 static struct clk_rcg2 csi0phytimer_clk_src = {
926 	.cmd_rcgr = 0x3000,
927 	.hid_width = 5,
928 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
929 	.freq_tbl = ftbl_csi0_1phytimer_clk_src,
930 	.clkr.hw.init = &(struct clk_init_data){
931 		.name = "csi0phytimer_clk_src",
932 		.parent_data = mmcc_xo_gpll0_mmpll0,
933 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
934 		.ops = &clk_rcg2_ops,
935 	},
936 };
937 
938 static struct clk_rcg2 csi1phytimer_clk_src = {
939 	.cmd_rcgr = 0x3030,
940 	.hid_width = 5,
941 	.parent_map = mmcc_xo_gpll0_mmpll0_map,
942 	.freq_tbl = ftbl_csi0_1phytimer_clk_src,
943 	.clkr.hw.init = &(struct clk_init_data){
944 		.name = "csi1phytimer_clk_src",
945 		.parent_data = mmcc_xo_gpll0_mmpll0,
946 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
947 		.ops = &clk_rcg2_ops,
948 	},
949 };
950 
951 static struct clk_rcg2 byte0_clk_src = {
952 	.cmd_rcgr = 0x2120,
953 	.hid_width = 5,
954 	.parent_map = mmcc_xo_dsibyte_map,
955 	.clkr.hw.init = &(struct clk_init_data){
956 		.name = "byte0_clk_src",
957 		.parent_data = mmcc_xo_dsibyte,
958 		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
959 		.ops = &clk_byte2_ops,
960 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
961 	},
962 };
963 
964 static struct clk_rcg2 byte1_clk_src = {
965 	.cmd_rcgr = 0x2140,
966 	.hid_width = 5,
967 	.parent_map = mmcc_xo_dsibyte_map,
968 	.clkr.hw.init = &(struct clk_init_data){
969 		.name = "byte1_clk_src",
970 		.parent_data = mmcc_xo_dsibyte,
971 		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
972 		.ops = &clk_byte2_ops,
973 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
974 	},
975 };
976 
977 static const struct freq_tbl ftbl_mdss_esc0_1_clk[] = {
978 	F(19200000, P_XO, 1, 0, 0),
979 	{ }
980 };
981 
982 static struct clk_rcg2 esc0_clk_src = {
983 	.cmd_rcgr = 0x2160,
984 	.hid_width = 5,
985 	.parent_map = mmcc_xo_dsibyte_map,
986 	.freq_tbl = ftbl_mdss_esc0_1_clk,
987 	.clkr.hw.init = &(struct clk_init_data){
988 		.name = "esc0_clk_src",
989 		.parent_data = mmcc_xo_dsibyte,
990 		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
991 		.ops = &clk_rcg2_ops,
992 	},
993 };
994 
995 static struct clk_rcg2 esc1_clk_src = {
996 	.cmd_rcgr = 0x2180,
997 	.hid_width = 5,
998 	.parent_map = mmcc_xo_dsibyte_map,
999 	.freq_tbl = ftbl_mdss_esc0_1_clk,
1000 	.clkr.hw.init = &(struct clk_init_data){
1001 		.name = "esc1_clk_src",
1002 		.parent_data = mmcc_xo_dsibyte,
1003 		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
1004 		.ops = &clk_rcg2_ops,
1005 	},
1006 };
1007 
1008 static const struct freq_tbl extpclk_freq_tbl[] = {
1009 	{ .src = P_HDMIPLL },
1010 	{ }
1011 };
1012 
1013 static struct clk_rcg2 extpclk_clk_src = {
1014 	.cmd_rcgr = 0x2060,
1015 	.hid_width = 5,
1016 	.parent_map = mmss_xo_hdmi_map,
1017 	.freq_tbl = extpclk_freq_tbl,
1018 	.clkr.hw.init = &(struct clk_init_data){
1019 		.name = "extpclk_clk_src",
1020 		.parent_data = mmss_xo_hdmi,
1021 		.num_parents = ARRAY_SIZE(mmss_xo_hdmi),
1022 		.ops = &clk_rcg2_ops,
1023 		.flags = CLK_SET_RATE_PARENT,
1024 	},
1025 };
1026 
1027 static const struct freq_tbl ftbl_hdmi_clk_src[] = {
1028 	F(19200000, P_XO, 1, 0, 0),
1029 	{ }
1030 };
1031 
1032 static struct clk_rcg2 hdmi_clk_src = {
1033 	.cmd_rcgr = 0x2100,
1034 	.hid_width = 5,
1035 	.parent_map = mmcc_xo_gpll0_map,
1036 	.freq_tbl = ftbl_hdmi_clk_src,
1037 	.clkr.hw.init = &(struct clk_init_data){
1038 		.name = "hdmi_clk_src",
1039 		.parent_data = mmcc_xo_gpll0,
1040 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
1041 		.ops = &clk_rcg2_ops,
1042 	},
1043 };
1044 
1045 static const struct freq_tbl ftbl_mdss_vsync_clk[] = {
1046 	F(19200000, P_XO, 1, 0, 0),
1047 	{ }
1048 };
1049 
1050 static struct clk_rcg2 vsync_clk_src = {
1051 	.cmd_rcgr = 0x2080,
1052 	.hid_width = 5,
1053 	.parent_map = mmcc_xo_gpll0_map,
1054 	.freq_tbl = ftbl_mdss_vsync_clk,
1055 	.clkr.hw.init = &(struct clk_init_data){
1056 		.name = "vsync_clk_src",
1057 		.parent_data = mmcc_xo_gpll0,
1058 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
1059 		.ops = &clk_rcg2_ops,
1060 	},
1061 };
1062 
1063 static const struct freq_tbl ftbl_rbbmtimer_clk_src[] = {
1064 	F(19200000, P_XO, 1, 0, 0),
1065 	{ }
1066 };
1067 
1068 static struct clk_rcg2 rbbmtimer_clk_src = {
1069 	.cmd_rcgr = 0x4090,
1070 	.hid_width = 5,
1071 	.parent_map = mmcc_xo_gpll0_map,
1072 	.freq_tbl = ftbl_rbbmtimer_clk_src,
1073 	.clkr.hw.init = &(struct clk_init_data){
1074 		.name = "rbbmtimer_clk_src",
1075 		.parent_data = mmcc_xo_gpll0,
1076 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
1077 		.ops = &clk_rcg2_ops,
1078 	},
1079 };
1080 
1081 static struct clk_branch camss_ahb_clk = {
1082 	.halt_reg = 0x348c,
1083 	.clkr = {
1084 		.enable_reg = 0x348c,
1085 		.enable_mask = BIT(0),
1086 		.hw.init = &(struct clk_init_data){
1087 			.name = "camss_ahb_clk",
1088 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1089 			.num_parents = 1,
1090 			.flags = CLK_SET_RATE_PARENT,
1091 			.ops = &clk_branch2_ops,
1092 		},
1093 	},
1094 };
1095 
1096 static struct clk_branch camss_cci_cci_ahb_clk = {
1097 	.halt_reg = 0x3348,
1098 	.clkr = {
1099 		.enable_reg = 0x3348,
1100 		.enable_mask = BIT(0),
1101 		.hw.init = &(struct clk_init_data){
1102 			.name = "camss_cci_cci_ahb_clk",
1103 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1104 			.num_parents = 1,
1105 			.flags = CLK_SET_RATE_PARENT,
1106 			.ops = &clk_branch2_ops,
1107 		},
1108 	},
1109 };
1110 
1111 static struct clk_branch camss_cci_cci_clk = {
1112 	.halt_reg = 0x3344,
1113 	.clkr = {
1114 		.enable_reg = 0x3344,
1115 		.enable_mask = BIT(0),
1116 		.hw.init = &(struct clk_init_data){
1117 			.name = "camss_cci_cci_clk",
1118 			.parent_hws = (const struct clk_hw *[]){ &cci_clk_src.clkr.hw },
1119 			.num_parents = 1,
1120 			.ops = &clk_branch2_ops,
1121 		},
1122 	},
1123 };
1124 
1125 static struct clk_branch camss_vfe_cpp_ahb_clk = {
1126 	.halt_reg = 0x36b4,
1127 	.clkr = {
1128 		.enable_reg = 0x36b4,
1129 		.enable_mask = BIT(0),
1130 		.hw.init = &(struct clk_init_data){
1131 			.name = "camss_vfe_cpp_ahb_clk",
1132 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1133 			.num_parents = 1,
1134 			.flags = CLK_SET_RATE_PARENT,
1135 			.ops = &clk_branch2_ops,
1136 		},
1137 	},
1138 };
1139 
1140 static struct clk_branch camss_vfe_cpp_axi_clk = {
1141 	.halt_reg = 0x36c4,
1142 	.clkr = {
1143 		.enable_reg = 0x36c4,
1144 		.enable_mask = BIT(0),
1145 		.hw.init = &(struct clk_init_data){
1146 			.name = "camss_vfe_cpp_axi_clk",
1147 			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
1148 			.num_parents = 1,
1149 			.ops = &clk_branch2_ops,
1150 		},
1151 	},
1152 };
1153 
1154 static struct clk_branch camss_vfe_cpp_clk = {
1155 	.halt_reg = 0x36b0,
1156 	.clkr = {
1157 		.enable_reg = 0x36b0,
1158 		.enable_mask = BIT(0),
1159 		.hw.init = &(struct clk_init_data){
1160 			.name = "camss_vfe_cpp_clk",
1161 			.parent_hws = (const struct clk_hw *[]){ &cpp_clk_src.clkr.hw },
1162 			.num_parents = 1,
1163 			.ops = &clk_branch2_ops,
1164 		},
1165 	},
1166 };
1167 
1168 static struct clk_branch camss_csi0_ahb_clk = {
1169 	.halt_reg = 0x30bc,
1170 	.clkr = {
1171 		.enable_reg = 0x30bc,
1172 		.enable_mask = BIT(0),
1173 		.hw.init = &(struct clk_init_data){
1174 			.name = "camss_csi0_ahb_clk",
1175 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1176 			.num_parents = 1,
1177 			.flags = CLK_SET_RATE_PARENT,
1178 			.ops = &clk_branch2_ops,
1179 		},
1180 	},
1181 };
1182 
1183 static struct clk_branch camss_csi0_clk = {
1184 	.halt_reg = 0x30b4,
1185 	.clkr = {
1186 		.enable_reg = 0x30b4,
1187 		.enable_mask = BIT(0),
1188 		.hw.init = &(struct clk_init_data){
1189 			.name = "camss_csi0_clk",
1190 			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1191 			.num_parents = 1,
1192 			.ops = &clk_branch2_ops,
1193 		},
1194 	},
1195 };
1196 
1197 static struct clk_branch camss_csi0phy_clk = {
1198 	.halt_reg = 0x30c4,
1199 	.clkr = {
1200 		.enable_reg = 0x30c4,
1201 		.enable_mask = BIT(0),
1202 		.hw.init = &(struct clk_init_data){
1203 			.name = "camss_csi0phy_clk",
1204 			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1205 			.num_parents = 1,
1206 			.ops = &clk_branch2_ops,
1207 		},
1208 	},
1209 };
1210 
1211 static struct clk_branch camss_csi0pix_clk = {
1212 	.halt_reg = 0x30e4,
1213 	.clkr = {
1214 		.enable_reg = 0x30e4,
1215 		.enable_mask = BIT(0),
1216 		.hw.init = &(struct clk_init_data){
1217 			.name = "camss_csi0pix_clk",
1218 			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1219 			.num_parents = 1,
1220 			.ops = &clk_branch2_ops,
1221 		},
1222 	},
1223 };
1224 
1225 static struct clk_branch camss_csi0rdi_clk = {
1226 	.halt_reg = 0x30d4,
1227 	.clkr = {
1228 		.enable_reg = 0x30d4,
1229 		.enable_mask = BIT(0),
1230 		.hw.init = &(struct clk_init_data){
1231 			.name = "camss_csi0rdi_clk",
1232 			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1233 			.num_parents = 1,
1234 			.ops = &clk_branch2_ops,
1235 		},
1236 	},
1237 };
1238 
1239 static struct clk_branch camss_csi1_ahb_clk = {
1240 	.halt_reg = 0x3128,
1241 	.clkr = {
1242 		.enable_reg = 0x3128,
1243 		.enable_mask = BIT(0),
1244 		.hw.init = &(struct clk_init_data){
1245 			.name = "camss_csi1_ahb_clk",
1246 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1247 			.num_parents = 1,
1248 			.flags = CLK_SET_RATE_PARENT,
1249 			.ops = &clk_branch2_ops,
1250 		},
1251 	},
1252 };
1253 
1254 static struct clk_branch camss_csi1_clk = {
1255 	.halt_reg = 0x3124,
1256 	.clkr = {
1257 		.enable_reg = 0x3124,
1258 		.enable_mask = BIT(0),
1259 		.hw.init = &(struct clk_init_data){
1260 			.name = "camss_csi1_clk",
1261 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1262 			.num_parents = 1,
1263 			.ops = &clk_branch2_ops,
1264 		},
1265 	},
1266 };
1267 
1268 static struct clk_branch camss_csi1phy_clk = {
1269 	.halt_reg = 0x3134,
1270 	.clkr = {
1271 		.enable_reg = 0x3134,
1272 		.enable_mask = BIT(0),
1273 		.hw.init = &(struct clk_init_data){
1274 			.name = "camss_csi1phy_clk",
1275 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1276 			.num_parents = 1,
1277 			.ops = &clk_branch2_ops,
1278 		},
1279 	},
1280 };
1281 
1282 static struct clk_branch camss_csi1pix_clk = {
1283 	.halt_reg = 0x3154,
1284 	.clkr = {
1285 		.enable_reg = 0x3154,
1286 		.enable_mask = BIT(0),
1287 		.hw.init = &(struct clk_init_data){
1288 			.name = "camss_csi1pix_clk",
1289 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1290 			.num_parents = 1,
1291 			.ops = &clk_branch2_ops,
1292 		},
1293 	},
1294 };
1295 
1296 static struct clk_branch camss_csi1rdi_clk = {
1297 	.halt_reg = 0x3144,
1298 	.clkr = {
1299 		.enable_reg = 0x3144,
1300 		.enable_mask = BIT(0),
1301 		.hw.init = &(struct clk_init_data){
1302 			.name = "camss_csi1rdi_clk",
1303 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1304 			.num_parents = 1,
1305 			.ops = &clk_branch2_ops,
1306 		},
1307 	},
1308 };
1309 
1310 static struct clk_branch camss_csi2_ahb_clk = {
1311 	.halt_reg = 0x3188,
1312 	.clkr = {
1313 		.enable_reg = 0x3188,
1314 		.enable_mask = BIT(0),
1315 		.hw.init = &(struct clk_init_data){
1316 			.name = "camss_csi2_ahb_clk",
1317 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1318 			.num_parents = 1,
1319 			.flags = CLK_SET_RATE_PARENT,
1320 			.ops = &clk_branch2_ops,
1321 		},
1322 	},
1323 };
1324 
1325 static struct clk_branch camss_csi2_clk = {
1326 	.halt_reg = 0x3184,
1327 	.clkr = {
1328 		.enable_reg = 0x3184,
1329 		.enable_mask = BIT(0),
1330 		.hw.init = &(struct clk_init_data){
1331 			.name = "camss_csi2_clk",
1332 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1333 			.num_parents = 1,
1334 			.ops = &clk_branch2_ops,
1335 		},
1336 	},
1337 };
1338 
1339 static struct clk_branch camss_csi2phy_clk = {
1340 	.halt_reg = 0x3194,
1341 	.clkr = {
1342 		.enable_reg = 0x3194,
1343 		.enable_mask = BIT(0),
1344 		.hw.init = &(struct clk_init_data){
1345 			.name = "camss_csi2phy_clk",
1346 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1347 			.num_parents = 1,
1348 			.ops = &clk_branch2_ops,
1349 		},
1350 	},
1351 };
1352 
1353 static struct clk_branch camss_csi2pix_clk = {
1354 	.halt_reg = 0x31b4,
1355 	.clkr = {
1356 		.enable_reg = 0x31b4,
1357 		.enable_mask = BIT(0),
1358 		.hw.init = &(struct clk_init_data){
1359 			.name = "camss_csi2pix_clk",
1360 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1361 			.num_parents = 1,
1362 			.ops = &clk_branch2_ops,
1363 		},
1364 	},
1365 };
1366 
1367 static struct clk_branch camss_csi2rdi_clk = {
1368 	.halt_reg = 0x31a4,
1369 	.clkr = {
1370 		.enable_reg = 0x31a4,
1371 		.enable_mask = BIT(0),
1372 		.hw.init = &(struct clk_init_data){
1373 			.name = "camss_csi2rdi_clk",
1374 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1375 			.num_parents = 1,
1376 			.ops = &clk_branch2_ops,
1377 		},
1378 	},
1379 };
1380 
1381 static struct clk_branch camss_csi3_ahb_clk = {
1382 	.halt_reg = 0x31e8,
1383 	.clkr = {
1384 		.enable_reg = 0x31e8,
1385 		.enable_mask = BIT(0),
1386 		.hw.init = &(struct clk_init_data){
1387 			.name = "camss_csi3_ahb_clk",
1388 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1389 			.num_parents = 1,
1390 			.flags = CLK_SET_RATE_PARENT,
1391 			.ops = &clk_branch2_ops,
1392 		},
1393 	},
1394 };
1395 
1396 static struct clk_branch camss_csi3_clk = {
1397 	.halt_reg = 0x31e4,
1398 	.clkr = {
1399 		.enable_reg = 0x31e4,
1400 		.enable_mask = BIT(0),
1401 		.hw.init = &(struct clk_init_data){
1402 			.name = "camss_csi3_clk",
1403 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1404 			.num_parents = 1,
1405 			.ops = &clk_branch2_ops,
1406 		},
1407 	},
1408 };
1409 
1410 static struct clk_branch camss_csi3phy_clk = {
1411 	.halt_reg = 0x31f4,
1412 	.clkr = {
1413 		.enable_reg = 0x31f4,
1414 		.enable_mask = BIT(0),
1415 		.hw.init = &(struct clk_init_data){
1416 			.name = "camss_csi3phy_clk",
1417 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1418 			.num_parents = 1,
1419 			.ops = &clk_branch2_ops,
1420 		},
1421 	},
1422 };
1423 
1424 static struct clk_branch camss_csi3pix_clk = {
1425 	.halt_reg = 0x3214,
1426 	.clkr = {
1427 		.enable_reg = 0x3214,
1428 		.enable_mask = BIT(0),
1429 		.hw.init = &(struct clk_init_data){
1430 			.name = "camss_csi3pix_clk",
1431 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1432 			.num_parents = 1,
1433 			.ops = &clk_branch2_ops,
1434 		},
1435 	},
1436 };
1437 
1438 static struct clk_branch camss_csi3rdi_clk = {
1439 	.halt_reg = 0x3204,
1440 	.clkr = {
1441 		.enable_reg = 0x3204,
1442 		.enable_mask = BIT(0),
1443 		.hw.init = &(struct clk_init_data){
1444 			.name = "camss_csi3rdi_clk",
1445 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1446 			.num_parents = 1,
1447 			.ops = &clk_branch2_ops,
1448 		},
1449 	},
1450 };
1451 
1452 static struct clk_branch camss_csi_vfe0_clk = {
1453 	.halt_reg = 0x3704,
1454 	.clkr = {
1455 		.enable_reg = 0x3704,
1456 		.enable_mask = BIT(0),
1457 		.hw.init = &(struct clk_init_data){
1458 			.name = "camss_csi_vfe0_clk",
1459 			.parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1460 			.num_parents = 1,
1461 			.ops = &clk_branch2_ops,
1462 		},
1463 	},
1464 };
1465 
1466 static struct clk_branch camss_csi_vfe1_clk = {
1467 	.halt_reg = 0x3714,
1468 	.clkr = {
1469 		.enable_reg = 0x3714,
1470 		.enable_mask = BIT(0),
1471 		.hw.init = &(struct clk_init_data){
1472 			.name = "camss_csi_vfe1_clk",
1473 			.parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1474 			.num_parents = 1,
1475 			.ops = &clk_branch2_ops,
1476 		},
1477 	},
1478 };
1479 
1480 static struct clk_branch camss_gp0_clk = {
1481 	.halt_reg = 0x3444,
1482 	.clkr = {
1483 		.enable_reg = 0x3444,
1484 		.enable_mask = BIT(0),
1485 		.hw.init = &(struct clk_init_data){
1486 			.name = "camss_gp0_clk",
1487 			.parent_hws = (const struct clk_hw *[]){ &mmss_gp0_clk_src.clkr.hw },
1488 			.num_parents = 1,
1489 			.ops = &clk_branch2_ops,
1490 		},
1491 	},
1492 };
1493 
1494 static struct clk_branch camss_gp1_clk = {
1495 	.halt_reg = 0x3474,
1496 	.clkr = {
1497 		.enable_reg = 0x3474,
1498 		.enable_mask = BIT(0),
1499 		.hw.init = &(struct clk_init_data){
1500 			.name = "camss_gp1_clk",
1501 			.parent_hws = (const struct clk_hw *[]){ &mmss_gp1_clk_src.clkr.hw },
1502 			.num_parents = 1,
1503 			.ops = &clk_branch2_ops,
1504 		},
1505 	},
1506 };
1507 
1508 static struct clk_branch camss_ispif_ahb_clk = {
1509 	.halt_reg = 0x3224,
1510 	.clkr = {
1511 		.enable_reg = 0x3224,
1512 		.enable_mask = BIT(0),
1513 		.hw.init = &(struct clk_init_data){
1514 			.name = "camss_ispif_ahb_clk",
1515 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1516 			.num_parents = 1,
1517 			.flags = CLK_SET_RATE_PARENT,
1518 			.ops = &clk_branch2_ops,
1519 		},
1520 	},
1521 };
1522 
1523 static struct clk_branch camss_jpeg_dma_clk = {
1524 	.halt_reg = 0x35c0,
1525 	.clkr = {
1526 		.enable_reg = 0x35c0,
1527 		.enable_mask = BIT(0),
1528 		.hw.init = &(struct clk_init_data){
1529 			.name = "camss_jpeg_dma_clk",
1530 			.parent_hws = (const struct clk_hw *[]){ &jpeg_dma_clk_src.clkr.hw },
1531 			.num_parents = 1,
1532 			.ops = &clk_branch2_ops,
1533 		},
1534 	},
1535 };
1536 
1537 static struct clk_branch camss_jpeg_jpeg0_clk = {
1538 	.halt_reg = 0x35a8,
1539 	.clkr = {
1540 		.enable_reg = 0x35a8,
1541 		.enable_mask = BIT(0),
1542 		.hw.init = &(struct clk_init_data){
1543 			.name = "camss_jpeg_jpeg0_clk",
1544 			.parent_hws = (const struct clk_hw *[]){ &jpeg0_clk_src.clkr.hw },
1545 			.num_parents = 1,
1546 			.ops = &clk_branch2_ops,
1547 		},
1548 	},
1549 };
1550 
1551 static struct clk_branch camss_jpeg_jpeg1_clk = {
1552 	.halt_reg = 0x35ac,
1553 	.clkr = {
1554 		.enable_reg = 0x35ac,
1555 		.enable_mask = BIT(0),
1556 		.hw.init = &(struct clk_init_data){
1557 			.name = "camss_jpeg_jpeg1_clk",
1558 			.parent_hws = (const struct clk_hw *[]){ &jpeg1_clk_src.clkr.hw },
1559 			.num_parents = 1,
1560 			.ops = &clk_branch2_ops,
1561 		},
1562 	},
1563 };
1564 
1565 static struct clk_branch camss_jpeg_jpeg2_clk = {
1566 	.halt_reg = 0x35b0,
1567 	.clkr = {
1568 		.enable_reg = 0x35b0,
1569 		.enable_mask = BIT(0),
1570 		.hw.init = &(struct clk_init_data){
1571 			.name = "camss_jpeg_jpeg2_clk",
1572 			.parent_hws = (const struct clk_hw *[]){ &jpeg2_clk_src.clkr.hw },
1573 			.num_parents = 1,
1574 			.ops = &clk_branch2_ops,
1575 		},
1576 	},
1577 };
1578 
1579 static struct clk_branch camss_jpeg_jpeg_ahb_clk = {
1580 	.halt_reg = 0x35b4,
1581 	.clkr = {
1582 		.enable_reg = 0x35b4,
1583 		.enable_mask = BIT(0),
1584 		.hw.init = &(struct clk_init_data){
1585 			.name = "camss_jpeg_jpeg_ahb_clk",
1586 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1587 			.num_parents = 1,
1588 			.flags = CLK_SET_RATE_PARENT,
1589 			.ops = &clk_branch2_ops,
1590 		},
1591 	},
1592 };
1593 
1594 static struct clk_branch camss_jpeg_jpeg_axi_clk = {
1595 	.halt_reg = 0x35b8,
1596 	.clkr = {
1597 		.enable_reg = 0x35b8,
1598 		.enable_mask = BIT(0),
1599 		.hw.init = &(struct clk_init_data){
1600 			.name = "camss_jpeg_jpeg_axi_clk",
1601 			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
1602 			.num_parents = 1,
1603 			.ops = &clk_branch2_ops,
1604 		},
1605 	},
1606 };
1607 
1608 static struct clk_branch camss_mclk0_clk = {
1609 	.halt_reg = 0x3384,
1610 	.clkr = {
1611 		.enable_reg = 0x3384,
1612 		.enable_mask = BIT(0),
1613 		.hw.init = &(struct clk_init_data){
1614 			.name = "camss_mclk0_clk",
1615 			.parent_hws = (const struct clk_hw *[]){ &mclk0_clk_src.clkr.hw },
1616 			.num_parents = 1,
1617 			.ops = &clk_branch2_ops,
1618 		},
1619 	},
1620 };
1621 
1622 static struct clk_branch camss_mclk1_clk = {
1623 	.halt_reg = 0x33b4,
1624 	.clkr = {
1625 		.enable_reg = 0x33b4,
1626 		.enable_mask = BIT(0),
1627 		.hw.init = &(struct clk_init_data){
1628 			.name = "camss_mclk1_clk",
1629 			.parent_hws = (const struct clk_hw *[]){ &mclk1_clk_src.clkr.hw },
1630 			.num_parents = 1,
1631 			.ops = &clk_branch2_ops,
1632 		},
1633 	},
1634 };
1635 
1636 static struct clk_branch camss_mclk2_clk = {
1637 	.halt_reg = 0x33e4,
1638 	.clkr = {
1639 		.enable_reg = 0x33e4,
1640 		.enable_mask = BIT(0),
1641 		.hw.init = &(struct clk_init_data){
1642 			.name = "camss_mclk2_clk",
1643 			.parent_hws = (const struct clk_hw *[]){ &mclk2_clk_src.clkr.hw },
1644 			.num_parents = 1,
1645 			.ops = &clk_branch2_ops,
1646 		},
1647 	},
1648 };
1649 
1650 static struct clk_branch camss_mclk3_clk = {
1651 	.halt_reg = 0x3414,
1652 	.clkr = {
1653 		.enable_reg = 0x3414,
1654 		.enable_mask = BIT(0),
1655 		.hw.init = &(struct clk_init_data){
1656 			.name = "camss_mclk3_clk",
1657 			.parent_hws = (const struct clk_hw *[]){ &mclk3_clk_src.clkr.hw },
1658 			.num_parents = 1,
1659 			.ops = &clk_branch2_ops,
1660 		},
1661 	},
1662 };
1663 
1664 static struct clk_branch camss_micro_ahb_clk = {
1665 	.halt_reg = 0x3494,
1666 	.clkr = {
1667 		.enable_reg = 0x3494,
1668 		.enable_mask = BIT(0),
1669 		.hw.init = &(struct clk_init_data){
1670 			.name = "camss_micro_ahb_clk",
1671 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1672 			.num_parents = 1,
1673 			.flags = CLK_SET_RATE_PARENT,
1674 			.ops = &clk_branch2_ops,
1675 		},
1676 	},
1677 };
1678 
1679 static struct clk_branch camss_phy0_csi0phytimer_clk = {
1680 	.halt_reg = 0x3024,
1681 	.clkr = {
1682 		.enable_reg = 0x3024,
1683 		.enable_mask = BIT(0),
1684 		.hw.init = &(struct clk_init_data){
1685 			.name = "camss_phy0_csi0phytimer_clk",
1686 			.parent_hws = (const struct clk_hw *[]){ &csi0phytimer_clk_src.clkr.hw },
1687 			.num_parents = 1,
1688 			.ops = &clk_branch2_ops,
1689 		},
1690 	},
1691 };
1692 
1693 static struct clk_branch camss_phy1_csi1phytimer_clk = {
1694 	.halt_reg = 0x3054,
1695 	.clkr = {
1696 		.enable_reg = 0x3054,
1697 		.enable_mask = BIT(0),
1698 		.hw.init = &(struct clk_init_data){
1699 			.name = "camss_phy1_csi1phytimer_clk",
1700 			.parent_hws = (const struct clk_hw *[]){ &csi1phytimer_clk_src.clkr.hw },
1701 			.num_parents = 1,
1702 			.ops = &clk_branch2_ops,
1703 		},
1704 	},
1705 };
1706 
1707 static struct clk_branch camss_phy2_csi2phytimer_clk = {
1708 	.halt_reg = 0x3084,
1709 	.clkr = {
1710 		.enable_reg = 0x3084,
1711 		.enable_mask = BIT(0),
1712 		.hw.init = &(struct clk_init_data){
1713 			.name = "camss_phy2_csi2phytimer_clk",
1714 			.parent_hws = (const struct clk_hw *[]){ &csi2phytimer_clk_src.clkr.hw },
1715 			.num_parents = 1,
1716 			.ops = &clk_branch2_ops,
1717 		},
1718 	},
1719 };
1720 
1721 static struct clk_branch camss_top_ahb_clk = {
1722 	.halt_reg = 0x3484,
1723 	.clkr = {
1724 		.enable_reg = 0x3484,
1725 		.enable_mask = BIT(0),
1726 		.hw.init = &(struct clk_init_data){
1727 			.name = "camss_top_ahb_clk",
1728 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1729 			.num_parents = 1,
1730 			.flags = CLK_SET_RATE_PARENT,
1731 			.ops = &clk_branch2_ops,
1732 		},
1733 	},
1734 };
1735 
1736 static struct clk_branch camss_vfe_vfe0_clk = {
1737 	.halt_reg = 0x36a8,
1738 	.clkr = {
1739 		.enable_reg = 0x36a8,
1740 		.enable_mask = BIT(0),
1741 		.hw.init = &(struct clk_init_data){
1742 			.name = "camss_vfe_vfe0_clk",
1743 			.parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1744 			.num_parents = 1,
1745 			.ops = &clk_branch2_ops,
1746 		},
1747 	},
1748 };
1749 
1750 static struct clk_branch camss_vfe_vfe1_clk = {
1751 	.halt_reg = 0x36ac,
1752 	.clkr = {
1753 		.enable_reg = 0x36ac,
1754 		.enable_mask = BIT(0),
1755 		.hw.init = &(struct clk_init_data){
1756 			.name = "camss_vfe_vfe1_clk",
1757 			.parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1758 			.num_parents = 1,
1759 			.ops = &clk_branch2_ops,
1760 		},
1761 	},
1762 };
1763 
1764 static struct clk_branch camss_vfe_vfe_ahb_clk = {
1765 	.halt_reg = 0x36b8,
1766 	.clkr = {
1767 		.enable_reg = 0x36b8,
1768 		.enable_mask = BIT(0),
1769 		.hw.init = &(struct clk_init_data){
1770 			.name = "camss_vfe_vfe_ahb_clk",
1771 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1772 			.num_parents = 1,
1773 			.flags = CLK_SET_RATE_PARENT,
1774 			.ops = &clk_branch2_ops,
1775 		},
1776 	},
1777 };
1778 
1779 static struct clk_branch camss_vfe_vfe_axi_clk = {
1780 	.halt_reg = 0x36bc,
1781 	.clkr = {
1782 		.enable_reg = 0x36bc,
1783 		.enable_mask = BIT(0),
1784 		.hw.init = &(struct clk_init_data){
1785 			.name = "camss_vfe_vfe_axi_clk",
1786 			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
1787 			.num_parents = 1,
1788 			.ops = &clk_branch2_ops,
1789 		},
1790 	},
1791 };
1792 
1793 static struct clk_branch fd_ahb_clk = {
1794 	.halt_reg = 0x3b74,
1795 	.clkr = {
1796 		.enable_reg = 0x3b74,
1797 		.enable_mask = BIT(0),
1798 		.hw.init = &(struct clk_init_data){
1799 			.name = "fd_ahb_clk",
1800 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1801 			.num_parents = 1,
1802 			.ops = &clk_branch2_ops,
1803 		},
1804 	},
1805 };
1806 
1807 static struct clk_branch fd_axi_clk = {
1808 	.halt_reg = 0x3b70,
1809 	.clkr = {
1810 		.enable_reg = 0x3b70,
1811 		.enable_mask = BIT(0),
1812 		.hw.init = &(struct clk_init_data){
1813 			.name = "fd_axi_clk",
1814 			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
1815 			.num_parents = 1,
1816 			.ops = &clk_branch2_ops,
1817 		},
1818 	},
1819 };
1820 
1821 static struct clk_branch fd_core_clk = {
1822 	.halt_reg = 0x3b68,
1823 	.clkr = {
1824 		.enable_reg = 0x3b68,
1825 		.enable_mask = BIT(0),
1826 		.hw.init = &(struct clk_init_data){
1827 			.name = "fd_core_clk",
1828 			.parent_hws = (const struct clk_hw *[]){ &fd_core_clk_src.clkr.hw },
1829 			.num_parents = 1,
1830 			.ops = &clk_branch2_ops,
1831 		},
1832 	},
1833 };
1834 
1835 static struct clk_branch fd_core_uar_clk = {
1836 	.halt_reg = 0x3b6c,
1837 	.clkr = {
1838 		.enable_reg = 0x3b6c,
1839 		.enable_mask = BIT(0),
1840 		.hw.init = &(struct clk_init_data){
1841 			.name = "fd_core_uar_clk",
1842 			.parent_hws = (const struct clk_hw *[]){ &fd_core_clk_src.clkr.hw },
1843 			.num_parents = 1,
1844 			.ops = &clk_branch2_ops,
1845 		},
1846 	},
1847 };
1848 
1849 static struct clk_branch mdss_ahb_clk = {
1850 	.halt_reg = 0x2308,
1851 	.halt_check = BRANCH_HALT,
1852 	.clkr = {
1853 		.enable_reg = 0x2308,
1854 		.enable_mask = BIT(0),
1855 		.hw.init = &(struct clk_init_data){
1856 			.name = "mdss_ahb_clk",
1857 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1858 			.num_parents = 1,
1859 			.flags = CLK_SET_RATE_PARENT,
1860 			.ops = &clk_branch2_ops,
1861 		},
1862 	},
1863 };
1864 
1865 static struct clk_branch mdss_axi_clk = {
1866 	.halt_reg = 0x2310,
1867 	.clkr = {
1868 		.enable_reg = 0x2310,
1869 		.enable_mask = BIT(0),
1870 		.hw.init = &(struct clk_init_data){
1871 			.name = "mdss_axi_clk",
1872 			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
1873 			.num_parents = 1,
1874 			.flags = CLK_SET_RATE_PARENT,
1875 			.ops = &clk_branch2_ops,
1876 		},
1877 	},
1878 };
1879 
1880 static struct clk_branch mdss_byte0_clk = {
1881 	.halt_reg = 0x233c,
1882 	.clkr = {
1883 		.enable_reg = 0x233c,
1884 		.enable_mask = BIT(0),
1885 		.hw.init = &(struct clk_init_data){
1886 			.name = "mdss_byte0_clk",
1887 			.parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
1888 			.num_parents = 1,
1889 			.flags = CLK_SET_RATE_PARENT,
1890 			.ops = &clk_branch2_ops,
1891 		},
1892 	},
1893 };
1894 
1895 static struct clk_branch mdss_byte1_clk = {
1896 	.halt_reg = 0x2340,
1897 	.clkr = {
1898 		.enable_reg = 0x2340,
1899 		.enable_mask = BIT(0),
1900 		.hw.init = &(struct clk_init_data){
1901 			.name = "mdss_byte1_clk",
1902 			.parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
1903 			.num_parents = 1,
1904 			.flags = CLK_SET_RATE_PARENT,
1905 			.ops = &clk_branch2_ops,
1906 		},
1907 	},
1908 };
1909 
1910 static struct clk_branch mdss_esc0_clk = {
1911 	.halt_reg = 0x2344,
1912 	.clkr = {
1913 		.enable_reg = 0x2344,
1914 		.enable_mask = BIT(0),
1915 		.hw.init = &(struct clk_init_data){
1916 			.name = "mdss_esc0_clk",
1917 			.parent_hws = (const struct clk_hw *[]){ &esc0_clk_src.clkr.hw },
1918 			.num_parents = 1,
1919 			.flags = CLK_SET_RATE_PARENT,
1920 			.ops = &clk_branch2_ops,
1921 		},
1922 	},
1923 };
1924 
1925 static struct clk_branch mdss_esc1_clk = {
1926 	.halt_reg = 0x2348,
1927 	.clkr = {
1928 		.enable_reg = 0x2348,
1929 		.enable_mask = BIT(0),
1930 		.hw.init = &(struct clk_init_data){
1931 			.name = "mdss_esc1_clk",
1932 			.parent_hws = (const struct clk_hw *[]){ &esc1_clk_src.clkr.hw },
1933 			.num_parents = 1,
1934 			.flags = CLK_SET_RATE_PARENT,
1935 			.ops = &clk_branch2_ops,
1936 		},
1937 	},
1938 };
1939 
1940 static struct clk_branch mdss_extpclk_clk = {
1941 	.halt_reg = 0x2324,
1942 	.clkr = {
1943 		.enable_reg = 0x2324,
1944 		.enable_mask = BIT(0),
1945 		.hw.init = &(struct clk_init_data){
1946 			.name = "mdss_extpclk_clk",
1947 			.parent_hws = (const struct clk_hw *[]){ &extpclk_clk_src.clkr.hw },
1948 			.num_parents = 1,
1949 			.flags = CLK_SET_RATE_PARENT,
1950 			.ops = &clk_branch2_ops,
1951 		},
1952 	},
1953 };
1954 
1955 static struct clk_branch mdss_hdmi_ahb_clk = {
1956 	.halt_reg = 0x230c,
1957 	.clkr = {
1958 		.enable_reg = 0x230c,
1959 		.enable_mask = BIT(0),
1960 		.hw.init = &(struct clk_init_data){
1961 			.name = "mdss_hdmi_ahb_clk",
1962 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1963 			.num_parents = 1,
1964 			.flags = CLK_SET_RATE_PARENT,
1965 			.ops = &clk_branch2_ops,
1966 		},
1967 	},
1968 };
1969 
1970 static struct clk_branch mdss_hdmi_clk = {
1971 	.halt_reg = 0x2338,
1972 	.clkr = {
1973 		.enable_reg = 0x2338,
1974 		.enable_mask = BIT(0),
1975 		.hw.init = &(struct clk_init_data){
1976 			.name = "mdss_hdmi_clk",
1977 			.parent_hws = (const struct clk_hw *[]){ &hdmi_clk_src.clkr.hw },
1978 			.num_parents = 1,
1979 			.flags = CLK_SET_RATE_PARENT,
1980 			.ops = &clk_branch2_ops,
1981 		},
1982 	},
1983 };
1984 
1985 static struct clk_branch mdss_mdp_clk = {
1986 	.halt_reg = 0x231c,
1987 	.clkr = {
1988 		.enable_reg = 0x231c,
1989 		.enable_mask = BIT(0),
1990 		.hw.init = &(struct clk_init_data){
1991 			.name = "mdss_mdp_clk",
1992 			.parent_hws = (const struct clk_hw *[]){ &mdp_clk_src.clkr.hw },
1993 			.num_parents = 1,
1994 			.flags = CLK_SET_RATE_PARENT,
1995 			.ops = &clk_branch2_ops,
1996 		},
1997 	},
1998 };
1999 
2000 static struct clk_branch mdss_pclk0_clk = {
2001 	.halt_reg = 0x2314,
2002 	.clkr = {
2003 		.enable_reg = 0x2314,
2004 		.enable_mask = BIT(0),
2005 		.hw.init = &(struct clk_init_data){
2006 			.name = "mdss_pclk0_clk",
2007 			.parent_hws = (const struct clk_hw *[]){ &pclk0_clk_src.clkr.hw },
2008 			.num_parents = 1,
2009 			.flags = CLK_SET_RATE_PARENT,
2010 			.ops = &clk_branch2_ops,
2011 		},
2012 	},
2013 };
2014 
2015 static struct clk_branch mdss_pclk1_clk = {
2016 	.halt_reg = 0x2318,
2017 	.clkr = {
2018 		.enable_reg = 0x2318,
2019 		.enable_mask = BIT(0),
2020 		.hw.init = &(struct clk_init_data){
2021 			.name = "mdss_pclk1_clk",
2022 			.parent_hws = (const struct clk_hw *[]){ &pclk1_clk_src.clkr.hw },
2023 			.num_parents = 1,
2024 			.flags = CLK_SET_RATE_PARENT,
2025 			.ops = &clk_branch2_ops,
2026 		},
2027 	},
2028 };
2029 
2030 static struct clk_branch mdss_vsync_clk = {
2031 	.halt_reg = 0x2328,
2032 	.clkr = {
2033 		.enable_reg = 0x2328,
2034 		.enable_mask = BIT(0),
2035 		.hw.init = &(struct clk_init_data){
2036 			.name = "mdss_vsync_clk",
2037 			.parent_hws = (const struct clk_hw *[]){ &vsync_clk_src.clkr.hw },
2038 			.num_parents = 1,
2039 			.flags = CLK_SET_RATE_PARENT,
2040 			.ops = &clk_branch2_ops,
2041 		},
2042 	},
2043 };
2044 
2045 static struct clk_branch mmss_misc_ahb_clk = {
2046 	.halt_reg = 0x502c,
2047 	.clkr = {
2048 		.enable_reg = 0x502c,
2049 		.enable_mask = BIT(0),
2050 		.hw.init = &(struct clk_init_data){
2051 			.name = "mmss_misc_ahb_clk",
2052 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2053 			.num_parents = 1,
2054 			.flags = CLK_SET_RATE_PARENT,
2055 			.ops = &clk_branch2_ops,
2056 		},
2057 	},
2058 };
2059 
2060 static struct clk_branch mmss_mmssnoc_axi_clk = {
2061 	.halt_reg = 0x506c,
2062 	.clkr = {
2063 		.enable_reg = 0x506c,
2064 		.enable_mask = BIT(0),
2065 		.hw.init = &(struct clk_init_data){
2066 			.name = "mmss_mmssnoc_axi_clk",
2067 			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
2068 			.num_parents = 1,
2069 			/* Gating this clock will wreck havoc among MMSS! */
2070 			.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
2071 			.ops = &clk_branch2_ops,
2072 		},
2073 	},
2074 };
2075 
2076 static struct clk_branch mmss_s0_axi_clk = {
2077 	.halt_reg = 0x5064,
2078 	.clkr = {
2079 		.enable_reg = 0x5064,
2080 		.enable_mask = BIT(0),
2081 		.hw.init = &(struct clk_init_data){
2082 			.name = "mmss_s0_axi_clk",
2083 			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw, },
2084 			.num_parents = 1,
2085 			.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2086 			.ops = &clk_branch2_ops,
2087 		},
2088 	},
2089 };
2090 
2091 static struct clk_branch ocmemcx_ocmemnoc_clk = {
2092 	.halt_reg = 0x4058,
2093 	.clkr = {
2094 		.enable_reg = 0x4058,
2095 		.enable_mask = BIT(0),
2096 		.hw.init = &(struct clk_init_data){
2097 			.name = "ocmemcx_ocmemnoc_clk",
2098 			.parent_hws = (const struct clk_hw *[]){ &ocmemnoc_clk_src.clkr.hw },
2099 			.num_parents = 1,
2100 			.flags = CLK_SET_RATE_PARENT,
2101 			.ops = &clk_branch2_ops,
2102 		},
2103 	},
2104 };
2105 
2106 static struct clk_branch oxili_gfx3d_clk = {
2107 	.halt_reg = 0x4028,
2108 	.clkr = {
2109 		.enable_reg = 0x4028,
2110 		.enable_mask = BIT(0),
2111 		.hw.init = &(struct clk_init_data){
2112 			.name = "oxili_gfx3d_clk",
2113 			.parent_data = &(const struct clk_parent_data){
2114 				.fw_name = "oxili_gfx3d_clk_src",
2115 				.name = "oxili_gfx3d_clk_src"
2116 			},
2117 			.num_parents = 1,
2118 			.flags = CLK_SET_RATE_PARENT,
2119 			.ops = &clk_branch2_ops,
2120 		},
2121 	},
2122 };
2123 
2124 static struct clk_branch oxili_rbbmtimer_clk = {
2125 	.halt_reg = 0x40b0,
2126 	.clkr = {
2127 		.enable_reg = 0x40b0,
2128 		.enable_mask = BIT(0),
2129 		.hw.init = &(struct clk_init_data){
2130 			.name = "oxili_rbbmtimer_clk",
2131 			.parent_hws = (const struct clk_hw *[]){ &rbbmtimer_clk_src.clkr.hw },
2132 			.num_parents = 1,
2133 			.flags = CLK_SET_RATE_PARENT,
2134 			.ops = &clk_branch2_ops,
2135 		},
2136 	},
2137 };
2138 
2139 static struct clk_branch oxilicx_ahb_clk = {
2140 	.halt_reg = 0x403c,
2141 	.clkr = {
2142 		.enable_reg = 0x403c,
2143 		.enable_mask = BIT(0),
2144 		.hw.init = &(struct clk_init_data){
2145 			.name = "oxilicx_ahb_clk",
2146 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2147 			.num_parents = 1,
2148 			.flags = CLK_SET_RATE_PARENT,
2149 			.ops = &clk_branch2_ops,
2150 		},
2151 	},
2152 };
2153 
2154 static struct clk_branch venus0_ahb_clk = {
2155 	.halt_reg = 0x1030,
2156 	.clkr = {
2157 		.enable_reg = 0x1030,
2158 		.enable_mask = BIT(0),
2159 		.hw.init = &(struct clk_init_data){
2160 			.name = "venus0_ahb_clk",
2161 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2162 			.num_parents = 1,
2163 			.flags = CLK_SET_RATE_PARENT,
2164 			.ops = &clk_branch2_ops,
2165 		},
2166 	},
2167 };
2168 
2169 static struct clk_branch venus0_axi_clk = {
2170 	.halt_reg = 0x1034,
2171 	.clkr = {
2172 		.enable_reg = 0x1034,
2173 		.enable_mask = BIT(0),
2174 		.hw.init = &(struct clk_init_data){
2175 			.name = "venus0_axi_clk",
2176 			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
2177 			.num_parents = 1,
2178 			.ops = &clk_branch2_ops,
2179 		},
2180 	},
2181 };
2182 
2183 static struct clk_branch venus0_ocmemnoc_clk = {
2184 	.halt_reg = 0x1038,
2185 	.clkr = {
2186 		.enable_reg = 0x1038,
2187 		.enable_mask = BIT(0),
2188 		.hw.init = &(struct clk_init_data){
2189 			.name = "venus0_ocmemnoc_clk",
2190 			.parent_hws = (const struct clk_hw *[]){ &ocmemnoc_clk_src.clkr.hw },
2191 			.num_parents = 1,
2192 			.flags = CLK_SET_RATE_PARENT,
2193 			.ops = &clk_branch2_ops,
2194 		},
2195 	},
2196 };
2197 
2198 static struct clk_branch venus0_vcodec0_clk = {
2199 	.halt_reg = 0x1028,
2200 	.clkr = {
2201 		.enable_reg = 0x1028,
2202 		.enable_mask = BIT(0),
2203 		.hw.init = &(struct clk_init_data){
2204 			.name = "venus0_vcodec0_clk",
2205 			.parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
2206 			.num_parents = 1,
2207 			.flags = CLK_SET_RATE_PARENT,
2208 			.ops = &clk_branch2_ops,
2209 		},
2210 	},
2211 };
2212 
2213 static struct clk_branch venus0_core0_vcodec_clk = {
2214 	.halt_reg = 0x1048,
2215 	.clkr = {
2216 		.enable_reg = 0x1048,
2217 		.enable_mask = BIT(0),
2218 		.hw.init = &(struct clk_init_data){
2219 			.name = "venus0_core0_vcodec_clk",
2220 			.parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
2221 			.num_parents = 1,
2222 			.flags = CLK_SET_RATE_PARENT,
2223 			.ops = &clk_branch2_ops,
2224 		},
2225 	},
2226 };
2227 
2228 static struct clk_branch venus0_core1_vcodec_clk = {
2229 	.halt_reg = 0x104c,
2230 	.clkr = {
2231 		.enable_reg = 0x104c,
2232 		.enable_mask = BIT(0),
2233 		.hw.init = &(struct clk_init_data){
2234 			.name = "venus0_core1_vcodec_clk",
2235 			.parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
2236 			.num_parents = 1,
2237 			.flags = CLK_SET_RATE_PARENT,
2238 			.ops = &clk_branch2_ops,
2239 		},
2240 	},
2241 };
2242 
2243 static struct clk_branch venus0_core2_vcodec_clk = {
2244 	.halt_reg = 0x1054,
2245 	.clkr = {
2246 		.enable_reg = 0x1054,
2247 		.enable_mask = BIT(0),
2248 		.hw.init = &(struct clk_init_data){
2249 			.name = "venus0_core2_vcodec_clk",
2250 			.parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
2251 			.num_parents = 1,
2252 			.flags = CLK_SET_RATE_PARENT,
2253 			.ops = &clk_branch2_ops,
2254 		},
2255 	},
2256 };
2257 
2258 static struct gdsc venus_gdsc = {
2259 	.gdscr = 0x1024,
2260 	.cxcs = (unsigned int []){ 0x1038, 0x1034, 0x1048 },
2261 	.cxc_count = 3,
2262 	.pd = {
2263 		.name = "venus_gdsc",
2264 	},
2265 	.pwrsts = PWRSTS_OFF_ON,
2266 };
2267 
2268 static struct gdsc venus_core0_gdsc = {
2269 	.gdscr = 0x1040,
2270 	.cxcs = (unsigned int []){ 0x1048 },
2271 	.cxc_count = 1,
2272 	.pd = {
2273 		.name = "venus_core0_gdsc",
2274 	},
2275 	.pwrsts = PWRSTS_OFF_ON,
2276 	.flags = HW_CTRL,
2277 };
2278 
2279 static struct gdsc venus_core1_gdsc = {
2280 	.gdscr = 0x1044,
2281 	.cxcs = (unsigned int []){ 0x104c },
2282 	.cxc_count = 1,
2283 	.pd = {
2284 	.name = "venus_core1_gdsc",
2285 	},
2286 	.pwrsts = PWRSTS_OFF_ON,
2287 	.flags = HW_CTRL,
2288 };
2289 
2290 static struct gdsc venus_core2_gdsc = {
2291 	.gdscr = 0x1050,
2292 	.cxcs = (unsigned int []){ 0x1054 },
2293 	.cxc_count = 1,
2294 	.pd = {
2295 		.name = "venus_core2_gdsc",
2296 	},
2297 	.pwrsts = PWRSTS_OFF_ON,
2298 	.flags = HW_CTRL,
2299 };
2300 
2301 static struct gdsc mdss_gdsc = {
2302 	.gdscr = 0x2304,
2303 	.cxcs = (unsigned int []){ 0x2310, 0x231c },
2304 	.cxc_count = 2,
2305 	.pd = {
2306 		.name = "mdss_gdsc",
2307 	},
2308 	.pwrsts = PWRSTS_OFF_ON,
2309 };
2310 
2311 static struct gdsc camss_top_gdsc = {
2312 	.gdscr = 0x34a0,
2313 	.cxcs = (unsigned int []){ 0x3704, 0x3714, 0x3494 },
2314 	.cxc_count = 3,
2315 	.pd = {
2316 		.name = "camss_top_gdsc",
2317 	},
2318 	.pwrsts = PWRSTS_OFF_ON,
2319 };
2320 
2321 static struct gdsc jpeg_gdsc = {
2322 	.gdscr = 0x35a4,
2323 	.cxcs = (unsigned int []){ 0x35a8 },
2324 	.cxc_count = 1,
2325 	.pd = {
2326 		.name = "jpeg_gdsc",
2327 	},
2328 	.parent = &camss_top_gdsc.pd,
2329 	.pwrsts = PWRSTS_OFF_ON,
2330 };
2331 
2332 static struct gdsc vfe_gdsc = {
2333 	.gdscr = 0x36a4,
2334 	.cxcs = (unsigned int []){ 0x36bc },
2335 	.cxc_count = 1,
2336 	.pd = {
2337 		.name = "vfe_gdsc",
2338 	},
2339 	.parent = &camss_top_gdsc.pd,
2340 	.pwrsts = PWRSTS_OFF_ON,
2341 };
2342 
2343 static struct gdsc cpp_gdsc = {
2344 	.gdscr = 0x36d4,
2345 	.cxcs = (unsigned int []){ 0x36c4, 0x36b0 },
2346 	.cxc_count = 2,
2347 	.pd = {
2348 		.name = "cpp_gdsc",
2349 	},
2350 	.parent = &camss_top_gdsc.pd,
2351 	.pwrsts = PWRSTS_OFF_ON,
2352 };
2353 
2354 static struct gdsc fd_gdsc = {
2355 	.gdscr = 0x3b64,
2356 	.cxcs = (unsigned int []){ 0x3b70, 0x3b68 },
2357 	.pd = {
2358 		.name = "fd_gdsc",
2359 	},
2360 	.pwrsts = PWRSTS_OFF_ON,
2361 };
2362 
2363 static struct gdsc oxili_cx_gdsc = {
2364 	.gdscr = 0x4034,
2365 	.pd = {
2366 		.name = "oxili_cx_gdsc",
2367 	},
2368 	.pwrsts = PWRSTS_OFF_ON,
2369 	.flags = VOTABLE,
2370 };
2371 
2372 static struct gdsc oxili_gx_gdsc = {
2373 	.gdscr = 0x4024,
2374 	.cxcs = (unsigned int []){ 0x4028 },
2375 	.cxc_count = 1,
2376 	.pd = {
2377 		.name = "oxili_gx_gdsc",
2378 	},
2379 	.pwrsts = PWRSTS_OFF_ON,
2380 	.parent = &oxili_cx_gdsc.pd,
2381 	.flags = CLAMP_IO,
2382 	.supply = "VDD_GFX",
2383 };
2384 
2385 static struct clk_regmap *mmcc_msm8994_clocks[] = {
2386 	[MMPLL0_EARLY] = &mmpll0_early.clkr,
2387 	[MMPLL0_PLL] = &mmpll0.clkr,
2388 	[MMPLL1_EARLY] = &mmpll1_early.clkr,
2389 	[MMPLL1_PLL] = &mmpll1.clkr,
2390 	[MMPLL3_EARLY] = &mmpll3_early.clkr,
2391 	[MMPLL3_PLL] = &mmpll3.clkr,
2392 	[MMPLL4_EARLY] = &mmpll4_early.clkr,
2393 	[MMPLL4_PLL] = &mmpll4.clkr,
2394 	[MMPLL5_EARLY] = &mmpll5_early.clkr,
2395 	[MMPLL5_PLL] = &mmpll5.clkr,
2396 	[AHB_CLK_SRC] = &ahb_clk_src.clkr,
2397 	[AXI_CLK_SRC] = &axi_clk_src.clkr,
2398 	[CSI0_CLK_SRC] = &csi0_clk_src.clkr,
2399 	[CSI1_CLK_SRC] = &csi1_clk_src.clkr,
2400 	[CSI2_CLK_SRC] = &csi2_clk_src.clkr,
2401 	[CSI3_CLK_SRC] = &csi3_clk_src.clkr,
2402 	[VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
2403 	[VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
2404 	[CPP_CLK_SRC] = &cpp_clk_src.clkr,
2405 	[JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
2406 	[JPEG1_CLK_SRC] = &jpeg1_clk_src.clkr,
2407 	[JPEG2_CLK_SRC] = &jpeg2_clk_src.clkr,
2408 	[CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
2409 	[FD_CORE_CLK_SRC] = &fd_core_clk_src.clkr,
2410 	[MDP_CLK_SRC] = &mdp_clk_src.clkr,
2411 	[PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
2412 	[PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
2413 	[OCMEMNOC_CLK_SRC] = &ocmemnoc_clk_src.clkr,
2414 	[CCI_CLK_SRC] = &cci_clk_src.clkr,
2415 	[MMSS_GP0_CLK_SRC] = &mmss_gp0_clk_src.clkr,
2416 	[MMSS_GP1_CLK_SRC] = &mmss_gp1_clk_src.clkr,
2417 	[JPEG_DMA_CLK_SRC] = &jpeg_dma_clk_src.clkr,
2418 	[MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
2419 	[MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
2420 	[MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
2421 	[MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
2422 	[CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
2423 	[CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
2424 	[BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
2425 	[BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
2426 	[ESC0_CLK_SRC] = &esc0_clk_src.clkr,
2427 	[ESC1_CLK_SRC] = &esc1_clk_src.clkr,
2428 	[MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
2429 	[MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
2430 	[EXTPCLK_CLK_SRC] = &extpclk_clk_src.clkr,
2431 	[HDMI_CLK_SRC] = &hdmi_clk_src.clkr,
2432 	[VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
2433 	[RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr,
2434 	[CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,
2435 	[CAMSS_CCI_CCI_AHB_CLK] = &camss_cci_cci_ahb_clk.clkr,
2436 	[CAMSS_CCI_CCI_CLK] = &camss_cci_cci_clk.clkr,
2437 	[CAMSS_VFE_CPP_AHB_CLK] = &camss_vfe_cpp_ahb_clk.clkr,
2438 	[CAMSS_VFE_CPP_AXI_CLK] = &camss_vfe_cpp_axi_clk.clkr,
2439 	[CAMSS_VFE_CPP_CLK] = &camss_vfe_cpp_clk.clkr,
2440 	[CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
2441 	[CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
2442 	[CAMSS_CSI0PHY_CLK] = &camss_csi0phy_clk.clkr,
2443 	[CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
2444 	[CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
2445 	[CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
2446 	[CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
2447 	[CAMSS_CSI1PHY_CLK] = &camss_csi1phy_clk.clkr,
2448 	[CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
2449 	[CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
2450 	[CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
2451 	[CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
2452 	[CAMSS_CSI2PHY_CLK] = &camss_csi2phy_clk.clkr,
2453 	[CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
2454 	[CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
2455 	[CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
2456 	[CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
2457 	[CAMSS_CSI3PHY_CLK] = &camss_csi3phy_clk.clkr,
2458 	[CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
2459 	[CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
2460 	[CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
2461 	[CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
2462 	[CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
2463 	[CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
2464 	[CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
2465 	[CAMSS_JPEG_DMA_CLK] = &camss_jpeg_dma_clk.clkr,
2466 	[CAMSS_JPEG_JPEG0_CLK] = &camss_jpeg_jpeg0_clk.clkr,
2467 	[CAMSS_JPEG_JPEG1_CLK] = &camss_jpeg_jpeg1_clk.clkr,
2468 	[CAMSS_JPEG_JPEG2_CLK] = &camss_jpeg_jpeg2_clk.clkr,
2469 	[CAMSS_JPEG_JPEG_AHB_CLK] = &camss_jpeg_jpeg_ahb_clk.clkr,
2470 	[CAMSS_JPEG_JPEG_AXI_CLK] = &camss_jpeg_jpeg_axi_clk.clkr,
2471 	[CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
2472 	[CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
2473 	[CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
2474 	[CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
2475 	[CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
2476 	[CAMSS_PHY0_CSI0PHYTIMER_CLK] = &camss_phy0_csi0phytimer_clk.clkr,
2477 	[CAMSS_PHY1_CSI1PHYTIMER_CLK] = &camss_phy1_csi1phytimer_clk.clkr,
2478 	[CAMSS_PHY2_CSI2PHYTIMER_CLK] = &camss_phy2_csi2phytimer_clk.clkr,
2479 	[CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
2480 	[CAMSS_VFE_VFE0_CLK] = &camss_vfe_vfe0_clk.clkr,
2481 	[CAMSS_VFE_VFE1_CLK] = &camss_vfe_vfe1_clk.clkr,
2482 	[CAMSS_VFE_VFE_AHB_CLK] = &camss_vfe_vfe_ahb_clk.clkr,
2483 	[CAMSS_VFE_VFE_AXI_CLK] = &camss_vfe_vfe_axi_clk.clkr,
2484 	[FD_AHB_CLK] = &fd_ahb_clk.clkr,
2485 	[FD_AXI_CLK] = &fd_axi_clk.clkr,
2486 	[FD_CORE_CLK] = &fd_core_clk.clkr,
2487 	[FD_CORE_UAR_CLK] = &fd_core_uar_clk.clkr,
2488 	[MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
2489 	[MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
2490 	[MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
2491 	[MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
2492 	[MDSS_EXTPCLK_CLK] = &mdss_extpclk_clk.clkr,
2493 	[MDSS_HDMI_AHB_CLK] = &mdss_hdmi_ahb_clk.clkr,
2494 	[MDSS_HDMI_CLK] = &mdss_hdmi_clk.clkr,
2495 	[MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
2496 	[MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
2497 	[MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
2498 	[MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
2499 	[MMSS_MISC_AHB_CLK] = &mmss_misc_ahb_clk.clkr,
2500 	[MMSS_MMSSNOC_AXI_CLK] = &mmss_mmssnoc_axi_clk.clkr,
2501 	[MMSS_S0_AXI_CLK] = &mmss_s0_axi_clk.clkr,
2502 	[OCMEMCX_OCMEMNOC_CLK] = &ocmemcx_ocmemnoc_clk.clkr,
2503 	[OXILI_GFX3D_CLK] = &oxili_gfx3d_clk.clkr,
2504 	[OXILI_RBBMTIMER_CLK] = &oxili_rbbmtimer_clk.clkr,
2505 	[OXILICX_AHB_CLK] = &oxilicx_ahb_clk.clkr,
2506 	[VENUS0_AHB_CLK] = &venus0_ahb_clk.clkr,
2507 	[VENUS0_AXI_CLK] = &venus0_axi_clk.clkr,
2508 	[VENUS0_OCMEMNOC_CLK] = &venus0_ocmemnoc_clk.clkr,
2509 	[VENUS0_VCODEC0_CLK] = &venus0_vcodec0_clk.clkr,
2510 	[VENUS0_CORE0_VCODEC_CLK] = &venus0_core0_vcodec_clk.clkr,
2511 	[VENUS0_CORE1_VCODEC_CLK] = &venus0_core1_vcodec_clk.clkr,
2512 	[VENUS0_CORE2_VCODEC_CLK] = &venus0_core2_vcodec_clk.clkr,
2513 };
2514 
2515 static struct gdsc *mmcc_msm8994_gdscs[] = {
2516 	[VENUS_GDSC] = &venus_gdsc,
2517 	[VENUS_CORE0_GDSC] = &venus_core0_gdsc,
2518 	[VENUS_CORE1_GDSC] = &venus_core1_gdsc,
2519 	[VENUS_CORE2_GDSC] = &venus_core2_gdsc,
2520 	[CAMSS_TOP_GDSC] = &camss_top_gdsc,
2521 	[MDSS_GDSC] = &mdss_gdsc,
2522 	[JPEG_GDSC] = &jpeg_gdsc,
2523 	[VFE_GDSC] = &vfe_gdsc,
2524 	[CPP_GDSC] = &cpp_gdsc,
2525 	[OXILI_GX_GDSC] = &oxili_gx_gdsc,
2526 	[OXILI_CX_GDSC] = &oxili_cx_gdsc,
2527 	[FD_GDSC] = &fd_gdsc,
2528 };
2529 
2530 static const struct qcom_reset_map mmcc_msm8994_resets[] = {
2531 	[CAMSS_MICRO_BCR] = { 0x3490 },
2532 };
2533 
2534 static const struct regmap_config mmcc_msm8994_regmap_config = {
2535 	.reg_bits	= 32,
2536 	.reg_stride	= 4,
2537 	.val_bits	= 32,
2538 	.max_register	= 0x5200,
2539 	.fast_io	= true,
2540 };
2541 
2542 static const struct qcom_cc_desc mmcc_msm8994_desc = {
2543 	.config = &mmcc_msm8994_regmap_config,
2544 	.clks = mmcc_msm8994_clocks,
2545 	.num_clks = ARRAY_SIZE(mmcc_msm8994_clocks),
2546 	.resets = mmcc_msm8994_resets,
2547 	.num_resets = ARRAY_SIZE(mmcc_msm8994_resets),
2548 	.gdscs = mmcc_msm8994_gdscs,
2549 	.num_gdscs = ARRAY_SIZE(mmcc_msm8994_gdscs),
2550 };
2551 
2552 static const struct of_device_id mmcc_msm8994_match_table[] = {
2553 	{ .compatible = "qcom,mmcc-msm8992" },
2554 	{ .compatible = "qcom,mmcc-msm8994" }, /* V2 and V2.1 */
2555 	{ }
2556 };
2557 MODULE_DEVICE_TABLE(of, mmcc_msm8994_match_table);
2558 
2559 static int mmcc_msm8994_probe(struct platform_device *pdev)
2560 {
2561 	struct regmap *regmap;
2562 
2563 	if (of_device_is_compatible(pdev->dev.of_node, "qcom,mmcc-msm8992")) {
2564 		/* MSM8992 features less clocks and some have different freq tables */
2565 		mmcc_msm8994_desc.clks[CAMSS_JPEG_JPEG1_CLK] = NULL;
2566 		mmcc_msm8994_desc.clks[CAMSS_JPEG_JPEG2_CLK] = NULL;
2567 		mmcc_msm8994_desc.clks[FD_CORE_CLK_SRC] = NULL;
2568 		mmcc_msm8994_desc.clks[FD_CORE_CLK] = NULL;
2569 		mmcc_msm8994_desc.clks[FD_CORE_UAR_CLK] = NULL;
2570 		mmcc_msm8994_desc.clks[FD_AXI_CLK] = NULL;
2571 		mmcc_msm8994_desc.clks[FD_AHB_CLK] = NULL;
2572 		mmcc_msm8994_desc.clks[JPEG1_CLK_SRC] = NULL;
2573 		mmcc_msm8994_desc.clks[JPEG2_CLK_SRC] = NULL;
2574 		mmcc_msm8994_desc.clks[VENUS0_CORE2_VCODEC_CLK] = NULL;
2575 
2576 		mmcc_msm8994_desc.gdscs[FD_GDSC] = NULL;
2577 		mmcc_msm8994_desc.gdscs[VENUS_CORE2_GDSC] = NULL;
2578 
2579 		axi_clk_src.freq_tbl = ftbl_axi_clk_src_8992;
2580 		cpp_clk_src.freq_tbl = ftbl_cpp_clk_src_8992;
2581 		csi0_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
2582 		csi1_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
2583 		csi2_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
2584 		csi3_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
2585 		mclk0_clk_src.freq_tbl = ftbl_mclk0_clk_src_8992;
2586 		mclk1_clk_src.freq_tbl = ftbl_mclk1_2_3_clk_src_8992;
2587 		mclk2_clk_src.freq_tbl = ftbl_mclk1_2_3_clk_src_8992;
2588 		mclk3_clk_src.freq_tbl = ftbl_mclk1_2_3_clk_src_8992;
2589 		mdp_clk_src.freq_tbl = ftbl_mdp_clk_src_8992;
2590 		ocmemnoc_clk_src.freq_tbl = ftbl_ocmemnoc_clk_src_8992;
2591 		vcodec0_clk_src.freq_tbl = ftbl_vcodec0_clk_src_8992;
2592 		vfe0_clk_src.freq_tbl = ftbl_vfe0_1_clk_src_8992;
2593 		vfe1_clk_src.freq_tbl = ftbl_vfe0_1_clk_src_8992;
2594 	}
2595 
2596 	regmap = qcom_cc_map(pdev, &mmcc_msm8994_desc);
2597 	if (IS_ERR(regmap))
2598 		return PTR_ERR(regmap);
2599 
2600 	clk_alpha_pll_configure(&mmpll0_early, regmap, &mmpll_p_config);
2601 	clk_alpha_pll_configure(&mmpll1_early, regmap, &mmpll_p_config);
2602 	clk_alpha_pll_configure(&mmpll3_early, regmap, &mmpll_p_config);
2603 	clk_alpha_pll_configure(&mmpll5_early, regmap, &mmpll_p_config);
2604 
2605 	return qcom_cc_really_probe(&pdev->dev, &mmcc_msm8994_desc, regmap);
2606 }
2607 
2608 static struct platform_driver mmcc_msm8994_driver = {
2609 	.probe		= mmcc_msm8994_probe,
2610 	.driver		= {
2611 		.name	= "mmcc-msm8994",
2612 		.of_match_table = mmcc_msm8994_match_table,
2613 	},
2614 };
2615 module_platform_driver(mmcc_msm8994_driver);
2616 
2617 MODULE_DESCRIPTION("QCOM MMCC MSM8994 Driver");
2618 MODULE_LICENSE("GPL v2");
2619 MODULE_ALIAS("platform:mmcc-msm8994");
2620