1 // SPDX-License-Identifier: GPL-2.0-only
2 /*x
3  * Copyright (c) 2015, The Linux Foundation. All rights reserved.
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/mod_devicetable.h>
11 #include <linux/module.h>
12 #include <linux/clk-provider.h>
13 #include <linux/regmap.h>
14 
15 #include <dt-bindings/clock/qcom,mmcc-msm8996.h>
16 
17 #include "common.h"
18 #include "clk-regmap.h"
19 #include "clk-regmap-divider.h"
20 #include "clk-alpha-pll.h"
21 #include "clk-rcg.h"
22 #include "clk-branch.h"
23 #include "reset.h"
24 #include "gdsc.h"
25 
26 enum {
27 	P_XO,
28 	P_MMPLL0,
29 	P_GPLL0,
30 	P_GPLL0_DIV,
31 	P_MMPLL1,
32 	P_MMPLL9,
33 	P_MMPLL2,
34 	P_MMPLL8,
35 	P_MMPLL3,
36 	P_DSI0PLL,
37 	P_DSI1PLL,
38 	P_MMPLL5,
39 	P_HDMIPLL,
40 	P_DSI0PLL_BYTE,
41 	P_DSI1PLL_BYTE,
42 	P_MMPLL4,
43 };
44 
45 static struct clk_fixed_factor gpll0_div = {
46 	.mult = 1,
47 	.div = 2,
48 	.hw.init = &(struct clk_init_data){
49 		.name = "gpll0_div",
50 		.parent_data = (const struct clk_parent_data[]){
51 			{ .fw_name = "gpll0", .name = "gpll0" },
52 		},
53 		.num_parents = 1,
54 		.ops = &clk_fixed_factor_ops,
55 	},
56 };
57 
58 static const struct pll_vco mmpll_p_vco[] = {
59 	{ 250000000, 500000000, 3 },
60 	{ 500000000, 1000000000, 2 },
61 	{ 1000000000, 1500000000, 1 },
62 	{ 1500000000, 2000000000, 0 },
63 };
64 
65 static const struct pll_vco mmpll_gfx_vco[] = {
66 	{ 400000000, 1000000000, 2 },
67 	{ 1000000000, 1500000000, 1 },
68 	{ 1500000000, 2000000000, 0 },
69 };
70 
71 static const struct pll_vco mmpll_t_vco[] = {
72 	{ 500000000, 1500000000, 0 },
73 };
74 
75 static struct clk_alpha_pll mmpll0_early = {
76 	.offset = 0x0,
77 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
78 	.vco_table = mmpll_p_vco,
79 	.num_vco = ARRAY_SIZE(mmpll_p_vco),
80 	.clkr = {
81 		.enable_reg = 0x100,
82 		.enable_mask = BIT(0),
83 		.hw.init = &(struct clk_init_data){
84 			.name = "mmpll0_early",
85 			.parent_data = (const struct clk_parent_data[]){
86 				{ .fw_name = "xo", .name = "xo_board" },
87 			},
88 			.num_parents = 1,
89 			.ops = &clk_alpha_pll_ops,
90 		},
91 	},
92 };
93 
94 static struct clk_alpha_pll_postdiv mmpll0 = {
95 	.offset = 0x0,
96 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
97 	.width = 4,
98 	.clkr.hw.init = &(struct clk_init_data){
99 		.name = "mmpll0",
100 		.parent_hws = (const struct clk_hw*[]){
101 			&mmpll0_early.clkr.hw
102 		},
103 		.num_parents = 1,
104 		.ops = &clk_alpha_pll_postdiv_ops,
105 		.flags = CLK_SET_RATE_PARENT,
106 	},
107 };
108 
109 static struct clk_alpha_pll mmpll1_early = {
110 	.offset = 0x30,
111 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
112 	.vco_table = mmpll_p_vco,
113 	.num_vco = ARRAY_SIZE(mmpll_p_vco),
114 	.clkr = {
115 		.enable_reg = 0x100,
116 		.enable_mask = BIT(1),
117 		.hw.init = &(struct clk_init_data){
118 			.name = "mmpll1_early",
119 			.parent_data = (const struct clk_parent_data[]){
120 				{ .fw_name = "xo", .name = "xo_board" },
121 			},
122 			.num_parents = 1,
123 			.ops = &clk_alpha_pll_ops,
124 		}
125 	},
126 };
127 
128 static struct clk_alpha_pll_postdiv mmpll1 = {
129 	.offset = 0x30,
130 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
131 	.width = 4,
132 	.clkr.hw.init = &(struct clk_init_data){
133 		.name = "mmpll1",
134 		.parent_hws = (const struct clk_hw*[]){
135 			&mmpll1_early.clkr.hw
136 		},
137 		.num_parents = 1,
138 		.ops = &clk_alpha_pll_postdiv_ops,
139 		.flags = CLK_SET_RATE_PARENT,
140 	},
141 };
142 
143 static struct clk_alpha_pll mmpll2_early = {
144 	.offset = 0x4100,
145 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
146 	.vco_table = mmpll_gfx_vco,
147 	.num_vco = ARRAY_SIZE(mmpll_gfx_vco),
148 	.clkr.hw.init = &(struct clk_init_data){
149 		.name = "mmpll2_early",
150 		.parent_data = (const struct clk_parent_data[]){
151 			{ .fw_name = "xo", .name = "xo_board" },
152 		},
153 		.num_parents = 1,
154 		.ops = &clk_alpha_pll_ops,
155 	},
156 };
157 
158 static struct clk_alpha_pll_postdiv mmpll2 = {
159 	.offset = 0x4100,
160 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
161 	.width = 4,
162 	.clkr.hw.init = &(struct clk_init_data){
163 		.name = "mmpll2",
164 		.parent_hws = (const struct clk_hw*[]){
165 			&mmpll2_early.clkr.hw
166 		},
167 		.num_parents = 1,
168 		.ops = &clk_alpha_pll_postdiv_ops,
169 		.flags = CLK_SET_RATE_PARENT,
170 	},
171 };
172 
173 static struct clk_alpha_pll mmpll3_early = {
174 	.offset = 0x60,
175 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
176 	.vco_table = mmpll_p_vco,
177 	.num_vco = ARRAY_SIZE(mmpll_p_vco),
178 	.clkr.hw.init = &(struct clk_init_data){
179 		.name = "mmpll3_early",
180 		.parent_data = (const struct clk_parent_data[]){
181 			{ .fw_name = "xo", .name = "xo_board" },
182 		},
183 		.num_parents = 1,
184 		.ops = &clk_alpha_pll_ops,
185 	},
186 };
187 
188 static struct clk_alpha_pll_postdiv mmpll3 = {
189 	.offset = 0x60,
190 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
191 	.width = 4,
192 	.clkr.hw.init = &(struct clk_init_data){
193 		.name = "mmpll3",
194 		.parent_hws = (const struct clk_hw*[]){
195 			&mmpll3_early.clkr.hw
196 		},
197 		.num_parents = 1,
198 		.ops = &clk_alpha_pll_postdiv_ops,
199 		.flags = CLK_SET_RATE_PARENT,
200 	},
201 };
202 
203 static struct clk_alpha_pll mmpll4_early = {
204 	.offset = 0x90,
205 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
206 	.vco_table = mmpll_t_vco,
207 	.num_vco = ARRAY_SIZE(mmpll_t_vco),
208 	.clkr.hw.init = &(struct clk_init_data){
209 		.name = "mmpll4_early",
210 		.parent_data = (const struct clk_parent_data[]){
211 			{ .fw_name = "xo", .name = "xo_board" },
212 		},
213 		.num_parents = 1,
214 		.ops = &clk_alpha_pll_ops,
215 	},
216 };
217 
218 static struct clk_alpha_pll_postdiv mmpll4 = {
219 	.offset = 0x90,
220 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
221 	.width = 2,
222 	.clkr.hw.init = &(struct clk_init_data){
223 		.name = "mmpll4",
224 		.parent_hws = (const struct clk_hw*[]){
225 			&mmpll4_early.clkr.hw
226 		},
227 		.num_parents = 1,
228 		.ops = &clk_alpha_pll_postdiv_ops,
229 		.flags = CLK_SET_RATE_PARENT,
230 	},
231 };
232 
233 static struct clk_alpha_pll mmpll5_early = {
234 	.offset = 0xc0,
235 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
236 	.vco_table = mmpll_p_vco,
237 	.num_vco = ARRAY_SIZE(mmpll_p_vco),
238 	.clkr.hw.init = &(struct clk_init_data){
239 		.name = "mmpll5_early",
240 		.parent_data = (const struct clk_parent_data[]){
241 			{ .fw_name = "xo", .name = "xo_board" },
242 		},
243 		.num_parents = 1,
244 		.ops = &clk_alpha_pll_ops,
245 	},
246 };
247 
248 static struct clk_alpha_pll_postdiv mmpll5 = {
249 	.offset = 0xc0,
250 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
251 	.width = 4,
252 	.clkr.hw.init = &(struct clk_init_data){
253 		.name = "mmpll5",
254 		.parent_hws = (const struct clk_hw*[]){
255 			&mmpll5_early.clkr.hw
256 		},
257 		.num_parents = 1,
258 		.ops = &clk_alpha_pll_postdiv_ops,
259 		.flags = CLK_SET_RATE_PARENT,
260 	},
261 };
262 
263 static struct clk_alpha_pll mmpll8_early = {
264 	.offset = 0x4130,
265 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
266 	.vco_table = mmpll_gfx_vco,
267 	.num_vco = ARRAY_SIZE(mmpll_gfx_vco),
268 	.clkr.hw.init = &(struct clk_init_data){
269 		.name = "mmpll8_early",
270 		.parent_data = (const struct clk_parent_data[]){
271 			{ .fw_name = "xo", .name = "xo_board" },
272 		},
273 		.num_parents = 1,
274 		.ops = &clk_alpha_pll_ops,
275 	},
276 };
277 
278 static struct clk_alpha_pll_postdiv mmpll8 = {
279 	.offset = 0x4130,
280 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
281 	.width = 4,
282 	.clkr.hw.init = &(struct clk_init_data){
283 		.name = "mmpll8",
284 		.parent_hws = (const struct clk_hw*[]){
285 			&mmpll8_early.clkr.hw
286 		},
287 		.num_parents = 1,
288 		.ops = &clk_alpha_pll_postdiv_ops,
289 		.flags = CLK_SET_RATE_PARENT,
290 	},
291 };
292 
293 static struct clk_alpha_pll mmpll9_early = {
294 	.offset = 0x4200,
295 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
296 	.vco_table = mmpll_t_vco,
297 	.num_vco = ARRAY_SIZE(mmpll_t_vco),
298 	.clkr.hw.init = &(struct clk_init_data){
299 		.name = "mmpll9_early",
300 		.parent_data = (const struct clk_parent_data[]){
301 			{ .fw_name = "xo", .name = "xo_board" },
302 		},
303 		.num_parents = 1,
304 		.ops = &clk_alpha_pll_ops,
305 	},
306 };
307 
308 static struct clk_alpha_pll_postdiv mmpll9 = {
309 	.offset = 0x4200,
310 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
311 	.width = 2,
312 	.clkr.hw.init = &(struct clk_init_data){
313 		.name = "mmpll9",
314 		.parent_hws = (const struct clk_hw*[]){
315 			&mmpll9_early.clkr.hw
316 		},
317 		.num_parents = 1,
318 		.ops = &clk_alpha_pll_postdiv_ops,
319 		.flags = CLK_SET_RATE_PARENT,
320 	},
321 };
322 
323 static const struct parent_map mmss_xo_hdmi_map[] = {
324 	{ P_XO, 0 },
325 	{ P_HDMIPLL, 1 }
326 };
327 
328 static const struct clk_parent_data mmss_xo_hdmi[] = {
329 	{ .fw_name = "xo", .name = "xo_board" },
330 	{ .fw_name = "hdmipll", .name = "hdmipll" }
331 };
332 
333 static const struct parent_map mmss_xo_dsi0pll_dsi1pll_map[] = {
334 	{ P_XO, 0 },
335 	{ P_DSI0PLL, 1 },
336 	{ P_DSI1PLL, 2 }
337 };
338 
339 static const struct clk_parent_data mmss_xo_dsi0pll_dsi1pll[] = {
340 	{ .fw_name = "xo", .name = "xo_board" },
341 	{ .fw_name = "dsi0pll", .name = "dsi0pll" },
342 	{ .fw_name = "dsi1pll", .name = "dsi1pll" }
343 };
344 
345 static const struct parent_map mmss_xo_gpll0_gpll0_div_map[] = {
346 	{ P_XO, 0 },
347 	{ P_GPLL0, 5 },
348 	{ P_GPLL0_DIV, 6 }
349 };
350 
351 static const struct clk_parent_data mmss_xo_gpll0_gpll0_div[] = {
352 	{ .fw_name = "xo", .name = "xo_board" },
353 	{ .fw_name = "gpll0", .name = "gpll0" },
354 	{ .hw = &gpll0_div.hw }
355 };
356 
357 static const struct parent_map mmss_xo_dsibyte_map[] = {
358 	{ P_XO, 0 },
359 	{ P_DSI0PLL_BYTE, 1 },
360 	{ P_DSI1PLL_BYTE, 2 }
361 };
362 
363 static const struct clk_parent_data mmss_xo_dsibyte[] = {
364 	{ .fw_name = "xo", .name = "xo_board" },
365 	{ .fw_name = "dsi0pllbyte", .name = "dsi0pllbyte" },
366 	{ .fw_name = "dsi1pllbyte", .name = "dsi1pllbyte" }
367 };
368 
369 static const struct parent_map mmss_xo_mmpll0_gpll0_gpll0_div_map[] = {
370 	{ P_XO, 0 },
371 	{ P_MMPLL0, 1 },
372 	{ P_GPLL0, 5 },
373 	{ P_GPLL0_DIV, 6 }
374 };
375 
376 static const struct clk_parent_data mmss_xo_mmpll0_gpll0_gpll0_div[] = {
377 	{ .fw_name = "xo", .name = "xo_board" },
378 	{ .hw = &mmpll0.clkr.hw },
379 	{ .fw_name = "gpll0", .name = "gpll0" },
380 	{ .hw = &gpll0_div.hw }
381 };
382 
383 static const struct parent_map mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div_map[] = {
384 	{ P_XO, 0 },
385 	{ P_MMPLL0, 1 },
386 	{ P_MMPLL1, 2 },
387 	{ P_GPLL0, 5 },
388 	{ P_GPLL0_DIV, 6 }
389 };
390 
391 static const struct clk_parent_data mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div[] = {
392 	{ .fw_name = "xo", .name = "xo_board" },
393 	{ .hw = &mmpll0.clkr.hw },
394 	{ .hw = &mmpll1.clkr.hw },
395 	{ .fw_name = "gpll0", .name = "gpll0" },
396 	{ .hw = &gpll0_div.hw }
397 };
398 
399 static const struct parent_map mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div_map[] = {
400 	{ P_XO, 0 },
401 	{ P_MMPLL0, 1 },
402 	{ P_MMPLL3, 3 },
403 	{ P_GPLL0, 5 },
404 	{ P_GPLL0_DIV, 6 }
405 };
406 
407 static const struct clk_parent_data mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div[] = {
408 	{ .fw_name = "xo", .name = "xo_board" },
409 	{ .hw = &mmpll0.clkr.hw },
410 	{ .hw = &mmpll3.clkr.hw },
411 	{ .fw_name = "gpll0", .name = "gpll0" },
412 	{ .hw = &gpll0_div.hw }
413 };
414 
415 static const struct parent_map mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div_map[] = {
416 	{ P_XO, 0 },
417 	{ P_MMPLL0, 1 },
418 	{ P_MMPLL5, 2 },
419 	{ P_GPLL0, 5 },
420 	{ P_GPLL0_DIV, 6 }
421 };
422 
423 static const struct clk_parent_data mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div[] = {
424 	{ .fw_name = "xo", .name = "xo_board" },
425 	{ .hw = &mmpll0.clkr.hw },
426 	{ .hw = &mmpll5.clkr.hw },
427 	{ .fw_name = "gpll0", .name = "gpll0" },
428 	{ .hw = &gpll0_div.hw }
429 };
430 
431 static const struct parent_map mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map[] = {
432 	{ P_XO, 0 },
433 	{ P_MMPLL0, 1 },
434 	{ P_MMPLL4, 3 },
435 	{ P_GPLL0, 5 },
436 	{ P_GPLL0_DIV, 6 }
437 };
438 
439 static const struct clk_parent_data mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div[] = {
440 	{ .fw_name = "xo", .name = "xo_board" },
441 	{ .hw = &mmpll0.clkr.hw },
442 	{ .hw = &mmpll4.clkr.hw },
443 	{ .fw_name = "gpll0", .name = "gpll0" },
444 	{ .hw = &gpll0_div.hw }
445 };
446 
447 static const struct parent_map mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_map[] = {
448 	{ P_XO, 0 },
449 	{ P_MMPLL0, 1 },
450 	{ P_MMPLL9, 2 },
451 	{ P_MMPLL2, 3 },
452 	{ P_MMPLL8, 4 },
453 	{ P_GPLL0, 5 }
454 };
455 
456 static const struct clk_parent_data mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0[] = {
457 	{ .fw_name = "xo", .name = "xo_board" },
458 	{ .hw = &mmpll0.clkr.hw },
459 	{ .hw = &mmpll9.clkr.hw },
460 	{ .hw = &mmpll2.clkr.hw },
461 	{ .hw = &mmpll8.clkr.hw },
462 	{ .fw_name = "gpll0", .name = "gpll0" },
463 };
464 
465 static const struct parent_map mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_gpll0_div_map[] = {
466 	{ P_XO, 0 },
467 	{ P_MMPLL0, 1 },
468 	{ P_MMPLL9, 2 },
469 	{ P_MMPLL2, 3 },
470 	{ P_MMPLL8, 4 },
471 	{ P_GPLL0, 5 },
472 	{ P_GPLL0_DIV, 6 }
473 };
474 
475 static const struct clk_parent_data mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_gpll0_div[] = {
476 	{ .fw_name = "xo", .name = "xo_board" },
477 	{ .hw = &mmpll0.clkr.hw },
478 	{ .hw = &mmpll9.clkr.hw },
479 	{ .hw = &mmpll2.clkr.hw },
480 	{ .hw = &mmpll8.clkr.hw },
481 	{ .fw_name = "gpll0", .name = "gpll0" },
482 	{ .hw = &gpll0_div.hw }
483 };
484 
485 static const struct parent_map mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map[] = {
486 	{ P_XO, 0 },
487 	{ P_MMPLL0, 1 },
488 	{ P_MMPLL1, 2 },
489 	{ P_MMPLL4, 3 },
490 	{ P_MMPLL3, 4 },
491 	{ P_GPLL0, 5 },
492 	{ P_GPLL0_DIV, 6 }
493 };
494 
495 static const struct clk_parent_data mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div[] = {
496 	{ .fw_name = "xo", .name = "xo_board" },
497 	{ .hw = &mmpll0.clkr.hw },
498 	{ .hw = &mmpll1.clkr.hw },
499 	{ .hw = &mmpll4.clkr.hw },
500 	{ .hw = &mmpll3.clkr.hw },
501 	{ .fw_name = "gpll0", .name = "gpll0" },
502 	{ .hw = &gpll0_div.hw }
503 };
504 
505 static const struct freq_tbl ftbl_ahb_clk_src[] = {
506 	F(19200000, P_XO, 1, 0, 0),
507 	F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
508 	F(80000000, P_MMPLL0, 10, 0, 0),
509 	{ }
510 };
511 
512 static struct clk_rcg2 ahb_clk_src = {
513 	.cmd_rcgr = 0x5000,
514 	.hid_width = 5,
515 	.parent_map = mmss_xo_mmpll0_gpll0_gpll0_div_map,
516 	.freq_tbl = ftbl_ahb_clk_src,
517 	.clkr.hw.init = &(struct clk_init_data){
518 		.name = "ahb_clk_src",
519 		.parent_data = mmss_xo_mmpll0_gpll0_gpll0_div,
520 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_gpll0_gpll0_div),
521 		.ops = &clk_rcg2_ops,
522 	},
523 };
524 
525 static const struct freq_tbl ftbl_axi_clk_src[] = {
526 	F(19200000, P_XO, 1, 0, 0),
527 	F(75000000, P_GPLL0_DIV, 4, 0, 0),
528 	F(100000000, P_GPLL0, 6, 0, 0),
529 	F(171430000, P_GPLL0, 3.5, 0, 0),
530 	F(200000000, P_GPLL0, 3, 0, 0),
531 	F(320000000, P_MMPLL0, 2.5, 0, 0),
532 	F(400000000, P_MMPLL0, 2, 0, 0),
533 	{ }
534 };
535 
536 static struct clk_rcg2 axi_clk_src = {
537 	.cmd_rcgr = 0x5040,
538 	.hid_width = 5,
539 	.parent_map = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div_map,
540 	.freq_tbl = ftbl_axi_clk_src,
541 	.clkr.hw.init = &(struct clk_init_data){
542 		.name = "axi_clk_src",
543 		.parent_data = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div,
544 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div),
545 		.ops = &clk_rcg2_ops,
546 	},
547 };
548 
549 static struct clk_rcg2 maxi_clk_src = {
550 	.cmd_rcgr = 0x5090,
551 	.hid_width = 5,
552 	.parent_map = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div_map,
553 	.freq_tbl = ftbl_axi_clk_src,
554 	.clkr.hw.init = &(struct clk_init_data){
555 		.name = "maxi_clk_src",
556 		.parent_data = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div,
557 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div),
558 		.ops = &clk_rcg2_ops,
559 	},
560 };
561 
562 static struct clk_rcg2_gfx3d gfx3d_clk_src = {
563 	.rcg = {
564 		.cmd_rcgr = 0x4000,
565 		.hid_width = 5,
566 		.parent_map = mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_map,
567 		.clkr.hw.init = &(struct clk_init_data){
568 			.name = "gfx3d_clk_src",
569 			.parent_data = mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0,
570 			.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0),
571 			.ops = &clk_gfx3d_ops,
572 			.flags = CLK_SET_RATE_PARENT,
573 		},
574 	},
575 	.hws = (struct clk_hw*[]) {
576 		&mmpll9.clkr.hw,
577 		&mmpll2.clkr.hw,
578 		&mmpll8.clkr.hw
579 	},
580 };
581 
582 static const struct freq_tbl ftbl_rbbmtimer_clk_src[] = {
583 	F(19200000, P_XO, 1, 0, 0),
584 	{ }
585 };
586 
587 static struct clk_rcg2 rbbmtimer_clk_src = {
588 	.cmd_rcgr = 0x4090,
589 	.hid_width = 5,
590 	.parent_map = mmss_xo_mmpll0_gpll0_gpll0_div_map,
591 	.freq_tbl = ftbl_rbbmtimer_clk_src,
592 	.clkr.hw.init = &(struct clk_init_data){
593 		.name = "rbbmtimer_clk_src",
594 		.parent_data = mmss_xo_mmpll0_gpll0_gpll0_div,
595 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_gpll0_gpll0_div),
596 		.ops = &clk_rcg2_ops,
597 	},
598 };
599 
600 static struct clk_rcg2 isense_clk_src = {
601 	.cmd_rcgr = 0x4010,
602 	.hid_width = 5,
603 	.parent_map = mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_gpll0_div_map,
604 	.clkr.hw.init = &(struct clk_init_data){
605 		.name = "isense_clk_src",
606 		.parent_data = mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_gpll0_div,
607 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_gpll0_div),
608 		.ops = &clk_rcg2_ops,
609 	},
610 };
611 
612 static const struct freq_tbl ftbl_rbcpr_clk_src[] = {
613 	F(19200000, P_XO, 1, 0, 0),
614 	F(50000000, P_GPLL0, 12, 0, 0),
615 	{ }
616 };
617 
618 static struct clk_rcg2 rbcpr_clk_src = {
619 	.cmd_rcgr = 0x4060,
620 	.hid_width = 5,
621 	.parent_map = mmss_xo_mmpll0_gpll0_gpll0_div_map,
622 	.freq_tbl = ftbl_rbcpr_clk_src,
623 	.clkr.hw.init = &(struct clk_init_data){
624 		.name = "rbcpr_clk_src",
625 		.parent_data = mmss_xo_mmpll0_gpll0_gpll0_div,
626 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_gpll0_gpll0_div),
627 		.ops = &clk_rcg2_ops,
628 	},
629 };
630 
631 static const struct freq_tbl ftbl_video_core_clk_src[] = {
632 	F(75000000, P_GPLL0_DIV, 4, 0, 0),
633 	F(150000000, P_GPLL0, 4, 0, 0),
634 	F(346666667, P_MMPLL3, 3, 0, 0),
635 	F(520000000, P_MMPLL3, 2, 0, 0),
636 	{ }
637 };
638 
639 static struct clk_rcg2 video_core_clk_src = {
640 	.cmd_rcgr = 0x1000,
641 	.mnd_width = 8,
642 	.hid_width = 5,
643 	.parent_map = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div_map,
644 	.freq_tbl = ftbl_video_core_clk_src,
645 	.clkr.hw.init = &(struct clk_init_data){
646 		.name = "video_core_clk_src",
647 		.parent_data = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div,
648 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div),
649 		.ops = &clk_rcg2_ops,
650 	},
651 };
652 
653 static struct clk_rcg2 video_subcore0_clk_src = {
654 	.cmd_rcgr = 0x1060,
655 	.mnd_width = 8,
656 	.hid_width = 5,
657 	.parent_map = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div_map,
658 	.freq_tbl = ftbl_video_core_clk_src,
659 	.clkr.hw.init = &(struct clk_init_data){
660 		.name = "video_subcore0_clk_src",
661 		.parent_data = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div,
662 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div),
663 		.ops = &clk_rcg2_ops,
664 	},
665 };
666 
667 static struct clk_rcg2 video_subcore1_clk_src = {
668 	.cmd_rcgr = 0x1080,
669 	.mnd_width = 8,
670 	.hid_width = 5,
671 	.parent_map = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div_map,
672 	.freq_tbl = ftbl_video_core_clk_src,
673 	.clkr.hw.init = &(struct clk_init_data){
674 		.name = "video_subcore1_clk_src",
675 		.parent_data = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div,
676 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div),
677 		.ops = &clk_rcg2_ops,
678 	},
679 };
680 
681 static struct clk_rcg2 pclk0_clk_src = {
682 	.cmd_rcgr = 0x2000,
683 	.mnd_width = 8,
684 	.hid_width = 5,
685 	.parent_map = mmss_xo_dsi0pll_dsi1pll_map,
686 	.clkr.hw.init = &(struct clk_init_data){
687 		.name = "pclk0_clk_src",
688 		.parent_data = mmss_xo_dsi0pll_dsi1pll,
689 		.num_parents = ARRAY_SIZE(mmss_xo_dsi0pll_dsi1pll),
690 		.ops = &clk_pixel_ops,
691 		.flags = CLK_SET_RATE_PARENT,
692 	},
693 };
694 
695 static struct clk_rcg2 pclk1_clk_src = {
696 	.cmd_rcgr = 0x2020,
697 	.mnd_width = 8,
698 	.hid_width = 5,
699 	.parent_map = mmss_xo_dsi0pll_dsi1pll_map,
700 	.clkr.hw.init = &(struct clk_init_data){
701 		.name = "pclk1_clk_src",
702 		.parent_data = mmss_xo_dsi0pll_dsi1pll,
703 		.num_parents = ARRAY_SIZE(mmss_xo_dsi0pll_dsi1pll),
704 		.ops = &clk_pixel_ops,
705 		.flags = CLK_SET_RATE_PARENT,
706 	},
707 };
708 
709 static const struct freq_tbl ftbl_mdp_clk_src[] = {
710 	F(85714286, P_GPLL0, 7, 0, 0),
711 	F(100000000, P_GPLL0, 6, 0, 0),
712 	F(150000000, P_GPLL0, 4, 0, 0),
713 	F(171428571, P_GPLL0, 3.5, 0, 0),
714 	F(200000000, P_GPLL0, 3, 0, 0),
715 	F(275000000, P_MMPLL5, 3, 0, 0),
716 	F(300000000, P_GPLL0, 2, 0, 0),
717 	F(330000000, P_MMPLL5, 2.5, 0, 0),
718 	F(412500000, P_MMPLL5, 2, 0, 0),
719 	{ }
720 };
721 
722 static struct clk_rcg2 mdp_clk_src = {
723 	.cmd_rcgr = 0x2040,
724 	.hid_width = 5,
725 	.parent_map = mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div_map,
726 	.freq_tbl = ftbl_mdp_clk_src,
727 	.clkr.hw.init = &(struct clk_init_data){
728 		.name = "mdp_clk_src",
729 		.parent_data = mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div,
730 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div),
731 		.ops = &clk_rcg2_ops,
732 	},
733 };
734 
735 static const struct freq_tbl extpclk_freq_tbl[] = {
736 	{ .src = P_HDMIPLL },
737 	{ }
738 };
739 
740 static struct clk_rcg2 extpclk_clk_src = {
741 	.cmd_rcgr = 0x2060,
742 	.hid_width = 5,
743 	.parent_map = mmss_xo_hdmi_map,
744 	.freq_tbl = extpclk_freq_tbl,
745 	.clkr.hw.init = &(struct clk_init_data){
746 		.name = "extpclk_clk_src",
747 		.parent_data = mmss_xo_hdmi,
748 		.num_parents = ARRAY_SIZE(mmss_xo_hdmi),
749 		.ops = &clk_byte_ops,
750 		.flags = CLK_SET_RATE_PARENT,
751 	},
752 };
753 
754 static const struct freq_tbl ftbl_mdss_vsync_clk[] = {
755 	F(19200000, P_XO, 1, 0, 0),
756 	{ }
757 };
758 
759 static struct clk_rcg2 vsync_clk_src = {
760 	.cmd_rcgr = 0x2080,
761 	.hid_width = 5,
762 	.parent_map = mmss_xo_gpll0_gpll0_div_map,
763 	.freq_tbl = ftbl_mdss_vsync_clk,
764 	.clkr.hw.init = &(struct clk_init_data){
765 		.name = "vsync_clk_src",
766 		.parent_data = mmss_xo_gpll0_gpll0_div,
767 		.num_parents = ARRAY_SIZE(mmss_xo_gpll0_gpll0_div),
768 		.ops = &clk_rcg2_ops,
769 	},
770 };
771 
772 static const struct freq_tbl ftbl_mdss_hdmi_clk[] = {
773 	F(19200000, P_XO, 1, 0, 0),
774 	{ }
775 };
776 
777 static struct clk_rcg2 hdmi_clk_src = {
778 	.cmd_rcgr = 0x2100,
779 	.hid_width = 5,
780 	.parent_map = mmss_xo_gpll0_gpll0_div_map,
781 	.freq_tbl = ftbl_mdss_hdmi_clk,
782 	.clkr.hw.init = &(struct clk_init_data){
783 		.name = "hdmi_clk_src",
784 		.parent_data = mmss_xo_gpll0_gpll0_div,
785 		.num_parents = ARRAY_SIZE(mmss_xo_gpll0_gpll0_div),
786 		.ops = &clk_rcg2_ops,
787 	},
788 };
789 
790 static struct clk_rcg2 byte0_clk_src = {
791 	.cmd_rcgr = 0x2120,
792 	.hid_width = 5,
793 	.parent_map = mmss_xo_dsibyte_map,
794 	.clkr.hw.init = &(struct clk_init_data){
795 		.name = "byte0_clk_src",
796 		.parent_data = mmss_xo_dsibyte,
797 		.num_parents = ARRAY_SIZE(mmss_xo_dsibyte),
798 		.ops = &clk_byte2_ops,
799 		.flags = CLK_SET_RATE_PARENT,
800 	},
801 };
802 
803 static struct clk_rcg2 byte1_clk_src = {
804 	.cmd_rcgr = 0x2140,
805 	.hid_width = 5,
806 	.parent_map = mmss_xo_dsibyte_map,
807 	.clkr.hw.init = &(struct clk_init_data){
808 		.name = "byte1_clk_src",
809 		.parent_data = mmss_xo_dsibyte,
810 		.num_parents = ARRAY_SIZE(mmss_xo_dsibyte),
811 		.ops = &clk_byte2_ops,
812 		.flags = CLK_SET_RATE_PARENT,
813 	},
814 };
815 
816 static const struct freq_tbl ftbl_mdss_esc0_1_clk[] = {
817 	F(19200000, P_XO, 1, 0, 0),
818 	{ }
819 };
820 
821 static struct clk_rcg2 esc0_clk_src = {
822 	.cmd_rcgr = 0x2160,
823 	.hid_width = 5,
824 	.parent_map = mmss_xo_dsibyte_map,
825 	.freq_tbl = ftbl_mdss_esc0_1_clk,
826 	.clkr.hw.init = &(struct clk_init_data){
827 		.name = "esc0_clk_src",
828 		.parent_data = mmss_xo_dsibyte,
829 		.num_parents = ARRAY_SIZE(mmss_xo_dsibyte),
830 		.ops = &clk_rcg2_ops,
831 	},
832 };
833 
834 static struct clk_rcg2 esc1_clk_src = {
835 	.cmd_rcgr = 0x2180,
836 	.hid_width = 5,
837 	.parent_map = mmss_xo_dsibyte_map,
838 	.freq_tbl = ftbl_mdss_esc0_1_clk,
839 	.clkr.hw.init = &(struct clk_init_data){
840 		.name = "esc1_clk_src",
841 		.parent_data = mmss_xo_dsibyte,
842 		.num_parents = ARRAY_SIZE(mmss_xo_dsibyte),
843 		.ops = &clk_rcg2_ops,
844 	},
845 };
846 
847 static const struct freq_tbl ftbl_camss_gp0_clk_src[] = {
848 	F(10000, P_XO, 16, 1, 120),
849 	F(24000, P_XO, 16, 1, 50),
850 	F(6000000, P_GPLL0_DIV, 10, 1, 5),
851 	F(12000000, P_GPLL0_DIV, 1, 1, 25),
852 	F(13000000, P_GPLL0_DIV, 2, 13, 150),
853 	F(24000000, P_GPLL0_DIV, 1, 2, 25),
854 	{ }
855 };
856 
857 static struct clk_rcg2 camss_gp0_clk_src = {
858 	.cmd_rcgr = 0x3420,
859 	.mnd_width = 8,
860 	.hid_width = 5,
861 	.parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map,
862 	.freq_tbl = ftbl_camss_gp0_clk_src,
863 	.clkr.hw.init = &(struct clk_init_data){
864 		.name = "camss_gp0_clk_src",
865 		.parent_data = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div,
866 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div),
867 		.ops = &clk_rcg2_ops,
868 	},
869 };
870 
871 static struct clk_rcg2 camss_gp1_clk_src = {
872 	.cmd_rcgr = 0x3450,
873 	.mnd_width = 8,
874 	.hid_width = 5,
875 	.parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map,
876 	.freq_tbl = ftbl_camss_gp0_clk_src,
877 	.clkr.hw.init = &(struct clk_init_data){
878 		.name = "camss_gp1_clk_src",
879 		.parent_data = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div,
880 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div),
881 		.ops = &clk_rcg2_ops,
882 	},
883 };
884 
885 static const struct freq_tbl ftbl_mclk0_clk_src[] = {
886 	F(4800000, P_XO, 4, 0, 0),
887 	F(6000000, P_GPLL0_DIV, 10, 1, 5),
888 	F(8000000, P_GPLL0_DIV, 1, 2, 75),
889 	F(9600000, P_XO, 2, 0, 0),
890 	F(16666667, P_GPLL0_DIV, 2, 1, 9),
891 	F(19200000, P_XO, 1, 0, 0),
892 	F(24000000, P_GPLL0_DIV, 1, 2, 25),
893 	F(33333333, P_GPLL0_DIV, 1, 1, 9),
894 	F(48000000, P_GPLL0, 1, 2, 25),
895 	F(66666667, P_GPLL0, 1, 1, 9),
896 	{ }
897 };
898 
899 static struct clk_rcg2 mclk0_clk_src = {
900 	.cmd_rcgr = 0x3360,
901 	.mnd_width = 8,
902 	.hid_width = 5,
903 	.parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map,
904 	.freq_tbl = ftbl_mclk0_clk_src,
905 	.clkr.hw.init = &(struct clk_init_data){
906 		.name = "mclk0_clk_src",
907 		.parent_data = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div,
908 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div),
909 		.ops = &clk_rcg2_ops,
910 	},
911 };
912 
913 static struct clk_rcg2 mclk1_clk_src = {
914 	.cmd_rcgr = 0x3390,
915 	.mnd_width = 8,
916 	.hid_width = 5,
917 	.parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map,
918 	.freq_tbl = ftbl_mclk0_clk_src,
919 	.clkr.hw.init = &(struct clk_init_data){
920 		.name = "mclk1_clk_src",
921 		.parent_data = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div,
922 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div),
923 		.ops = &clk_rcg2_ops,
924 	},
925 };
926 
927 static struct clk_rcg2 mclk2_clk_src = {
928 	.cmd_rcgr = 0x33c0,
929 	.mnd_width = 8,
930 	.hid_width = 5,
931 	.parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map,
932 	.freq_tbl = ftbl_mclk0_clk_src,
933 	.clkr.hw.init = &(struct clk_init_data){
934 		.name = "mclk2_clk_src",
935 		.parent_data = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div,
936 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div),
937 		.ops = &clk_rcg2_ops,
938 	},
939 };
940 
941 static struct clk_rcg2 mclk3_clk_src = {
942 	.cmd_rcgr = 0x33f0,
943 	.mnd_width = 8,
944 	.hid_width = 5,
945 	.parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map,
946 	.freq_tbl = ftbl_mclk0_clk_src,
947 	.clkr.hw.init = &(struct clk_init_data){
948 		.name = "mclk3_clk_src",
949 		.parent_data = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div,
950 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div),
951 		.ops = &clk_rcg2_ops,
952 	},
953 };
954 
955 static const struct freq_tbl ftbl_cci_clk_src[] = {
956 	F(19200000, P_XO, 1, 0, 0),
957 	F(37500000, P_GPLL0, 16, 0, 0),
958 	F(50000000, P_GPLL0, 12, 0, 0),
959 	F(100000000, P_GPLL0, 6, 0, 0),
960 	{ }
961 };
962 
963 static struct clk_rcg2 cci_clk_src = {
964 	.cmd_rcgr = 0x3300,
965 	.mnd_width = 8,
966 	.hid_width = 5,
967 	.parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map,
968 	.freq_tbl = ftbl_cci_clk_src,
969 	.clkr.hw.init = &(struct clk_init_data){
970 		.name = "cci_clk_src",
971 		.parent_data = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div,
972 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div),
973 		.ops = &clk_rcg2_ops,
974 	},
975 };
976 
977 static const struct freq_tbl ftbl_csi0phytimer_clk_src[] = {
978 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
979 	F(200000000, P_GPLL0, 3, 0, 0),
980 	F(266666667, P_MMPLL0, 3, 0, 0),
981 	{ }
982 };
983 
984 static struct clk_rcg2 csi0phytimer_clk_src = {
985 	.cmd_rcgr = 0x3000,
986 	.hid_width = 5,
987 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
988 	.freq_tbl = ftbl_csi0phytimer_clk_src,
989 	.clkr.hw.init = &(struct clk_init_data){
990 		.name = "csi0phytimer_clk_src",
991 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
992 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
993 		.ops = &clk_rcg2_ops,
994 	},
995 };
996 
997 static struct clk_rcg2 csi1phytimer_clk_src = {
998 	.cmd_rcgr = 0x3030,
999 	.hid_width = 5,
1000 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1001 	.freq_tbl = ftbl_csi0phytimer_clk_src,
1002 	.clkr.hw.init = &(struct clk_init_data){
1003 		.name = "csi1phytimer_clk_src",
1004 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1005 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1006 		.ops = &clk_rcg2_ops,
1007 	},
1008 };
1009 
1010 static struct clk_rcg2 csi2phytimer_clk_src = {
1011 	.cmd_rcgr = 0x3060,
1012 	.hid_width = 5,
1013 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1014 	.freq_tbl = ftbl_csi0phytimer_clk_src,
1015 	.clkr.hw.init = &(struct clk_init_data){
1016 		.name = "csi2phytimer_clk_src",
1017 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1018 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1019 		.ops = &clk_rcg2_ops,
1020 	},
1021 };
1022 
1023 static const struct freq_tbl ftbl_csiphy0_3p_clk_src[] = {
1024 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
1025 	F(200000000, P_GPLL0, 3, 0, 0),
1026 	F(320000000, P_MMPLL4, 3, 0, 0),
1027 	F(384000000, P_MMPLL4, 2.5, 0, 0),
1028 	{ }
1029 };
1030 
1031 static struct clk_rcg2 csiphy0_3p_clk_src = {
1032 	.cmd_rcgr = 0x3240,
1033 	.hid_width = 5,
1034 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1035 	.freq_tbl = ftbl_csiphy0_3p_clk_src,
1036 	.clkr.hw.init = &(struct clk_init_data){
1037 		.name = "csiphy0_3p_clk_src",
1038 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1039 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1040 		.ops = &clk_rcg2_ops,
1041 	},
1042 };
1043 
1044 static struct clk_rcg2 csiphy1_3p_clk_src = {
1045 	.cmd_rcgr = 0x3260,
1046 	.hid_width = 5,
1047 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1048 	.freq_tbl = ftbl_csiphy0_3p_clk_src,
1049 	.clkr.hw.init = &(struct clk_init_data){
1050 		.name = "csiphy1_3p_clk_src",
1051 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1052 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1053 		.ops = &clk_rcg2_ops,
1054 	},
1055 };
1056 
1057 static struct clk_rcg2 csiphy2_3p_clk_src = {
1058 	.cmd_rcgr = 0x3280,
1059 	.hid_width = 5,
1060 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1061 	.freq_tbl = ftbl_csiphy0_3p_clk_src,
1062 	.clkr.hw.init = &(struct clk_init_data){
1063 		.name = "csiphy2_3p_clk_src",
1064 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1065 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1066 		.ops = &clk_rcg2_ops,
1067 	},
1068 };
1069 
1070 static const struct freq_tbl ftbl_jpeg0_clk_src[] = {
1071 	F(75000000, P_GPLL0_DIV, 4, 0, 0),
1072 	F(150000000, P_GPLL0, 4, 0, 0),
1073 	F(228571429, P_MMPLL0, 3.5, 0, 0),
1074 	F(266666667, P_MMPLL0, 3, 0, 0),
1075 	F(320000000, P_MMPLL0, 2.5, 0, 0),
1076 	F(480000000, P_MMPLL4, 2, 0, 0),
1077 	{ }
1078 };
1079 
1080 static struct clk_rcg2 jpeg0_clk_src = {
1081 	.cmd_rcgr = 0x3500,
1082 	.hid_width = 5,
1083 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1084 	.freq_tbl = ftbl_jpeg0_clk_src,
1085 	.clkr.hw.init = &(struct clk_init_data){
1086 		.name = "jpeg0_clk_src",
1087 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1088 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1089 		.ops = &clk_rcg2_ops,
1090 	},
1091 };
1092 
1093 static const struct freq_tbl ftbl_jpeg2_clk_src[] = {
1094 	F(75000000, P_GPLL0_DIV, 4, 0, 0),
1095 	F(150000000, P_GPLL0, 4, 0, 0),
1096 	F(228571429, P_MMPLL0, 3.5, 0, 0),
1097 	F(266666667, P_MMPLL0, 3, 0, 0),
1098 	F(320000000, P_MMPLL0, 2.5, 0, 0),
1099 	{ }
1100 };
1101 
1102 static struct clk_rcg2 jpeg2_clk_src = {
1103 	.cmd_rcgr = 0x3540,
1104 	.hid_width = 5,
1105 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1106 	.freq_tbl = ftbl_jpeg2_clk_src,
1107 	.clkr.hw.init = &(struct clk_init_data){
1108 		.name = "jpeg2_clk_src",
1109 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1110 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1111 		.ops = &clk_rcg2_ops,
1112 	},
1113 };
1114 
1115 static struct clk_rcg2 jpeg_dma_clk_src = {
1116 	.cmd_rcgr = 0x3560,
1117 	.hid_width = 5,
1118 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1119 	.freq_tbl = ftbl_jpeg0_clk_src,
1120 	.clkr.hw.init = &(struct clk_init_data){
1121 		.name = "jpeg_dma_clk_src",
1122 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1123 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1124 		.ops = &clk_rcg2_ops,
1125 	},
1126 };
1127 
1128 static const struct freq_tbl ftbl_vfe0_clk_src[] = {
1129 	F(75000000, P_GPLL0_DIV, 4, 0, 0),
1130 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
1131 	F(300000000, P_GPLL0, 2, 0, 0),
1132 	F(320000000, P_MMPLL0, 2.5, 0, 0),
1133 	F(480000000, P_MMPLL4, 2, 0, 0),
1134 	F(600000000, P_GPLL0, 1, 0, 0),
1135 	{ }
1136 };
1137 
1138 static struct clk_rcg2 vfe0_clk_src = {
1139 	.cmd_rcgr = 0x3600,
1140 	.hid_width = 5,
1141 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1142 	.freq_tbl = ftbl_vfe0_clk_src,
1143 	.clkr.hw.init = &(struct clk_init_data){
1144 		.name = "vfe0_clk_src",
1145 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1146 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1147 		.ops = &clk_rcg2_ops,
1148 	},
1149 };
1150 
1151 static struct clk_rcg2 vfe1_clk_src = {
1152 	.cmd_rcgr = 0x3620,
1153 	.hid_width = 5,
1154 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1155 	.freq_tbl = ftbl_vfe0_clk_src,
1156 	.clkr.hw.init = &(struct clk_init_data){
1157 		.name = "vfe1_clk_src",
1158 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1159 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1160 		.ops = &clk_rcg2_ops,
1161 	},
1162 };
1163 
1164 static const struct freq_tbl ftbl_cpp_clk_src[] = {
1165 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
1166 	F(200000000, P_GPLL0, 3, 0, 0),
1167 	F(320000000, P_MMPLL0, 2.5, 0, 0),
1168 	F(480000000, P_MMPLL4, 2, 0, 0),
1169 	F(640000000, P_MMPLL4, 1.5, 0, 0),
1170 	{ }
1171 };
1172 
1173 static struct clk_rcg2 cpp_clk_src = {
1174 	.cmd_rcgr = 0x3640,
1175 	.hid_width = 5,
1176 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1177 	.freq_tbl = ftbl_cpp_clk_src,
1178 	.clkr.hw.init = &(struct clk_init_data){
1179 		.name = "cpp_clk_src",
1180 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1181 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1182 		.ops = &clk_rcg2_ops,
1183 	},
1184 };
1185 
1186 static const struct freq_tbl ftbl_csi0_clk_src[] = {
1187 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
1188 	F(200000000, P_GPLL0, 3, 0, 0),
1189 	F(266666667, P_MMPLL0, 3, 0, 0),
1190 	F(480000000, P_MMPLL4, 2, 0, 0),
1191 	F(600000000, P_GPLL0, 1, 0, 0),
1192 	{ }
1193 };
1194 
1195 static struct clk_rcg2 csi0_clk_src = {
1196 	.cmd_rcgr = 0x3090,
1197 	.hid_width = 5,
1198 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1199 	.freq_tbl = ftbl_csi0_clk_src,
1200 	.clkr.hw.init = &(struct clk_init_data){
1201 		.name = "csi0_clk_src",
1202 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1203 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1204 		.ops = &clk_rcg2_ops,
1205 	},
1206 };
1207 
1208 static struct clk_rcg2 csi1_clk_src = {
1209 	.cmd_rcgr = 0x3100,
1210 	.hid_width = 5,
1211 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1212 	.freq_tbl = ftbl_csi0_clk_src,
1213 	.clkr.hw.init = &(struct clk_init_data){
1214 		.name = "csi1_clk_src",
1215 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1216 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1217 		.ops = &clk_rcg2_ops,
1218 	},
1219 };
1220 
1221 static struct clk_rcg2 csi2_clk_src = {
1222 	.cmd_rcgr = 0x3160,
1223 	.hid_width = 5,
1224 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1225 	.freq_tbl = ftbl_csi0_clk_src,
1226 	.clkr.hw.init = &(struct clk_init_data){
1227 		.name = "csi2_clk_src",
1228 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1229 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1230 		.ops = &clk_rcg2_ops,
1231 	},
1232 };
1233 
1234 static struct clk_rcg2 csi3_clk_src = {
1235 	.cmd_rcgr = 0x31c0,
1236 	.hid_width = 5,
1237 	.parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map,
1238 	.freq_tbl = ftbl_csi0_clk_src,
1239 	.clkr.hw.init = &(struct clk_init_data){
1240 		.name = "csi3_clk_src",
1241 		.parent_data = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div,
1242 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div),
1243 		.ops = &clk_rcg2_ops,
1244 	},
1245 };
1246 
1247 static const struct freq_tbl ftbl_fd_core_clk_src[] = {
1248 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
1249 	F(200000000, P_GPLL0, 3, 0, 0),
1250 	F(400000000, P_MMPLL0, 2, 0, 0),
1251 	{ }
1252 };
1253 
1254 static struct clk_rcg2 fd_core_clk_src = {
1255 	.cmd_rcgr = 0x3b00,
1256 	.hid_width = 5,
1257 	.parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map,
1258 	.freq_tbl = ftbl_fd_core_clk_src,
1259 	.clkr.hw.init = &(struct clk_init_data){
1260 		.name = "fd_core_clk_src",
1261 		.parent_data = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div,
1262 		.num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div),
1263 		.ops = &clk_rcg2_ops,
1264 	},
1265 };
1266 
1267 static struct clk_branch mmss_mmagic_ahb_clk = {
1268 	.halt_reg = 0x5024,
1269 	.clkr = {
1270 		.enable_reg = 0x5024,
1271 		.enable_mask = BIT(0),
1272 		.hw.init = &(struct clk_init_data){
1273 			.name = "mmss_mmagic_ahb_clk",
1274 			.parent_hws = (const struct clk_hw*[]){
1275 				&ahb_clk_src.clkr.hw
1276 			},
1277 			.num_parents = 1,
1278 			.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
1279 			.ops = &clk_branch2_ops,
1280 		},
1281 	},
1282 };
1283 
1284 static struct clk_branch mmss_mmagic_cfg_ahb_clk = {
1285 	.halt_reg = 0x5054,
1286 	.clkr = {
1287 		.enable_reg = 0x5054,
1288 		.enable_mask = BIT(0),
1289 		.hw.init = &(struct clk_init_data){
1290 			.name = "mmss_mmagic_cfg_ahb_clk",
1291 			.parent_hws = (const struct clk_hw*[]){
1292 				&ahb_clk_src.clkr.hw
1293 			},
1294 			.num_parents = 1,
1295 			.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
1296 			.ops = &clk_branch2_ops,
1297 		},
1298 	},
1299 };
1300 
1301 static struct clk_branch mmss_misc_ahb_clk = {
1302 	.halt_reg = 0x5018,
1303 	.clkr = {
1304 		.enable_reg = 0x5018,
1305 		.enable_mask = BIT(0),
1306 		.hw.init = &(struct clk_init_data){
1307 			.name = "mmss_misc_ahb_clk",
1308 			.parent_hws = (const struct clk_hw*[]){
1309 				&ahb_clk_src.clkr.hw
1310 			},
1311 			.num_parents = 1,
1312 			.flags = CLK_SET_RATE_PARENT,
1313 			.ops = &clk_branch2_ops,
1314 		},
1315 	},
1316 };
1317 
1318 static struct clk_branch mmss_misc_cxo_clk = {
1319 	.halt_reg = 0x5014,
1320 	.clkr = {
1321 		.enable_reg = 0x5014,
1322 		.enable_mask = BIT(0),
1323 		.hw.init = &(struct clk_init_data){
1324 			.name = "mmss_misc_cxo_clk",
1325 			.parent_data = (const struct clk_parent_data[]){
1326 				{ .fw_name = "xo", .name = "xo_board" },
1327 			},
1328 			.num_parents = 1,
1329 			.ops = &clk_branch2_ops,
1330 		},
1331 	},
1332 };
1333 
1334 static struct clk_branch mmss_mmagic_maxi_clk = {
1335 	.halt_reg = 0x5074,
1336 	.clkr = {
1337 		.enable_reg = 0x5074,
1338 		.enable_mask = BIT(0),
1339 		.hw.init = &(struct clk_init_data){
1340 			.name = "mmss_mmagic_maxi_clk",
1341 			.parent_hws = (const struct clk_hw*[]){
1342 				&maxi_clk_src.clkr.hw
1343 			},
1344 			.num_parents = 1,
1345 			.flags = CLK_SET_RATE_PARENT,
1346 			.ops = &clk_branch2_ops,
1347 		},
1348 	},
1349 };
1350 
1351 static struct clk_branch mmagic_camss_axi_clk = {
1352 	.halt_reg = 0x3c44,
1353 	.clkr = {
1354 		.enable_reg = 0x3c44,
1355 		.enable_mask = BIT(0),
1356 		.hw.init = &(struct clk_init_data){
1357 			.name = "mmagic_camss_axi_clk",
1358 			.parent_hws = (const struct clk_hw*[]){
1359 				&axi_clk_src.clkr.hw
1360 			},
1361 			.num_parents = 1,
1362 			.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
1363 			.ops = &clk_branch2_ops,
1364 		},
1365 	},
1366 };
1367 
1368 static struct clk_branch mmagic_camss_noc_cfg_ahb_clk = {
1369 	.halt_reg = 0x3c48,
1370 	.clkr = {
1371 		.enable_reg = 0x3c48,
1372 		.enable_mask = BIT(0),
1373 		.hw.init = &(struct clk_init_data){
1374 			.name = "mmagic_camss_noc_cfg_ahb_clk",
1375 			.parent_data = (const struct clk_parent_data[]){
1376 				{ .fw_name = "gcc_mmss_noc_cfg_ahb_clk", .name = "gcc_mmss_noc_cfg_ahb_clk" },
1377 			},
1378 			.num_parents = 1,
1379 			.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
1380 			.ops = &clk_branch2_ops,
1381 		},
1382 	},
1383 };
1384 
1385 static struct clk_branch smmu_vfe_ahb_clk = {
1386 	.halt_reg = 0x3c04,
1387 	.clkr = {
1388 		.enable_reg = 0x3c04,
1389 		.enable_mask = BIT(0),
1390 		.hw.init = &(struct clk_init_data){
1391 			.name = "smmu_vfe_ahb_clk",
1392 			.parent_hws = (const struct clk_hw*[]){
1393 				&ahb_clk_src.clkr.hw
1394 			},
1395 			.num_parents = 1,
1396 			.flags = CLK_SET_RATE_PARENT,
1397 			.ops = &clk_branch2_ops,
1398 		},
1399 	},
1400 };
1401 
1402 static struct clk_branch smmu_vfe_axi_clk = {
1403 	.halt_reg = 0x3c08,
1404 	.clkr = {
1405 		.enable_reg = 0x3c08,
1406 		.enable_mask = BIT(0),
1407 		.hw.init = &(struct clk_init_data){
1408 			.name = "smmu_vfe_axi_clk",
1409 			.parent_hws = (const struct clk_hw*[]){
1410 				&axi_clk_src.clkr.hw
1411 			},
1412 			.num_parents = 1,
1413 			.flags = CLK_SET_RATE_PARENT,
1414 			.ops = &clk_branch2_ops,
1415 		},
1416 	},
1417 };
1418 
1419 static struct clk_branch smmu_cpp_ahb_clk = {
1420 	.halt_reg = 0x3c14,
1421 	.clkr = {
1422 		.enable_reg = 0x3c14,
1423 		.enable_mask = BIT(0),
1424 		.hw.init = &(struct clk_init_data){
1425 			.name = "smmu_cpp_ahb_clk",
1426 			.parent_hws = (const struct clk_hw*[]){
1427 				&ahb_clk_src.clkr.hw
1428 			},
1429 			.num_parents = 1,
1430 			.flags = CLK_SET_RATE_PARENT,
1431 			.ops = &clk_branch2_ops,
1432 		},
1433 	},
1434 };
1435 
1436 static struct clk_branch smmu_cpp_axi_clk = {
1437 	.halt_reg = 0x3c18,
1438 	.clkr = {
1439 		.enable_reg = 0x3c18,
1440 		.enable_mask = BIT(0),
1441 		.hw.init = &(struct clk_init_data){
1442 			.name = "smmu_cpp_axi_clk",
1443 			.parent_hws = (const struct clk_hw*[]){
1444 				&axi_clk_src.clkr.hw
1445 			},
1446 			.num_parents = 1,
1447 			.flags = CLK_SET_RATE_PARENT,
1448 			.ops = &clk_branch2_ops,
1449 		},
1450 	},
1451 };
1452 
1453 static struct clk_branch smmu_jpeg_ahb_clk = {
1454 	.halt_reg = 0x3c24,
1455 	.clkr = {
1456 		.enable_reg = 0x3c24,
1457 		.enable_mask = BIT(0),
1458 		.hw.init = &(struct clk_init_data){
1459 			.name = "smmu_jpeg_ahb_clk",
1460 			.parent_hws = (const struct clk_hw*[]){
1461 				&ahb_clk_src.clkr.hw
1462 			},
1463 			.num_parents = 1,
1464 			.flags = CLK_SET_RATE_PARENT,
1465 			.ops = &clk_branch2_ops,
1466 		},
1467 	},
1468 };
1469 
1470 static struct clk_branch smmu_jpeg_axi_clk = {
1471 	.halt_reg = 0x3c28,
1472 	.clkr = {
1473 		.enable_reg = 0x3c28,
1474 		.enable_mask = BIT(0),
1475 		.hw.init = &(struct clk_init_data){
1476 			.name = "smmu_jpeg_axi_clk",
1477 			.parent_hws = (const struct clk_hw*[]){
1478 				&axi_clk_src.clkr.hw
1479 			},
1480 			.num_parents = 1,
1481 			.flags = CLK_SET_RATE_PARENT,
1482 			.ops = &clk_branch2_ops,
1483 		},
1484 	},
1485 };
1486 
1487 static struct clk_branch mmagic_mdss_axi_clk = {
1488 	.halt_reg = 0x2474,
1489 	.clkr = {
1490 		.enable_reg = 0x2474,
1491 		.enable_mask = BIT(0),
1492 		.hw.init = &(struct clk_init_data){
1493 			.name = "mmagic_mdss_axi_clk",
1494 			.parent_hws = (const struct clk_hw*[]){
1495 				&axi_clk_src.clkr.hw
1496 			},
1497 			.num_parents = 1,
1498 			.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
1499 			.ops = &clk_branch2_ops,
1500 		},
1501 	},
1502 };
1503 
1504 static struct clk_branch mmagic_mdss_noc_cfg_ahb_clk = {
1505 	.halt_reg = 0x2478,
1506 	.clkr = {
1507 		.enable_reg = 0x2478,
1508 		.enable_mask = BIT(0),
1509 		.hw.init = &(struct clk_init_data){
1510 			.name = "mmagic_mdss_noc_cfg_ahb_clk",
1511 			.parent_data = (const struct clk_parent_data[]){
1512 				{ .fw_name = "gcc_mmss_noc_cfg_ahb_clk", .name = "gcc_mmss_noc_cfg_ahb_clk" },
1513 			},
1514 			.num_parents = 1,
1515 			.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
1516 			.ops = &clk_branch2_ops,
1517 		},
1518 	},
1519 };
1520 
1521 static struct clk_branch smmu_rot_ahb_clk = {
1522 	.halt_reg = 0x2444,
1523 	.clkr = {
1524 		.enable_reg = 0x2444,
1525 		.enable_mask = BIT(0),
1526 		.hw.init = &(struct clk_init_data){
1527 			.name = "smmu_rot_ahb_clk",
1528 			.parent_hws = (const struct clk_hw*[]){
1529 				&ahb_clk_src.clkr.hw
1530 			},
1531 			.num_parents = 1,
1532 			.flags = CLK_SET_RATE_PARENT,
1533 			.ops = &clk_branch2_ops,
1534 		},
1535 	},
1536 };
1537 
1538 static struct clk_branch smmu_rot_axi_clk = {
1539 	.halt_reg = 0x2448,
1540 	.clkr = {
1541 		.enable_reg = 0x2448,
1542 		.enable_mask = BIT(0),
1543 		.hw.init = &(struct clk_init_data){
1544 			.name = "smmu_rot_axi_clk",
1545 			.parent_hws = (const struct clk_hw*[]){
1546 				&axi_clk_src.clkr.hw
1547 			},
1548 			.num_parents = 1,
1549 			.flags = CLK_SET_RATE_PARENT,
1550 			.ops = &clk_branch2_ops,
1551 		},
1552 	},
1553 };
1554 
1555 static struct clk_branch smmu_mdp_ahb_clk = {
1556 	.halt_reg = 0x2454,
1557 	.clkr = {
1558 		.enable_reg = 0x2454,
1559 		.enable_mask = BIT(0),
1560 		.hw.init = &(struct clk_init_data){
1561 			.name = "smmu_mdp_ahb_clk",
1562 			.parent_hws = (const struct clk_hw*[]){
1563 				&ahb_clk_src.clkr.hw
1564 			},
1565 			.num_parents = 1,
1566 			.flags = CLK_SET_RATE_PARENT,
1567 			.ops = &clk_branch2_ops,
1568 		},
1569 	},
1570 };
1571 
1572 static struct clk_branch smmu_mdp_axi_clk = {
1573 	.halt_reg = 0x2458,
1574 	.clkr = {
1575 		.enable_reg = 0x2458,
1576 		.enable_mask = BIT(0),
1577 		.hw.init = &(struct clk_init_data){
1578 			.name = "smmu_mdp_axi_clk",
1579 			.parent_hws = (const struct clk_hw*[]){
1580 				&axi_clk_src.clkr.hw
1581 			},
1582 			.num_parents = 1,
1583 			.flags = CLK_SET_RATE_PARENT,
1584 			.ops = &clk_branch2_ops,
1585 		},
1586 	},
1587 };
1588 
1589 static struct clk_branch mmagic_video_axi_clk = {
1590 	.halt_reg = 0x1194,
1591 	.clkr = {
1592 		.enable_reg = 0x1194,
1593 		.enable_mask = BIT(0),
1594 		.hw.init = &(struct clk_init_data){
1595 			.name = "mmagic_video_axi_clk",
1596 			.parent_hws = (const struct clk_hw*[]){
1597 				&axi_clk_src.clkr.hw
1598 			},
1599 			.num_parents = 1,
1600 			.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
1601 			.ops = &clk_branch2_ops,
1602 		},
1603 	},
1604 };
1605 
1606 static struct clk_branch mmagic_video_noc_cfg_ahb_clk = {
1607 	.halt_reg = 0x1198,
1608 	.clkr = {
1609 		.enable_reg = 0x1198,
1610 		.enable_mask = BIT(0),
1611 		.hw.init = &(struct clk_init_data){
1612 			.name = "mmagic_video_noc_cfg_ahb_clk",
1613 			.parent_data = (const struct clk_parent_data[]){
1614 				{ .fw_name = "gcc_mmss_noc_cfg_ahb_clk", .name = "gcc_mmss_noc_cfg_ahb_clk" },
1615 			},
1616 			.num_parents = 1,
1617 			.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
1618 			.ops = &clk_branch2_ops,
1619 		},
1620 	},
1621 };
1622 
1623 static struct clk_branch smmu_video_ahb_clk = {
1624 	.halt_reg = 0x1174,
1625 	.clkr = {
1626 		.enable_reg = 0x1174,
1627 		.enable_mask = BIT(0),
1628 		.hw.init = &(struct clk_init_data){
1629 			.name = "smmu_video_ahb_clk",
1630 			.parent_hws = (const struct clk_hw*[]){
1631 				&ahb_clk_src.clkr.hw
1632 			},
1633 			.num_parents = 1,
1634 			.flags = CLK_SET_RATE_PARENT,
1635 			.ops = &clk_branch2_ops,
1636 		},
1637 	},
1638 };
1639 
1640 static struct clk_branch smmu_video_axi_clk = {
1641 	.halt_reg = 0x1178,
1642 	.clkr = {
1643 		.enable_reg = 0x1178,
1644 		.enable_mask = BIT(0),
1645 		.hw.init = &(struct clk_init_data){
1646 			.name = "smmu_video_axi_clk",
1647 			.parent_hws = (const struct clk_hw*[]){
1648 				&axi_clk_src.clkr.hw
1649 			},
1650 			.num_parents = 1,
1651 			.flags = CLK_SET_RATE_PARENT,
1652 			.ops = &clk_branch2_ops,
1653 		},
1654 	},
1655 };
1656 
1657 static struct clk_branch mmagic_bimc_noc_cfg_ahb_clk = {
1658 	.halt_reg = 0x5298,
1659 	.clkr = {
1660 		.enable_reg = 0x5298,
1661 		.enable_mask = BIT(0),
1662 		.hw.init = &(struct clk_init_data){
1663 			.name = "mmagic_bimc_noc_cfg_ahb_clk",
1664 			.parent_data = (const struct clk_parent_data[]){
1665 				{ .fw_name = "gcc_mmss_noc_cfg_ahb_clk", .name = "gcc_mmss_noc_cfg_ahb_clk" },
1666 			},
1667 			.num_parents = 1,
1668 			.flags = CLK_SET_RATE_PARENT,
1669 			.ops = &clk_branch2_ops,
1670 		},
1671 	},
1672 };
1673 
1674 static struct clk_branch gpu_gx_gfx3d_clk = {
1675 	.halt_reg = 0x4028,
1676 	.clkr = {
1677 		.enable_reg = 0x4028,
1678 		.enable_mask = BIT(0),
1679 		.hw.init = &(struct clk_init_data){
1680 			.name = "gpu_gx_gfx3d_clk",
1681 			.parent_hws = (const struct clk_hw*[]){
1682 				&gfx3d_clk_src.rcg.clkr.hw
1683 			},
1684 			.num_parents = 1,
1685 			.flags = CLK_SET_RATE_PARENT,
1686 			.ops = &clk_branch2_ops,
1687 		},
1688 	},
1689 };
1690 
1691 static struct clk_branch gpu_gx_rbbmtimer_clk = {
1692 	.halt_reg = 0x40b0,
1693 	.clkr = {
1694 		.enable_reg = 0x40b0,
1695 		.enable_mask = BIT(0),
1696 		.hw.init = &(struct clk_init_data){
1697 			.name = "gpu_gx_rbbmtimer_clk",
1698 			.parent_hws = (const struct clk_hw*[]){
1699 				&rbbmtimer_clk_src.clkr.hw
1700 			},
1701 			.num_parents = 1,
1702 			.flags = CLK_SET_RATE_PARENT,
1703 			.ops = &clk_branch2_ops,
1704 		},
1705 	},
1706 };
1707 
1708 static struct clk_branch gpu_ahb_clk = {
1709 	.halt_reg = 0x403c,
1710 	.clkr = {
1711 		.enable_reg = 0x403c,
1712 		.enable_mask = BIT(0),
1713 		.hw.init = &(struct clk_init_data){
1714 			.name = "gpu_ahb_clk",
1715 			.parent_hws = (const struct clk_hw*[]){
1716 				&ahb_clk_src.clkr.hw
1717 			},
1718 			.num_parents = 1,
1719 			.flags = CLK_SET_RATE_PARENT,
1720 			.ops = &clk_branch2_ops,
1721 		},
1722 	},
1723 };
1724 
1725 static struct clk_branch gpu_aon_isense_clk = {
1726 	.halt_reg = 0x4044,
1727 	.clkr = {
1728 		.enable_reg = 0x4044,
1729 		.enable_mask = BIT(0),
1730 		.hw.init = &(struct clk_init_data){
1731 			.name = "gpu_aon_isense_clk",
1732 			.parent_hws = (const struct clk_hw*[]){
1733 				&isense_clk_src.clkr.hw
1734 			},
1735 			.num_parents = 1,
1736 			.flags = CLK_SET_RATE_PARENT,
1737 			.ops = &clk_branch2_ops,
1738 		},
1739 	},
1740 };
1741 
1742 static struct clk_branch vmem_maxi_clk = {
1743 	.halt_reg = 0x1204,
1744 	.clkr = {
1745 		.enable_reg = 0x1204,
1746 		.enable_mask = BIT(0),
1747 		.hw.init = &(struct clk_init_data){
1748 			.name = "vmem_maxi_clk",
1749 			.parent_hws = (const struct clk_hw*[]){
1750 				&maxi_clk_src.clkr.hw
1751 			},
1752 			.num_parents = 1,
1753 			.flags = CLK_SET_RATE_PARENT,
1754 			.ops = &clk_branch2_ops,
1755 		},
1756 	},
1757 };
1758 
1759 static struct clk_branch vmem_ahb_clk = {
1760 	.halt_reg = 0x1208,
1761 	.clkr = {
1762 		.enable_reg = 0x1208,
1763 		.enable_mask = BIT(0),
1764 		.hw.init = &(struct clk_init_data){
1765 			.name = "vmem_ahb_clk",
1766 			.parent_hws = (const struct clk_hw*[]){
1767 				&ahb_clk_src.clkr.hw
1768 			},
1769 			.num_parents = 1,
1770 			.flags = CLK_SET_RATE_PARENT,
1771 			.ops = &clk_branch2_ops,
1772 		},
1773 	},
1774 };
1775 
1776 static struct clk_branch mmss_rbcpr_clk = {
1777 	.halt_reg = 0x4084,
1778 	.clkr = {
1779 		.enable_reg = 0x4084,
1780 		.enable_mask = BIT(0),
1781 		.hw.init = &(struct clk_init_data){
1782 			.name = "mmss_rbcpr_clk",
1783 			.parent_hws = (const struct clk_hw*[]){
1784 				&rbcpr_clk_src.clkr.hw
1785 			},
1786 			.num_parents = 1,
1787 			.flags = CLK_SET_RATE_PARENT,
1788 			.ops = &clk_branch2_ops,
1789 		},
1790 	},
1791 };
1792 
1793 static struct clk_branch mmss_rbcpr_ahb_clk = {
1794 	.halt_reg = 0x4088,
1795 	.clkr = {
1796 		.enable_reg = 0x4088,
1797 		.enable_mask = BIT(0),
1798 		.hw.init = &(struct clk_init_data){
1799 			.name = "mmss_rbcpr_ahb_clk",
1800 			.parent_hws = (const struct clk_hw*[]){
1801 				&ahb_clk_src.clkr.hw
1802 			},
1803 			.num_parents = 1,
1804 			.flags = CLK_SET_RATE_PARENT,
1805 			.ops = &clk_branch2_ops,
1806 		},
1807 	},
1808 };
1809 
1810 static struct clk_branch video_core_clk = {
1811 	.halt_reg = 0x1028,
1812 	.clkr = {
1813 		.enable_reg = 0x1028,
1814 		.enable_mask = BIT(0),
1815 		.hw.init = &(struct clk_init_data){
1816 			.name = "video_core_clk",
1817 			.parent_hws = (const struct clk_hw*[]){
1818 				&video_core_clk_src.clkr.hw
1819 			},
1820 			.num_parents = 1,
1821 			.flags = CLK_SET_RATE_PARENT,
1822 			.ops = &clk_branch2_ops,
1823 		},
1824 	},
1825 };
1826 
1827 static struct clk_branch video_axi_clk = {
1828 	.halt_reg = 0x1034,
1829 	.clkr = {
1830 		.enable_reg = 0x1034,
1831 		.enable_mask = BIT(0),
1832 		.hw.init = &(struct clk_init_data){
1833 			.name = "video_axi_clk",
1834 			.parent_hws = (const struct clk_hw*[]){
1835 				&axi_clk_src.clkr.hw
1836 			},
1837 			.num_parents = 1,
1838 			.flags = CLK_SET_RATE_PARENT,
1839 			.ops = &clk_branch2_ops,
1840 		},
1841 	},
1842 };
1843 
1844 static struct clk_branch video_maxi_clk = {
1845 	.halt_reg = 0x1038,
1846 	.clkr = {
1847 		.enable_reg = 0x1038,
1848 		.enable_mask = BIT(0),
1849 		.hw.init = &(struct clk_init_data){
1850 			.name = "video_maxi_clk",
1851 			.parent_hws = (const struct clk_hw*[]){
1852 				&maxi_clk_src.clkr.hw
1853 			},
1854 			.num_parents = 1,
1855 			.flags = CLK_SET_RATE_PARENT,
1856 			.ops = &clk_branch2_ops,
1857 		},
1858 	},
1859 };
1860 
1861 static struct clk_branch video_ahb_clk = {
1862 	.halt_reg = 0x1030,
1863 	.clkr = {
1864 		.enable_reg = 0x1030,
1865 		.enable_mask = BIT(0),
1866 		.hw.init = &(struct clk_init_data){
1867 			.name = "video_ahb_clk",
1868 			.parent_hws = (const struct clk_hw*[]){
1869 				&ahb_clk_src.clkr.hw
1870 			},
1871 			.num_parents = 1,
1872 			.flags = CLK_SET_RATE_PARENT,
1873 			.ops = &clk_branch2_ops,
1874 		},
1875 	},
1876 };
1877 
1878 static struct clk_branch video_subcore0_clk = {
1879 	.halt_reg = 0x1048,
1880 	.clkr = {
1881 		.enable_reg = 0x1048,
1882 		.enable_mask = BIT(0),
1883 		.hw.init = &(struct clk_init_data){
1884 			.name = "video_subcore0_clk",
1885 			.parent_hws = (const struct clk_hw*[]){
1886 				&video_subcore0_clk_src.clkr.hw
1887 			},
1888 			.num_parents = 1,
1889 			.flags = CLK_SET_RATE_PARENT,
1890 			.ops = &clk_branch2_ops,
1891 		},
1892 	},
1893 };
1894 
1895 static struct clk_branch video_subcore1_clk = {
1896 	.halt_reg = 0x104c,
1897 	.clkr = {
1898 		.enable_reg = 0x104c,
1899 		.enable_mask = BIT(0),
1900 		.hw.init = &(struct clk_init_data){
1901 			.name = "video_subcore1_clk",
1902 			.parent_hws = (const struct clk_hw*[]){
1903 				&video_subcore1_clk_src.clkr.hw
1904 			},
1905 			.num_parents = 1,
1906 			.flags = CLK_SET_RATE_PARENT,
1907 			.ops = &clk_branch2_ops,
1908 		},
1909 	},
1910 };
1911 
1912 static struct clk_branch mdss_ahb_clk = {
1913 	.halt_reg = 0x2308,
1914 	.clkr = {
1915 		.enable_reg = 0x2308,
1916 		.enable_mask = BIT(0),
1917 		.hw.init = &(struct clk_init_data){
1918 			.name = "mdss_ahb_clk",
1919 			.parent_hws = (const struct clk_hw*[]){
1920 				&ahb_clk_src.clkr.hw
1921 			},
1922 			.num_parents = 1,
1923 			.flags = CLK_SET_RATE_PARENT,
1924 			.ops = &clk_branch2_ops,
1925 		},
1926 	},
1927 };
1928 
1929 static struct clk_branch mdss_hdmi_ahb_clk = {
1930 	.halt_reg = 0x230c,
1931 	.clkr = {
1932 		.enable_reg = 0x230c,
1933 		.enable_mask = BIT(0),
1934 		.hw.init = &(struct clk_init_data){
1935 			.name = "mdss_hdmi_ahb_clk",
1936 			.parent_hws = (const struct clk_hw*[]){
1937 				&ahb_clk_src.clkr.hw
1938 			},
1939 			.num_parents = 1,
1940 			.flags = CLK_SET_RATE_PARENT,
1941 			.ops = &clk_branch2_ops,
1942 		},
1943 	},
1944 };
1945 
1946 static struct clk_branch mdss_axi_clk = {
1947 	.halt_reg = 0x2310,
1948 	.clkr = {
1949 		.enable_reg = 0x2310,
1950 		.enable_mask = BIT(0),
1951 		.hw.init = &(struct clk_init_data){
1952 			.name = "mdss_axi_clk",
1953 			.parent_hws = (const struct clk_hw*[]){
1954 				&axi_clk_src.clkr.hw
1955 			},
1956 			.num_parents = 1,
1957 			.flags = CLK_SET_RATE_PARENT,
1958 			.ops = &clk_branch2_ops,
1959 		},
1960 	},
1961 };
1962 
1963 static struct clk_branch mdss_pclk0_clk = {
1964 	.halt_reg = 0x2314,
1965 	.clkr = {
1966 		.enable_reg = 0x2314,
1967 		.enable_mask = BIT(0),
1968 		.hw.init = &(struct clk_init_data){
1969 			.name = "mdss_pclk0_clk",
1970 			.parent_hws = (const struct clk_hw*[]){
1971 				&pclk0_clk_src.clkr.hw
1972 			},
1973 			.num_parents = 1,
1974 			.flags = CLK_SET_RATE_PARENT,
1975 			.ops = &clk_branch2_ops,
1976 		},
1977 	},
1978 };
1979 
1980 static struct clk_branch mdss_pclk1_clk = {
1981 	.halt_reg = 0x2318,
1982 	.clkr = {
1983 		.enable_reg = 0x2318,
1984 		.enable_mask = BIT(0),
1985 		.hw.init = &(struct clk_init_data){
1986 			.name = "mdss_pclk1_clk",
1987 			.parent_hws = (const struct clk_hw*[]){
1988 				&pclk1_clk_src.clkr.hw
1989 			},
1990 			.num_parents = 1,
1991 			.flags = CLK_SET_RATE_PARENT,
1992 			.ops = &clk_branch2_ops,
1993 		},
1994 	},
1995 };
1996 
1997 static struct clk_branch mdss_mdp_clk = {
1998 	.halt_reg = 0x231c,
1999 	.clkr = {
2000 		.enable_reg = 0x231c,
2001 		.enable_mask = BIT(0),
2002 		.hw.init = &(struct clk_init_data){
2003 			.name = "mdss_mdp_clk",
2004 			.parent_hws = (const struct clk_hw*[]){
2005 				&mdp_clk_src.clkr.hw
2006 			},
2007 			.num_parents = 1,
2008 			.flags = CLK_SET_RATE_PARENT,
2009 			.ops = &clk_branch2_ops,
2010 		},
2011 	},
2012 };
2013 
2014 static struct clk_branch mdss_extpclk_clk = {
2015 	.halt_reg = 0x2324,
2016 	.clkr = {
2017 		.enable_reg = 0x2324,
2018 		.enable_mask = BIT(0),
2019 		.hw.init = &(struct clk_init_data){
2020 			.name = "mdss_extpclk_clk",
2021 			.parent_hws = (const struct clk_hw*[]){
2022 				&extpclk_clk_src.clkr.hw
2023 			},
2024 			.num_parents = 1,
2025 			.flags = CLK_SET_RATE_PARENT,
2026 			.ops = &clk_branch2_ops,
2027 		},
2028 	},
2029 };
2030 
2031 static struct clk_branch mdss_vsync_clk = {
2032 	.halt_reg = 0x2328,
2033 	.clkr = {
2034 		.enable_reg = 0x2328,
2035 		.enable_mask = BIT(0),
2036 		.hw.init = &(struct clk_init_data){
2037 			.name = "mdss_vsync_clk",
2038 			.parent_hws = (const struct clk_hw*[]){
2039 				&vsync_clk_src.clkr.hw
2040 			},
2041 			.num_parents = 1,
2042 			.flags = CLK_SET_RATE_PARENT,
2043 			.ops = &clk_branch2_ops,
2044 		},
2045 	},
2046 };
2047 
2048 static struct clk_branch mdss_hdmi_clk = {
2049 	.halt_reg = 0x2338,
2050 	.clkr = {
2051 		.enable_reg = 0x2338,
2052 		.enable_mask = BIT(0),
2053 		.hw.init = &(struct clk_init_data){
2054 			.name = "mdss_hdmi_clk",
2055 			.parent_hws = (const struct clk_hw*[]){
2056 				&hdmi_clk_src.clkr.hw
2057 			},
2058 			.num_parents = 1,
2059 			.flags = CLK_SET_RATE_PARENT,
2060 			.ops = &clk_branch2_ops,
2061 		},
2062 	},
2063 };
2064 
2065 static struct clk_branch mdss_byte0_clk = {
2066 	.halt_reg = 0x233c,
2067 	.clkr = {
2068 		.enable_reg = 0x233c,
2069 		.enable_mask = BIT(0),
2070 		.hw.init = &(struct clk_init_data){
2071 			.name = "mdss_byte0_clk",
2072 			.parent_hws = (const struct clk_hw*[]){
2073 				&byte0_clk_src.clkr.hw
2074 			},
2075 			.num_parents = 1,
2076 			.flags = CLK_SET_RATE_PARENT,
2077 			.ops = &clk_branch2_ops,
2078 		},
2079 	},
2080 };
2081 
2082 static struct clk_branch mdss_byte1_clk = {
2083 	.halt_reg = 0x2340,
2084 	.clkr = {
2085 		.enable_reg = 0x2340,
2086 		.enable_mask = BIT(0),
2087 		.hw.init = &(struct clk_init_data){
2088 			.name = "mdss_byte1_clk",
2089 			.parent_hws = (const struct clk_hw*[]){
2090 				&byte1_clk_src.clkr.hw
2091 			},
2092 			.num_parents = 1,
2093 			.flags = CLK_SET_RATE_PARENT,
2094 			.ops = &clk_branch2_ops,
2095 		},
2096 	},
2097 };
2098 
2099 static struct clk_branch mdss_esc0_clk = {
2100 	.halt_reg = 0x2344,
2101 	.clkr = {
2102 		.enable_reg = 0x2344,
2103 		.enable_mask = BIT(0),
2104 		.hw.init = &(struct clk_init_data){
2105 			.name = "mdss_esc0_clk",
2106 			.parent_hws = (const struct clk_hw*[]){
2107 				&esc0_clk_src.clkr.hw
2108 			},
2109 			.num_parents = 1,
2110 			.flags = CLK_SET_RATE_PARENT,
2111 			.ops = &clk_branch2_ops,
2112 		},
2113 	},
2114 };
2115 
2116 static struct clk_branch mdss_esc1_clk = {
2117 	.halt_reg = 0x2348,
2118 	.clkr = {
2119 		.enable_reg = 0x2348,
2120 		.enable_mask = BIT(0),
2121 		.hw.init = &(struct clk_init_data){
2122 			.name = "mdss_esc1_clk",
2123 			.parent_hws = (const struct clk_hw*[]){
2124 				&esc1_clk_src.clkr.hw
2125 			},
2126 			.num_parents = 1,
2127 			.flags = CLK_SET_RATE_PARENT,
2128 			.ops = &clk_branch2_ops,
2129 		},
2130 	},
2131 };
2132 
2133 static struct clk_branch camss_top_ahb_clk = {
2134 	.halt_reg = 0x3484,
2135 	.clkr = {
2136 		.enable_reg = 0x3484,
2137 		.enable_mask = BIT(0),
2138 		.hw.init = &(struct clk_init_data){
2139 			.name = "camss_top_ahb_clk",
2140 			.parent_hws = (const struct clk_hw*[]){
2141 				&ahb_clk_src.clkr.hw
2142 			},
2143 			.num_parents = 1,
2144 			.flags = CLK_SET_RATE_PARENT,
2145 			.ops = &clk_branch2_ops,
2146 		},
2147 	},
2148 };
2149 
2150 static struct clk_branch camss_ahb_clk = {
2151 	.halt_reg = 0x348c,
2152 	.clkr = {
2153 		.enable_reg = 0x348c,
2154 		.enable_mask = BIT(0),
2155 		.hw.init = &(struct clk_init_data){
2156 			.name = "camss_ahb_clk",
2157 			.parent_hws = (const struct clk_hw*[]){
2158 				&ahb_clk_src.clkr.hw
2159 			},
2160 			.num_parents = 1,
2161 			.flags = CLK_SET_RATE_PARENT,
2162 			.ops = &clk_branch2_ops,
2163 		},
2164 	},
2165 };
2166 
2167 static struct clk_branch camss_micro_ahb_clk = {
2168 	.halt_reg = 0x3494,
2169 	.clkr = {
2170 		.enable_reg = 0x3494,
2171 		.enable_mask = BIT(0),
2172 		.hw.init = &(struct clk_init_data){
2173 			.name = "camss_micro_ahb_clk",
2174 			.parent_hws = (const struct clk_hw*[]){
2175 				&ahb_clk_src.clkr.hw
2176 			},
2177 			.num_parents = 1,
2178 			.flags = CLK_SET_RATE_PARENT,
2179 			.ops = &clk_branch2_ops,
2180 		},
2181 	},
2182 };
2183 
2184 static struct clk_branch camss_gp0_clk = {
2185 	.halt_reg = 0x3444,
2186 	.clkr = {
2187 		.enable_reg = 0x3444,
2188 		.enable_mask = BIT(0),
2189 		.hw.init = &(struct clk_init_data){
2190 			.name = "camss_gp0_clk",
2191 			.parent_hws = (const struct clk_hw*[]){
2192 				&camss_gp0_clk_src.clkr.hw
2193 			},
2194 			.num_parents = 1,
2195 			.flags = CLK_SET_RATE_PARENT,
2196 			.ops = &clk_branch2_ops,
2197 		},
2198 	},
2199 };
2200 
2201 static struct clk_branch camss_gp1_clk = {
2202 	.halt_reg = 0x3474,
2203 	.clkr = {
2204 		.enable_reg = 0x3474,
2205 		.enable_mask = BIT(0),
2206 		.hw.init = &(struct clk_init_data){
2207 			.name = "camss_gp1_clk",
2208 			.parent_hws = (const struct clk_hw*[]){
2209 				&camss_gp1_clk_src.clkr.hw
2210 			},
2211 			.num_parents = 1,
2212 			.flags = CLK_SET_RATE_PARENT,
2213 			.ops = &clk_branch2_ops,
2214 		},
2215 	},
2216 };
2217 
2218 static struct clk_branch camss_mclk0_clk = {
2219 	.halt_reg = 0x3384,
2220 	.clkr = {
2221 		.enable_reg = 0x3384,
2222 		.enable_mask = BIT(0),
2223 		.hw.init = &(struct clk_init_data){
2224 			.name = "camss_mclk0_clk",
2225 			.parent_hws = (const struct clk_hw*[]){
2226 				&mclk0_clk_src.clkr.hw
2227 			},
2228 			.num_parents = 1,
2229 			.flags = CLK_SET_RATE_PARENT,
2230 			.ops = &clk_branch2_ops,
2231 		},
2232 	},
2233 };
2234 
2235 static struct clk_branch camss_mclk1_clk = {
2236 	.halt_reg = 0x33b4,
2237 	.clkr = {
2238 		.enable_reg = 0x33b4,
2239 		.enable_mask = BIT(0),
2240 		.hw.init = &(struct clk_init_data){
2241 			.name = "camss_mclk1_clk",
2242 			.parent_hws = (const struct clk_hw*[]){
2243 				&mclk1_clk_src.clkr.hw
2244 			},
2245 			.num_parents = 1,
2246 			.flags = CLK_SET_RATE_PARENT,
2247 			.ops = &clk_branch2_ops,
2248 		},
2249 	},
2250 };
2251 
2252 static struct clk_branch camss_mclk2_clk = {
2253 	.halt_reg = 0x33e4,
2254 	.clkr = {
2255 		.enable_reg = 0x33e4,
2256 		.enable_mask = BIT(0),
2257 		.hw.init = &(struct clk_init_data){
2258 			.name = "camss_mclk2_clk",
2259 			.parent_hws = (const struct clk_hw*[]){
2260 				&mclk2_clk_src.clkr.hw
2261 			},
2262 			.num_parents = 1,
2263 			.flags = CLK_SET_RATE_PARENT,
2264 			.ops = &clk_branch2_ops,
2265 		},
2266 	},
2267 };
2268 
2269 static struct clk_branch camss_mclk3_clk = {
2270 	.halt_reg = 0x3414,
2271 	.clkr = {
2272 		.enable_reg = 0x3414,
2273 		.enable_mask = BIT(0),
2274 		.hw.init = &(struct clk_init_data){
2275 			.name = "camss_mclk3_clk",
2276 			.parent_hws = (const struct clk_hw*[]){
2277 				&mclk3_clk_src.clkr.hw
2278 			},
2279 			.num_parents = 1,
2280 			.flags = CLK_SET_RATE_PARENT,
2281 			.ops = &clk_branch2_ops,
2282 		},
2283 	},
2284 };
2285 
2286 static struct clk_branch camss_cci_clk = {
2287 	.halt_reg = 0x3344,
2288 	.clkr = {
2289 		.enable_reg = 0x3344,
2290 		.enable_mask = BIT(0),
2291 		.hw.init = &(struct clk_init_data){
2292 			.name = "camss_cci_clk",
2293 			.parent_hws = (const struct clk_hw*[]){
2294 				&cci_clk_src.clkr.hw
2295 			},
2296 			.num_parents = 1,
2297 			.flags = CLK_SET_RATE_PARENT,
2298 			.ops = &clk_branch2_ops,
2299 		},
2300 	},
2301 };
2302 
2303 static struct clk_branch camss_cci_ahb_clk = {
2304 	.halt_reg = 0x3348,
2305 	.clkr = {
2306 		.enable_reg = 0x3348,
2307 		.enable_mask = BIT(0),
2308 		.hw.init = &(struct clk_init_data){
2309 			.name = "camss_cci_ahb_clk",
2310 			.parent_hws = (const struct clk_hw*[]){
2311 				&ahb_clk_src.clkr.hw
2312 			},
2313 			.num_parents = 1,
2314 			.flags = CLK_SET_RATE_PARENT,
2315 			.ops = &clk_branch2_ops,
2316 		},
2317 	},
2318 };
2319 
2320 static struct clk_branch camss_csi0phytimer_clk = {
2321 	.halt_reg = 0x3024,
2322 	.clkr = {
2323 		.enable_reg = 0x3024,
2324 		.enable_mask = BIT(0),
2325 		.hw.init = &(struct clk_init_data){
2326 			.name = "camss_csi0phytimer_clk",
2327 			.parent_hws = (const struct clk_hw*[]){
2328 				&csi0phytimer_clk_src.clkr.hw
2329 			},
2330 			.num_parents = 1,
2331 			.flags = CLK_SET_RATE_PARENT,
2332 			.ops = &clk_branch2_ops,
2333 		},
2334 	},
2335 };
2336 
2337 static struct clk_branch camss_csi1phytimer_clk = {
2338 	.halt_reg = 0x3054,
2339 	.clkr = {
2340 		.enable_reg = 0x3054,
2341 		.enable_mask = BIT(0),
2342 		.hw.init = &(struct clk_init_data){
2343 			.name = "camss_csi1phytimer_clk",
2344 			.parent_hws = (const struct clk_hw*[]){
2345 				&csi1phytimer_clk_src.clkr.hw
2346 			},
2347 			.num_parents = 1,
2348 			.flags = CLK_SET_RATE_PARENT,
2349 			.ops = &clk_branch2_ops,
2350 		},
2351 	},
2352 };
2353 
2354 static struct clk_branch camss_csi2phytimer_clk = {
2355 	.halt_reg = 0x3084,
2356 	.clkr = {
2357 		.enable_reg = 0x3084,
2358 		.enable_mask = BIT(0),
2359 		.hw.init = &(struct clk_init_data){
2360 			.name = "camss_csi2phytimer_clk",
2361 			.parent_hws = (const struct clk_hw*[]){
2362 				&csi2phytimer_clk_src.clkr.hw
2363 			},
2364 			.num_parents = 1,
2365 			.flags = CLK_SET_RATE_PARENT,
2366 			.ops = &clk_branch2_ops,
2367 		},
2368 	},
2369 };
2370 
2371 static struct clk_branch camss_csiphy0_3p_clk = {
2372 	.halt_reg = 0x3234,
2373 	.clkr = {
2374 		.enable_reg = 0x3234,
2375 		.enable_mask = BIT(0),
2376 		.hw.init = &(struct clk_init_data){
2377 			.name = "camss_csiphy0_3p_clk",
2378 			.parent_hws = (const struct clk_hw*[]){
2379 				&csiphy0_3p_clk_src.clkr.hw
2380 			},
2381 			.num_parents = 1,
2382 			.flags = CLK_SET_RATE_PARENT,
2383 			.ops = &clk_branch2_ops,
2384 		},
2385 	},
2386 };
2387 
2388 static struct clk_branch camss_csiphy1_3p_clk = {
2389 	.halt_reg = 0x3254,
2390 	.clkr = {
2391 		.enable_reg = 0x3254,
2392 		.enable_mask = BIT(0),
2393 		.hw.init = &(struct clk_init_data){
2394 			.name = "camss_csiphy1_3p_clk",
2395 			.parent_hws = (const struct clk_hw*[]){
2396 				&csiphy1_3p_clk_src.clkr.hw
2397 			},
2398 			.num_parents = 1,
2399 			.flags = CLK_SET_RATE_PARENT,
2400 			.ops = &clk_branch2_ops,
2401 		},
2402 	},
2403 };
2404 
2405 static struct clk_branch camss_csiphy2_3p_clk = {
2406 	.halt_reg = 0x3274,
2407 	.clkr = {
2408 		.enable_reg = 0x3274,
2409 		.enable_mask = BIT(0),
2410 		.hw.init = &(struct clk_init_data){
2411 			.name = "camss_csiphy2_3p_clk",
2412 			.parent_hws = (const struct clk_hw*[]){
2413 				&csiphy2_3p_clk_src.clkr.hw
2414 			},
2415 			.num_parents = 1,
2416 			.flags = CLK_SET_RATE_PARENT,
2417 			.ops = &clk_branch2_ops,
2418 		},
2419 	},
2420 };
2421 
2422 static struct clk_branch camss_jpeg0_clk = {
2423 	.halt_reg = 0x35a8,
2424 	.clkr = {
2425 		.enable_reg = 0x35a8,
2426 		.enable_mask = BIT(0),
2427 		.hw.init = &(struct clk_init_data){
2428 			.name = "camss_jpeg0_clk",
2429 			.parent_hws = (const struct clk_hw*[]){
2430 				&jpeg0_clk_src.clkr.hw
2431 			},
2432 			.num_parents = 1,
2433 			.flags = CLK_SET_RATE_PARENT,
2434 			.ops = &clk_branch2_ops,
2435 		},
2436 	},
2437 };
2438 
2439 static struct clk_branch camss_jpeg2_clk = {
2440 	.halt_reg = 0x35b0,
2441 	.clkr = {
2442 		.enable_reg = 0x35b0,
2443 		.enable_mask = BIT(0),
2444 		.hw.init = &(struct clk_init_data){
2445 			.name = "camss_jpeg2_clk",
2446 			.parent_hws = (const struct clk_hw*[]){
2447 				&jpeg2_clk_src.clkr.hw
2448 			},
2449 			.num_parents = 1,
2450 			.flags = CLK_SET_RATE_PARENT,
2451 			.ops = &clk_branch2_ops,
2452 		},
2453 	},
2454 };
2455 
2456 static struct clk_branch camss_jpeg_dma_clk = {
2457 	.halt_reg = 0x35c0,
2458 	.clkr = {
2459 		.enable_reg = 0x35c0,
2460 		.enable_mask = BIT(0),
2461 		.hw.init = &(struct clk_init_data){
2462 			.name = "camss_jpeg_dma_clk",
2463 			.parent_hws = (const struct clk_hw*[]){
2464 				&jpeg_dma_clk_src.clkr.hw
2465 			},
2466 			.num_parents = 1,
2467 			.flags = CLK_SET_RATE_PARENT,
2468 			.ops = &clk_branch2_ops,
2469 		},
2470 	},
2471 };
2472 
2473 static struct clk_branch camss_jpeg_ahb_clk = {
2474 	.halt_reg = 0x35b4,
2475 	.clkr = {
2476 		.enable_reg = 0x35b4,
2477 		.enable_mask = BIT(0),
2478 		.hw.init = &(struct clk_init_data){
2479 			.name = "camss_jpeg_ahb_clk",
2480 			.parent_hws = (const struct clk_hw*[]){
2481 				&ahb_clk_src.clkr.hw
2482 			},
2483 			.num_parents = 1,
2484 			.flags = CLK_SET_RATE_PARENT,
2485 			.ops = &clk_branch2_ops,
2486 		},
2487 	},
2488 };
2489 
2490 static struct clk_branch camss_jpeg_axi_clk = {
2491 	.halt_reg = 0x35b8,
2492 	.clkr = {
2493 		.enable_reg = 0x35b8,
2494 		.enable_mask = BIT(0),
2495 		.hw.init = &(struct clk_init_data){
2496 			.name = "camss_jpeg_axi_clk",
2497 			.parent_hws = (const struct clk_hw*[]){
2498 				&axi_clk_src.clkr.hw
2499 			},
2500 			.num_parents = 1,
2501 			.flags = CLK_SET_RATE_PARENT,
2502 			.ops = &clk_branch2_ops,
2503 		},
2504 	},
2505 };
2506 
2507 static struct clk_branch camss_vfe_ahb_clk = {
2508 	.halt_reg = 0x36b8,
2509 	.clkr = {
2510 		.enable_reg = 0x36b8,
2511 		.enable_mask = BIT(0),
2512 		.hw.init = &(struct clk_init_data){
2513 			.name = "camss_vfe_ahb_clk",
2514 			.parent_hws = (const struct clk_hw*[]){
2515 				&ahb_clk_src.clkr.hw
2516 			},
2517 			.num_parents = 1,
2518 			.flags = CLK_SET_RATE_PARENT,
2519 			.ops = &clk_branch2_ops,
2520 		},
2521 	},
2522 };
2523 
2524 static struct clk_branch camss_vfe_axi_clk = {
2525 	.halt_reg = 0x36bc,
2526 	.clkr = {
2527 		.enable_reg = 0x36bc,
2528 		.enable_mask = BIT(0),
2529 		.hw.init = &(struct clk_init_data){
2530 			.name = "camss_vfe_axi_clk",
2531 			.parent_hws = (const struct clk_hw*[]){
2532 				&axi_clk_src.clkr.hw
2533 			},
2534 			.num_parents = 1,
2535 			.flags = CLK_SET_RATE_PARENT,
2536 			.ops = &clk_branch2_ops,
2537 		},
2538 	},
2539 };
2540 
2541 static struct clk_branch camss_vfe0_clk = {
2542 	.halt_reg = 0x36a8,
2543 	.clkr = {
2544 		.enable_reg = 0x36a8,
2545 		.enable_mask = BIT(0),
2546 		.hw.init = &(struct clk_init_data){
2547 			.name = "camss_vfe0_clk",
2548 			.parent_hws = (const struct clk_hw*[]){
2549 				&vfe0_clk_src.clkr.hw
2550 			},
2551 			.num_parents = 1,
2552 			.flags = CLK_SET_RATE_PARENT,
2553 			.ops = &clk_branch2_ops,
2554 		},
2555 	},
2556 };
2557 
2558 static struct clk_branch camss_vfe0_stream_clk = {
2559 	.halt_reg = 0x3720,
2560 	.clkr = {
2561 		.enable_reg = 0x3720,
2562 		.enable_mask = BIT(0),
2563 		.hw.init = &(struct clk_init_data){
2564 			.name = "camss_vfe0_stream_clk",
2565 			.parent_hws = (const struct clk_hw*[]){
2566 				&vfe0_clk_src.clkr.hw
2567 			},
2568 			.num_parents = 1,
2569 			.flags = CLK_SET_RATE_PARENT,
2570 			.ops = &clk_branch2_ops,
2571 		},
2572 	},
2573 };
2574 
2575 static struct clk_branch camss_vfe0_ahb_clk = {
2576 	.halt_reg = 0x3668,
2577 	.clkr = {
2578 		.enable_reg = 0x3668,
2579 		.enable_mask = BIT(0),
2580 		.hw.init = &(struct clk_init_data){
2581 			.name = "camss_vfe0_ahb_clk",
2582 			.parent_hws = (const struct clk_hw*[]){
2583 				&ahb_clk_src.clkr.hw
2584 			},
2585 			.num_parents = 1,
2586 			.flags = CLK_SET_RATE_PARENT,
2587 			.ops = &clk_branch2_ops,
2588 		},
2589 	},
2590 };
2591 
2592 static struct clk_branch camss_vfe1_clk = {
2593 	.halt_reg = 0x36ac,
2594 	.clkr = {
2595 		.enable_reg = 0x36ac,
2596 		.enable_mask = BIT(0),
2597 		.hw.init = &(struct clk_init_data){
2598 			.name = "camss_vfe1_clk",
2599 			.parent_hws = (const struct clk_hw*[]){
2600 				&vfe1_clk_src.clkr.hw
2601 			},
2602 			.num_parents = 1,
2603 			.flags = CLK_SET_RATE_PARENT,
2604 			.ops = &clk_branch2_ops,
2605 		},
2606 	},
2607 };
2608 
2609 static struct clk_branch camss_vfe1_stream_clk = {
2610 	.halt_reg = 0x3724,
2611 	.clkr = {
2612 		.enable_reg = 0x3724,
2613 		.enable_mask = BIT(0),
2614 		.hw.init = &(struct clk_init_data){
2615 			.name = "camss_vfe1_stream_clk",
2616 			.parent_hws = (const struct clk_hw*[]){
2617 				&vfe1_clk_src.clkr.hw
2618 			},
2619 			.num_parents = 1,
2620 			.flags = CLK_SET_RATE_PARENT,
2621 			.ops = &clk_branch2_ops,
2622 		},
2623 	},
2624 };
2625 
2626 static struct clk_branch camss_vfe1_ahb_clk = {
2627 	.halt_reg = 0x3678,
2628 	.clkr = {
2629 		.enable_reg = 0x3678,
2630 		.enable_mask = BIT(0),
2631 		.hw.init = &(struct clk_init_data){
2632 			.name = "camss_vfe1_ahb_clk",
2633 			.parent_hws = (const struct clk_hw*[]){
2634 				&ahb_clk_src.clkr.hw
2635 			},
2636 			.num_parents = 1,
2637 			.flags = CLK_SET_RATE_PARENT,
2638 			.ops = &clk_branch2_ops,
2639 		},
2640 	},
2641 };
2642 
2643 static struct clk_branch camss_csi_vfe0_clk = {
2644 	.halt_reg = 0x3704,
2645 	.clkr = {
2646 		.enable_reg = 0x3704,
2647 		.enable_mask = BIT(0),
2648 		.hw.init = &(struct clk_init_data){
2649 			.name = "camss_csi_vfe0_clk",
2650 			.parent_hws = (const struct clk_hw*[]){
2651 				&vfe0_clk_src.clkr.hw
2652 			},
2653 			.num_parents = 1,
2654 			.flags = CLK_SET_RATE_PARENT,
2655 			.ops = &clk_branch2_ops,
2656 		},
2657 	},
2658 };
2659 
2660 static struct clk_branch camss_csi_vfe1_clk = {
2661 	.halt_reg = 0x3714,
2662 	.clkr = {
2663 		.enable_reg = 0x3714,
2664 		.enable_mask = BIT(0),
2665 		.hw.init = &(struct clk_init_data){
2666 			.name = "camss_csi_vfe1_clk",
2667 			.parent_hws = (const struct clk_hw*[]){
2668 				&vfe1_clk_src.clkr.hw
2669 			},
2670 			.num_parents = 1,
2671 			.flags = CLK_SET_RATE_PARENT,
2672 			.ops = &clk_branch2_ops,
2673 		},
2674 	},
2675 };
2676 
2677 static struct clk_branch camss_cpp_vbif_ahb_clk = {
2678 	.halt_reg = 0x36c8,
2679 	.clkr = {
2680 		.enable_reg = 0x36c8,
2681 		.enable_mask = BIT(0),
2682 		.hw.init = &(struct clk_init_data){
2683 			.name = "camss_cpp_vbif_ahb_clk",
2684 			.parent_hws = (const struct clk_hw*[]){
2685 				&ahb_clk_src.clkr.hw
2686 			},
2687 			.num_parents = 1,
2688 			.flags = CLK_SET_RATE_PARENT,
2689 			.ops = &clk_branch2_ops,
2690 		},
2691 	},
2692 };
2693 
2694 static struct clk_branch camss_cpp_axi_clk = {
2695 	.halt_reg = 0x36c4,
2696 	.clkr = {
2697 		.enable_reg = 0x36c4,
2698 		.enable_mask = BIT(0),
2699 		.hw.init = &(struct clk_init_data){
2700 			.name = "camss_cpp_axi_clk",
2701 			.parent_hws = (const struct clk_hw*[]){
2702 				&axi_clk_src.clkr.hw
2703 			},
2704 			.num_parents = 1,
2705 			.flags = CLK_SET_RATE_PARENT,
2706 			.ops = &clk_branch2_ops,
2707 		},
2708 	},
2709 };
2710 
2711 static struct clk_branch camss_cpp_clk = {
2712 	.halt_reg = 0x36b0,
2713 	.clkr = {
2714 		.enable_reg = 0x36b0,
2715 		.enable_mask = BIT(0),
2716 		.hw.init = &(struct clk_init_data){
2717 			.name = "camss_cpp_clk",
2718 			.parent_hws = (const struct clk_hw*[]){
2719 				&cpp_clk_src.clkr.hw
2720 			},
2721 			.num_parents = 1,
2722 			.flags = CLK_SET_RATE_PARENT,
2723 			.ops = &clk_branch2_ops,
2724 		},
2725 	},
2726 };
2727 
2728 static struct clk_branch camss_cpp_ahb_clk = {
2729 	.halt_reg = 0x36b4,
2730 	.clkr = {
2731 		.enable_reg = 0x36b4,
2732 		.enable_mask = BIT(0),
2733 		.hw.init = &(struct clk_init_data){
2734 			.name = "camss_cpp_ahb_clk",
2735 			.parent_hws = (const struct clk_hw*[]){
2736 				&ahb_clk_src.clkr.hw
2737 			},
2738 			.num_parents = 1,
2739 			.flags = CLK_SET_RATE_PARENT,
2740 			.ops = &clk_branch2_ops,
2741 		},
2742 	},
2743 };
2744 
2745 static struct clk_branch camss_csi0_clk = {
2746 	.halt_reg = 0x30b4,
2747 	.clkr = {
2748 		.enable_reg = 0x30b4,
2749 		.enable_mask = BIT(0),
2750 		.hw.init = &(struct clk_init_data){
2751 			.name = "camss_csi0_clk",
2752 			.parent_hws = (const struct clk_hw*[]){
2753 				&csi0_clk_src.clkr.hw
2754 			},
2755 			.num_parents = 1,
2756 			.flags = CLK_SET_RATE_PARENT,
2757 			.ops = &clk_branch2_ops,
2758 		},
2759 	},
2760 };
2761 
2762 static struct clk_branch camss_csi0_ahb_clk = {
2763 	.halt_reg = 0x30bc,
2764 	.clkr = {
2765 		.enable_reg = 0x30bc,
2766 		.enable_mask = BIT(0),
2767 		.hw.init = &(struct clk_init_data){
2768 			.name = "camss_csi0_ahb_clk",
2769 			.parent_hws = (const struct clk_hw*[]){
2770 				&ahb_clk_src.clkr.hw
2771 			},
2772 			.num_parents = 1,
2773 			.flags = CLK_SET_RATE_PARENT,
2774 			.ops = &clk_branch2_ops,
2775 		},
2776 	},
2777 };
2778 
2779 static struct clk_branch camss_csi0phy_clk = {
2780 	.halt_reg = 0x30c4,
2781 	.clkr = {
2782 		.enable_reg = 0x30c4,
2783 		.enable_mask = BIT(0),
2784 		.hw.init = &(struct clk_init_data){
2785 			.name = "camss_csi0phy_clk",
2786 			.parent_hws = (const struct clk_hw*[]){
2787 				&csi0_clk_src.clkr.hw
2788 			},
2789 			.num_parents = 1,
2790 			.flags = CLK_SET_RATE_PARENT,
2791 			.ops = &clk_branch2_ops,
2792 		},
2793 	},
2794 };
2795 
2796 static struct clk_branch camss_csi0rdi_clk = {
2797 	.halt_reg = 0x30d4,
2798 	.clkr = {
2799 		.enable_reg = 0x30d4,
2800 		.enable_mask = BIT(0),
2801 		.hw.init = &(struct clk_init_data){
2802 			.name = "camss_csi0rdi_clk",
2803 			.parent_hws = (const struct clk_hw*[]){
2804 				&csi0_clk_src.clkr.hw
2805 			},
2806 			.num_parents = 1,
2807 			.flags = CLK_SET_RATE_PARENT,
2808 			.ops = &clk_branch2_ops,
2809 		},
2810 	},
2811 };
2812 
2813 static struct clk_branch camss_csi0pix_clk = {
2814 	.halt_reg = 0x30e4,
2815 	.clkr = {
2816 		.enable_reg = 0x30e4,
2817 		.enable_mask = BIT(0),
2818 		.hw.init = &(struct clk_init_data){
2819 			.name = "camss_csi0pix_clk",
2820 			.parent_hws = (const struct clk_hw*[]){
2821 				&csi0_clk_src.clkr.hw
2822 			},
2823 			.num_parents = 1,
2824 			.flags = CLK_SET_RATE_PARENT,
2825 			.ops = &clk_branch2_ops,
2826 		},
2827 	},
2828 };
2829 
2830 static struct clk_branch camss_csi1_clk = {
2831 	.halt_reg = 0x3124,
2832 	.clkr = {
2833 		.enable_reg = 0x3124,
2834 		.enable_mask = BIT(0),
2835 		.hw.init = &(struct clk_init_data){
2836 			.name = "camss_csi1_clk",
2837 			.parent_hws = (const struct clk_hw*[]){
2838 				&csi1_clk_src.clkr.hw
2839 			},
2840 			.num_parents = 1,
2841 			.flags = CLK_SET_RATE_PARENT,
2842 			.ops = &clk_branch2_ops,
2843 		},
2844 	},
2845 };
2846 
2847 static struct clk_branch camss_csi1_ahb_clk = {
2848 	.halt_reg = 0x3128,
2849 	.clkr = {
2850 		.enable_reg = 0x3128,
2851 		.enable_mask = BIT(0),
2852 		.hw.init = &(struct clk_init_data){
2853 			.name = "camss_csi1_ahb_clk",
2854 			.parent_hws = (const struct clk_hw*[]){
2855 				&ahb_clk_src.clkr.hw
2856 			},
2857 			.num_parents = 1,
2858 			.flags = CLK_SET_RATE_PARENT,
2859 			.ops = &clk_branch2_ops,
2860 		},
2861 	},
2862 };
2863 
2864 static struct clk_branch camss_csi1phy_clk = {
2865 	.halt_reg = 0x3134,
2866 	.clkr = {
2867 		.enable_reg = 0x3134,
2868 		.enable_mask = BIT(0),
2869 		.hw.init = &(struct clk_init_data){
2870 			.name = "camss_csi1phy_clk",
2871 			.parent_hws = (const struct clk_hw*[]){
2872 				&csi1_clk_src.clkr.hw
2873 			},
2874 			.num_parents = 1,
2875 			.flags = CLK_SET_RATE_PARENT,
2876 			.ops = &clk_branch2_ops,
2877 		},
2878 	},
2879 };
2880 
2881 static struct clk_branch camss_csi1rdi_clk = {
2882 	.halt_reg = 0x3144,
2883 	.clkr = {
2884 		.enable_reg = 0x3144,
2885 		.enable_mask = BIT(0),
2886 		.hw.init = &(struct clk_init_data){
2887 			.name = "camss_csi1rdi_clk",
2888 			.parent_hws = (const struct clk_hw*[]){
2889 				&csi1_clk_src.clkr.hw
2890 			},
2891 			.num_parents = 1,
2892 			.flags = CLK_SET_RATE_PARENT,
2893 			.ops = &clk_branch2_ops,
2894 		},
2895 	},
2896 };
2897 
2898 static struct clk_branch camss_csi1pix_clk = {
2899 	.halt_reg = 0x3154,
2900 	.clkr = {
2901 		.enable_reg = 0x3154,
2902 		.enable_mask = BIT(0),
2903 		.hw.init = &(struct clk_init_data){
2904 			.name = "camss_csi1pix_clk",
2905 			.parent_hws = (const struct clk_hw*[]){
2906 				&csi1_clk_src.clkr.hw
2907 			},
2908 			.num_parents = 1,
2909 			.flags = CLK_SET_RATE_PARENT,
2910 			.ops = &clk_branch2_ops,
2911 		},
2912 	},
2913 };
2914 
2915 static struct clk_branch camss_csi2_clk = {
2916 	.halt_reg = 0x3184,
2917 	.clkr = {
2918 		.enable_reg = 0x3184,
2919 		.enable_mask = BIT(0),
2920 		.hw.init = &(struct clk_init_data){
2921 			.name = "camss_csi2_clk",
2922 			.parent_hws = (const struct clk_hw*[]){
2923 				&csi2_clk_src.clkr.hw
2924 			},
2925 			.num_parents = 1,
2926 			.flags = CLK_SET_RATE_PARENT,
2927 			.ops = &clk_branch2_ops,
2928 		},
2929 	},
2930 };
2931 
2932 static struct clk_branch camss_csi2_ahb_clk = {
2933 	.halt_reg = 0x3188,
2934 	.clkr = {
2935 		.enable_reg = 0x3188,
2936 		.enable_mask = BIT(0),
2937 		.hw.init = &(struct clk_init_data){
2938 			.name = "camss_csi2_ahb_clk",
2939 			.parent_hws = (const struct clk_hw*[]){
2940 				&ahb_clk_src.clkr.hw
2941 			},
2942 			.num_parents = 1,
2943 			.flags = CLK_SET_RATE_PARENT,
2944 			.ops = &clk_branch2_ops,
2945 		},
2946 	},
2947 };
2948 
2949 static struct clk_branch camss_csi2phy_clk = {
2950 	.halt_reg = 0x3194,
2951 	.clkr = {
2952 		.enable_reg = 0x3194,
2953 		.enable_mask = BIT(0),
2954 		.hw.init = &(struct clk_init_data){
2955 			.name = "camss_csi2phy_clk",
2956 			.parent_hws = (const struct clk_hw*[]){
2957 				&csi2_clk_src.clkr.hw
2958 			},
2959 			.num_parents = 1,
2960 			.flags = CLK_SET_RATE_PARENT,
2961 			.ops = &clk_branch2_ops,
2962 		},
2963 	},
2964 };
2965 
2966 static struct clk_branch camss_csi2rdi_clk = {
2967 	.halt_reg = 0x31a4,
2968 	.clkr = {
2969 		.enable_reg = 0x31a4,
2970 		.enable_mask = BIT(0),
2971 		.hw.init = &(struct clk_init_data){
2972 			.name = "camss_csi2rdi_clk",
2973 			.parent_hws = (const struct clk_hw*[]){
2974 				&csi2_clk_src.clkr.hw
2975 			},
2976 			.num_parents = 1,
2977 			.flags = CLK_SET_RATE_PARENT,
2978 			.ops = &clk_branch2_ops,
2979 		},
2980 	},
2981 };
2982 
2983 static struct clk_branch camss_csi2pix_clk = {
2984 	.halt_reg = 0x31b4,
2985 	.clkr = {
2986 		.enable_reg = 0x31b4,
2987 		.enable_mask = BIT(0),
2988 		.hw.init = &(struct clk_init_data){
2989 			.name = "camss_csi2pix_clk",
2990 			.parent_hws = (const struct clk_hw*[]){
2991 				&csi2_clk_src.clkr.hw
2992 			},
2993 			.num_parents = 1,
2994 			.flags = CLK_SET_RATE_PARENT,
2995 			.ops = &clk_branch2_ops,
2996 		},
2997 	},
2998 };
2999 
3000 static struct clk_branch camss_csi3_clk = {
3001 	.halt_reg = 0x31e4,
3002 	.clkr = {
3003 		.enable_reg = 0x31e4,
3004 		.enable_mask = BIT(0),
3005 		.hw.init = &(struct clk_init_data){
3006 			.name = "camss_csi3_clk",
3007 			.parent_hws = (const struct clk_hw*[]){
3008 				&csi3_clk_src.clkr.hw
3009 			},
3010 			.num_parents = 1,
3011 			.flags = CLK_SET_RATE_PARENT,
3012 			.ops = &clk_branch2_ops,
3013 		},
3014 	},
3015 };
3016 
3017 static struct clk_branch camss_csi3_ahb_clk = {
3018 	.halt_reg = 0x31e8,
3019 	.clkr = {
3020 		.enable_reg = 0x31e8,
3021 		.enable_mask = BIT(0),
3022 		.hw.init = &(struct clk_init_data){
3023 			.name = "camss_csi3_ahb_clk",
3024 			.parent_hws = (const struct clk_hw*[]){
3025 				&ahb_clk_src.clkr.hw
3026 			},
3027 			.num_parents = 1,
3028 			.flags = CLK_SET_RATE_PARENT,
3029 			.ops = &clk_branch2_ops,
3030 		},
3031 	},
3032 };
3033 
3034 static struct clk_branch camss_csi3phy_clk = {
3035 	.halt_reg = 0x31f4,
3036 	.clkr = {
3037 		.enable_reg = 0x31f4,
3038 		.enable_mask = BIT(0),
3039 		.hw.init = &(struct clk_init_data){
3040 			.name = "camss_csi3phy_clk",
3041 			.parent_hws = (const struct clk_hw*[]){
3042 				&csi3_clk_src.clkr.hw
3043 			},
3044 			.num_parents = 1,
3045 			.flags = CLK_SET_RATE_PARENT,
3046 			.ops = &clk_branch2_ops,
3047 		},
3048 	},
3049 };
3050 
3051 static struct clk_branch camss_csi3rdi_clk = {
3052 	.halt_reg = 0x3204,
3053 	.clkr = {
3054 		.enable_reg = 0x3204,
3055 		.enable_mask = BIT(0),
3056 		.hw.init = &(struct clk_init_data){
3057 			.name = "camss_csi3rdi_clk",
3058 			.parent_hws = (const struct clk_hw*[]){
3059 				&csi3_clk_src.clkr.hw
3060 			},
3061 			.num_parents = 1,
3062 			.flags = CLK_SET_RATE_PARENT,
3063 			.ops = &clk_branch2_ops,
3064 		},
3065 	},
3066 };
3067 
3068 static struct clk_branch camss_csi3pix_clk = {
3069 	.halt_reg = 0x3214,
3070 	.clkr = {
3071 		.enable_reg = 0x3214,
3072 		.enable_mask = BIT(0),
3073 		.hw.init = &(struct clk_init_data){
3074 			.name = "camss_csi3pix_clk",
3075 			.parent_hws = (const struct clk_hw*[]){
3076 				&csi3_clk_src.clkr.hw
3077 			},
3078 			.num_parents = 1,
3079 			.flags = CLK_SET_RATE_PARENT,
3080 			.ops = &clk_branch2_ops,
3081 		},
3082 	},
3083 };
3084 
3085 static struct clk_branch camss_ispif_ahb_clk = {
3086 	.halt_reg = 0x3224,
3087 	.clkr = {
3088 		.enable_reg = 0x3224,
3089 		.enable_mask = BIT(0),
3090 		.hw.init = &(struct clk_init_data){
3091 			.name = "camss_ispif_ahb_clk",
3092 			.parent_hws = (const struct clk_hw*[]){
3093 				&ahb_clk_src.clkr.hw
3094 			},
3095 			.num_parents = 1,
3096 			.flags = CLK_SET_RATE_PARENT,
3097 			.ops = &clk_branch2_ops,
3098 		},
3099 	},
3100 };
3101 
3102 static struct clk_branch fd_core_clk = {
3103 	.halt_reg = 0x3b68,
3104 	.clkr = {
3105 		.enable_reg = 0x3b68,
3106 		.enable_mask = BIT(0),
3107 		.hw.init = &(struct clk_init_data){
3108 			.name = "fd_core_clk",
3109 			.parent_hws = (const struct clk_hw*[]){
3110 				&fd_core_clk_src.clkr.hw
3111 			},
3112 			.num_parents = 1,
3113 			.flags = CLK_SET_RATE_PARENT,
3114 			.ops = &clk_branch2_ops,
3115 		},
3116 	},
3117 };
3118 
3119 static struct clk_branch fd_core_uar_clk = {
3120 	.halt_reg = 0x3b6c,
3121 	.clkr = {
3122 		.enable_reg = 0x3b6c,
3123 		.enable_mask = BIT(0),
3124 		.hw.init = &(struct clk_init_data){
3125 			.name = "fd_core_uar_clk",
3126 			.parent_hws = (const struct clk_hw*[]){
3127 				&fd_core_clk_src.clkr.hw
3128 			},
3129 			.num_parents = 1,
3130 			.flags = CLK_SET_RATE_PARENT,
3131 			.ops = &clk_branch2_ops,
3132 		},
3133 	},
3134 };
3135 
3136 static struct clk_branch fd_ahb_clk = {
3137 	.halt_reg = 0x3ba74,
3138 	.clkr = {
3139 		.enable_reg = 0x3ba74,
3140 		.enable_mask = BIT(0),
3141 		.hw.init = &(struct clk_init_data){
3142 			.name = "fd_ahb_clk",
3143 			.parent_hws = (const struct clk_hw*[]){
3144 				&ahb_clk_src.clkr.hw
3145 			},
3146 			.num_parents = 1,
3147 			.flags = CLK_SET_RATE_PARENT,
3148 			.ops = &clk_branch2_ops,
3149 		},
3150 	},
3151 };
3152 
3153 static struct clk_hw *mmcc_msm8996_hws[] = {
3154 	&gpll0_div.hw,
3155 };
3156 
3157 static struct gdsc mmagic_bimc_gdsc = {
3158 	.gdscr = 0x529c,
3159 	.pd = {
3160 		.name = "mmagic_bimc",
3161 	},
3162 	.pwrsts = PWRSTS_OFF_ON,
3163 	.flags = ALWAYS_ON,
3164 };
3165 
3166 static struct gdsc mmagic_video_gdsc = {
3167 	.gdscr = 0x119c,
3168 	.gds_hw_ctrl = 0x120c,
3169 	.pd = {
3170 		.name = "mmagic_video",
3171 	},
3172 	.pwrsts = PWRSTS_OFF_ON,
3173 	.flags = VOTABLE | ALWAYS_ON,
3174 };
3175 
3176 static struct gdsc mmagic_mdss_gdsc = {
3177 	.gdscr = 0x247c,
3178 	.gds_hw_ctrl = 0x2480,
3179 	.pd = {
3180 		.name = "mmagic_mdss",
3181 	},
3182 	.pwrsts = PWRSTS_OFF_ON,
3183 	.flags = VOTABLE | ALWAYS_ON,
3184 };
3185 
3186 static struct gdsc mmagic_camss_gdsc = {
3187 	.gdscr = 0x3c4c,
3188 	.gds_hw_ctrl = 0x3c50,
3189 	.pd = {
3190 		.name = "mmagic_camss",
3191 	},
3192 	.pwrsts = PWRSTS_OFF_ON,
3193 	.flags = VOTABLE | ALWAYS_ON,
3194 };
3195 
3196 static struct gdsc venus_gdsc = {
3197 	.gdscr = 0x1024,
3198 	.cxcs = (unsigned int []){ 0x1028, 0x1034, 0x1038 },
3199 	.cxc_count = 3,
3200 	.pd = {
3201 		.name = "venus",
3202 	},
3203 	.parent = &mmagic_video_gdsc.pd,
3204 	.pwrsts = PWRSTS_OFF_ON,
3205 };
3206 
3207 static struct gdsc venus_core0_gdsc = {
3208 	.gdscr = 0x1040,
3209 	.cxcs = (unsigned int []){ 0x1048 },
3210 	.cxc_count = 1,
3211 	.pd = {
3212 		.name = "venus_core0",
3213 	},
3214 	.parent = &venus_gdsc.pd,
3215 	.pwrsts = PWRSTS_OFF_ON,
3216 	.flags = HW_CTRL,
3217 };
3218 
3219 static struct gdsc venus_core1_gdsc = {
3220 	.gdscr = 0x1044,
3221 	.cxcs = (unsigned int []){ 0x104c },
3222 	.cxc_count = 1,
3223 	.pd = {
3224 		.name = "venus_core1",
3225 	},
3226 	.parent = &venus_gdsc.pd,
3227 	.pwrsts = PWRSTS_OFF_ON,
3228 	.flags = HW_CTRL,
3229 };
3230 
3231 static struct gdsc camss_gdsc = {
3232 	.gdscr = 0x34a0,
3233 	.cxcs = (unsigned int []){ 0x36bc, 0x36c4 },
3234 	.cxc_count = 2,
3235 	.pd = {
3236 		.name = "camss",
3237 	},
3238 	.parent = &mmagic_camss_gdsc.pd,
3239 	.pwrsts = PWRSTS_OFF_ON,
3240 };
3241 
3242 static struct gdsc vfe0_gdsc = {
3243 	.gdscr = 0x3664,
3244 	.cxcs = (unsigned int []){ 0x36a8 },
3245 	.cxc_count = 1,
3246 	.pd = {
3247 		.name = "vfe0",
3248 	},
3249 	.parent = &camss_gdsc.pd,
3250 	.pwrsts = PWRSTS_OFF_ON,
3251 };
3252 
3253 static struct gdsc vfe1_gdsc = {
3254 	.gdscr = 0x3674,
3255 	.cxcs = (unsigned int []){ 0x36ac },
3256 	.cxc_count = 1,
3257 	.pd = {
3258 		.name = "vfe1",
3259 	},
3260 	.parent = &camss_gdsc.pd,
3261 	.pwrsts = PWRSTS_OFF_ON,
3262 };
3263 
3264 static struct gdsc jpeg_gdsc = {
3265 	.gdscr = 0x35a4,
3266 	.cxcs = (unsigned int []){ 0x35a8, 0x35b0, 0x35c0, 0x35b8 },
3267 	.cxc_count = 4,
3268 	.pd = {
3269 		.name = "jpeg",
3270 	},
3271 	.parent = &camss_gdsc.pd,
3272 	.pwrsts = PWRSTS_OFF_ON,
3273 };
3274 
3275 static struct gdsc cpp_gdsc = {
3276 	.gdscr = 0x36d4,
3277 	.cxcs = (unsigned int []){ 0x36b0 },
3278 	.cxc_count = 1,
3279 	.pd = {
3280 		.name = "cpp",
3281 	},
3282 	.parent = &camss_gdsc.pd,
3283 	.pwrsts = PWRSTS_OFF_ON,
3284 };
3285 
3286 static struct gdsc fd_gdsc = {
3287 	.gdscr = 0x3b64,
3288 	.cxcs = (unsigned int []){ 0x3b68, 0x3b6c },
3289 	.cxc_count = 2,
3290 	.pd = {
3291 		.name = "fd",
3292 	},
3293 	.parent = &camss_gdsc.pd,
3294 	.pwrsts = PWRSTS_OFF_ON,
3295 };
3296 
3297 static struct gdsc mdss_gdsc = {
3298 	.gdscr = 0x2304,
3299 	.cxcs = (unsigned int []){ 0x2310, 0x231c },
3300 	.cxc_count = 2,
3301 	.pd = {
3302 		.name = "mdss",
3303 	},
3304 	.parent = &mmagic_mdss_gdsc.pd,
3305 	.pwrsts = PWRSTS_OFF_ON,
3306 };
3307 
3308 static struct gdsc gpu_gdsc = {
3309 	.gdscr = 0x4034,
3310 	.gds_hw_ctrl = 0x4038,
3311 	.pd = {
3312 		.name = "gpu",
3313 	},
3314 	.pwrsts = PWRSTS_OFF_ON,
3315 	.flags = VOTABLE,
3316 };
3317 
3318 static struct gdsc gpu_gx_gdsc = {
3319 	.gdscr = 0x4024,
3320 	.clamp_io_ctrl = 0x4300,
3321 	.cxcs = (unsigned int []){ 0x4028 },
3322 	.cxc_count = 1,
3323 	.pd = {
3324 		.name = "gpu_gx",
3325 	},
3326 	.pwrsts = PWRSTS_OFF_ON,
3327 	.parent = &gpu_gdsc.pd,
3328 	.flags = CLAMP_IO,
3329 	.supply = "vdd-gfx",
3330 };
3331 
3332 static struct clk_regmap *mmcc_msm8996_clocks[] = {
3333 	[MMPLL0_EARLY] = &mmpll0_early.clkr,
3334 	[MMPLL0_PLL] = &mmpll0.clkr,
3335 	[MMPLL1_EARLY] = &mmpll1_early.clkr,
3336 	[MMPLL1_PLL] = &mmpll1.clkr,
3337 	[MMPLL2_EARLY] = &mmpll2_early.clkr,
3338 	[MMPLL2_PLL] = &mmpll2.clkr,
3339 	[MMPLL3_EARLY] = &mmpll3_early.clkr,
3340 	[MMPLL3_PLL] = &mmpll3.clkr,
3341 	[MMPLL4_EARLY] = &mmpll4_early.clkr,
3342 	[MMPLL4_PLL] = &mmpll4.clkr,
3343 	[MMPLL5_EARLY] = &mmpll5_early.clkr,
3344 	[MMPLL5_PLL] = &mmpll5.clkr,
3345 	[MMPLL8_EARLY] = &mmpll8_early.clkr,
3346 	[MMPLL8_PLL] = &mmpll8.clkr,
3347 	[MMPLL9_EARLY] = &mmpll9_early.clkr,
3348 	[MMPLL9_PLL] = &mmpll9.clkr,
3349 	[AHB_CLK_SRC] = &ahb_clk_src.clkr,
3350 	[AXI_CLK_SRC] = &axi_clk_src.clkr,
3351 	[MAXI_CLK_SRC] = &maxi_clk_src.clkr,
3352 	[GFX3D_CLK_SRC] = &gfx3d_clk_src.rcg.clkr,
3353 	[RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr,
3354 	[ISENSE_CLK_SRC] = &isense_clk_src.clkr,
3355 	[RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr,
3356 	[VIDEO_CORE_CLK_SRC] = &video_core_clk_src.clkr,
3357 	[VIDEO_SUBCORE0_CLK_SRC] = &video_subcore0_clk_src.clkr,
3358 	[VIDEO_SUBCORE1_CLK_SRC] = &video_subcore1_clk_src.clkr,
3359 	[PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
3360 	[PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
3361 	[MDP_CLK_SRC] = &mdp_clk_src.clkr,
3362 	[EXTPCLK_CLK_SRC] = &extpclk_clk_src.clkr,
3363 	[VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
3364 	[HDMI_CLK_SRC] = &hdmi_clk_src.clkr,
3365 	[BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
3366 	[BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
3367 	[ESC0_CLK_SRC] = &esc0_clk_src.clkr,
3368 	[ESC1_CLK_SRC] = &esc1_clk_src.clkr,
3369 	[CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
3370 	[CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
3371 	[MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
3372 	[MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
3373 	[MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
3374 	[MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
3375 	[CCI_CLK_SRC] = &cci_clk_src.clkr,
3376 	[CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
3377 	[CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
3378 	[CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
3379 	[CSIPHY0_3P_CLK_SRC] = &csiphy0_3p_clk_src.clkr,
3380 	[CSIPHY1_3P_CLK_SRC] = &csiphy1_3p_clk_src.clkr,
3381 	[CSIPHY2_3P_CLK_SRC] = &csiphy2_3p_clk_src.clkr,
3382 	[JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
3383 	[JPEG2_CLK_SRC] = &jpeg2_clk_src.clkr,
3384 	[JPEG_DMA_CLK_SRC] = &jpeg_dma_clk_src.clkr,
3385 	[VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
3386 	[VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
3387 	[CPP_CLK_SRC] = &cpp_clk_src.clkr,
3388 	[CSI0_CLK_SRC] = &csi0_clk_src.clkr,
3389 	[CSI1_CLK_SRC] = &csi1_clk_src.clkr,
3390 	[CSI2_CLK_SRC] = &csi2_clk_src.clkr,
3391 	[CSI3_CLK_SRC] = &csi3_clk_src.clkr,
3392 	[FD_CORE_CLK_SRC] = &fd_core_clk_src.clkr,
3393 	[MMSS_MMAGIC_AHB_CLK] = &mmss_mmagic_ahb_clk.clkr,
3394 	[MMSS_MMAGIC_CFG_AHB_CLK] = &mmss_mmagic_cfg_ahb_clk.clkr,
3395 	[MMSS_MISC_AHB_CLK] = &mmss_misc_ahb_clk.clkr,
3396 	[MMSS_MISC_CXO_CLK] = &mmss_misc_cxo_clk.clkr,
3397 	[MMSS_MMAGIC_MAXI_CLK] = &mmss_mmagic_maxi_clk.clkr,
3398 	[MMAGIC_CAMSS_AXI_CLK] = &mmagic_camss_axi_clk.clkr,
3399 	[MMAGIC_CAMSS_NOC_CFG_AHB_CLK] = &mmagic_camss_noc_cfg_ahb_clk.clkr,
3400 	[SMMU_VFE_AHB_CLK] = &smmu_vfe_ahb_clk.clkr,
3401 	[SMMU_VFE_AXI_CLK] = &smmu_vfe_axi_clk.clkr,
3402 	[SMMU_CPP_AHB_CLK] = &smmu_cpp_ahb_clk.clkr,
3403 	[SMMU_CPP_AXI_CLK] = &smmu_cpp_axi_clk.clkr,
3404 	[SMMU_JPEG_AHB_CLK] = &smmu_jpeg_ahb_clk.clkr,
3405 	[SMMU_JPEG_AXI_CLK] = &smmu_jpeg_axi_clk.clkr,
3406 	[MMAGIC_MDSS_AXI_CLK] = &mmagic_mdss_axi_clk.clkr,
3407 	[MMAGIC_MDSS_NOC_CFG_AHB_CLK] = &mmagic_mdss_noc_cfg_ahb_clk.clkr,
3408 	[SMMU_ROT_AHB_CLK] = &smmu_rot_ahb_clk.clkr,
3409 	[SMMU_ROT_AXI_CLK] = &smmu_rot_axi_clk.clkr,
3410 	[SMMU_MDP_AHB_CLK] = &smmu_mdp_ahb_clk.clkr,
3411 	[SMMU_MDP_AXI_CLK] = &smmu_mdp_axi_clk.clkr,
3412 	[MMAGIC_VIDEO_AXI_CLK] = &mmagic_video_axi_clk.clkr,
3413 	[MMAGIC_VIDEO_NOC_CFG_AHB_CLK] = &mmagic_video_noc_cfg_ahb_clk.clkr,
3414 	[SMMU_VIDEO_AHB_CLK] = &smmu_video_ahb_clk.clkr,
3415 	[SMMU_VIDEO_AXI_CLK] = &smmu_video_axi_clk.clkr,
3416 	[MMAGIC_BIMC_NOC_CFG_AHB_CLK] = &mmagic_bimc_noc_cfg_ahb_clk.clkr,
3417 	[GPU_GX_GFX3D_CLK] = &gpu_gx_gfx3d_clk.clkr,
3418 	[GPU_GX_RBBMTIMER_CLK] = &gpu_gx_rbbmtimer_clk.clkr,
3419 	[GPU_AHB_CLK] = &gpu_ahb_clk.clkr,
3420 	[GPU_AON_ISENSE_CLK] = &gpu_aon_isense_clk.clkr,
3421 	[VMEM_MAXI_CLK] = &vmem_maxi_clk.clkr,
3422 	[VMEM_AHB_CLK] = &vmem_ahb_clk.clkr,
3423 	[MMSS_RBCPR_CLK] = &mmss_rbcpr_clk.clkr,
3424 	[MMSS_RBCPR_AHB_CLK] = &mmss_rbcpr_ahb_clk.clkr,
3425 	[VIDEO_CORE_CLK] = &video_core_clk.clkr,
3426 	[VIDEO_AXI_CLK] = &video_axi_clk.clkr,
3427 	[VIDEO_MAXI_CLK] = &video_maxi_clk.clkr,
3428 	[VIDEO_AHB_CLK] = &video_ahb_clk.clkr,
3429 	[VIDEO_SUBCORE0_CLK] = &video_subcore0_clk.clkr,
3430 	[VIDEO_SUBCORE1_CLK] = &video_subcore1_clk.clkr,
3431 	[MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
3432 	[MDSS_HDMI_AHB_CLK] = &mdss_hdmi_ahb_clk.clkr,
3433 	[MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
3434 	[MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
3435 	[MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
3436 	[MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
3437 	[MDSS_EXTPCLK_CLK] = &mdss_extpclk_clk.clkr,
3438 	[MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
3439 	[MDSS_HDMI_CLK] = &mdss_hdmi_clk.clkr,
3440 	[MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
3441 	[MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
3442 	[MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
3443 	[MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
3444 	[CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
3445 	[CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,
3446 	[CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
3447 	[CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
3448 	[CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
3449 	[CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
3450 	[CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
3451 	[CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
3452 	[CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
3453 	[CAMSS_CCI_CLK] = &camss_cci_clk.clkr,
3454 	[CAMSS_CCI_AHB_CLK] = &camss_cci_ahb_clk.clkr,
3455 	[CAMSS_CSI0PHYTIMER_CLK] = &camss_csi0phytimer_clk.clkr,
3456 	[CAMSS_CSI1PHYTIMER_CLK] = &camss_csi1phytimer_clk.clkr,
3457 	[CAMSS_CSI2PHYTIMER_CLK] = &camss_csi2phytimer_clk.clkr,
3458 	[CAMSS_CSIPHY0_3P_CLK] = &camss_csiphy0_3p_clk.clkr,
3459 	[CAMSS_CSIPHY1_3P_CLK] = &camss_csiphy1_3p_clk.clkr,
3460 	[CAMSS_CSIPHY2_3P_CLK] = &camss_csiphy2_3p_clk.clkr,
3461 	[CAMSS_JPEG0_CLK] = &camss_jpeg0_clk.clkr,
3462 	[CAMSS_JPEG2_CLK] = &camss_jpeg2_clk.clkr,
3463 	[CAMSS_JPEG_DMA_CLK] = &camss_jpeg_dma_clk.clkr,
3464 	[CAMSS_JPEG_AHB_CLK] = &camss_jpeg_ahb_clk.clkr,
3465 	[CAMSS_JPEG_AXI_CLK] = &camss_jpeg_axi_clk.clkr,
3466 	[CAMSS_VFE_AHB_CLK] = &camss_vfe_ahb_clk.clkr,
3467 	[CAMSS_VFE_AXI_CLK] = &camss_vfe_axi_clk.clkr,
3468 	[CAMSS_VFE0_CLK] = &camss_vfe0_clk.clkr,
3469 	[CAMSS_VFE0_STREAM_CLK] = &camss_vfe0_stream_clk.clkr,
3470 	[CAMSS_VFE0_AHB_CLK] = &camss_vfe0_ahb_clk.clkr,
3471 	[CAMSS_VFE1_CLK] = &camss_vfe1_clk.clkr,
3472 	[CAMSS_VFE1_STREAM_CLK] = &camss_vfe1_stream_clk.clkr,
3473 	[CAMSS_VFE1_AHB_CLK] = &camss_vfe1_ahb_clk.clkr,
3474 	[CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
3475 	[CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
3476 	[CAMSS_CPP_VBIF_AHB_CLK] = &camss_cpp_vbif_ahb_clk.clkr,
3477 	[CAMSS_CPP_AXI_CLK] = &camss_cpp_axi_clk.clkr,
3478 	[CAMSS_CPP_CLK] = &camss_cpp_clk.clkr,
3479 	[CAMSS_CPP_AHB_CLK] = &camss_cpp_ahb_clk.clkr,
3480 	[CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
3481 	[CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
3482 	[CAMSS_CSI0PHY_CLK] = &camss_csi0phy_clk.clkr,
3483 	[CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
3484 	[CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
3485 	[CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
3486 	[CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
3487 	[CAMSS_CSI1PHY_CLK] = &camss_csi1phy_clk.clkr,
3488 	[CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
3489 	[CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
3490 	[CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
3491 	[CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
3492 	[CAMSS_CSI2PHY_CLK] = &camss_csi2phy_clk.clkr,
3493 	[CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
3494 	[CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
3495 	[CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
3496 	[CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
3497 	[CAMSS_CSI3PHY_CLK] = &camss_csi3phy_clk.clkr,
3498 	[CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
3499 	[CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
3500 	[CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
3501 	[FD_CORE_CLK] = &fd_core_clk.clkr,
3502 	[FD_CORE_UAR_CLK] = &fd_core_uar_clk.clkr,
3503 	[FD_AHB_CLK] = &fd_ahb_clk.clkr,
3504 };
3505 
3506 static struct gdsc *mmcc_msm8996_gdscs[] = {
3507 	[MMAGIC_BIMC_GDSC] = &mmagic_bimc_gdsc,
3508 	[MMAGIC_VIDEO_GDSC] = &mmagic_video_gdsc,
3509 	[MMAGIC_MDSS_GDSC] = &mmagic_mdss_gdsc,
3510 	[MMAGIC_CAMSS_GDSC] = &mmagic_camss_gdsc,
3511 	[VENUS_GDSC] = &venus_gdsc,
3512 	[VENUS_CORE0_GDSC] = &venus_core0_gdsc,
3513 	[VENUS_CORE1_GDSC] = &venus_core1_gdsc,
3514 	[CAMSS_GDSC] = &camss_gdsc,
3515 	[VFE0_GDSC] = &vfe0_gdsc,
3516 	[VFE1_GDSC] = &vfe1_gdsc,
3517 	[JPEG_GDSC] = &jpeg_gdsc,
3518 	[CPP_GDSC] = &cpp_gdsc,
3519 	[FD_GDSC] = &fd_gdsc,
3520 	[MDSS_GDSC] = &mdss_gdsc,
3521 	[GPU_GDSC] = &gpu_gdsc,
3522 	[GPU_GX_GDSC] = &gpu_gx_gdsc,
3523 };
3524 
3525 static const struct qcom_reset_map mmcc_msm8996_resets[] = {
3526 	[MMAGICAHB_BCR] = { 0x5020 },
3527 	[MMAGIC_CFG_BCR] = { 0x5050 },
3528 	[MISC_BCR] = { 0x5010 },
3529 	[BTO_BCR] = { 0x5030 },
3530 	[MMAGICAXI_BCR] = { 0x5060 },
3531 	[MMAGICMAXI_BCR] = { 0x5070 },
3532 	[DSA_BCR] = { 0x50a0 },
3533 	[MMAGIC_CAMSS_BCR] = { 0x3c40 },
3534 	[THROTTLE_CAMSS_BCR] = { 0x3c30 },
3535 	[SMMU_VFE_BCR] = { 0x3c00 },
3536 	[SMMU_CPP_BCR] = { 0x3c10 },
3537 	[SMMU_JPEG_BCR] = { 0x3c20 },
3538 	[MMAGIC_MDSS_BCR] = { 0x2470 },
3539 	[THROTTLE_MDSS_BCR] = { 0x2460 },
3540 	[SMMU_ROT_BCR] = { 0x2440 },
3541 	[SMMU_MDP_BCR] = { 0x2450 },
3542 	[MMAGIC_VIDEO_BCR] = { 0x1190 },
3543 	[THROTTLE_VIDEO_BCR] = { 0x1180 },
3544 	[SMMU_VIDEO_BCR] = { 0x1170 },
3545 	[MMAGIC_BIMC_BCR] = { 0x5290 },
3546 	[GPU_GX_BCR] = { 0x4020 },
3547 	[GPU_BCR] = { 0x4030 },
3548 	[GPU_AON_BCR] = { 0x4040 },
3549 	[VMEM_BCR] = { 0x1200 },
3550 	[MMSS_RBCPR_BCR] = { 0x4080 },
3551 	[VIDEO_BCR] = { 0x1020 },
3552 	[MDSS_BCR] = { 0x2300 },
3553 	[CAMSS_TOP_BCR] = { 0x3480 },
3554 	[CAMSS_AHB_BCR] = { 0x3488 },
3555 	[CAMSS_MICRO_BCR] = { 0x3490 },
3556 	[CAMSS_CCI_BCR] = { 0x3340 },
3557 	[CAMSS_PHY0_BCR] = { 0x3020 },
3558 	[CAMSS_PHY1_BCR] = { 0x3050 },
3559 	[CAMSS_PHY2_BCR] = { 0x3080 },
3560 	[CAMSS_CSIPHY0_3P_BCR] = { 0x3230 },
3561 	[CAMSS_CSIPHY1_3P_BCR] = { 0x3250 },
3562 	[CAMSS_CSIPHY2_3P_BCR] = { 0x3270 },
3563 	[CAMSS_JPEG_BCR] = { 0x35a0 },
3564 	[CAMSS_VFE_BCR] = { 0x36a0 },
3565 	[CAMSS_VFE0_BCR] = { 0x3660 },
3566 	[CAMSS_VFE1_BCR] = { 0x3670 },
3567 	[CAMSS_CSI_VFE0_BCR] = { 0x3700 },
3568 	[CAMSS_CSI_VFE1_BCR] = { 0x3710 },
3569 	[CAMSS_CPP_TOP_BCR] = { 0x36c0 },
3570 	[CAMSS_CPP_BCR] = { 0x36d0 },
3571 	[CAMSS_CSI0_BCR] = { 0x30b0 },
3572 	[CAMSS_CSI0RDI_BCR] = { 0x30d0 },
3573 	[CAMSS_CSI0PIX_BCR] = { 0x30e0 },
3574 	[CAMSS_CSI1_BCR] = { 0x3120 },
3575 	[CAMSS_CSI1RDI_BCR] = { 0x3140 },
3576 	[CAMSS_CSI1PIX_BCR] = { 0x3150 },
3577 	[CAMSS_CSI2_BCR] = { 0x3180 },
3578 	[CAMSS_CSI2RDI_BCR] = { 0x31a0 },
3579 	[CAMSS_CSI2PIX_BCR] = { 0x31b0 },
3580 	[CAMSS_CSI3_BCR] = { 0x31e0 },
3581 	[CAMSS_CSI3RDI_BCR] = { 0x3200 },
3582 	[CAMSS_CSI3PIX_BCR] = { 0x3210 },
3583 	[CAMSS_ISPIF_BCR] = { 0x3220 },
3584 	[FD_BCR] = { 0x3b60 },
3585 	[MMSS_SPDM_RM_BCR] = { 0x300 },
3586 };
3587 
3588 static const struct regmap_config mmcc_msm8996_regmap_config = {
3589 	.reg_bits	= 32,
3590 	.reg_stride	= 4,
3591 	.val_bits	= 32,
3592 	.max_register	= 0xb008,
3593 	.fast_io	= true,
3594 };
3595 
3596 static const struct qcom_cc_desc mmcc_msm8996_desc = {
3597 	.config = &mmcc_msm8996_regmap_config,
3598 	.clks = mmcc_msm8996_clocks,
3599 	.num_clks = ARRAY_SIZE(mmcc_msm8996_clocks),
3600 	.resets = mmcc_msm8996_resets,
3601 	.num_resets = ARRAY_SIZE(mmcc_msm8996_resets),
3602 	.gdscs = mmcc_msm8996_gdscs,
3603 	.num_gdscs = ARRAY_SIZE(mmcc_msm8996_gdscs),
3604 	.clk_hws = mmcc_msm8996_hws,
3605 	.num_clk_hws = ARRAY_SIZE(mmcc_msm8996_hws),
3606 };
3607 
3608 static const struct of_device_id mmcc_msm8996_match_table[] = {
3609 	{ .compatible = "qcom,mmcc-msm8996" },
3610 	{ }
3611 };
3612 MODULE_DEVICE_TABLE(of, mmcc_msm8996_match_table);
3613 
mmcc_msm8996_probe(struct platform_device * pdev)3614 static int mmcc_msm8996_probe(struct platform_device *pdev)
3615 {
3616 	struct regmap *regmap;
3617 
3618 	regmap = qcom_cc_map(pdev, &mmcc_msm8996_desc);
3619 	if (IS_ERR(regmap))
3620 		return PTR_ERR(regmap);
3621 
3622 	/* Disable the AHB DCD */
3623 	regmap_update_bits(regmap, 0x50d8, BIT(31), 0);
3624 	/* Disable the NoC FSM for mmss_mmagic_cfg_ahb_clk */
3625 	regmap_update_bits(regmap, 0x5054, BIT(15), 0);
3626 
3627 	return qcom_cc_really_probe(&pdev->dev, &mmcc_msm8996_desc, regmap);
3628 }
3629 
3630 static struct platform_driver mmcc_msm8996_driver = {
3631 	.probe		= mmcc_msm8996_probe,
3632 	.driver		= {
3633 		.name	= "mmcc-msm8996",
3634 		.of_match_table = mmcc_msm8996_match_table,
3635 	},
3636 };
3637 module_platform_driver(mmcc_msm8996_driver);
3638 
3639 MODULE_DESCRIPTION("QCOM MMCC MSM8996 Driver");
3640 MODULE_LICENSE("GPL v2");
3641 MODULE_ALIAS("platform:mmcc-msm8996");
3642