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