1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
4  * Copyright (c) 2020, Martin Botka <martin.botka@somainline.org>
5  * Copyright (c) 2020, Konrad Dybcio <konrad.dybcio@somainline.org>
6  */
7 
8 #include <linux/kernel.h>
9 #include <linux/bitops.h>
10 #include <linux/err.h>
11 #include <linux/platform_device.h>
12 #include <linux/mod_devicetable.h>
13 #include <linux/module.h>
14 #include <linux/clk-provider.h>
15 #include <linux/regmap.h>
16 
17 #include <dt-bindings/clock/qcom,mmcc-sdm660.h>
18 
19 #include "common.h"
20 #include "clk-regmap.h"
21 #include "clk-regmap-divider.h"
22 #include "clk-alpha-pll.h"
23 #include "clk-rcg.h"
24 #include "clk-branch.h"
25 #include "reset.h"
26 #include "gdsc.h"
27 
28 enum {
29 	P_XO,
30 	P_DSI0PLL_BYTE,
31 	P_DSI0PLL,
32 	P_DSI1PLL_BYTE,
33 	P_DSI1PLL,
34 	P_GPLL0,
35 	P_GPLL0_DIV,
36 	P_MMPLL0,
37 	P_MMPLL10,
38 	P_MMPLL3,
39 	P_MMPLL4,
40 	P_MMPLL5,
41 	P_MMPLL6,
42 	P_MMPLL7,
43 	P_MMPLL8,
44 	P_SLEEP_CLK,
45 	P_DP_PHY_PLL_LINK_CLK,
46 	P_DP_PHY_PLL_VCO_DIV,
47 };
48 
49 static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map[] = {
50 	{ P_XO, 0 },
51 	{ P_MMPLL0, 1 },
52 	{ P_MMPLL4, 2 },
53 	{ P_MMPLL7, 3 },
54 	{ P_MMPLL8, 4 },
55 	{ P_GPLL0, 5 },
56 	{ P_GPLL0_DIV, 6 },
57 };
58 
59 /* Voteable PLL */
60 static struct clk_alpha_pll mmpll0 = {
61 	.offset = 0xc000,
62 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
63 	.clkr = {
64 		.enable_reg = 0x1f0,
65 		.enable_mask = BIT(0),
66 		.hw.init = &(struct clk_init_data){
67 			.name = "mmpll0",
68 			.parent_data = &(const struct clk_parent_data){
69 				.fw_name = "xo",
70 			},
71 			.num_parents = 1,
72 			.ops = &clk_alpha_pll_ops,
73 		},
74 	},
75 };
76 
77 static struct clk_alpha_pll mmpll6 =  {
78 	.offset = 0xf0,
79 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
80 	.clkr = {
81 		.enable_reg = 0x1f0,
82 		.enable_mask = BIT(2),
83 		.hw.init = &(struct clk_init_data){
84 			.name = "mmpll6",
85 			.parent_data = &(const struct clk_parent_data){
86 				.fw_name = "xo",
87 			},
88 			.num_parents = 1,
89 			.ops = &clk_alpha_pll_ops,
90 		},
91 	},
92 };
93 
94 /* APSS controlled PLLs */
95 static const struct pll_vco vco[] = {
96 	{ 1000000000, 2000000000, 0 },
97 	{ 750000000, 1500000000, 1 },
98 	{ 500000000, 1000000000, 2 },
99 	{ 250000000, 500000000, 3 },
100 };
101 
102 static const struct pll_vco mmpll3_vco[] = {
103 	{ 750000000, 1500000000, 1 },
104 };
105 
106 static const struct alpha_pll_config mmpll10_config = {
107 	.l = 0x1e,
108 	.config_ctl_val = 0x00004289,
109 	.main_output_mask = 0x1,
110 };
111 
112 static struct clk_alpha_pll mmpll10 = {
113 	.offset = 0x190,
114 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
115 	.clkr = {
116 		.hw.init = &(struct clk_init_data){
117 			.name = "mmpll10",
118 			.parent_data = &(const struct clk_parent_data){
119 				.fw_name = "xo",
120 			},
121 			.num_parents = 1,
122 			.ops = &clk_alpha_pll_ops,
123 		},
124 	},
125 };
126 
127 static const struct alpha_pll_config mmpll3_config = {
128 	.l = 0x2e,
129 	.config_ctl_val = 0x4001055b,
130 	.vco_val = 0x1 << 20,
131 	.vco_mask = 0x3 << 20,
132 	.main_output_mask = 0x1,
133 };
134 
135 static struct clk_alpha_pll mmpll3 = {
136 	.offset = 0x0,
137 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
138 	.vco_table = mmpll3_vco,
139 	.num_vco = ARRAY_SIZE(mmpll3_vco),
140 	.clkr = {
141 		.hw.init = &(struct clk_init_data){
142 			.name = "mmpll3",
143 			.parent_data = &(const struct clk_parent_data){
144 				.fw_name = "xo",
145 			},
146 			.num_parents = 1,
147 			.ops = &clk_alpha_pll_ops,
148 		},
149 	},
150 };
151 
152 static const struct alpha_pll_config mmpll4_config = {
153 	.l = 0x28,
154 	.config_ctl_val = 0x4001055b,
155 	.vco_val = 0x2 << 20,
156 	.vco_mask = 0x3 << 20,
157 	.main_output_mask = 0x1,
158 };
159 
160 static struct clk_alpha_pll mmpll4 = {
161 	.offset = 0x50,
162 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
163 	.vco_table = vco,
164 	.num_vco = ARRAY_SIZE(vco),
165 	.clkr = {
166 		.hw.init = &(struct clk_init_data){
167 			.name = "mmpll4",
168 			.parent_data = &(const struct clk_parent_data){
169 				.fw_name = "xo",
170 			},
171 			.num_parents = 1,
172 			.ops = &clk_alpha_pll_ops,
173 		},
174 	},
175 };
176 
177 static const struct alpha_pll_config mmpll5_config = {
178 	.l = 0x2a,
179 	.config_ctl_val = 0x4001055b,
180 	.alpha_hi = 0xf8,
181 	.alpha_en_mask = BIT(24),
182 	.vco_val = 0x2 << 20,
183 	.vco_mask = 0x3 << 20,
184 	.main_output_mask = 0x1,
185 };
186 
187 static struct clk_alpha_pll mmpll5 = {
188 	.offset = 0xa0,
189 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
190 	.vco_table = vco,
191 	.num_vco = ARRAY_SIZE(vco),
192 	.clkr = {
193 		.hw.init = &(struct clk_init_data){
194 			.name = "mmpll5",
195 			.parent_data = &(const struct clk_parent_data){
196 				.fw_name = "xo",
197 			},
198 			.num_parents = 1,
199 			.ops = &clk_alpha_pll_ops,
200 		},
201 	},
202 };
203 
204 static const struct alpha_pll_config mmpll7_config = {
205 	.l = 0x32,
206 	.config_ctl_val = 0x4001055b,
207 	.vco_val = 0x2 << 20,
208 	.vco_mask = 0x3 << 20,
209 	.main_output_mask = 0x1,
210 };
211 
212 static struct clk_alpha_pll mmpll7 = {
213 	.offset = 0x140,
214 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
215 	.vco_table = vco,
216 	.num_vco = ARRAY_SIZE(vco),
217 	.clkr = {
218 		.hw.init = &(struct clk_init_data){
219 			.name = "mmpll7",
220 			.parent_data = &(const struct clk_parent_data){
221 				.fw_name = "xo",
222 			},
223 			.num_parents = 1,
224 			.ops = &clk_alpha_pll_ops,
225 		},
226 	},
227 };
228 
229 static const struct alpha_pll_config mmpll8_config = {
230 	.l = 0x30,
231 	.alpha_hi = 0x70,
232 	.alpha_en_mask = BIT(24),
233 	.config_ctl_val = 0x4001055b,
234 	.vco_val = 0x2 << 20,
235 	.vco_mask = 0x3 << 20,
236 	.main_output_mask = 0x1,
237 };
238 
239 static struct clk_alpha_pll mmpll8 = {
240 	.offset = 0x1c0,
241 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
242 	.vco_table = vco,
243 	.num_vco = ARRAY_SIZE(vco),
244 	.clkr = {
245 		.hw.init = &(struct clk_init_data){
246 			.name = "mmpll8",
247 			.parent_data = &(const struct clk_parent_data){
248 				.fw_name = "xo",
249 			},
250 			.num_parents = 1,
251 			.ops = &clk_alpha_pll_ops,
252 		},
253 	},
254 };
255 
256 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div[] = {
257 	{ .fw_name = "xo" },
258 	{ .hw = &mmpll0.clkr.hw },
259 	{ .hw = &mmpll4.clkr.hw },
260 	{ .hw = &mmpll7.clkr.hw },
261 	{ .hw = &mmpll8.clkr.hw },
262 	{ .fw_name = "gpll0" },
263 	{ .fw_name = "gpll0_div" },
264 };
265 
266 static const struct parent_map mmcc_xo_dsibyte_map[] = {
267 	{ P_XO, 0 },
268 	{ P_DSI0PLL_BYTE, 1 },
269 	{ P_DSI1PLL_BYTE, 2 },
270 };
271 
272 static const struct clk_parent_data mmcc_xo_dsibyte[] = {
273 	{ .fw_name = "xo" },
274 	{ .fw_name = "dsi0pllbyte" },
275 	{ .fw_name = "dsi1pllbyte" },
276 };
277 
278 static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map[] = {
279 	{ P_XO, 0 },
280 	{ P_MMPLL0, 1 },
281 	{ P_MMPLL4, 2 },
282 	{ P_MMPLL7, 3 },
283 	{ P_MMPLL10, 4 },
284 	{ P_GPLL0, 5 },
285 	{ P_GPLL0_DIV, 6 },
286 };
287 
288 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div[] = {
289 	{ .fw_name = "xo" },
290 	{ .hw = &mmpll0.clkr.hw },
291 	{ .hw = &mmpll4.clkr.hw },
292 	{ .hw = &mmpll7.clkr.hw },
293 	{ .hw = &mmpll10.clkr.hw },
294 	{ .fw_name = "gpll0" },
295 	{ .fw_name = "gpll0_div" },
296 };
297 
298 static const struct parent_map mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
299 	{ P_XO, 0 },
300 	{ P_MMPLL4, 1 },
301 	{ P_MMPLL7, 2 },
302 	{ P_MMPLL10, 3 },
303 	{ P_SLEEP_CLK, 4 },
304 	{ P_GPLL0, 5 },
305 	{ P_GPLL0_DIV, 6 },
306 };
307 
308 static const struct clk_parent_data mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
309 	{ .fw_name = "xo" },
310 	{ .hw = &mmpll4.clkr.hw },
311 	{ .hw = &mmpll7.clkr.hw },
312 	{ .hw = &mmpll10.clkr.hw },
313 	{ .fw_name = "sleep_clk" },
314 	{ .fw_name = "gpll0" },
315 	{ .fw_name = "gpll0_div" },
316 };
317 
318 static const struct parent_map mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
319 	{ P_XO, 0 },
320 	{ P_MMPLL0, 1 },
321 	{ P_MMPLL7, 2 },
322 	{ P_MMPLL10, 3 },
323 	{ P_SLEEP_CLK, 4 },
324 	{ P_GPLL0, 5 },
325 	{ P_GPLL0_DIV, 6 },
326 };
327 
328 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
329 	{ .fw_name = "xo" },
330 	{ .hw = &mmpll0.clkr.hw },
331 	{ .hw = &mmpll7.clkr.hw },
332 	{ .hw = &mmpll10.clkr.hw },
333 	{ .fw_name = "sleep_clk" },
334 	{ .fw_name = "gpll0" },
335 	{ .fw_name = "gpll0_div" },
336 };
337 
338 static const struct parent_map mmcc_xo_gpll0_gpll0_div_map[] = {
339 	{ P_XO, 0 },
340 	{ P_GPLL0, 5 },
341 	{ P_GPLL0_DIV, 6 },
342 };
343 
344 static const struct clk_parent_data mmcc_xo_gpll0_gpll0_div[] = {
345 	{ .fw_name = "xo" },
346 	{ .fw_name = "gpll0" },
347 	{ .fw_name = "gpll0_div" },
348 };
349 
350 static const struct parent_map mmcc_xo_dplink_dpvco_map[] = {
351 	{ P_XO, 0 },
352 	{ P_DP_PHY_PLL_LINK_CLK, 1 },
353 	{ P_DP_PHY_PLL_VCO_DIV, 2 },
354 };
355 
356 static const struct clk_parent_data mmcc_xo_dplink_dpvco[] = {
357 	{ .fw_name = "xo" },
358 	{ .fw_name = "dp_link_2x_clk_divsel_five" },
359 	{ .fw_name = "dp_vco_divided_clk_src_mux" },
360 };
361 
362 static const struct parent_map mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map[] = {
363 	{ P_XO, 0 },
364 	{ P_MMPLL0, 1 },
365 	{ P_MMPLL5, 2 },
366 	{ P_MMPLL7, 3 },
367 	{ P_GPLL0, 5 },
368 	{ P_GPLL0_DIV, 6 },
369 };
370 
371 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div[] = {
372 	{ .fw_name = "xo" },
373 	{ .hw = &mmpll0.clkr.hw },
374 	{ .hw = &mmpll5.clkr.hw },
375 	{ .hw = &mmpll7.clkr.hw },
376 	{ .fw_name = "gpll0" },
377 	{ .fw_name = "gpll0_div" },
378 };
379 
380 static const struct parent_map mmcc_xo_dsi0pll_dsi1pll_map[] = {
381 	{ P_XO, 0 },
382 	{ P_DSI0PLL, 1 },
383 	{ P_DSI1PLL, 2 },
384 };
385 
386 static const struct clk_parent_data mmcc_xo_dsi0pll_dsi1pll[] = {
387 	{ .fw_name = "xo" },
388 	{ .fw_name = "dsi0pll" },
389 	{ .fw_name = "dsi1pll" },
390 };
391 
392 static const struct parent_map mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map[] = {
393 	{ P_XO, 0 },
394 	{ P_MMPLL0, 1 },
395 	{ P_MMPLL4, 2 },
396 	{ P_MMPLL7, 3 },
397 	{ P_MMPLL10, 4 },
398 	{ P_MMPLL6, 5 },
399 	{ P_GPLL0, 6 },
400 };
401 
402 static const struct clk_parent_data mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0[] = {
403 	{ .fw_name = "xo" },
404 	{ .hw = &mmpll0.clkr.hw },
405 	{ .hw = &mmpll4.clkr.hw },
406 	{ .hw = &mmpll7.clkr.hw },
407 	{ .hw = &mmpll10.clkr.hw },
408 	{ .hw = &mmpll6.clkr.hw },
409 	{ .fw_name = "gpll0" },
410 };
411 
412 static const struct parent_map mmcc_xo_mmpll0_gpll0_gpll0_div_map[] = {
413 	{ P_XO, 0 },
414 	{ P_MMPLL0, 1 },
415 	{ P_GPLL0, 5 },
416 	{ P_GPLL0_DIV, 6 },
417 };
418 
419 static const struct clk_parent_data mmcc_xo_mmpll0_gpll0_gpll0_div[] = {
420 	{ .fw_name = "xo" },
421 	{ .hw = &mmpll0.clkr.hw },
422 	{ .fw_name = "gpll0" },
423 	{ .fw_name = "gpll0_div" },
424 };
425 
426 static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map[] = {
427 	{ P_XO, 0 },
428 	{ P_MMPLL0, 1 },
429 	{ P_MMPLL4, 2 },
430 	{ P_MMPLL7, 3 },
431 	{ P_MMPLL10, 4 },
432 	{ P_GPLL0, 5 },
433 	{ P_MMPLL6, 6 },
434 };
435 
436 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6[] = {
437 	{ .fw_name = "xo" },
438 	{ .hw = &mmpll0.clkr.hw },
439 	{ .hw = &mmpll4.clkr.hw },
440 	{ .hw = &mmpll7.clkr.hw },
441 	{ .hw = &mmpll10.clkr.hw },
442 	{ .fw_name = "gpll0" },
443 	{ .hw = &mmpll6.clkr.hw },
444 };
445 
446 static const struct parent_map mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map[] = {
447 	{ P_XO, 0 },
448 	{ P_MMPLL0, 1 },
449 	{ P_MMPLL8, 2 },
450 	{ P_MMPLL3, 3 },
451 	{ P_MMPLL6, 4 },
452 	{ P_GPLL0, 5 },
453 	{ P_MMPLL7, 6 },
454 };
455 
456 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7[] = {
457 	{ .fw_name = "xo" },
458 	{ .hw = &mmpll0.clkr.hw },
459 	{ .hw = &mmpll8.clkr.hw },
460 	{ .hw = &mmpll3.clkr.hw },
461 	{ .hw = &mmpll6.clkr.hw },
462 	{ .fw_name = "gpll0" },
463 	{ .hw = &mmpll7.clkr.hw },
464 };
465 
466 static const struct freq_tbl ftbl_ahb_clk_src[] = {
467 	F(19200000, P_XO, 1, 0, 0),
468 	F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
469 	F(80800000, P_MMPLL0, 10, 0, 0),
470 	{ }
471 };
472 
473 static struct clk_rcg2 ahb_clk_src = {
474 	.cmd_rcgr = 0x5000,
475 	.mnd_width = 0,
476 	.hid_width = 5,
477 	.parent_map = mmcc_xo_mmpll0_gpll0_gpll0_div_map,
478 	.freq_tbl = ftbl_ahb_clk_src,
479 	.clkr.hw.init = &(struct clk_init_data){
480 		.name = "ahb_clk_src",
481 		.parent_data = mmcc_xo_mmpll0_gpll0_gpll0_div,
482 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_gpll0_gpll0_div),
483 		.ops = &clk_rcg2_ops,
484 	},
485 };
486 
487 static struct clk_rcg2 byte0_clk_src = {
488 	.cmd_rcgr = 0x2120,
489 	.mnd_width = 0,
490 	.hid_width = 5,
491 	.parent_map = mmcc_xo_dsibyte_map,
492 	.clkr.hw.init = &(struct clk_init_data){
493 		.name = "byte0_clk_src",
494 		.parent_data = mmcc_xo_dsibyte,
495 		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
496 		.ops = &clk_byte2_ops,
497 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
498 	},
499 };
500 
501 static struct clk_rcg2 byte1_clk_src = {
502 	.cmd_rcgr = 0x2140,
503 	.mnd_width = 0,
504 	.hid_width = 5,
505 	.parent_map = mmcc_xo_dsibyte_map,
506 	.clkr.hw.init = &(struct clk_init_data){
507 		.name = "byte1_clk_src",
508 		.parent_data = mmcc_xo_dsibyte,
509 		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
510 		.ops = &clk_byte2_ops,
511 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
512 	},
513 };
514 
515 static const struct freq_tbl ftbl_camss_gp0_clk_src[] = {
516 	F(10000, P_XO, 16, 1, 120),
517 	F(24000, P_XO, 16, 1, 50),
518 	F(6000000, P_GPLL0_DIV, 10, 1, 5),
519 	F(12000000, P_GPLL0_DIV, 10, 2, 5),
520 	F(13043478, P_GPLL0_DIV, 1, 1, 23),
521 	F(24000000, P_GPLL0_DIV, 1, 2, 25),
522 	F(50000000, P_GPLL0_DIV, 6, 0, 0),
523 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
524 	F(200000000, P_GPLL0, 3, 0, 0),
525 	{ }
526 };
527 
528 static struct clk_rcg2 camss_gp0_clk_src = {
529 	.cmd_rcgr = 0x3420,
530 	.mnd_width = 8,
531 	.hid_width = 5,
532 	.parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
533 	.freq_tbl = ftbl_camss_gp0_clk_src,
534 	.clkr.hw.init = &(struct clk_init_data){
535 		.name = "camss_gp0_clk_src",
536 		.parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
537 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
538 		.ops = &clk_rcg2_ops,
539 	},
540 };
541 
542 static struct clk_rcg2 camss_gp1_clk_src = {
543 	.cmd_rcgr = 0x3450,
544 	.mnd_width = 8,
545 	.hid_width = 5,
546 	.parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
547 	.freq_tbl = ftbl_camss_gp0_clk_src,
548 	.clkr.hw.init = &(struct clk_init_data){
549 		.name = "camss_gp1_clk_src",
550 		.parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
551 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
552 		.ops = &clk_rcg2_ops,
553 	},
554 };
555 
556 static const struct freq_tbl ftbl_cci_clk_src[] = {
557 	F(37500000, P_GPLL0_DIV, 8, 0, 0),
558 	F(50000000, P_GPLL0_DIV, 6, 0, 0),
559 	F(100000000, P_GPLL0, 6, 0, 0),
560 	{ }
561 };
562 
563 static struct clk_rcg2 cci_clk_src = {
564 	.cmd_rcgr = 0x3300,
565 	.mnd_width = 8,
566 	.hid_width = 5,
567 	.parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
568 	.freq_tbl = ftbl_cci_clk_src,
569 	.clkr.hw.init = &(struct clk_init_data){
570 		.name = "cci_clk_src",
571 		.parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
572 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
573 		.ops = &clk_rcg2_ops,
574 	},
575 };
576 
577 static const struct freq_tbl ftbl_cpp_clk_src[] = {
578 	F(120000000, P_GPLL0, 5, 0, 0),
579 	F(256000000, P_MMPLL4, 3, 0, 0),
580 	F(384000000, P_MMPLL4, 2, 0, 0),
581 	F(480000000, P_MMPLL7, 2, 0, 0),
582 	F(540000000, P_MMPLL6, 2, 0, 0),
583 	F(576000000, P_MMPLL10, 1, 0, 0),
584 	{ }
585 };
586 
587 static struct clk_rcg2 cpp_clk_src = {
588 	.cmd_rcgr = 0x3640,
589 	.mnd_width = 0,
590 	.hid_width = 5,
591 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map,
592 	.freq_tbl = ftbl_cpp_clk_src,
593 	.clkr.hw.init = &(struct clk_init_data){
594 		.name = "cpp_clk_src",
595 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6,
596 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6),
597 		.ops = &clk_rcg2_ops,
598 	},
599 };
600 
601 static const struct freq_tbl ftbl_csi0_clk_src[] = {
602 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
603 	F(200000000, P_GPLL0, 3, 0, 0),
604 	F(310000000, P_MMPLL8, 3, 0, 0),
605 	F(404000000, P_MMPLL0, 2, 0, 0),
606 	F(465000000, P_MMPLL8, 2, 0, 0),
607 	{ }
608 };
609 
610 static struct clk_rcg2 csi0_clk_src = {
611 	.cmd_rcgr = 0x3090,
612 	.mnd_width = 0,
613 	.hid_width = 5,
614 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
615 	.freq_tbl = ftbl_csi0_clk_src,
616 	.clkr.hw.init = &(struct clk_init_data){
617 		.name = "csi0_clk_src",
618 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
619 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
620 		.ops = &clk_rcg2_ops,
621 	},
622 };
623 
624 static const struct freq_tbl ftbl_csi0phytimer_clk_src[] = {
625 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
626 	F(200000000, P_GPLL0, 3, 0, 0),
627 	F(269333333, P_MMPLL0, 3, 0, 0),
628 	{ }
629 };
630 
631 static struct clk_rcg2 csi0phytimer_clk_src = {
632 	.cmd_rcgr = 0x3000,
633 	.mnd_width = 0,
634 	.hid_width = 5,
635 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
636 	.freq_tbl = ftbl_csi0phytimer_clk_src,
637 	.clkr.hw.init = &(struct clk_init_data){
638 		.name = "csi0phytimer_clk_src",
639 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
640 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
641 		.ops = &clk_rcg2_ops,
642 	},
643 };
644 
645 static struct clk_rcg2 csi1_clk_src = {
646 	.cmd_rcgr = 0x3100,
647 	.mnd_width = 0,
648 	.hid_width = 5,
649 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
650 	.freq_tbl = ftbl_csi0_clk_src,
651 	.clkr.hw.init = &(struct clk_init_data){
652 		.name = "csi1_clk_src",
653 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
654 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
655 		.ops = &clk_rcg2_ops,
656 	},
657 };
658 
659 static struct clk_rcg2 csi1phytimer_clk_src = {
660 	.cmd_rcgr = 0x3030,
661 	.mnd_width = 0,
662 	.hid_width = 5,
663 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
664 	.freq_tbl = ftbl_csi0phytimer_clk_src,
665 	.clkr.hw.init = &(struct clk_init_data){
666 		.name = "csi1phytimer_clk_src",
667 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
668 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
669 		.ops = &clk_rcg2_ops,
670 	},
671 };
672 
673 static struct clk_rcg2 csi2_clk_src = {
674 	.cmd_rcgr = 0x3160,
675 	.mnd_width = 0,
676 	.hid_width = 5,
677 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
678 	.freq_tbl = ftbl_csi0_clk_src,
679 	.clkr.hw.init = &(struct clk_init_data){
680 		.name = "csi2_clk_src",
681 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
682 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
683 		.ops = &clk_rcg2_ops,
684 	},
685 };
686 
687 static struct clk_rcg2 csi2phytimer_clk_src = {
688 	.cmd_rcgr = 0x3060,
689 	.mnd_width = 0,
690 	.hid_width = 5,
691 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
692 	.freq_tbl = ftbl_csi0phytimer_clk_src,
693 	.clkr.hw.init = &(struct clk_init_data){
694 		.name = "csi2phytimer_clk_src",
695 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
696 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
697 		.ops = &clk_rcg2_ops,
698 	},
699 };
700 
701 static struct clk_rcg2 csi3_clk_src = {
702 	.cmd_rcgr = 0x31c0,
703 	.mnd_width = 0,
704 	.hid_width = 5,
705 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
706 	.freq_tbl = ftbl_csi0_clk_src,
707 	.clkr.hw.init = &(struct clk_init_data){
708 		.name = "csi3_clk_src",
709 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
710 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
711 		.ops = &clk_rcg2_ops,
712 	},
713 };
714 
715 static const struct freq_tbl ftbl_csiphy_clk_src[] = {
716 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
717 	F(200000000, P_GPLL0, 3, 0, 0),
718 	F(269333333, P_MMPLL0, 3, 0, 0),
719 	F(320000000, P_MMPLL7, 3, 0, 0),
720 	{ }
721 };
722 
723 static struct clk_rcg2 csiphy_clk_src = {
724 	.cmd_rcgr = 0x3800,
725 	.mnd_width = 0,
726 	.hid_width = 5,
727 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
728 	.freq_tbl = ftbl_csiphy_clk_src,
729 	.clkr.hw.init = &(struct clk_init_data){
730 		.name = "csiphy_clk_src",
731 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
732 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
733 		.ops = &clk_rcg2_ops,
734 	},
735 };
736 
737 static const struct freq_tbl ftbl_dp_aux_clk_src[] = {
738 	F(19200000, P_XO, 1, 0, 0),
739 	{ }
740 };
741 
742 static struct clk_rcg2 dp_aux_clk_src = {
743 	.cmd_rcgr = 0x2260,
744 	.mnd_width = 0,
745 	.hid_width = 5,
746 	.parent_map = mmcc_xo_gpll0_gpll0_div_map,
747 	.freq_tbl = ftbl_dp_aux_clk_src,
748 	.clkr.hw.init = &(struct clk_init_data){
749 		.name = "dp_aux_clk_src",
750 		.parent_data = mmcc_xo_gpll0_gpll0_div,
751 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
752 		.ops = &clk_rcg2_ops,
753 	},
754 };
755 
756 static const struct freq_tbl ftbl_dp_crypto_clk_src[] = {
757 	F(101250000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
758 	F(168750000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
759 	F(337500000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
760 	{ }
761 };
762 
763 static struct clk_rcg2 dp_crypto_clk_src = {
764 	.cmd_rcgr = 0x2220,
765 	.mnd_width = 8,
766 	.hid_width = 5,
767 	.parent_map = mmcc_xo_dplink_dpvco_map,
768 	.freq_tbl = ftbl_dp_crypto_clk_src,
769 	.clkr.hw.init = &(struct clk_init_data){
770 		.name = "dp_crypto_clk_src",
771 		.parent_data = mmcc_xo_dplink_dpvco,
772 		.num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
773 		.ops = &clk_rcg2_ops,
774 	},
775 };
776 
777 static const struct freq_tbl ftbl_dp_gtc_clk_src[] = {
778 	F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
779 	F(60000000, P_GPLL0, 10, 0, 0),
780 	{ }
781 };
782 
783 static struct clk_rcg2 dp_gtc_clk_src = {
784 	.cmd_rcgr = 0x2280,
785 	.mnd_width = 0,
786 	.hid_width = 5,
787 	.parent_map = mmcc_xo_gpll0_gpll0_div_map,
788 	.freq_tbl = ftbl_dp_gtc_clk_src,
789 	.clkr.hw.init = &(struct clk_init_data){
790 		.name = "dp_gtc_clk_src",
791 		.parent_data = mmcc_xo_gpll0_gpll0_div,
792 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
793 		.ops = &clk_rcg2_ops,
794 	},
795 };
796 
797 static const struct freq_tbl ftbl_dp_link_clk_src[] = {
798 	F(162000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
799 	F(270000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
800 	F(540000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
801 	{ }
802 };
803 
804 static struct clk_rcg2 dp_link_clk_src = {
805 	.cmd_rcgr = 0x2200,
806 	.mnd_width = 0,
807 	.hid_width = 5,
808 	.parent_map = mmcc_xo_dplink_dpvco_map,
809 	.freq_tbl = ftbl_dp_link_clk_src,
810 	.clkr.hw.init = &(struct clk_init_data){
811 		.name = "dp_link_clk_src",
812 		.parent_data = mmcc_xo_dplink_dpvco,
813 		.num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
814 		.ops = &clk_rcg2_ops,
815 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
816 	},
817 };
818 
819 static struct clk_rcg2 dp_pixel_clk_src = {
820 	.cmd_rcgr = 0x2240,
821 	.mnd_width = 16,
822 	.hid_width = 5,
823 	.parent_map = mmcc_xo_dplink_dpvco_map,
824 	.clkr.hw.init = &(struct clk_init_data){
825 		.name = "dp_pixel_clk_src",
826 		.parent_data = mmcc_xo_dplink_dpvco,
827 		.num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
828 		.ops = &clk_dp_ops,
829 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
830 	},
831 };
832 
833 static struct clk_rcg2 esc0_clk_src = {
834 	.cmd_rcgr = 0x2160,
835 	.mnd_width = 0,
836 	.hid_width = 5,
837 	.parent_map = mmcc_xo_dsibyte_map,
838 	.clkr.hw.init = &(struct clk_init_data){
839 		.name = "esc0_clk_src",
840 		.parent_data = mmcc_xo_dsibyte,
841 		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
842 		.ops = &clk_rcg2_ops,
843 	},
844 };
845 
846 static struct clk_rcg2 esc1_clk_src = {
847 	.cmd_rcgr = 0x2180,
848 	.mnd_width = 0,
849 	.hid_width = 5,
850 	.parent_map = mmcc_xo_dsibyte_map,
851 	.clkr.hw.init = &(struct clk_init_data){
852 		.name = "esc1_clk_src",
853 		.parent_data = mmcc_xo_dsibyte,
854 		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
855 		.ops = &clk_rcg2_ops,
856 	},
857 };
858 
859 static const struct freq_tbl ftbl_jpeg0_clk_src[] = {
860 	F(66666667, P_GPLL0_DIV, 4.5, 0, 0),
861 	F(133333333, P_GPLL0, 4.5, 0, 0),
862 	F(219428571, P_MMPLL4, 3.5, 0, 0),
863 	F(320000000, P_MMPLL7, 3, 0, 0),
864 	F(480000000, P_MMPLL7, 2, 0, 0),
865 	{ }
866 };
867 
868 static struct clk_rcg2 jpeg0_clk_src = {
869 	.cmd_rcgr = 0x3500,
870 	.mnd_width = 0,
871 	.hid_width = 5,
872 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
873 	.freq_tbl = ftbl_jpeg0_clk_src,
874 	.clkr.hw.init = &(struct clk_init_data){
875 		.name = "jpeg0_clk_src",
876 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
877 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
878 		.ops = &clk_rcg2_ops,
879 	},
880 };
881 
882 static const struct freq_tbl ftbl_mclk0_clk_src[] = {
883 	F(4800000, P_XO, 4, 0, 0),
884 	F(6000000, P_GPLL0_DIV, 10, 1, 5),
885 	F(8000000, P_GPLL0_DIV, 1, 2, 75),
886 	F(9600000, P_XO, 2, 0, 0),
887 	F(16666667, P_GPLL0_DIV, 2, 1, 9),
888 	F(19200000, P_XO, 1, 0, 0),
889 	F(24000000, P_MMPLL10, 1, 1, 24),
890 	F(33333333, P_GPLL0_DIV, 1, 1, 9),
891 	F(48000000, P_GPLL0, 1, 2, 25),
892 	F(66666667, P_GPLL0, 1, 1, 9),
893 	{ }
894 };
895 
896 static struct clk_rcg2 mclk0_clk_src = {
897 	.cmd_rcgr = 0x3360,
898 	.mnd_width = 8,
899 	.hid_width = 5,
900 	.parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
901 	.freq_tbl = ftbl_mclk0_clk_src,
902 	.clkr.hw.init = &(struct clk_init_data){
903 		.name = "mclk0_clk_src",
904 		.parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
905 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
906 		.ops = &clk_rcg2_ops,
907 	},
908 };
909 
910 static struct clk_rcg2 mclk1_clk_src = {
911 	.cmd_rcgr = 0x3390,
912 	.mnd_width = 8,
913 	.hid_width = 5,
914 	.parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
915 	.freq_tbl = ftbl_mclk0_clk_src,
916 	.clkr.hw.init = &(struct clk_init_data){
917 		.name = "mclk1_clk_src",
918 		.parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
919 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
920 		.ops = &clk_rcg2_ops,
921 	},
922 };
923 
924 static struct clk_rcg2 mclk2_clk_src = {
925 	.cmd_rcgr = 0x33c0,
926 	.mnd_width = 8,
927 	.hid_width = 5,
928 	.parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
929 	.freq_tbl = ftbl_mclk0_clk_src,
930 	.clkr.hw.init = &(struct clk_init_data){
931 		.name = "mclk2_clk_src",
932 		.parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
933 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
934 		.ops = &clk_rcg2_ops,
935 	},
936 };
937 
938 static struct clk_rcg2 mclk3_clk_src = {
939 	.cmd_rcgr = 0x33f0,
940 	.mnd_width = 8,
941 	.hid_width = 5,
942 	.parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
943 	.freq_tbl = ftbl_mclk0_clk_src,
944 	.clkr.hw.init = &(struct clk_init_data){
945 		.name = "mclk3_clk_src",
946 		.parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
947 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
948 		.ops = &clk_rcg2_ops,
949 	},
950 };
951 
952 static const struct freq_tbl ftbl_mdp_clk_src[] = {
953 	F(100000000, P_GPLL0_DIV, 3, 0, 0),
954 	F(150000000, P_GPLL0_DIV, 2, 0, 0),
955 	F(171428571, P_GPLL0, 3.5, 0, 0),
956 	F(200000000, P_GPLL0, 3, 0, 0),
957 	F(275000000, P_MMPLL5, 3, 0, 0),
958 	F(300000000, P_GPLL0, 2, 0, 0),
959 	F(330000000, P_MMPLL5, 2.5, 0, 0),
960 	F(412500000, P_MMPLL5, 2, 0, 0),
961 	{ }
962 };
963 
964 static struct clk_rcg2 mdp_clk_src = {
965 	.cmd_rcgr = 0x2040,
966 	.mnd_width = 0,
967 	.hid_width = 5,
968 	.parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
969 	.freq_tbl = ftbl_mdp_clk_src,
970 	.clkr.hw.init = &(struct clk_init_data){
971 		.name = "mdp_clk_src",
972 		.parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
973 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
974 		.ops = &clk_rcg2_ops,
975 	},
976 };
977 
978 static struct clk_rcg2 pclk0_clk_src = {
979 	.cmd_rcgr = 0x2000,
980 	.mnd_width = 8,
981 	.hid_width = 5,
982 	.parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
983 	.clkr.hw.init = &(struct clk_init_data){
984 		.name = "pclk0_clk_src",
985 		.parent_data = mmcc_xo_dsi0pll_dsi1pll,
986 		.num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
987 		.ops = &clk_pixel_ops,
988 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
989 	},
990 };
991 
992 static struct clk_rcg2 pclk1_clk_src = {
993 	.cmd_rcgr = 0x2020,
994 	.mnd_width = 8,
995 	.hid_width = 5,
996 	.parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
997 	.clkr.hw.init = &(struct clk_init_data){
998 		.name = "pclk1_clk_src",
999 		.parent_data = mmcc_xo_dsi0pll_dsi1pll,
1000 		.num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
1001 		.ops = &clk_pixel_ops,
1002 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
1003 	},
1004 };
1005 
1006 static const struct freq_tbl ftbl_rot_clk_src[] = {
1007 	F(171428571, P_GPLL0, 3.5, 0, 0),
1008 	F(275000000, P_MMPLL5, 3, 0, 0),
1009 	F(300000000, P_GPLL0, 2, 0, 0),
1010 	F(330000000, P_MMPLL5, 2.5, 0, 0),
1011 	F(412500000, P_MMPLL5, 2, 0, 0),
1012 	{ }
1013 };
1014 
1015 static struct clk_rcg2 rot_clk_src = {
1016 	.cmd_rcgr = 0x21a0,
1017 	.mnd_width = 0,
1018 	.hid_width = 5,
1019 	.parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
1020 	.freq_tbl = ftbl_rot_clk_src,
1021 	.clkr.hw.init = &(struct clk_init_data){
1022 		.name = "rot_clk_src",
1023 		.parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
1024 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
1025 		.ops = &clk_rcg2_ops,
1026 	},
1027 };
1028 
1029 static const struct freq_tbl ftbl_vfe0_clk_src[] = {
1030 	F(120000000, P_GPLL0, 5, 0, 0),
1031 	F(200000000, P_GPLL0, 3, 0, 0),
1032 	F(256000000, P_MMPLL4, 3, 0, 0),
1033 	F(300000000, P_GPLL0, 2, 0, 0),
1034 	F(404000000, P_MMPLL0, 2, 0, 0),
1035 	F(480000000, P_MMPLL7, 2, 0, 0),
1036 	F(540000000, P_MMPLL6, 2, 0, 0),
1037 	F(576000000, P_MMPLL10, 1, 0, 0),
1038 	{ }
1039 };
1040 
1041 static struct clk_rcg2 vfe0_clk_src = {
1042 	.cmd_rcgr = 0x3600,
1043 	.mnd_width = 0,
1044 	.hid_width = 5,
1045 	.parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
1046 	.freq_tbl = ftbl_vfe0_clk_src,
1047 	.clkr.hw.init = &(struct clk_init_data){
1048 		.name = "vfe0_clk_src",
1049 		.parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
1050 		.num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
1051 		.ops = &clk_rcg2_ops,
1052 	},
1053 };
1054 
1055 static struct clk_rcg2 vfe1_clk_src = {
1056 	.cmd_rcgr = 0x3620,
1057 	.mnd_width = 0,
1058 	.hid_width = 5,
1059 	.parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
1060 	.freq_tbl = ftbl_vfe0_clk_src,
1061 	.clkr.hw.init = &(struct clk_init_data){
1062 		.name = "vfe1_clk_src",
1063 		.parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
1064 		.num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
1065 		.ops = &clk_rcg2_ops,
1066 	},
1067 };
1068 
1069 static const struct freq_tbl ftbl_video_core_clk_src[] = {
1070 	F(133333333, P_GPLL0, 4.5, 0, 0),
1071 	F(269333333, P_MMPLL0, 3, 0, 0),
1072 	F(320000000, P_MMPLL7, 3, 0, 0),
1073 	F(404000000, P_MMPLL0, 2, 0, 0),
1074 	F(441600000, P_MMPLL3, 2, 0, 0),
1075 	F(518400000, P_MMPLL3, 2, 0, 0),
1076 	{ }
1077 };
1078 
1079 static struct clk_rcg2 video_core_clk_src = {
1080 	.cmd_rcgr = 0x1000,
1081 	.mnd_width = 0,
1082 	.hid_width = 5,
1083 	.parent_map = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map,
1084 	.freq_tbl = ftbl_video_core_clk_src,
1085 	.clkr.hw.init = &(struct clk_init_data){
1086 		.name = "video_core_clk_src",
1087 		.parent_data = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7,
1088 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7),
1089 		.ops = &clk_rcg2_ops,
1090 		.flags = CLK_IS_CRITICAL,
1091 	},
1092 };
1093 
1094 static struct clk_rcg2 vsync_clk_src = {
1095 	.cmd_rcgr = 0x2080,
1096 	.mnd_width = 0,
1097 	.hid_width = 5,
1098 	.parent_map = mmcc_xo_gpll0_gpll0_div_map,
1099 	.freq_tbl = ftbl_dp_aux_clk_src,
1100 	.clkr.hw.init = &(struct clk_init_data){
1101 		.name = "vsync_clk_src",
1102 		.parent_data = mmcc_xo_gpll0_gpll0_div,
1103 		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
1104 		.ops = &clk_rcg2_ops,
1105 	},
1106 };
1107 
1108 static struct clk_branch bimc_smmu_ahb_clk = {
1109 	.halt_reg = 0xe004,
1110 	.halt_check = BRANCH_VOTED,
1111 	.hwcg_reg = 0xe004,
1112 	.hwcg_bit = 1,
1113 	.clkr = {
1114 		.enable_reg = 0xe004,
1115 		.enable_mask = BIT(0),
1116 		.hw.init = &(struct clk_init_data){
1117 			.name = "bimc_smmu_ahb_clk",
1118 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1119 			.num_parents = 1,
1120 			.ops = &clk_branch2_ops,
1121 		},
1122 	},
1123 };
1124 
1125 static struct clk_branch bimc_smmu_axi_clk = {
1126 	.halt_reg = 0xe008,
1127 	.halt_check = BRANCH_VOTED,
1128 	.hwcg_reg = 0xe008,
1129 	.hwcg_bit = 1,
1130 	.clkr = {
1131 		.enable_reg = 0xe008,
1132 		.enable_mask = BIT(0),
1133 		.hw.init = &(struct clk_init_data){
1134 			.name = "bimc_smmu_axi_clk",
1135 			.ops = &clk_branch2_ops,
1136 		},
1137 	},
1138 };
1139 
1140 static struct clk_branch camss_ahb_clk = {
1141 	.halt_reg = 0x348c,
1142 	.halt_check = BRANCH_HALT,
1143 	.hwcg_reg = 0x348c,
1144 	.hwcg_bit = 1,
1145 	.clkr = {
1146 		.enable_reg = 0x348c,
1147 		.enable_mask = BIT(0),
1148 		.hw.init = &(struct clk_init_data){
1149 			.name = "camss_ahb_clk",
1150 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1151 			.num_parents = 1,
1152 			.ops = &clk_branch2_ops,
1153 		},
1154 	},
1155 };
1156 
1157 static struct clk_branch camss_cci_ahb_clk = {
1158 	.halt_reg = 0x3348,
1159 	.halt_check = BRANCH_HALT,
1160 	.clkr = {
1161 		.enable_reg = 0x3348,
1162 		.enable_mask = BIT(0),
1163 		.hw.init = &(struct clk_init_data){
1164 			.name = "camss_cci_ahb_clk",
1165 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1166 			.num_parents = 1,
1167 			.flags = CLK_SET_RATE_PARENT,
1168 			.ops = &clk_branch2_ops,
1169 		},
1170 	},
1171 };
1172 
1173 static struct clk_branch camss_cci_clk = {
1174 	.halt_reg = 0x3344,
1175 	.halt_check = BRANCH_HALT,
1176 	.clkr = {
1177 		.enable_reg = 0x3344,
1178 		.enable_mask = BIT(0),
1179 		.hw.init = &(struct clk_init_data){
1180 			.name = "camss_cci_clk",
1181 			.parent_hws = (const struct clk_hw *[]){ &cci_clk_src.clkr.hw },
1182 			.num_parents = 1,
1183 			.flags = CLK_SET_RATE_PARENT,
1184 			.ops = &clk_branch2_ops,
1185 		},
1186 	},
1187 };
1188 
1189 static struct clk_branch camss_cpp_ahb_clk = {
1190 	.halt_reg = 0x36b4,
1191 	.halt_check = BRANCH_HALT,
1192 	.clkr = {
1193 		.enable_reg = 0x36b4,
1194 		.enable_mask = BIT(0),
1195 		.hw.init = &(struct clk_init_data){
1196 			.name = "camss_cpp_ahb_clk",
1197 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1198 			.num_parents = 1,
1199 			.ops = &clk_branch2_ops,
1200 		},
1201 	},
1202 };
1203 
1204 static struct clk_branch camss_cpp_axi_clk = {
1205 	.halt_reg = 0x36c4,
1206 	.halt_check = BRANCH_HALT,
1207 	.clkr = {
1208 		.enable_reg = 0x36c4,
1209 		.enable_mask = BIT(0),
1210 		.hw.init = &(struct clk_init_data){
1211 			.name = "camss_cpp_axi_clk",
1212 			.ops = &clk_branch2_ops,
1213 		},
1214 	},
1215 };
1216 
1217 static struct clk_branch camss_cpp_clk = {
1218 	.halt_reg = 0x36b0,
1219 	.halt_check = BRANCH_HALT,
1220 	.clkr = {
1221 		.enable_reg = 0x36b0,
1222 		.enable_mask = BIT(0),
1223 		.hw.init = &(struct clk_init_data){
1224 			.name = "camss_cpp_clk",
1225 			.parent_hws = (const struct clk_hw *[]){ &cpp_clk_src.clkr.hw },
1226 			.num_parents = 1,
1227 			.flags = CLK_SET_RATE_PARENT,
1228 			.ops = &clk_branch2_ops,
1229 		},
1230 	},
1231 };
1232 
1233 static struct clk_branch camss_cpp_vbif_ahb_clk = {
1234 	.halt_reg = 0x36c8,
1235 	.halt_check = BRANCH_HALT,
1236 	.clkr = {
1237 		.enable_reg = 0x36c8,
1238 		.enable_mask = BIT(0),
1239 		.hw.init = &(struct clk_init_data){
1240 			.name = "camss_cpp_vbif_ahb_clk",
1241 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1242 			.num_parents = 1,
1243 			.ops = &clk_branch2_ops,
1244 		},
1245 	},
1246 };
1247 
1248 static struct clk_branch camss_csi0_ahb_clk = {
1249 	.halt_reg = 0x30bc,
1250 	.halt_check = BRANCH_HALT,
1251 	.clkr = {
1252 		.enable_reg = 0x30bc,
1253 		.enable_mask = BIT(0),
1254 		.hw.init = &(struct clk_init_data){
1255 			.name = "camss_csi0_ahb_clk",
1256 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1257 			.num_parents = 1,
1258 			.ops = &clk_branch2_ops,
1259 		},
1260 	},
1261 };
1262 
1263 static struct clk_branch camss_csi0_clk = {
1264 	.halt_reg = 0x30b4,
1265 	.halt_check = BRANCH_HALT,
1266 	.clkr = {
1267 		.enable_reg = 0x30b4,
1268 		.enable_mask = BIT(0),
1269 		.hw.init = &(struct clk_init_data){
1270 			.name = "camss_csi0_clk",
1271 			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1272 			.num_parents = 1,
1273 			.flags = CLK_SET_RATE_PARENT,
1274 			.ops = &clk_branch2_ops,
1275 		},
1276 	},
1277 };
1278 
1279 static struct clk_branch camss_csi0phytimer_clk = {
1280 	.halt_reg = 0x3024,
1281 	.halt_check = BRANCH_HALT,
1282 	.clkr = {
1283 		.enable_reg = 0x3024,
1284 		.enable_mask = BIT(0),
1285 		.hw.init = &(struct clk_init_data){
1286 			.name = "camss_csi0phytimer_clk",
1287 			.parent_hws = (const struct clk_hw *[]){ &csi0phytimer_clk_src.clkr.hw },
1288 			.num_parents = 1,
1289 			.flags = CLK_SET_RATE_PARENT,
1290 			.ops = &clk_branch2_ops,
1291 		},
1292 	},
1293 };
1294 
1295 static struct clk_branch camss_csi0pix_clk = {
1296 	.halt_reg = 0x30e4,
1297 	.halt_check = BRANCH_HALT,
1298 	.clkr = {
1299 		.enable_reg = 0x30e4,
1300 		.enable_mask = BIT(0),
1301 		.hw.init = &(struct clk_init_data){
1302 			.name = "camss_csi0pix_clk",
1303 			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1304 			.num_parents = 1,
1305 			.ops = &clk_branch2_ops,
1306 		},
1307 	},
1308 };
1309 
1310 static struct clk_branch camss_csi0rdi_clk = {
1311 	.halt_reg = 0x30d4,
1312 	.halt_check = BRANCH_HALT,
1313 	.clkr = {
1314 		.enable_reg = 0x30d4,
1315 		.enable_mask = BIT(0),
1316 		.hw.init = &(struct clk_init_data){
1317 			.name = "camss_csi0rdi_clk",
1318 			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1319 			.num_parents = 1,
1320 			.ops = &clk_branch2_ops,
1321 		},
1322 	},
1323 };
1324 
1325 static struct clk_branch camss_csi1_ahb_clk = {
1326 	.halt_reg = 0x3128,
1327 	.halt_check = BRANCH_HALT,
1328 	.clkr = {
1329 		.enable_reg = 0x3128,
1330 		.enable_mask = BIT(0),
1331 		.hw.init = &(struct clk_init_data){
1332 			.name = "camss_csi1_ahb_clk",
1333 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1334 			.num_parents = 1,
1335 			.ops = &clk_branch2_ops,
1336 		},
1337 	},
1338 };
1339 
1340 static struct clk_branch camss_csi1_clk = {
1341 	.halt_reg = 0x3124,
1342 	.halt_check = BRANCH_HALT,
1343 	.clkr = {
1344 		.enable_reg = 0x3124,
1345 		.enable_mask = BIT(0),
1346 		.hw.init = &(struct clk_init_data){
1347 			.name = "camss_csi1_clk",
1348 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1349 			.num_parents = 1,
1350 			.flags = CLK_SET_RATE_PARENT,
1351 			.ops = &clk_branch2_ops,
1352 		},
1353 	},
1354 };
1355 
1356 static struct clk_branch camss_csi1phytimer_clk = {
1357 	.halt_reg = 0x3054,
1358 	.halt_check = BRANCH_HALT,
1359 	.clkr = {
1360 		.enable_reg = 0x3054,
1361 		.enable_mask = BIT(0),
1362 		.hw.init = &(struct clk_init_data){
1363 			.name = "camss_csi1phytimer_clk",
1364 			.parent_hws = (const struct clk_hw *[]){ &csi1phytimer_clk_src.clkr.hw },
1365 			.num_parents = 1,
1366 			.flags = CLK_SET_RATE_PARENT,
1367 			.ops = &clk_branch2_ops,
1368 		},
1369 	},
1370 };
1371 
1372 static struct clk_branch camss_csi1pix_clk = {
1373 	.halt_reg = 0x3154,
1374 	.halt_check = BRANCH_HALT,
1375 	.clkr = {
1376 		.enable_reg = 0x3154,
1377 		.enable_mask = BIT(0),
1378 		.hw.init = &(struct clk_init_data){
1379 			.name = "camss_csi1pix_clk",
1380 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1381 			.num_parents = 1,
1382 			.ops = &clk_branch2_ops,
1383 		},
1384 	},
1385 };
1386 
1387 static struct clk_branch camss_csi1rdi_clk = {
1388 	.halt_reg = 0x3144,
1389 	.halt_check = BRANCH_HALT,
1390 	.clkr = {
1391 		.enable_reg = 0x3144,
1392 		.enable_mask = BIT(0),
1393 		.hw.init = &(struct clk_init_data){
1394 			.name = "camss_csi1rdi_clk",
1395 			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1396 			.num_parents = 1,
1397 			.ops = &clk_branch2_ops,
1398 		},
1399 	},
1400 };
1401 
1402 static struct clk_branch camss_csi2_ahb_clk = {
1403 	.halt_reg = 0x3188,
1404 	.halt_check = BRANCH_HALT,
1405 	.clkr = {
1406 		.enable_reg = 0x3188,
1407 		.enable_mask = BIT(0),
1408 		.hw.init = &(struct clk_init_data){
1409 			.name = "camss_csi2_ahb_clk",
1410 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1411 			.num_parents = 1,
1412 			.ops = &clk_branch2_ops,
1413 		},
1414 	},
1415 };
1416 
1417 static struct clk_branch camss_csi2_clk = {
1418 	.halt_reg = 0x3184,
1419 	.halt_check = BRANCH_HALT,
1420 	.clkr = {
1421 		.enable_reg = 0x3184,
1422 		.enable_mask = BIT(0),
1423 		.hw.init = &(struct clk_init_data){
1424 			.name = "camss_csi2_clk",
1425 			.parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1426 			.num_parents = 1,
1427 			.flags = CLK_SET_RATE_PARENT,
1428 			.ops = &clk_branch2_ops,
1429 		},
1430 	},
1431 };
1432 
1433 static struct clk_branch camss_csi2phytimer_clk = {
1434 	.halt_reg = 0x3084,
1435 	.halt_check = BRANCH_HALT,
1436 	.clkr = {
1437 		.enable_reg = 0x3084,
1438 		.enable_mask = BIT(0),
1439 		.hw.init = &(struct clk_init_data){
1440 			.name = "camss_csi2phytimer_clk",
1441 			.parent_hws = (const struct clk_hw *[]){ &csi2phytimer_clk_src.clkr.hw },
1442 			.num_parents = 1,
1443 			.flags = CLK_SET_RATE_PARENT,
1444 			.ops = &clk_branch2_ops,
1445 		},
1446 	},
1447 };
1448 
1449 static struct clk_branch camss_csi2pix_clk = {
1450 	.halt_reg = 0x31b4,
1451 	.halt_check = BRANCH_HALT,
1452 	.clkr = {
1453 		.enable_reg = 0x31b4,
1454 		.enable_mask = BIT(0),
1455 		.hw.init = &(struct clk_init_data){
1456 			.name = "camss_csi2pix_clk",
1457 			.parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1458 			.num_parents = 1,
1459 			.ops = &clk_branch2_ops,
1460 		},
1461 	},
1462 };
1463 
1464 static struct clk_branch camss_csi2rdi_clk = {
1465 	.halt_reg = 0x31a4,
1466 	.halt_check = BRANCH_HALT,
1467 	.clkr = {
1468 		.enable_reg = 0x31a4,
1469 		.enable_mask = BIT(0),
1470 		.hw.init = &(struct clk_init_data){
1471 			.name = "camss_csi2rdi_clk",
1472 			.parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1473 			.num_parents = 1,
1474 			.ops = &clk_branch2_ops,
1475 		},
1476 	},
1477 };
1478 
1479 static struct clk_branch camss_csi3_ahb_clk = {
1480 	.halt_reg = 0x31e8,
1481 	.halt_check = BRANCH_HALT,
1482 	.clkr = {
1483 		.enable_reg = 0x31e8,
1484 		.enable_mask = BIT(0),
1485 		.hw.init = &(struct clk_init_data){
1486 			.name = "camss_csi3_ahb_clk",
1487 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1488 			.num_parents = 1,
1489 			.ops = &clk_branch2_ops,
1490 		},
1491 	},
1492 };
1493 
1494 static struct clk_branch camss_csi3_clk = {
1495 	.halt_reg = 0x31e4,
1496 	.halt_check = BRANCH_HALT,
1497 	.clkr = {
1498 		.enable_reg = 0x31e4,
1499 		.enable_mask = BIT(0),
1500 		.hw.init = &(struct clk_init_data){
1501 			.name = "camss_csi3_clk",
1502 			.parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1503 			.num_parents = 1,
1504 			.flags = CLK_SET_RATE_PARENT,
1505 			.ops = &clk_branch2_ops,
1506 		},
1507 	},
1508 };
1509 
1510 static struct clk_branch camss_csi3pix_clk = {
1511 	.halt_reg = 0x3214,
1512 	.halt_check = BRANCH_HALT,
1513 	.clkr = {
1514 		.enable_reg = 0x3214,
1515 		.enable_mask = BIT(0),
1516 		.hw.init = &(struct clk_init_data){
1517 			.name = "camss_csi3pix_clk",
1518 			.parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1519 			.num_parents = 1,
1520 			.ops = &clk_branch2_ops,
1521 		},
1522 	},
1523 };
1524 
1525 static struct clk_branch camss_csi3rdi_clk = {
1526 	.halt_reg = 0x3204,
1527 	.halt_check = BRANCH_HALT,
1528 	.clkr = {
1529 		.enable_reg = 0x3204,
1530 		.enable_mask = BIT(0),
1531 		.hw.init = &(struct clk_init_data){
1532 			.name = "camss_csi3rdi_clk",
1533 			.parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1534 			.num_parents = 1,
1535 			.ops = &clk_branch2_ops,
1536 		},
1537 	},
1538 };
1539 
1540 static struct clk_branch camss_csi_vfe0_clk = {
1541 	.halt_reg = 0x3704,
1542 	.halt_check = BRANCH_HALT,
1543 	.clkr = {
1544 		.enable_reg = 0x3704,
1545 		.enable_mask = BIT(0),
1546 		.hw.init = &(struct clk_init_data){
1547 			.name = "camss_csi_vfe0_clk",
1548 			.parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1549 			.num_parents = 1,
1550 			.ops = &clk_branch2_ops,
1551 		},
1552 	},
1553 };
1554 
1555 static struct clk_branch camss_csi_vfe1_clk = {
1556 	.halt_reg = 0x3714,
1557 	.halt_check = BRANCH_HALT,
1558 	.clkr = {
1559 		.enable_reg = 0x3714,
1560 		.enable_mask = BIT(0),
1561 		.hw.init = &(struct clk_init_data){
1562 			.name = "camss_csi_vfe1_clk",
1563 			.parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1564 			.num_parents = 1,
1565 			.ops = &clk_branch2_ops,
1566 		},
1567 	},
1568 };
1569 
1570 static struct clk_branch camss_csiphy0_clk = {
1571 	.halt_reg = 0x3740,
1572 	.halt_check = BRANCH_HALT,
1573 	.clkr = {
1574 		.enable_reg = 0x3740,
1575 		.enable_mask = BIT(0),
1576 		.hw.init = &(struct clk_init_data){
1577 			.name = "camss_csiphy0_clk",
1578 			.parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1579 			.num_parents = 1,
1580 			.flags = CLK_SET_RATE_PARENT,
1581 			.ops = &clk_branch2_ops,
1582 		},
1583 	},
1584 };
1585 
1586 static struct clk_branch camss_csiphy1_clk = {
1587 	.halt_reg = 0x3744,
1588 	.halt_check = BRANCH_HALT,
1589 	.clkr = {
1590 		.enable_reg = 0x3744,
1591 		.enable_mask = BIT(0),
1592 		.hw.init = &(struct clk_init_data){
1593 			.name = "camss_csiphy1_clk",
1594 			.parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1595 			.num_parents = 1,
1596 			.flags = CLK_SET_RATE_PARENT,
1597 			.ops = &clk_branch2_ops,
1598 		},
1599 	},
1600 };
1601 
1602 static struct clk_branch camss_csiphy2_clk = {
1603 	.halt_reg = 0x3748,
1604 	.halt_check = BRANCH_HALT,
1605 	.clkr = {
1606 		.enable_reg = 0x3748,
1607 		.enable_mask = BIT(0),
1608 		.hw.init = &(struct clk_init_data){
1609 			.name = "camss_csiphy2_clk",
1610 			.parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1611 			.num_parents = 1,
1612 			.flags = CLK_SET_RATE_PARENT,
1613 			.ops = &clk_branch2_ops,
1614 		},
1615 	},
1616 };
1617 
1618 
1619 static struct clk_branch camss_cphy_csid0_clk = {
1620 	.halt_reg = 0x3730,
1621 	.halt_check = BRANCH_HALT,
1622 	.clkr = {
1623 		.enable_reg = 0x3730,
1624 		.enable_mask = BIT(0),
1625 		.hw.init = &(struct clk_init_data){
1626 			.name = "camss_cphy_csid0_clk",
1627 			.parent_hws = (const struct clk_hw *[]){ &camss_csiphy0_clk.clkr.hw },
1628 			.num_parents = 1,
1629 			.flags = CLK_SET_RATE_PARENT,
1630 			.ops = &clk_branch2_ops,
1631 		},
1632 	},
1633 };
1634 
1635 static struct clk_branch camss_cphy_csid1_clk = {
1636 	.halt_reg = 0x3734,
1637 	.halt_check = BRANCH_HALT,
1638 	.clkr = {
1639 		.enable_reg = 0x3734,
1640 		.enable_mask = BIT(0),
1641 		.hw.init = &(struct clk_init_data){
1642 			.name = "camss_cphy_csid1_clk",
1643 			.parent_hws = (const struct clk_hw *[]){ &camss_csiphy1_clk.clkr.hw },
1644 			.num_parents = 1,
1645 			.flags = CLK_SET_RATE_PARENT,
1646 			.ops = &clk_branch2_ops,
1647 		},
1648 	},
1649 };
1650 
1651 static struct clk_branch camss_cphy_csid2_clk = {
1652 	.halt_reg = 0x3738,
1653 	.halt_check = BRANCH_HALT,
1654 	.clkr = {
1655 		.enable_reg = 0x3738,
1656 		.enable_mask = BIT(0),
1657 		.hw.init = &(struct clk_init_data){
1658 			.name = "camss_cphy_csid2_clk",
1659 			.parent_hws = (const struct clk_hw *[]){ &camss_csiphy2_clk.clkr.hw },
1660 			.num_parents = 1,
1661 			.flags = CLK_SET_RATE_PARENT,
1662 			.ops = &clk_branch2_ops,
1663 		},
1664 	},
1665 };
1666 
1667 static struct clk_branch camss_cphy_csid3_clk = {
1668 	.halt_reg = 0x373c,
1669 	.halt_check = BRANCH_HALT,
1670 	.clkr = {
1671 		.enable_reg = 0x373c,
1672 		.enable_mask = BIT(0),
1673 		.hw.init = &(struct clk_init_data){
1674 			.name = "camss_cphy_csid3_clk",
1675 			.parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1676 			.num_parents = 1,
1677 			.flags = CLK_SET_RATE_PARENT,
1678 			.ops = &clk_branch2_ops,
1679 		},
1680 	},
1681 };
1682 
1683 static struct clk_branch camss_gp0_clk = {
1684 	.halt_reg = 0x3444,
1685 	.halt_check = BRANCH_HALT,
1686 	.clkr = {
1687 		.enable_reg = 0x3444,
1688 		.enable_mask = BIT(0),
1689 		.hw.init = &(struct clk_init_data){
1690 			.name = "camss_gp0_clk",
1691 			.parent_hws = (const struct clk_hw *[]){ &camss_gp0_clk_src.clkr.hw },
1692 			.num_parents = 1,
1693 			.flags = CLK_SET_RATE_PARENT,
1694 			.ops = &clk_branch2_ops,
1695 		},
1696 	},
1697 };
1698 
1699 static struct clk_branch camss_gp1_clk = {
1700 	.halt_reg = 0x3474,
1701 	.halt_check = BRANCH_HALT,
1702 	.clkr = {
1703 		.enable_reg = 0x3474,
1704 		.enable_mask = BIT(0),
1705 		.hw.init = &(struct clk_init_data){
1706 			.name = "camss_gp1_clk",
1707 			.parent_hws = (const struct clk_hw *[]){ &camss_gp1_clk_src.clkr.hw },
1708 			.num_parents = 1,
1709 			.flags = CLK_SET_RATE_PARENT,
1710 			.ops = &clk_branch2_ops,
1711 		},
1712 	},
1713 };
1714 
1715 static struct clk_branch camss_ispif_ahb_clk = {
1716 	.halt_reg = 0x3224,
1717 	.halt_check = BRANCH_HALT,
1718 	.clkr = {
1719 		.enable_reg = 0x3224,
1720 		.enable_mask = BIT(0),
1721 		.hw.init = &(struct clk_init_data){
1722 			.name = "camss_ispif_ahb_clk",
1723 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1724 			.num_parents = 1,
1725 			.ops = &clk_branch2_ops,
1726 		},
1727 	},
1728 };
1729 
1730 static struct clk_branch camss_jpeg0_clk = {
1731 	.halt_reg = 0x35a8,
1732 	.halt_check = BRANCH_HALT,
1733 	.clkr = {
1734 		.enable_reg = 0x35a8,
1735 		.enable_mask = BIT(0),
1736 		.hw.init = &(struct clk_init_data){
1737 			.name = "camss_jpeg0_clk",
1738 			.parent_hws = (const struct clk_hw *[]){ &jpeg0_clk_src.clkr.hw },
1739 			.num_parents = 1,
1740 			.flags = CLK_SET_RATE_PARENT,
1741 			.ops = &clk_branch2_ops,
1742 		},
1743 	},
1744 };
1745 
1746 static struct clk_branch camss_jpeg_ahb_clk = {
1747 	.halt_reg = 0x35b4,
1748 	.halt_check = BRANCH_HALT,
1749 	.clkr = {
1750 		.enable_reg = 0x35b4,
1751 		.enable_mask = BIT(0),
1752 		.hw.init = &(struct clk_init_data){
1753 			.name = "camss_jpeg_ahb_clk",
1754 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1755 			.num_parents = 1,
1756 			.ops = &clk_branch2_ops,
1757 		},
1758 	},
1759 };
1760 
1761 static struct clk_branch camss_jpeg_axi_clk = {
1762 	.halt_reg = 0x35b8,
1763 	.halt_check = BRANCH_HALT,
1764 	.clkr = {
1765 		.enable_reg = 0x35b8,
1766 		.enable_mask = BIT(0),
1767 		.hw.init = &(struct clk_init_data){
1768 			.name = "camss_jpeg_axi_clk",
1769 			.ops = &clk_branch2_ops,
1770 		},
1771 	},
1772 };
1773 
1774 static struct clk_branch throttle_camss_axi_clk = {
1775 	.halt_reg = 0x3c3c,
1776 	.halt_check = BRANCH_HALT,
1777 	.clkr = {
1778 		.enable_reg = 0x3c3c,
1779 		.enable_mask = BIT(0),
1780 		.hw.init = &(struct clk_init_data){
1781 			.name = "throttle_camss_axi_clk",
1782 			.ops = &clk_branch2_ops,
1783 		},
1784 	},
1785 };
1786 
1787 static struct clk_branch camss_mclk0_clk = {
1788 	.halt_reg = 0x3384,
1789 	.halt_check = BRANCH_HALT,
1790 	.clkr = {
1791 		.enable_reg = 0x3384,
1792 		.enable_mask = BIT(0),
1793 		.hw.init = &(struct clk_init_data){
1794 			.name = "camss_mclk0_clk",
1795 			.parent_hws = (const struct clk_hw *[]){ &mclk0_clk_src.clkr.hw },
1796 			.num_parents = 1,
1797 			.flags = CLK_SET_RATE_PARENT,
1798 			.ops = &clk_branch2_ops,
1799 		},
1800 	},
1801 };
1802 
1803 static struct clk_branch camss_mclk1_clk = {
1804 	.halt_reg = 0x33b4,
1805 	.halt_check = BRANCH_HALT,
1806 	.clkr = {
1807 		.enable_reg = 0x33b4,
1808 		.enable_mask = BIT(0),
1809 		.hw.init = &(struct clk_init_data){
1810 			.name = "camss_mclk1_clk",
1811 			.parent_hws = (const struct clk_hw *[]){ &mclk1_clk_src.clkr.hw },
1812 			.num_parents = 1,
1813 			.flags = CLK_SET_RATE_PARENT,
1814 			.ops = &clk_branch2_ops,
1815 		},
1816 	},
1817 };
1818 
1819 static struct clk_branch camss_mclk2_clk = {
1820 	.halt_reg = 0x33e4,
1821 	.halt_check = BRANCH_HALT,
1822 	.clkr = {
1823 		.enable_reg = 0x33e4,
1824 		.enable_mask = BIT(0),
1825 		.hw.init = &(struct clk_init_data){
1826 			.name = "camss_mclk2_clk",
1827 			.parent_hws = (const struct clk_hw *[]){ &mclk2_clk_src.clkr.hw },
1828 			.num_parents = 1,
1829 			.flags = CLK_SET_RATE_PARENT,
1830 			.ops = &clk_branch2_ops,
1831 		},
1832 	},
1833 };
1834 
1835 static struct clk_branch camss_mclk3_clk = {
1836 	.halt_reg = 0x3414,
1837 	.halt_check = BRANCH_HALT,
1838 	.clkr = {
1839 		.enable_reg = 0x3414,
1840 		.enable_mask = BIT(0),
1841 		.hw.init = &(struct clk_init_data){
1842 			.name = "camss_mclk3_clk",
1843 			.parent_hws = (const struct clk_hw *[]){ &mclk3_clk_src.clkr.hw },
1844 			.num_parents = 1,
1845 			.flags = CLK_SET_RATE_PARENT,
1846 			.ops = &clk_branch2_ops,
1847 		},
1848 	},
1849 };
1850 
1851 static struct clk_branch camss_micro_ahb_clk = {
1852 	.halt_reg = 0x3494,
1853 	.halt_check = BRANCH_HALT,
1854 	.clkr = {
1855 		.enable_reg = 0x3494,
1856 		.enable_mask = BIT(0),
1857 		.hw.init = &(struct clk_init_data){
1858 			.name = "camss_micro_ahb_clk",
1859 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1860 			.num_parents = 1,
1861 			.ops = &clk_branch2_ops,
1862 		},
1863 	},
1864 };
1865 
1866 static struct clk_branch camss_top_ahb_clk = {
1867 	.halt_reg = 0x3484,
1868 	.halt_check = BRANCH_HALT,
1869 	.clkr = {
1870 		.enable_reg = 0x3484,
1871 		.enable_mask = BIT(0),
1872 		.hw.init = &(struct clk_init_data){
1873 			.name = "camss_top_ahb_clk",
1874 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1875 			.num_parents = 1,
1876 			.ops = &clk_branch2_ops,
1877 		},
1878 	},
1879 };
1880 
1881 static struct clk_branch camss_vfe0_ahb_clk = {
1882 	.halt_reg = 0x3668,
1883 	.halt_check = BRANCH_HALT,
1884 	.clkr = {
1885 		.enable_reg = 0x3668,
1886 		.enable_mask = BIT(0),
1887 		.hw.init = &(struct clk_init_data){
1888 			.name = "camss_vfe0_ahb_clk",
1889 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1890 			.num_parents = 1,
1891 			.ops = &clk_branch2_ops,
1892 		},
1893 	},
1894 };
1895 
1896 static struct clk_branch camss_vfe0_clk = {
1897 	.halt_reg = 0x36a8,
1898 	.halt_check = BRANCH_HALT,
1899 	.clkr = {
1900 		.enable_reg = 0x36a8,
1901 		.enable_mask = BIT(0),
1902 		.hw.init = &(struct clk_init_data){
1903 			.name = "camss_vfe0_clk",
1904 			.parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1905 			.num_parents = 1,
1906 			.flags = CLK_SET_RATE_PARENT,
1907 			.ops = &clk_branch2_ops,
1908 		},
1909 	},
1910 };
1911 
1912 static struct clk_branch camss_vfe0_stream_clk = {
1913 	.halt_reg = 0x3720,
1914 	.halt_check = BRANCH_HALT,
1915 	.clkr = {
1916 		.enable_reg = 0x3720,
1917 		.enable_mask = BIT(0),
1918 		.hw.init = &(struct clk_init_data){
1919 			.name = "camss_vfe0_stream_clk",
1920 			.parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1921 			.num_parents = 1,
1922 			.ops = &clk_branch2_ops,
1923 		},
1924 	},
1925 };
1926 
1927 static struct clk_branch camss_vfe1_ahb_clk = {
1928 	.halt_reg = 0x3678,
1929 	.halt_check = BRANCH_HALT,
1930 	.clkr = {
1931 		.enable_reg = 0x3678,
1932 		.enable_mask = BIT(0),
1933 		.hw.init = &(struct clk_init_data){
1934 			.name = "camss_vfe1_ahb_clk",
1935 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1936 			.num_parents = 1,
1937 			.ops = &clk_branch2_ops,
1938 		},
1939 	},
1940 };
1941 
1942 static struct clk_branch camss_vfe1_clk = {
1943 	.halt_reg = 0x36ac,
1944 	.halt_check = BRANCH_HALT,
1945 	.clkr = {
1946 		.enable_reg = 0x36ac,
1947 		.enable_mask = BIT(0),
1948 		.hw.init = &(struct clk_init_data){
1949 			.name = "camss_vfe1_clk",
1950 			.parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1951 			.num_parents = 1,
1952 			.flags = CLK_SET_RATE_PARENT,
1953 			.ops = &clk_branch2_ops,
1954 		},
1955 	},
1956 };
1957 
1958 static struct clk_branch camss_vfe1_stream_clk = {
1959 	.halt_reg = 0x3724,
1960 	.halt_check = BRANCH_HALT,
1961 	.clkr = {
1962 		.enable_reg = 0x3724,
1963 		.enable_mask = BIT(0),
1964 		.hw.init = &(struct clk_init_data){
1965 			.name = "camss_vfe1_stream_clk",
1966 			.parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1967 			.num_parents = 1,
1968 			.ops = &clk_branch2_ops,
1969 		},
1970 	},
1971 };
1972 
1973 static struct clk_branch camss_vfe_vbif_ahb_clk = {
1974 	.halt_reg = 0x36b8,
1975 	.halt_check = BRANCH_HALT,
1976 	.clkr = {
1977 		.enable_reg = 0x36b8,
1978 		.enable_mask = BIT(0),
1979 		.hw.init = &(struct clk_init_data){
1980 			.name = "camss_vfe_vbif_ahb_clk",
1981 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1982 			.num_parents = 1,
1983 			.ops = &clk_branch2_ops,
1984 		},
1985 	},
1986 };
1987 
1988 static struct clk_branch camss_vfe_vbif_axi_clk = {
1989 	.halt_reg = 0x36bc,
1990 	.halt_check = BRANCH_HALT,
1991 	.clkr = {
1992 		.enable_reg = 0x36bc,
1993 		.enable_mask = BIT(0),
1994 		.hw.init = &(struct clk_init_data){
1995 			.name = "camss_vfe_vbif_axi_clk",
1996 			.ops = &clk_branch2_ops,
1997 		},
1998 	},
1999 };
2000 
2001 static struct clk_branch csiphy_ahb2crif_clk = {
2002 	.halt_reg = 0x374c,
2003 	.halt_check = BRANCH_HALT,
2004 	.hwcg_reg = 0x374c,
2005 	.hwcg_bit = 1,
2006 	.clkr = {
2007 		.enable_reg = 0x374c,
2008 		.enable_mask = BIT(0),
2009 		.hw.init = &(struct clk_init_data){
2010 			.name = "csiphy_ahb2crif_clk",
2011 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2012 			.num_parents = 1,
2013 			.ops = &clk_branch2_ops,
2014 		},
2015 	},
2016 };
2017 
2018 static struct clk_branch mdss_ahb_clk = {
2019 	.halt_reg = 0x2308,
2020 	.halt_check = BRANCH_HALT,
2021 	.hwcg_reg = 0x8a004,
2022 	.hwcg_bit = 1,
2023 	.clkr = {
2024 		.enable_reg = 0x2308,
2025 		.enable_mask = BIT(0),
2026 		.hw.init = &(struct clk_init_data){
2027 			.name = "mdss_ahb_clk",
2028 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2029 			.flags = CLK_SET_RATE_PARENT,
2030 			.num_parents = 1,
2031 			.ops = &clk_branch2_ops,
2032 		},
2033 	},
2034 };
2035 
2036 static const struct freq_tbl ftbl_axi_clk_src[] = {
2037 		F(75000000, P_GPLL0, 8, 0, 0),
2038 		F(171428571, P_GPLL0, 3.5, 0, 0),
2039 		F(240000000, P_GPLL0, 2.5, 0, 0),
2040 		F(323200000, P_MMPLL0, 2.5, 0, 0),
2041 		F(406000000, P_MMPLL0, 2, 0, 0),
2042 		{ }
2043 };
2044 
2045 /* RO to linux */
2046 static struct clk_rcg2 axi_clk_src = {
2047 	.cmd_rcgr = 0xd000,
2048 	.hid_width = 5,
2049 	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
2050 	.freq_tbl = ftbl_axi_clk_src,
2051 	.clkr.hw.init = &(struct clk_init_data){
2052 		.name = "axi_clk_src",
2053 		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
2054 		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
2055 		.ops = &clk_rcg2_ops,
2056 	},
2057 };
2058 
2059 static struct clk_branch mdss_axi_clk = {
2060 	.halt_reg = 0x2310,
2061 	.halt_check = BRANCH_HALT,
2062 	.clkr = {
2063 		.enable_reg = 0x2310,
2064 		.enable_mask = BIT(0),
2065 		.hw.init = &(struct clk_init_data){
2066 			.name = "mdss_axi_clk",
2067 			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
2068 			.ops = &clk_branch2_ops,
2069 		},
2070 	},
2071 };
2072 
2073 static struct clk_branch throttle_mdss_axi_clk = {
2074 	.halt_reg = 0x246c,
2075 	.halt_check = BRANCH_HALT,
2076 	.hwcg_reg = 0x246c,
2077 	.hwcg_bit = 1,
2078 	.clkr = {
2079 		.enable_reg = 0x246c,
2080 		.enable_mask = BIT(0),
2081 		.hw.init = &(struct clk_init_data){
2082 			.name = "throttle_mdss_axi_clk",
2083 			.ops = &clk_branch2_ops,
2084 		},
2085 	},
2086 };
2087 
2088 static struct clk_branch mdss_byte0_clk = {
2089 	.halt_reg = 0x233c,
2090 	.halt_check = BRANCH_HALT,
2091 	.clkr = {
2092 		.enable_reg = 0x233c,
2093 		.enable_mask = BIT(0),
2094 		.hw.init = &(struct clk_init_data){
2095 			.name = "mdss_byte0_clk",
2096 			.parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
2097 			.num_parents = 1,
2098 			.flags = CLK_SET_RATE_PARENT,
2099 			.ops = &clk_branch2_ops,
2100 		},
2101 	},
2102 };
2103 
2104 static struct clk_regmap_div mdss_byte0_intf_div_clk = {
2105 	.reg = 0x237c,
2106 	.shift = 0,
2107 	.width = 2,
2108 	/*
2109 	 * NOTE: Op does not work for div-3. Current assumption is that div-3
2110 	 * is not a recommended setting for this divider.
2111 	 */
2112 	.clkr = {
2113 		.hw.init = &(struct clk_init_data){
2114 			.name = "mdss_byte0_intf_div_clk",
2115 			.parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
2116 			.num_parents = 1,
2117 			.ops = &clk_regmap_div_ops,
2118 			.flags = CLK_GET_RATE_NOCACHE,
2119 		},
2120 	},
2121 };
2122 
2123 static struct clk_branch mdss_byte0_intf_clk = {
2124 	.halt_reg = 0x2374,
2125 	.halt_check = BRANCH_HALT,
2126 	.clkr = {
2127 		.enable_reg = 0x2374,
2128 		.enable_mask = BIT(0),
2129 		.hw.init = &(struct clk_init_data){
2130 			.name = "mdss_byte0_intf_clk",
2131 			.parent_hws = (const struct clk_hw *[]){ &mdss_byte0_intf_div_clk.clkr.hw },
2132 			.num_parents = 1,
2133 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2134 			.ops = &clk_branch2_ops,
2135 		},
2136 	},
2137 };
2138 
2139 static struct clk_branch mdss_byte1_clk = {
2140 	.halt_reg = 0x2340,
2141 	.halt_check = BRANCH_HALT,
2142 	.clkr = {
2143 		.enable_reg = 0x2340,
2144 		.enable_mask = BIT(0),
2145 		.hw.init = &(struct clk_init_data){
2146 			.name = "mdss_byte1_clk",
2147 			.parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
2148 			.num_parents = 1,
2149 			.flags = CLK_SET_RATE_PARENT,
2150 			.ops = &clk_branch2_ops,
2151 		},
2152 	},
2153 };
2154 
2155 static struct clk_regmap_div mdss_byte1_intf_div_clk = {
2156 	.reg = 0x2380,
2157 	.shift = 0,
2158 	.width = 2,
2159 	/*
2160 	 * NOTE: Op does not work for div-3. Current assumption is that div-3
2161 	 * is not a recommended setting for this divider.
2162 	 */
2163 	.clkr = {
2164 		.hw.init = &(struct clk_init_data){
2165 			.name = "mdss_byte1_intf_div_clk",
2166 			.parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
2167 			.num_parents = 1,
2168 			.ops = &clk_regmap_div_ops,
2169 			.flags = CLK_GET_RATE_NOCACHE,
2170 		},
2171 	},
2172 };
2173 
2174 static struct clk_branch mdss_byte1_intf_clk = {
2175 	.halt_reg = 0x2378,
2176 	.halt_check = BRANCH_HALT,
2177 	.clkr = {
2178 		.enable_reg = 0x2378,
2179 		.enable_mask = BIT(0),
2180 		.hw.init = &(struct clk_init_data){
2181 			.name = "mdss_byte1_intf_clk",
2182 			.parent_hws = (const struct clk_hw *[]){ &mdss_byte1_intf_div_clk.clkr.hw },
2183 			.num_parents = 1,
2184 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2185 			.ops = &clk_branch2_ops,
2186 		},
2187 	},
2188 };
2189 
2190 static struct clk_branch mdss_dp_aux_clk = {
2191 	.halt_reg = 0x2364,
2192 	.halt_check = BRANCH_HALT,
2193 	.clkr = {
2194 		.enable_reg = 0x2364,
2195 		.enable_mask = BIT(0),
2196 		.hw.init = &(struct clk_init_data){
2197 			.name = "mdss_dp_aux_clk",
2198 			.parent_hws = (const struct clk_hw *[]){ &dp_aux_clk_src.clkr.hw },
2199 			.num_parents = 1,
2200 			.flags = CLK_SET_RATE_PARENT,
2201 			.ops = &clk_branch2_ops,
2202 		},
2203 	},
2204 };
2205 
2206 static struct clk_branch mdss_dp_crypto_clk = {
2207 	.halt_reg = 0x235c,
2208 	.halt_check = BRANCH_HALT,
2209 	.clkr = {
2210 		.enable_reg = 0x235c,
2211 		.enable_mask = BIT(0),
2212 		.hw.init = &(struct clk_init_data){
2213 			.name = "mdss_dp_crypto_clk",
2214 			.parent_hws = (const struct clk_hw *[]){ &dp_crypto_clk_src.clkr.hw },
2215 			.num_parents = 1,
2216 			.flags = CLK_SET_RATE_PARENT,
2217 			.ops = &clk_branch2_ops,
2218 		},
2219 	},
2220 };
2221 
2222 static struct clk_branch mdss_dp_gtc_clk = {
2223 	.halt_reg = 0x2368,
2224 	.halt_check = BRANCH_HALT,
2225 	.clkr = {
2226 		.enable_reg = 0x2368,
2227 		.enable_mask = BIT(0),
2228 		.hw.init = &(struct clk_init_data){
2229 			.name = "mdss_dp_gtc_clk",
2230 			.parent_hws = (const struct clk_hw *[]){ &dp_gtc_clk_src.clkr.hw },
2231 			.num_parents = 1,
2232 			.flags = CLK_SET_RATE_PARENT,
2233 			.ops = &clk_branch2_ops,
2234 		},
2235 	},
2236 };
2237 
2238 static struct clk_branch mdss_dp_link_clk = {
2239 	.halt_reg = 0x2354,
2240 	.halt_check = BRANCH_HALT,
2241 	.clkr = {
2242 		.enable_reg = 0x2354,
2243 		.enable_mask = BIT(0),
2244 		.hw.init = &(struct clk_init_data){
2245 			.name = "mdss_dp_link_clk",
2246 			.parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
2247 			.num_parents = 1,
2248 			.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2249 			.ops = &clk_branch2_ops,
2250 		},
2251 	},
2252 };
2253 
2254 /* Reset state of MDSS_DP_LINK_INTF_DIV is 0x3 (div-4) */
2255 static struct clk_branch mdss_dp_link_intf_clk = {
2256 	.halt_reg = 0x2358,
2257 	.halt_check = BRANCH_HALT,
2258 	.clkr = {
2259 		.enable_reg = 0x2358,
2260 		.enable_mask = BIT(0),
2261 		.hw.init = &(struct clk_init_data){
2262 			.name = "mdss_dp_link_intf_clk",
2263 			.parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
2264 			.num_parents = 1,
2265 			.ops = &clk_branch2_ops,
2266 		},
2267 	},
2268 };
2269 
2270 static struct clk_branch mdss_dp_pixel_clk = {
2271 	.halt_reg = 0x2360,
2272 	.halt_check = BRANCH_HALT,
2273 	.clkr = {
2274 		.enable_reg = 0x2360,
2275 		.enable_mask = BIT(0),
2276 		.hw.init = &(struct clk_init_data){
2277 			.name = "mdss_dp_pixel_clk",
2278 			.parent_hws = (const struct clk_hw *[]){ &dp_pixel_clk_src.clkr.hw },
2279 			.num_parents = 1,
2280 			.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2281 			.ops = &clk_branch2_ops,
2282 		},
2283 	},
2284 };
2285 
2286 static struct clk_branch mdss_esc0_clk = {
2287 	.halt_reg = 0x2344,
2288 	.halt_check = BRANCH_HALT,
2289 	.clkr = {
2290 		.enable_reg = 0x2344,
2291 		.enable_mask = BIT(0),
2292 		.hw.init = &(struct clk_init_data){
2293 			.name = "mdss_esc0_clk",
2294 			.parent_hws = (const struct clk_hw *[]){ &esc0_clk_src.clkr.hw },
2295 			.num_parents = 1,
2296 			.flags = CLK_SET_RATE_PARENT,
2297 			.ops = &clk_branch2_ops,
2298 		},
2299 	},
2300 };
2301 
2302 static struct clk_branch mdss_esc1_clk = {
2303 	.halt_reg = 0x2348,
2304 	.halt_check = BRANCH_HALT,
2305 	.clkr = {
2306 		.enable_reg = 0x2348,
2307 		.enable_mask = BIT(0),
2308 		.hw.init = &(struct clk_init_data){
2309 			.name = "mdss_esc1_clk",
2310 			.parent_hws = (const struct clk_hw *[]){ &esc1_clk_src.clkr.hw },
2311 			.num_parents = 1,
2312 			.flags = CLK_SET_RATE_PARENT,
2313 			.ops = &clk_branch2_ops,
2314 		},
2315 	},
2316 };
2317 
2318 static struct clk_branch mdss_hdmi_dp_ahb_clk = {
2319 	.halt_reg = 0x230c,
2320 	.halt_check = BRANCH_HALT,
2321 	.clkr = {
2322 		.enable_reg = 0x230c,
2323 		.enable_mask = BIT(0),
2324 		.hw.init = &(struct clk_init_data){
2325 			.name = "mdss_hdmi_dp_ahb_clk",
2326 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2327 			.num_parents = 1,
2328 			.ops = &clk_branch2_ops,
2329 		},
2330 	},
2331 };
2332 
2333 static struct clk_branch mdss_mdp_clk = {
2334 	.halt_reg = 0x231c,
2335 	.halt_check = BRANCH_HALT,
2336 	.clkr = {
2337 		.enable_reg = 0x231c,
2338 		.enable_mask = BIT(0),
2339 		.hw.init = &(struct clk_init_data){
2340 			.name = "mdss_mdp_clk",
2341 			.parent_hws = (const struct clk_hw *[]){ &mdp_clk_src.clkr.hw },
2342 			.num_parents = 1,
2343 			.flags = CLK_SET_RATE_PARENT,
2344 			.ops = &clk_branch2_ops,
2345 		},
2346 	},
2347 };
2348 
2349 static struct clk_branch mdss_pclk0_clk = {
2350 	.halt_reg = 0x2314,
2351 	.halt_check = BRANCH_HALT,
2352 	.clkr = {
2353 		.enable_reg = 0x2314,
2354 		.enable_mask = BIT(0),
2355 		.hw.init = &(struct clk_init_data){
2356 			.name = "mdss_pclk0_clk",
2357 			.parent_hws = (const struct clk_hw *[]){ &pclk0_clk_src.clkr.hw },
2358 			.num_parents = 1,
2359 			.flags = CLK_SET_RATE_PARENT,
2360 			.ops = &clk_branch2_ops,
2361 		},
2362 	},
2363 };
2364 
2365 static struct clk_branch mdss_pclk1_clk = {
2366 	.halt_reg = 0x2318,
2367 	.halt_check = BRANCH_HALT,
2368 	.clkr = {
2369 		.enable_reg = 0x2318,
2370 		.enable_mask = BIT(0),
2371 		.hw.init = &(struct clk_init_data){
2372 			.name = "mdss_pclk1_clk",
2373 			.parent_hws = (const struct clk_hw *[]){ &pclk1_clk_src.clkr.hw },
2374 			.num_parents = 1,
2375 			.flags = CLK_SET_RATE_PARENT,
2376 			.ops = &clk_branch2_ops,
2377 		},
2378 	},
2379 };
2380 
2381 static struct clk_branch mdss_rot_clk = {
2382 	.halt_reg = 0x2350,
2383 	.halt_check = BRANCH_HALT,
2384 	.clkr = {
2385 		.enable_reg = 0x2350,
2386 		.enable_mask = BIT(0),
2387 		.hw.init = &(struct clk_init_data){
2388 			.name = "mdss_rot_clk",
2389 			.parent_hws = (const struct clk_hw *[]){ &rot_clk_src.clkr.hw },
2390 			.num_parents = 1,
2391 			.flags = CLK_SET_RATE_PARENT,
2392 			.ops = &clk_branch2_ops,
2393 		},
2394 	},
2395 };
2396 
2397 static struct clk_branch mdss_vsync_clk = {
2398 	.halt_reg = 0x2328,
2399 	.halt_check = BRANCH_HALT,
2400 	.clkr = {
2401 		.enable_reg = 0x2328,
2402 		.enable_mask = BIT(0),
2403 		.hw.init = &(struct clk_init_data){
2404 			.name = "mdss_vsync_clk",
2405 			.parent_hws = (const struct clk_hw *[]){ &vsync_clk_src.clkr.hw },
2406 			.num_parents = 1,
2407 			.flags = CLK_SET_RATE_PARENT,
2408 			.ops = &clk_branch2_ops,
2409 		},
2410 	},
2411 };
2412 
2413 static struct clk_branch mnoc_ahb_clk = {
2414 	.halt_reg = 0x5024,
2415 	.halt_check = BRANCH_VOTED,
2416 	.clkr = {
2417 		.enable_reg = 0x5024,
2418 		.enable_mask = BIT(0),
2419 		.hw.init = &(struct clk_init_data){
2420 			.name = "mnoc_ahb_clk",
2421 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2422 			.num_parents = 1,
2423 			.flags = CLK_SET_RATE_PARENT,
2424 			.ops = &clk_branch2_ops,
2425 		},
2426 	},
2427 };
2428 
2429 static struct clk_branch misc_ahb_clk = {
2430 	.halt_reg = 0x328,
2431 	.halt_check = BRANCH_HALT,
2432 	.hwcg_reg = 0x328,
2433 	.hwcg_bit = 1,
2434 	.clkr = {
2435 		.enable_reg = 0x328,
2436 		.enable_mask = BIT(0),
2437 		.hw.init = &(struct clk_init_data){
2438 			.name = "misc_ahb_clk",
2439 			/*
2440 			 * Dependency to be enabled before the branch is
2441 			 * enabled.
2442 			 */
2443 			.parent_hws = (const struct clk_hw *[]){ &mnoc_ahb_clk.clkr.hw },
2444 			.num_parents = 1,
2445 			.ops = &clk_branch2_ops,
2446 		},
2447 	},
2448 };
2449 
2450 static struct clk_branch misc_cxo_clk = {
2451 	.halt_reg = 0x324,
2452 	.halt_check = BRANCH_HALT,
2453 	.clkr = {
2454 		.enable_reg = 0x324,
2455 		.enable_mask = BIT(0),
2456 		.hw.init = &(struct clk_init_data){
2457 			.name = "misc_cxo_clk",
2458 			.parent_data = &(const struct clk_parent_data){
2459 				.fw_name = "xo",
2460 			},
2461 			.num_parents = 1,
2462 			.ops = &clk_branch2_ops,
2463 		},
2464 	},
2465 };
2466 
2467 static struct clk_branch snoc_dvm_axi_clk = {
2468 	.halt_reg = 0xe040,
2469 	.halt_check = BRANCH_HALT,
2470 	.clkr = {
2471 		.enable_reg = 0xe040,
2472 		.enable_mask = BIT(0),
2473 		.hw.init = &(struct clk_init_data){
2474 			.name = "snoc_dvm_axi_clk",
2475 			.ops = &clk_branch2_ops,
2476 		},
2477 	},
2478 };
2479 
2480 static struct clk_branch video_ahb_clk = {
2481 	.halt_reg = 0x1030,
2482 	.halt_check = BRANCH_HALT,
2483 	.hwcg_reg = 0x1030,
2484 	.hwcg_bit = 1,
2485 	.clkr = {
2486 		.enable_reg = 0x1030,
2487 		.enable_mask = BIT(0),
2488 		.hw.init = &(struct clk_init_data){
2489 			.name = "video_ahb_clk",
2490 			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2491 			.num_parents = 1,
2492 			.ops = &clk_branch2_ops,
2493 		},
2494 	},
2495 };
2496 
2497 static struct clk_branch video_axi_clk = {
2498 	.halt_reg = 0x1034,
2499 	.halt_check = BRANCH_HALT,
2500 	.clkr = {
2501 		.enable_reg = 0x1034,
2502 		.enable_mask = BIT(0),
2503 		.hw.init = &(struct clk_init_data){
2504 			.name = "video_axi_clk",
2505 			.ops = &clk_branch2_ops,
2506 		},
2507 	},
2508 };
2509 
2510 static struct clk_branch throttle_video_axi_clk = {
2511 	.halt_reg = 0x118c,
2512 	.halt_check = BRANCH_HALT,
2513 	.hwcg_reg = 0x118c,
2514 	.hwcg_bit = 1,
2515 	.clkr = {
2516 		.enable_reg = 0x118c,
2517 		.enable_mask = BIT(0),
2518 		.hw.init = &(struct clk_init_data){
2519 			.name = "throttle_video_axi_clk",
2520 			.ops = &clk_branch2_ops,
2521 		},
2522 	},
2523 };
2524 
2525 static struct clk_branch video_core_clk = {
2526 	.halt_reg = 0x1028,
2527 	.halt_check = BRANCH_HALT,
2528 	.clkr = {
2529 		.enable_reg = 0x1028,
2530 		.enable_mask = BIT(0),
2531 		.hw.init = &(struct clk_init_data){
2532 			.name = "video_core_clk",
2533 			.parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
2534 			.num_parents = 1,
2535 			.flags = CLK_SET_RATE_PARENT,
2536 			.ops = &clk_branch2_ops,
2537 		},
2538 	},
2539 };
2540 
2541 static struct clk_branch video_subcore0_clk = {
2542 	.halt_reg = 0x1048,
2543 	.halt_check = BRANCH_HALT_SKIP,
2544 	.clkr = {
2545 		.enable_reg = 0x1048,
2546 		.enable_mask = BIT(0),
2547 		.hw.init = &(struct clk_init_data){
2548 			.name = "video_subcore0_clk",
2549 			.parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
2550 			.num_parents = 1,
2551 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2552 			.ops = &clk_branch2_ops,
2553 		},
2554 	},
2555 };
2556 
2557 static struct gdsc venus_gdsc = {
2558 	.gdscr = 0x1024,
2559 	.cxcs = (unsigned int[]){ 0x1028, 0x1034, 0x1048 },
2560 	.cxc_count = 3,
2561 	.pd = {
2562 		.name = "venus",
2563 	},
2564 	.pwrsts = PWRSTS_OFF_ON,
2565 };
2566 
2567 static struct gdsc venus_core0_gdsc = {
2568 	.gdscr = 0x1040,
2569 	.pd = {
2570 		.name = "venus_core0",
2571 	},
2572 	.parent = &venus_gdsc.pd,
2573 	.pwrsts = PWRSTS_OFF_ON,
2574 	.flags = HW_CTRL,
2575 };
2576 
2577 static struct gdsc mdss_gdsc = {
2578 	.gdscr = 0x2304,
2579 	.pd = {
2580 		.name = "mdss",
2581 	},
2582 	.cxcs = (unsigned int []){ 0x2040 },
2583 	.cxc_count = 1,
2584 	.pwrsts = PWRSTS_OFF_ON,
2585 };
2586 
2587 static struct gdsc camss_top_gdsc = {
2588 	.gdscr = 0x34a0,
2589 	.pd = {
2590 		.name = "camss_top",
2591 	},
2592 	.pwrsts = PWRSTS_OFF_ON,
2593 };
2594 
2595 static struct gdsc camss_vfe0_gdsc = {
2596 	.gdscr = 0x3664,
2597 	.pd = {
2598 		.name = "camss_vfe0",
2599 	},
2600 	.parent = &camss_top_gdsc.pd,
2601 	.pwrsts = PWRSTS_OFF_ON,
2602 };
2603 
2604 static struct gdsc camss_vfe1_gdsc = {
2605 	.gdscr = 0x3674,
2606 	.pd = {
2607 		.name = "camss_vfe1_gdsc",
2608 	},
2609 	.parent = &camss_top_gdsc.pd,
2610 	.pwrsts = PWRSTS_OFF_ON,
2611 };
2612 
2613 static struct gdsc camss_cpp_gdsc = {
2614 	.gdscr = 0x36d4,
2615 	.pd = {
2616 		.name = "camss_cpp",
2617 	},
2618 	.parent = &camss_top_gdsc.pd,
2619 	.pwrsts = PWRSTS_OFF_ON,
2620 };
2621 
2622 /* This GDSC seems to hang the whole multimedia subsystem.
2623 static struct gdsc bimc_smmu_gdsc = {
2624 	.gdscr = 0xe020,
2625 	.gds_hw_ctrl = 0xe024,
2626 	.pd = {
2627 		.name = "bimc_smmu",
2628 	},
2629 	.pwrsts = PWRSTS_OFF_ON,
2630 	.parent = &bimc_smmu_gdsc.pd,
2631 	.flags = HW_CTRL,
2632 };
2633 */
2634 
2635 static struct clk_regmap *mmcc_660_clocks[] = {
2636 	[AHB_CLK_SRC] = &ahb_clk_src.clkr,
2637 	[BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
2638 	[BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
2639 	[CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
2640 	[CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
2641 	[CCI_CLK_SRC] = &cci_clk_src.clkr,
2642 	[CPP_CLK_SRC] = &cpp_clk_src.clkr,
2643 	[CSI0_CLK_SRC] = &csi0_clk_src.clkr,
2644 	[CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
2645 	[CSI1_CLK_SRC] = &csi1_clk_src.clkr,
2646 	[CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
2647 	[CSI2_CLK_SRC] = &csi2_clk_src.clkr,
2648 	[CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
2649 	[CSI3_CLK_SRC] = &csi3_clk_src.clkr,
2650 	[CSIPHY_CLK_SRC] = &csiphy_clk_src.clkr,
2651 	[DP_AUX_CLK_SRC] = &dp_aux_clk_src.clkr,
2652 	[DP_CRYPTO_CLK_SRC] = &dp_crypto_clk_src.clkr,
2653 	[DP_GTC_CLK_SRC] = &dp_gtc_clk_src.clkr,
2654 	[DP_LINK_CLK_SRC] = &dp_link_clk_src.clkr,
2655 	[DP_PIXEL_CLK_SRC] = &dp_pixel_clk_src.clkr,
2656 	[ESC0_CLK_SRC] = &esc0_clk_src.clkr,
2657 	[ESC1_CLK_SRC] = &esc1_clk_src.clkr,
2658 	[JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
2659 	[MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
2660 	[MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
2661 	[MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
2662 	[MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
2663 	[MDP_CLK_SRC] = &mdp_clk_src.clkr,
2664 	[MMPLL0_PLL] = &mmpll0.clkr,
2665 	[MMPLL10_PLL] = &mmpll10.clkr,
2666 	[MMPLL3_PLL] = &mmpll3.clkr,
2667 	[MMPLL4_PLL] = &mmpll4.clkr,
2668 	[MMPLL5_PLL] = &mmpll5.clkr,
2669 	[MMPLL6_PLL] = &mmpll6.clkr,
2670 	[MMPLL7_PLL] = &mmpll7.clkr,
2671 	[MMPLL8_PLL] = &mmpll8.clkr,
2672 	[BIMC_SMMU_AHB_CLK] = &bimc_smmu_ahb_clk.clkr,
2673 	[BIMC_SMMU_AXI_CLK] = &bimc_smmu_axi_clk.clkr,
2674 	[CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,
2675 	[CAMSS_CCI_AHB_CLK] = &camss_cci_ahb_clk.clkr,
2676 	[CAMSS_CCI_CLK] = &camss_cci_clk.clkr,
2677 	[CAMSS_CPHY_CSID0_CLK] = &camss_cphy_csid0_clk.clkr,
2678 	[CAMSS_CPHY_CSID1_CLK] = &camss_cphy_csid1_clk.clkr,
2679 	[CAMSS_CPHY_CSID2_CLK] = &camss_cphy_csid2_clk.clkr,
2680 	[CAMSS_CPHY_CSID3_CLK] = &camss_cphy_csid3_clk.clkr,
2681 	[CAMSS_CPP_AHB_CLK] = &camss_cpp_ahb_clk.clkr,
2682 	[CAMSS_CPP_AXI_CLK] = &camss_cpp_axi_clk.clkr,
2683 	[CAMSS_CPP_CLK] = &camss_cpp_clk.clkr,
2684 	[CAMSS_CPP_VBIF_AHB_CLK] = &camss_cpp_vbif_ahb_clk.clkr,
2685 	[CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
2686 	[CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
2687 	[CAMSS_CSI0PHYTIMER_CLK] = &camss_csi0phytimer_clk.clkr,
2688 	[CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
2689 	[CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
2690 	[CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
2691 	[CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
2692 	[CAMSS_CSI1PHYTIMER_CLK] = &camss_csi1phytimer_clk.clkr,
2693 	[CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
2694 	[CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
2695 	[CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
2696 	[CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
2697 	[CAMSS_CSI2PHYTIMER_CLK] = &camss_csi2phytimer_clk.clkr,
2698 	[CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
2699 	[CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
2700 	[CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
2701 	[CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
2702 	[CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
2703 	[CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
2704 	[CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
2705 	[CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
2706 	[CAMSS_CSIPHY0_CLK] = &camss_csiphy0_clk.clkr,
2707 	[CAMSS_CSIPHY1_CLK] = &camss_csiphy1_clk.clkr,
2708 	[CAMSS_CSIPHY2_CLK] = &camss_csiphy2_clk.clkr,
2709 	[CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
2710 	[CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
2711 	[CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
2712 	[CAMSS_JPEG0_CLK] = &camss_jpeg0_clk.clkr,
2713 	[CAMSS_JPEG_AHB_CLK] = &camss_jpeg_ahb_clk.clkr,
2714 	[CAMSS_JPEG_AXI_CLK] = &camss_jpeg_axi_clk.clkr,
2715 	[CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
2716 	[CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
2717 	[CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
2718 	[CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
2719 	[CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
2720 	[CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
2721 	[CAMSS_VFE0_AHB_CLK] = &camss_vfe0_ahb_clk.clkr,
2722 	[CAMSS_VFE0_CLK] = &camss_vfe0_clk.clkr,
2723 	[CAMSS_VFE0_STREAM_CLK] = &camss_vfe0_stream_clk.clkr,
2724 	[CAMSS_VFE1_AHB_CLK] = &camss_vfe1_ahb_clk.clkr,
2725 	[CAMSS_VFE1_CLK] = &camss_vfe1_clk.clkr,
2726 	[CAMSS_VFE1_STREAM_CLK] = &camss_vfe1_stream_clk.clkr,
2727 	[CAMSS_VFE_VBIF_AHB_CLK] = &camss_vfe_vbif_ahb_clk.clkr,
2728 	[CAMSS_VFE_VBIF_AXI_CLK] = &camss_vfe_vbif_axi_clk.clkr,
2729 	[CSIPHY_AHB2CRIF_CLK] = &csiphy_ahb2crif_clk.clkr,
2730 	[MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
2731 	[MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
2732 	[MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
2733 	[MDSS_BYTE0_INTF_CLK] = &mdss_byte0_intf_clk.clkr,
2734 	[MDSS_BYTE0_INTF_DIV_CLK] = &mdss_byte0_intf_div_clk.clkr,
2735 	[MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
2736 	[MDSS_BYTE1_INTF_CLK] = &mdss_byte1_intf_clk.clkr,
2737 	[MDSS_DP_AUX_CLK] = &mdss_dp_aux_clk.clkr,
2738 	[MDSS_DP_CRYPTO_CLK] = &mdss_dp_crypto_clk.clkr,
2739 	[MDSS_DP_GTC_CLK] = &mdss_dp_gtc_clk.clkr,
2740 	[MDSS_DP_LINK_CLK] = &mdss_dp_link_clk.clkr,
2741 	[MDSS_DP_LINK_INTF_CLK] = &mdss_dp_link_intf_clk.clkr,
2742 	[MDSS_DP_PIXEL_CLK] = &mdss_dp_pixel_clk.clkr,
2743 	[MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
2744 	[MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
2745 	[MDSS_HDMI_DP_AHB_CLK] = &mdss_hdmi_dp_ahb_clk.clkr,
2746 	[MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
2747 	[MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
2748 	[MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
2749 	[MDSS_ROT_CLK] = &mdss_rot_clk.clkr,
2750 	[MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
2751 	[MISC_AHB_CLK] = &misc_ahb_clk.clkr,
2752 	[MISC_CXO_CLK] = &misc_cxo_clk.clkr,
2753 	[MNOC_AHB_CLK] = &mnoc_ahb_clk.clkr,
2754 	[SNOC_DVM_AXI_CLK] = &snoc_dvm_axi_clk.clkr,
2755 	[THROTTLE_CAMSS_AXI_CLK] = &throttle_camss_axi_clk.clkr,
2756 	[THROTTLE_MDSS_AXI_CLK] = &throttle_mdss_axi_clk.clkr,
2757 	[THROTTLE_VIDEO_AXI_CLK] = &throttle_video_axi_clk.clkr,
2758 	[VIDEO_AHB_CLK] = &video_ahb_clk.clkr,
2759 	[VIDEO_AXI_CLK] = &video_axi_clk.clkr,
2760 	[VIDEO_CORE_CLK] = &video_core_clk.clkr,
2761 	[VIDEO_SUBCORE0_CLK] = &video_subcore0_clk.clkr,
2762 	[PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
2763 	[PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
2764 	[ROT_CLK_SRC] = &rot_clk_src.clkr,
2765 	[VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
2766 	[VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
2767 	[VIDEO_CORE_CLK_SRC] = &video_core_clk_src.clkr,
2768 	[VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
2769 	[MDSS_BYTE1_INTF_DIV_CLK] = &mdss_byte1_intf_div_clk.clkr,
2770 	[AXI_CLK_SRC] = &axi_clk_src.clkr,
2771 };
2772 
2773 static struct gdsc *mmcc_sdm660_gdscs[] = {
2774 	[VENUS_GDSC] = &venus_gdsc,
2775 	[VENUS_CORE0_GDSC] = &venus_core0_gdsc,
2776 	[MDSS_GDSC] = &mdss_gdsc,
2777 	[CAMSS_TOP_GDSC] = &camss_top_gdsc,
2778 	[CAMSS_VFE0_GDSC] = &camss_vfe0_gdsc,
2779 	[CAMSS_VFE1_GDSC] = &camss_vfe1_gdsc,
2780 	[CAMSS_CPP_GDSC] = &camss_cpp_gdsc,
2781 };
2782 
2783 static const struct qcom_reset_map mmcc_660_resets[] = {
2784 	[CAMSS_MICRO_BCR] = { 0x3490 },
2785 };
2786 
2787 static const struct regmap_config mmcc_660_regmap_config = {
2788 	.reg_bits	= 32,
2789 	.reg_stride	= 4,
2790 	.val_bits	= 32,
2791 	.max_register	= 0x40000,
2792 	.fast_io	= true,
2793 };
2794 
2795 static const struct qcom_cc_desc mmcc_660_desc = {
2796 	.config = &mmcc_660_regmap_config,
2797 	.clks = mmcc_660_clocks,
2798 	.num_clks = ARRAY_SIZE(mmcc_660_clocks),
2799 	.resets = mmcc_660_resets,
2800 	.num_resets = ARRAY_SIZE(mmcc_660_resets),
2801 	.gdscs = mmcc_sdm660_gdscs,
2802 	.num_gdscs = ARRAY_SIZE(mmcc_sdm660_gdscs),
2803 };
2804 
2805 static const struct of_device_id mmcc_660_match_table[] = {
2806 	{ .compatible = "qcom,mmcc-sdm660" },
2807 	{ .compatible = "qcom,mmcc-sdm630", .data = (void *)1UL },
2808 	{ }
2809 };
2810 MODULE_DEVICE_TABLE(of, mmcc_660_match_table);
2811 
sdm630_clock_override(void)2812 static void sdm630_clock_override(void)
2813 {
2814 	/* SDM630 has only one DSI */
2815 	mmcc_660_desc.clks[BYTE1_CLK_SRC] = NULL;
2816 	mmcc_660_desc.clks[MDSS_BYTE1_CLK] = NULL;
2817 	mmcc_660_desc.clks[MDSS_BYTE1_INTF_DIV_CLK] = NULL;
2818 	mmcc_660_desc.clks[MDSS_BYTE1_INTF_CLK] = NULL;
2819 	mmcc_660_desc.clks[ESC1_CLK_SRC] = NULL;
2820 	mmcc_660_desc.clks[MDSS_ESC1_CLK] = NULL;
2821 	mmcc_660_desc.clks[PCLK1_CLK_SRC] = NULL;
2822 	mmcc_660_desc.clks[MDSS_PCLK1_CLK] = NULL;
2823 }
2824 
mmcc_660_probe(struct platform_device * pdev)2825 static int mmcc_660_probe(struct platform_device *pdev)
2826 {
2827 	struct regmap *regmap;
2828 	bool is_sdm630;
2829 
2830 	is_sdm630 = !!device_get_match_data(&pdev->dev);
2831 
2832 	regmap = qcom_cc_map(pdev, &mmcc_660_desc);
2833 	if (IS_ERR(regmap))
2834 		return PTR_ERR(regmap);
2835 
2836 	if (is_sdm630)
2837 		sdm630_clock_override();
2838 
2839 	clk_alpha_pll_configure(&mmpll3, regmap, &mmpll3_config);
2840 	clk_alpha_pll_configure(&mmpll4, regmap, &mmpll4_config);
2841 	clk_alpha_pll_configure(&mmpll5, regmap, &mmpll5_config);
2842 	clk_alpha_pll_configure(&mmpll7, regmap, &mmpll7_config);
2843 	clk_alpha_pll_configure(&mmpll8, regmap, &mmpll8_config);
2844 	clk_alpha_pll_configure(&mmpll10, regmap, &mmpll10_config);
2845 
2846 	return qcom_cc_really_probe(&pdev->dev, &mmcc_660_desc, regmap);
2847 }
2848 
2849 static struct platform_driver mmcc_660_driver = {
2850 	.probe		= mmcc_660_probe,
2851 	.driver		= {
2852 		.name	= "mmcc-sdm660",
2853 		.of_match_table = mmcc_660_match_table,
2854 	},
2855 };
2856 module_platform_driver(mmcc_660_driver);
2857 
2858 MODULE_DESCRIPTION("Qualcomm SDM630/SDM660 MMCC driver");
2859 MODULE_LICENSE("GPL v2");
2860