xref: /linux/drivers/clk/qcom/camcc-sa8775p.c (revision 9f32a03e3e0d372c520d829dd4da6022fe88832a)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
4  */
5 
6 #include <linux/clk-provider.h>
7 #include <linux/module.h>
8 #include <linux/mod_devicetable.h>
9 #include <linux/platform_device.h>
10 #include <linux/pm_runtime.h>
11 #include <linux/regmap.h>
12 
13 #include <dt-bindings/clock/qcom,qcs8300-camcc.h>
14 
15 #include "clk-alpha-pll.h"
16 #include "clk-branch.h"
17 #include "clk-pll.h"
18 #include "clk-rcg.h"
19 #include "clk-regmap.h"
20 #include "clk-regmap-divider.h"
21 #include "clk-regmap-mux.h"
22 #include "common.h"
23 #include "gdsc.h"
24 #include "reset.h"
25 
26 enum {
27 	DT_IFACE,
28 	DT_BI_TCXO,
29 	DT_BI_TCXO_AO,
30 	DT_SLEEP_CLK,
31 };
32 
33 enum {
34 	P_BI_TCXO,
35 	P_BI_TCXO_AO,
36 	P_CAM_CC_PLL0_OUT_EVEN,
37 	P_CAM_CC_PLL0_OUT_MAIN,
38 	P_CAM_CC_PLL0_OUT_ODD,
39 	P_CAM_CC_PLL2_OUT_EVEN,
40 	P_CAM_CC_PLL2_OUT_MAIN,
41 	P_CAM_CC_PLL3_OUT_EVEN,
42 	P_CAM_CC_PLL4_OUT_EVEN,
43 	P_CAM_CC_PLL5_OUT_EVEN,
44 	P_SLEEP_CLK,
45 };
46 
47 static const struct pll_vco lucid_evo_vco[] = {
48 	{ 249600000, 2020000000, 0 },
49 };
50 
51 static const struct pll_vco rivian_evo_vco[] = {
52 	{ 864000000, 1056000000, 0 },
53 };
54 
55 static const struct alpha_pll_config cam_cc_pll0_config = {
56 	.l = 0x3e,
57 	.alpha = 0x8000,
58 	.config_ctl_val = 0x20485699,
59 	.config_ctl_hi_val = 0x00182261,
60 	.config_ctl_hi1_val = 0x32aa299c,
61 	.user_ctl_val = 0x00008400,
62 	.user_ctl_hi_val = 0x00400805,
63 };
64 
65 static struct clk_alpha_pll cam_cc_pll0 = {
66 	.offset = 0x0,
67 	.vco_table = lucid_evo_vco,
68 	.num_vco = ARRAY_SIZE(lucid_evo_vco),
69 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
70 	.clkr = {
71 		.hw.init = &(const struct clk_init_data) {
72 			.name = "cam_cc_pll0",
73 			.parent_data = &(const struct clk_parent_data) {
74 				.index = DT_BI_TCXO,
75 			},
76 			.num_parents = 1,
77 			.ops = &clk_alpha_pll_lucid_evo_ops,
78 		},
79 	},
80 };
81 
82 static const struct clk_div_table post_div_table_cam_cc_pll0_out_even[] = {
83 	{ 0x1, 2 },
84 	{ }
85 };
86 
87 static struct clk_alpha_pll_postdiv cam_cc_pll0_out_even = {
88 	.offset = 0x0,
89 	.post_div_shift = 10,
90 	.post_div_table = post_div_table_cam_cc_pll0_out_even,
91 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_even),
92 	.width = 4,
93 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
94 	.clkr.hw.init = &(const struct clk_init_data) {
95 		.name = "cam_cc_pll0_out_even",
96 		.parent_hws = (const struct clk_hw*[]) {
97 			&cam_cc_pll0.clkr.hw,
98 		},
99 		.num_parents = 1,
100 		.flags = CLK_SET_RATE_PARENT,
101 		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
102 	},
103 };
104 
105 static const struct clk_div_table post_div_table_cam_cc_pll0_out_odd[] = {
106 	{ 0x2, 3 },
107 	{ }
108 };
109 
110 static struct clk_alpha_pll_postdiv cam_cc_pll0_out_odd = {
111 	.offset = 0x0,
112 	.post_div_shift = 14,
113 	.post_div_table = post_div_table_cam_cc_pll0_out_odd,
114 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_odd),
115 	.width = 4,
116 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
117 	.clkr.hw.init = &(const struct clk_init_data) {
118 		.name = "cam_cc_pll0_out_odd",
119 		.parent_hws = (const struct clk_hw*[]) {
120 			&cam_cc_pll0.clkr.hw,
121 		},
122 		.num_parents = 1,
123 		.flags = CLK_SET_RATE_PARENT,
124 		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
125 	},
126 };
127 
128 static const struct alpha_pll_config cam_cc_pll2_config = {
129 	.l = 0x32,
130 	.alpha = 0x0,
131 	.config_ctl_val = 0x90008820,
132 	.config_ctl_hi_val = 0x00890263,
133 	.config_ctl_hi1_val = 0x00000247,
134 	.user_ctl_val = 0x00000000,
135 	.user_ctl_hi_val = 0x00400000,
136 };
137 
138 static struct clk_alpha_pll cam_cc_pll2 = {
139 	.offset = 0x1000,
140 	.vco_table = rivian_evo_vco,
141 	.num_vco = ARRAY_SIZE(rivian_evo_vco),
142 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EVO],
143 	.clkr = {
144 		.hw.init = &(const struct clk_init_data) {
145 			.name = "cam_cc_pll2",
146 			.parent_data = &(const struct clk_parent_data) {
147 				.index = DT_BI_TCXO,
148 			},
149 			.num_parents = 1,
150 			.ops = &clk_alpha_pll_rivian_evo_ops,
151 		},
152 	},
153 };
154 
155 static const struct alpha_pll_config cam_cc_pll3_config = {
156 	.l = 0x32,
157 	.alpha = 0x0,
158 	.config_ctl_val = 0x20485699,
159 	.config_ctl_hi_val = 0x00182261,
160 	.config_ctl_hi1_val = 0x32aa299c,
161 	.user_ctl_val = 0x00000400,
162 	.user_ctl_hi_val = 0x00400805,
163 };
164 
165 static struct clk_alpha_pll cam_cc_pll3 = {
166 	.offset = 0x2000,
167 	.vco_table = lucid_evo_vco,
168 	.num_vco = ARRAY_SIZE(lucid_evo_vco),
169 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
170 	.clkr = {
171 		.hw.init = &(const struct clk_init_data) {
172 			.name = "cam_cc_pll3",
173 			.parent_data = &(const struct clk_parent_data) {
174 				.index = DT_BI_TCXO,
175 			},
176 			.num_parents = 1,
177 			.ops = &clk_alpha_pll_lucid_evo_ops,
178 		},
179 	},
180 };
181 
182 static const struct clk_div_table post_div_table_cam_cc_pll3_out_even[] = {
183 	{ 0x1, 2 },
184 	{ }
185 };
186 
187 static struct clk_alpha_pll_postdiv cam_cc_pll3_out_even = {
188 	.offset = 0x2000,
189 	.post_div_shift = 10,
190 	.post_div_table = post_div_table_cam_cc_pll3_out_even,
191 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll3_out_even),
192 	.width = 4,
193 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
194 	.clkr.hw.init = &(const struct clk_init_data) {
195 		.name = "cam_cc_pll3_out_even",
196 		.parent_hws = (const struct clk_hw*[]) {
197 			&cam_cc_pll3.clkr.hw,
198 		},
199 		.num_parents = 1,
200 		.flags = CLK_SET_RATE_PARENT,
201 		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
202 	},
203 };
204 
205 static const struct alpha_pll_config cam_cc_pll4_config = {
206 	.l = 0x32,
207 	.alpha = 0x0,
208 	.config_ctl_val = 0x20485699,
209 	.config_ctl_hi_val = 0x00182261,
210 	.config_ctl_hi1_val = 0x32aa299c,
211 	.user_ctl_val = 0x00000400,
212 	.user_ctl_hi_val = 0x00400805,
213 };
214 
215 static struct clk_alpha_pll cam_cc_pll4 = {
216 	.offset = 0x3000,
217 	.vco_table = lucid_evo_vco,
218 	.num_vco = ARRAY_SIZE(lucid_evo_vco),
219 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
220 	.clkr = {
221 		.hw.init = &(const struct clk_init_data) {
222 			.name = "cam_cc_pll4",
223 			.parent_data = &(const struct clk_parent_data) {
224 				.index = DT_BI_TCXO,
225 			},
226 			.num_parents = 1,
227 			.ops = &clk_alpha_pll_lucid_evo_ops,
228 		},
229 	},
230 };
231 
232 static const struct clk_div_table post_div_table_cam_cc_pll4_out_even[] = {
233 	{ 0x1, 2 },
234 	{ }
235 };
236 
237 static struct clk_alpha_pll_postdiv cam_cc_pll4_out_even = {
238 	.offset = 0x3000,
239 	.post_div_shift = 10,
240 	.post_div_table = post_div_table_cam_cc_pll4_out_even,
241 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll4_out_even),
242 	.width = 4,
243 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
244 	.clkr.hw.init = &(const struct clk_init_data) {
245 		.name = "cam_cc_pll4_out_even",
246 		.parent_hws = (const struct clk_hw*[]) {
247 			&cam_cc_pll4.clkr.hw,
248 		},
249 		.num_parents = 1,
250 		.flags = CLK_SET_RATE_PARENT,
251 		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
252 	},
253 };
254 
255 static const struct alpha_pll_config cam_cc_pll5_config = {
256 	.l = 0x32,
257 	.alpha = 0x0,
258 	.config_ctl_val = 0x20485699,
259 	.config_ctl_hi_val = 0x00182261,
260 	.config_ctl_hi1_val = 0x32aa299c,
261 	.user_ctl_val = 0x00000400,
262 	.user_ctl_hi_val = 0x00400805,
263 };
264 
265 static struct clk_alpha_pll cam_cc_pll5 = {
266 	.offset = 0x4000,
267 	.vco_table = lucid_evo_vco,
268 	.num_vco = ARRAY_SIZE(lucid_evo_vco),
269 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
270 	.clkr = {
271 		.hw.init = &(const struct clk_init_data) {
272 			.name = "cam_cc_pll5",
273 			.parent_data = &(const struct clk_parent_data) {
274 				.index = DT_BI_TCXO,
275 			},
276 			.num_parents = 1,
277 			.ops = &clk_alpha_pll_lucid_evo_ops,
278 		},
279 	},
280 };
281 
282 static const struct clk_div_table post_div_table_cam_cc_pll5_out_even[] = {
283 	{ 0x1, 2 },
284 	{ }
285 };
286 
287 static struct clk_alpha_pll_postdiv cam_cc_pll5_out_even = {
288 	.offset = 0x4000,
289 	.post_div_shift = 10,
290 	.post_div_table = post_div_table_cam_cc_pll5_out_even,
291 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll5_out_even),
292 	.width = 4,
293 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
294 	.clkr.hw.init = &(const struct clk_init_data) {
295 		.name = "cam_cc_pll5_out_even",
296 		.parent_hws = (const struct clk_hw*[]) {
297 			&cam_cc_pll5.clkr.hw,
298 		},
299 		.num_parents = 1,
300 		.flags = CLK_SET_RATE_PARENT,
301 		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
302 	},
303 };
304 
305 static const struct parent_map cam_cc_parent_map_0[] = {
306 	{ P_BI_TCXO, 0 },
307 	{ P_CAM_CC_PLL0_OUT_MAIN, 1 },
308 	{ P_CAM_CC_PLL0_OUT_EVEN, 2 },
309 	{ P_CAM_CC_PLL0_OUT_ODD, 3 },
310 };
311 
312 static const struct clk_parent_data cam_cc_parent_data_0[] = {
313 	{ .index = DT_BI_TCXO },
314 	{ .hw = &cam_cc_pll0.clkr.hw },
315 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
316 	{ .hw = &cam_cc_pll0_out_odd.clkr.hw },
317 };
318 
319 static const struct parent_map cam_cc_parent_map_1[] = {
320 	{ P_BI_TCXO, 0 },
321 	{ P_CAM_CC_PLL2_OUT_EVEN, 3 },
322 	{ P_CAM_CC_PLL2_OUT_MAIN, 5 },
323 };
324 
325 static const struct clk_parent_data cam_cc_parent_data_1[] = {
326 	{ .index = DT_BI_TCXO },
327 	{ .hw = &cam_cc_pll2.clkr.hw },
328 	{ .hw = &cam_cc_pll2.clkr.hw },
329 };
330 
331 static const struct parent_map cam_cc_parent_map_2[] = {
332 	{ P_BI_TCXO, 0 },
333 	{ P_CAM_CC_PLL4_OUT_EVEN, 6 },
334 };
335 
336 static const struct clk_parent_data cam_cc_parent_data_2[] = {
337 	{ .index = DT_BI_TCXO },
338 	{ .hw = &cam_cc_pll4_out_even.clkr.hw },
339 };
340 
341 static const struct parent_map cam_cc_parent_map_3[] = {
342 	{ P_BI_TCXO, 0 },
343 	{ P_CAM_CC_PLL5_OUT_EVEN, 6 },
344 };
345 
346 static const struct clk_parent_data cam_cc_parent_data_3[] = {
347 	{ .index = DT_BI_TCXO },
348 	{ .hw = &cam_cc_pll5_out_even.clkr.hw },
349 };
350 
351 static const struct parent_map cam_cc_parent_map_4[] = {
352 	{ P_BI_TCXO, 0 },
353 	{ P_CAM_CC_PLL3_OUT_EVEN, 6 },
354 };
355 
356 static const struct clk_parent_data cam_cc_parent_data_4[] = {
357 	{ .index = DT_BI_TCXO },
358 	{ .hw = &cam_cc_pll3_out_even.clkr.hw },
359 };
360 
361 static const struct parent_map cam_cc_parent_map_5[] = {
362 	{ P_SLEEP_CLK, 0 },
363 };
364 
365 static const struct clk_parent_data cam_cc_parent_data_5[] = {
366 	{ .index = DT_SLEEP_CLK },
367 };
368 
369 static const struct parent_map cam_cc_parent_map_6_ao[] = {
370 	{ P_BI_TCXO_AO, 0 },
371 };
372 
373 static const struct clk_parent_data cam_cc_parent_data_6_ao[] = {
374 	{ .index = DT_BI_TCXO_AO },
375 };
376 
377 static const struct freq_tbl ftbl_cam_cc_camnoc_axi_clk_src[] = {
378 	F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
379 	{ }
380 };
381 
382 static struct clk_rcg2 cam_cc_camnoc_axi_clk_src = {
383 	.cmd_rcgr = 0x13170,
384 	.mnd_width = 0,
385 	.hid_width = 5,
386 	.parent_map = cam_cc_parent_map_0,
387 	.freq_tbl = ftbl_cam_cc_camnoc_axi_clk_src,
388 	.clkr.hw.init = &(const struct clk_init_data) {
389 		.name = "cam_cc_camnoc_axi_clk_src",
390 		.parent_data = cam_cc_parent_data_0,
391 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
392 		.flags = CLK_SET_RATE_PARENT,
393 		.ops = &clk_rcg2_shared_ops,
394 	},
395 };
396 
397 static const struct freq_tbl ftbl_cam_cc_cci_0_clk_src[] = {
398 	F(37500000, P_CAM_CC_PLL0_OUT_MAIN, 16, 1, 2),
399 	{ }
400 };
401 
402 static struct clk_rcg2 cam_cc_cci_0_clk_src = {
403 	.cmd_rcgr = 0x130a0,
404 	.mnd_width = 8,
405 	.hid_width = 5,
406 	.parent_map = cam_cc_parent_map_0,
407 	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
408 	.clkr.hw.init = &(const struct clk_init_data) {
409 		.name = "cam_cc_cci_0_clk_src",
410 		.parent_data = cam_cc_parent_data_0,
411 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
412 		.flags = CLK_SET_RATE_PARENT,
413 		.ops = &clk_rcg2_shared_ops,
414 	},
415 };
416 
417 static struct clk_rcg2 cam_cc_cci_1_clk_src = {
418 	.cmd_rcgr = 0x130bc,
419 	.mnd_width = 8,
420 	.hid_width = 5,
421 	.parent_map = cam_cc_parent_map_0,
422 	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
423 	.clkr.hw.init = &(const struct clk_init_data) {
424 		.name = "cam_cc_cci_1_clk_src",
425 		.parent_data = cam_cc_parent_data_0,
426 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
427 		.flags = CLK_SET_RATE_PARENT,
428 		.ops = &clk_rcg2_shared_ops,
429 	},
430 };
431 
432 static struct clk_rcg2 cam_cc_cci_2_clk_src = {
433 	.cmd_rcgr = 0x130d8,
434 	.mnd_width = 8,
435 	.hid_width = 5,
436 	.parent_map = cam_cc_parent_map_0,
437 	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
438 	.clkr.hw.init = &(const struct clk_init_data) {
439 		.name = "cam_cc_cci_2_clk_src",
440 		.parent_data = cam_cc_parent_data_0,
441 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
442 		.flags = CLK_SET_RATE_PARENT,
443 		.ops = &clk_rcg2_shared_ops,
444 	},
445 };
446 
447 static struct clk_rcg2 cam_cc_cci_3_clk_src = {
448 	.cmd_rcgr = 0x130f4,
449 	.mnd_width = 8,
450 	.hid_width = 5,
451 	.parent_map = cam_cc_parent_map_0,
452 	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
453 	.clkr.hw.init = &(const struct clk_init_data) {
454 		.name = "cam_cc_cci_3_clk_src",
455 		.parent_data = cam_cc_parent_data_0,
456 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
457 		.flags = CLK_SET_RATE_PARENT,
458 		.ops = &clk_rcg2_shared_ops,
459 	},
460 };
461 
462 static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = {
463 	F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0),
464 	{ }
465 };
466 
467 static struct clk_rcg2 cam_cc_cphy_rx_clk_src = {
468 	.cmd_rcgr = 0x11034,
469 	.mnd_width = 0,
470 	.hid_width = 5,
471 	.parent_map = cam_cc_parent_map_0,
472 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
473 	.clkr.hw.init = &(const struct clk_init_data) {
474 		.name = "cam_cc_cphy_rx_clk_src",
475 		.parent_data = cam_cc_parent_data_0,
476 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
477 		.flags = CLK_SET_RATE_PARENT,
478 		.ops = &clk_rcg2_shared_ops,
479 	},
480 };
481 
482 static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
483 	.cmd_rcgr = 0x15074,
484 	.mnd_width = 0,
485 	.hid_width = 5,
486 	.parent_map = cam_cc_parent_map_0,
487 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
488 	.clkr.hw.init = &(const struct clk_init_data) {
489 		.name = "cam_cc_csi0phytimer_clk_src",
490 		.parent_data = cam_cc_parent_data_0,
491 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
492 		.flags = CLK_SET_RATE_PARENT,
493 		.ops = &clk_rcg2_shared_ops,
494 	},
495 };
496 
497 static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
498 	.cmd_rcgr = 0x15098,
499 	.mnd_width = 0,
500 	.hid_width = 5,
501 	.parent_map = cam_cc_parent_map_0,
502 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
503 	.clkr.hw.init = &(const struct clk_init_data) {
504 		.name = "cam_cc_csi1phytimer_clk_src",
505 		.parent_data = cam_cc_parent_data_0,
506 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
507 		.flags = CLK_SET_RATE_PARENT,
508 		.ops = &clk_rcg2_shared_ops,
509 	},
510 };
511 
512 static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = {
513 	.cmd_rcgr = 0x150b8,
514 	.mnd_width = 0,
515 	.hid_width = 5,
516 	.parent_map = cam_cc_parent_map_0,
517 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
518 	.clkr.hw.init = &(const struct clk_init_data) {
519 		.name = "cam_cc_csi2phytimer_clk_src",
520 		.parent_data = cam_cc_parent_data_0,
521 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
522 		.flags = CLK_SET_RATE_PARENT,
523 		.ops = &clk_rcg2_shared_ops,
524 	},
525 };
526 
527 static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = {
528 	.cmd_rcgr = 0x150d8,
529 	.mnd_width = 0,
530 	.hid_width = 5,
531 	.parent_map = cam_cc_parent_map_0,
532 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
533 	.clkr.hw.init = &(const struct clk_init_data) {
534 		.name = "cam_cc_csi3phytimer_clk_src",
535 		.parent_data = cam_cc_parent_data_0,
536 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
537 		.flags = CLK_SET_RATE_PARENT,
538 		.ops = &clk_rcg2_shared_ops,
539 	},
540 };
541 
542 static struct clk_rcg2 cam_cc_csid_clk_src = {
543 	.cmd_rcgr = 0x13150,
544 	.mnd_width = 0,
545 	.hid_width = 5,
546 	.parent_map = cam_cc_parent_map_0,
547 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
548 	.clkr.hw.init = &(const struct clk_init_data) {
549 		.name = "cam_cc_csid_clk_src",
550 		.parent_data = cam_cc_parent_data_0,
551 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
552 		.flags = CLK_SET_RATE_PARENT,
553 		.ops = &clk_rcg2_shared_ops,
554 	},
555 };
556 
557 static const struct freq_tbl ftbl_cam_cc_fast_ahb_clk_src[] = {
558 	F(300000000, P_CAM_CC_PLL0_OUT_MAIN, 4, 0, 0),
559 	F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
560 	{ }
561 };
562 
563 static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
564 	.cmd_rcgr = 0x13120,
565 	.mnd_width = 0,
566 	.hid_width = 5,
567 	.parent_map = cam_cc_parent_map_0,
568 	.freq_tbl = ftbl_cam_cc_fast_ahb_clk_src,
569 	.clkr.hw.init = &(const struct clk_init_data) {
570 		.name = "cam_cc_fast_ahb_clk_src",
571 		.parent_data = cam_cc_parent_data_0,
572 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
573 		.flags = CLK_SET_RATE_PARENT,
574 		.ops = &clk_rcg2_shared_ops,
575 	},
576 };
577 
578 static const struct freq_tbl ftbl_cam_cc_icp_clk_src[] = {
579 	F(480000000, P_CAM_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
580 	F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0),
581 	{ }
582 };
583 
584 static struct clk_rcg2 cam_cc_icp_clk_src = {
585 	.cmd_rcgr = 0x1307c,
586 	.mnd_width = 0,
587 	.hid_width = 5,
588 	.parent_map = cam_cc_parent_map_0,
589 	.freq_tbl = ftbl_cam_cc_icp_clk_src,
590 	.clkr.hw.init = &(const struct clk_init_data) {
591 		.name = "cam_cc_icp_clk_src",
592 		.parent_data = cam_cc_parent_data_0,
593 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
594 		.flags = CLK_SET_RATE_PARENT,
595 		.ops = &clk_rcg2_shared_ops,
596 	},
597 };
598 
599 static const struct freq_tbl ftbl_cam_cc_ife_0_clk_src[] = {
600 	F(480000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
601 	F(600000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
602 	{ }
603 };
604 
605 static struct clk_rcg2 cam_cc_ife_0_clk_src = {
606 	.cmd_rcgr = 0x11004,
607 	.mnd_width = 0,
608 	.hid_width = 5,
609 	.parent_map = cam_cc_parent_map_2,
610 	.freq_tbl = ftbl_cam_cc_ife_0_clk_src,
611 	.clkr.hw.init = &(const struct clk_init_data) {
612 		.name = "cam_cc_ife_0_clk_src",
613 		.parent_data = cam_cc_parent_data_2,
614 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
615 		.flags = CLK_SET_RATE_PARENT,
616 		.ops = &clk_rcg2_shared_ops,
617 	},
618 };
619 
620 static const struct freq_tbl ftbl_cam_cc_ife_1_clk_src[] = {
621 	F(480000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
622 	F(600000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
623 	{ }
624 };
625 
626 static struct clk_rcg2 cam_cc_ife_1_clk_src = {
627 	.cmd_rcgr = 0x12004,
628 	.mnd_width = 0,
629 	.hid_width = 5,
630 	.parent_map = cam_cc_parent_map_3,
631 	.freq_tbl = ftbl_cam_cc_ife_1_clk_src,
632 	.clkr.hw.init = &(const struct clk_init_data) {
633 		.name = "cam_cc_ife_1_clk_src",
634 		.parent_data = cam_cc_parent_data_3,
635 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
636 		.flags = CLK_SET_RATE_PARENT,
637 		.ops = &clk_rcg2_shared_ops,
638 	},
639 };
640 
641 static const struct freq_tbl ftbl_cam_cc_ife_lite_clk_src[] = {
642 	F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
643 	F(480000000, P_CAM_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
644 	{ }
645 };
646 
647 static struct clk_rcg2 cam_cc_ife_lite_clk_src = {
648 	.cmd_rcgr = 0x13000,
649 	.mnd_width = 0,
650 	.hid_width = 5,
651 	.parent_map = cam_cc_parent_map_0,
652 	.freq_tbl = ftbl_cam_cc_ife_lite_clk_src,
653 	.clkr.hw.init = &(const struct clk_init_data) {
654 		.name = "cam_cc_ife_lite_clk_src",
655 		.parent_data = cam_cc_parent_data_0,
656 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
657 		.flags = CLK_SET_RATE_PARENT,
658 		.ops = &clk_rcg2_shared_ops,
659 	},
660 };
661 
662 static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = {
663 	.cmd_rcgr = 0x13020,
664 	.mnd_width = 0,
665 	.hid_width = 5,
666 	.parent_map = cam_cc_parent_map_0,
667 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
668 	.clkr.hw.init = &(const struct clk_init_data) {
669 		.name = "cam_cc_ife_lite_csid_clk_src",
670 		.parent_data = cam_cc_parent_data_0,
671 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
672 		.flags = CLK_SET_RATE_PARENT,
673 		.ops = &clk_rcg2_shared_ops,
674 	},
675 };
676 
677 static const struct freq_tbl ftbl_cam_cc_ipe_clk_src[] = {
678 	F(480000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
679 	F(600000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
680 	{ }
681 };
682 
683 static struct clk_rcg2 cam_cc_ipe_clk_src = {
684 	.cmd_rcgr = 0x10004,
685 	.mnd_width = 0,
686 	.hid_width = 5,
687 	.parent_map = cam_cc_parent_map_4,
688 	.freq_tbl = ftbl_cam_cc_ipe_clk_src,
689 	.clkr.hw.init = &(const struct clk_init_data) {
690 		.name = "cam_cc_ipe_clk_src",
691 		.parent_data = cam_cc_parent_data_4,
692 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
693 		.flags = CLK_SET_RATE_PARENT,
694 		.ops = &clk_rcg2_shared_ops,
695 	},
696 };
697 
698 static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = {
699 	F(19200000, P_CAM_CC_PLL2_OUT_MAIN, 1, 1, 50),
700 	F(24000000, P_CAM_CC_PLL2_OUT_MAIN, 10, 1, 4),
701 	F(64000000, P_CAM_CC_PLL2_OUT_MAIN, 15, 0, 0),
702 	{ }
703 };
704 
705 static struct clk_rcg2 cam_cc_mclk0_clk_src = {
706 	.cmd_rcgr = 0x15004,
707 	.mnd_width = 8,
708 	.hid_width = 5,
709 	.parent_map = cam_cc_parent_map_1,
710 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
711 	.clkr.hw.init = &(const struct clk_init_data) {
712 		.name = "cam_cc_mclk0_clk_src",
713 		.parent_data = cam_cc_parent_data_1,
714 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
715 		.flags = CLK_SET_RATE_PARENT,
716 		.ops = &clk_rcg2_shared_ops,
717 	},
718 };
719 
720 static struct clk_rcg2 cam_cc_mclk1_clk_src = {
721 	.cmd_rcgr = 0x15020,
722 	.mnd_width = 8,
723 	.hid_width = 5,
724 	.parent_map = cam_cc_parent_map_1,
725 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
726 	.clkr.hw.init = &(const struct clk_init_data) {
727 		.name = "cam_cc_mclk1_clk_src",
728 		.parent_data = cam_cc_parent_data_1,
729 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
730 		.flags = CLK_SET_RATE_PARENT,
731 		.ops = &clk_rcg2_shared_ops,
732 	},
733 };
734 
735 static struct clk_rcg2 cam_cc_mclk2_clk_src = {
736 	.cmd_rcgr = 0x1503c,
737 	.mnd_width = 8,
738 	.hid_width = 5,
739 	.parent_map = cam_cc_parent_map_1,
740 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
741 	.clkr.hw.init = &(const struct clk_init_data) {
742 		.name = "cam_cc_mclk2_clk_src",
743 		.parent_data = cam_cc_parent_data_1,
744 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
745 		.flags = CLK_SET_RATE_PARENT,
746 		.ops = &clk_rcg2_shared_ops,
747 	},
748 };
749 
750 static struct clk_rcg2 cam_cc_mclk3_clk_src = {
751 	.cmd_rcgr = 0x15058,
752 	.mnd_width = 8,
753 	.hid_width = 5,
754 	.parent_map = cam_cc_parent_map_1,
755 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
756 	.clkr.hw.init = &(const struct clk_init_data) {
757 		.name = "cam_cc_mclk3_clk_src",
758 		.parent_data = cam_cc_parent_data_1,
759 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
760 		.flags = CLK_SET_RATE_PARENT,
761 		.ops = &clk_rcg2_shared_ops,
762 	},
763 };
764 
765 static const struct freq_tbl ftbl_cam_cc_sleep_clk_src[] = {
766 	F(32000, P_SLEEP_CLK, 1, 0, 0),
767 	{ }
768 };
769 
770 static struct clk_rcg2 cam_cc_sleep_clk_src = {
771 	.cmd_rcgr = 0x131f0,
772 	.mnd_width = 0,
773 	.hid_width = 5,
774 	.parent_map = cam_cc_parent_map_5,
775 	.freq_tbl = ftbl_cam_cc_sleep_clk_src,
776 	.clkr.hw.init = &(const struct clk_init_data) {
777 		.name = "cam_cc_sleep_clk_src",
778 		.parent_data = cam_cc_parent_data_5,
779 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_5),
780 		.flags = CLK_SET_RATE_PARENT,
781 		.ops = &clk_rcg2_shared_ops,
782 	},
783 };
784 
785 static const struct freq_tbl ftbl_cam_cc_slow_ahb_clk_src[] = {
786 	F(80000000, P_CAM_CC_PLL0_OUT_EVEN, 7.5, 0, 0),
787 	{ }
788 };
789 
790 static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
791 	.cmd_rcgr = 0x13138,
792 	.mnd_width = 8,
793 	.hid_width = 5,
794 	.parent_map = cam_cc_parent_map_0,
795 	.freq_tbl = ftbl_cam_cc_slow_ahb_clk_src,
796 	.clkr.hw.init = &(const struct clk_init_data) {
797 		.name = "cam_cc_slow_ahb_clk_src",
798 		.parent_data = cam_cc_parent_data_0,
799 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
800 		.flags = CLK_SET_RATE_PARENT,
801 		.ops = &clk_rcg2_shared_ops,
802 	},
803 };
804 
805 static const struct freq_tbl ftbl_cam_cc_xo_clk_src[] = {
806 	F(19200000, P_BI_TCXO_AO, 1, 0, 0),
807 	{ }
808 };
809 
810 static struct clk_rcg2 cam_cc_xo_clk_src = {
811 	.cmd_rcgr = 0x131d4,
812 	.mnd_width = 0,
813 	.hid_width = 5,
814 	.parent_map = cam_cc_parent_map_6_ao,
815 	.freq_tbl = ftbl_cam_cc_xo_clk_src,
816 	.clkr.hw.init = &(const struct clk_init_data) {
817 		.name = "cam_cc_xo_clk_src",
818 		.parent_data = cam_cc_parent_data_6_ao,
819 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_6_ao),
820 		.flags = CLK_SET_RATE_PARENT,
821 		.ops = &clk_rcg2_shared_ops,
822 	},
823 };
824 
825 static struct clk_branch cam_cc_camnoc_axi_clk = {
826 	.halt_reg = 0x13188,
827 	.halt_check = BRANCH_HALT,
828 	.clkr = {
829 		.enable_reg = 0x13188,
830 		.enable_mask = BIT(0),
831 		.hw.init = &(const struct clk_init_data) {
832 			.name = "cam_cc_camnoc_axi_clk",
833 			.parent_hws = (const struct clk_hw*[]) {
834 				&cam_cc_camnoc_axi_clk_src.clkr.hw,
835 			},
836 			.num_parents = 1,
837 			.flags = CLK_SET_RATE_PARENT,
838 			.ops = &clk_branch2_ops,
839 		},
840 	},
841 };
842 
843 static struct clk_branch cam_cc_camnoc_dcd_xo_clk = {
844 	.halt_reg = 0x13190,
845 	.halt_check = BRANCH_HALT,
846 	.clkr = {
847 		.enable_reg = 0x13190,
848 		.enable_mask = BIT(0),
849 		.hw.init = &(const struct clk_init_data) {
850 			.name = "cam_cc_camnoc_dcd_xo_clk",
851 			.parent_hws = (const struct clk_hw*[]) {
852 				&cam_cc_xo_clk_src.clkr.hw,
853 			},
854 			.num_parents = 1,
855 			.flags = CLK_SET_RATE_PARENT,
856 			.ops = &clk_branch2_ops,
857 		},
858 	},
859 };
860 
861 static struct clk_branch cam_cc_qdss_debug_xo_clk = {
862 	.halt_reg = 0x131b8,
863 	.halt_check = BRANCH_HALT,
864 	.clkr = {
865 		.enable_reg = 0x131b8,
866 		.enable_mask = BIT(0),
867 		.hw.init = &(const struct clk_init_data) {
868 			.name = "cam_cc_qdss_debug_xo_clk",
869 			.parent_hws = (const struct clk_hw*[]) {
870 				&cam_cc_xo_clk_src.clkr.hw,
871 			},
872 			.num_parents = 1,
873 			.flags = CLK_SET_RATE_PARENT,
874 			.ops = &clk_branch2_ops,
875 		},
876 	},
877 };
878 
879 static struct clk_branch cam_cc_cci_0_clk = {
880 	.halt_reg = 0x130b8,
881 	.halt_check = BRANCH_HALT,
882 	.clkr = {
883 		.enable_reg = 0x130b8,
884 		.enable_mask = BIT(0),
885 		.hw.init = &(const struct clk_init_data) {
886 			.name = "cam_cc_cci_0_clk",
887 			.parent_hws = (const struct clk_hw*[]) {
888 				&cam_cc_cci_0_clk_src.clkr.hw,
889 			},
890 			.num_parents = 1,
891 			.flags = CLK_SET_RATE_PARENT,
892 			.ops = &clk_branch2_ops,
893 		},
894 	},
895 };
896 
897 static struct clk_branch cam_cc_cci_1_clk = {
898 	.halt_reg = 0x130d4,
899 	.halt_check = BRANCH_HALT,
900 	.clkr = {
901 		.enable_reg = 0x130d4,
902 		.enable_mask = BIT(0),
903 		.hw.init = &(const struct clk_init_data) {
904 			.name = "cam_cc_cci_1_clk",
905 			.parent_hws = (const struct clk_hw*[]) {
906 				&cam_cc_cci_1_clk_src.clkr.hw,
907 			},
908 			.num_parents = 1,
909 			.flags = CLK_SET_RATE_PARENT,
910 			.ops = &clk_branch2_ops,
911 		},
912 	},
913 };
914 
915 static struct clk_branch cam_cc_cci_2_clk = {
916 	.halt_reg = 0x130f0,
917 	.halt_check = BRANCH_HALT,
918 	.clkr = {
919 		.enable_reg = 0x130f0,
920 		.enable_mask = BIT(0),
921 		.hw.init = &(const struct clk_init_data) {
922 			.name = "cam_cc_cci_2_clk",
923 			.parent_hws = (const struct clk_hw*[]) {
924 				&cam_cc_cci_2_clk_src.clkr.hw,
925 			},
926 			.num_parents = 1,
927 			.flags = CLK_SET_RATE_PARENT,
928 			.ops = &clk_branch2_ops,
929 		},
930 	},
931 };
932 
933 static struct clk_branch cam_cc_cci_3_clk = {
934 	.halt_reg = 0x1310c,
935 	.halt_check = BRANCH_HALT,
936 	.clkr = {
937 		.enable_reg = 0x1310c,
938 		.enable_mask = BIT(0),
939 		.hw.init = &(const struct clk_init_data) {
940 			.name = "cam_cc_cci_3_clk",
941 			.parent_hws = (const struct clk_hw*[]) {
942 				&cam_cc_cci_3_clk_src.clkr.hw,
943 			},
944 			.num_parents = 1,
945 			.flags = CLK_SET_RATE_PARENT,
946 			.ops = &clk_branch2_ops,
947 		},
948 	},
949 };
950 
951 static struct clk_branch cam_cc_core_ahb_clk = {
952 	.halt_reg = 0x131d0,
953 	.halt_check = BRANCH_HALT_DELAY,
954 	.clkr = {
955 		.enable_reg = 0x131d0,
956 		.enable_mask = BIT(0),
957 		.hw.init = &(const struct clk_init_data) {
958 			.name = "cam_cc_core_ahb_clk",
959 			.parent_hws = (const struct clk_hw*[]) {
960 				&cam_cc_slow_ahb_clk_src.clkr.hw,
961 			},
962 			.num_parents = 1,
963 			.flags = CLK_SET_RATE_PARENT,
964 			.ops = &clk_branch2_ops,
965 		},
966 	},
967 };
968 
969 static struct clk_branch cam_cc_cpas_ahb_clk = {
970 	.halt_reg = 0x13110,
971 	.halt_check = BRANCH_HALT,
972 	.clkr = {
973 		.enable_reg = 0x13110,
974 		.enable_mask = BIT(0),
975 		.hw.init = &(const struct clk_init_data) {
976 			.name = "cam_cc_cpas_ahb_clk",
977 			.parent_hws = (const struct clk_hw*[]) {
978 				&cam_cc_slow_ahb_clk_src.clkr.hw,
979 			},
980 			.num_parents = 1,
981 			.flags = CLK_SET_RATE_PARENT,
982 			.ops = &clk_branch2_ops,
983 		},
984 	},
985 };
986 
987 static struct clk_branch cam_cc_cpas_fast_ahb_clk = {
988 	.halt_reg = 0x13118,
989 	.halt_check = BRANCH_HALT,
990 	.clkr = {
991 		.enable_reg = 0x13118,
992 		.enable_mask = BIT(0),
993 		.hw.init = &(const struct clk_init_data) {
994 			.name = "cam_cc_cpas_fast_ahb_clk",
995 			.parent_hws = (const struct clk_hw*[]) {
996 				&cam_cc_fast_ahb_clk_src.clkr.hw,
997 			},
998 			.num_parents = 1,
999 			.flags = CLK_SET_RATE_PARENT,
1000 			.ops = &clk_branch2_ops,
1001 		},
1002 	},
1003 };
1004 
1005 static struct clk_branch cam_cc_cpas_ife_0_clk = {
1006 	.halt_reg = 0x11024,
1007 	.halt_check = BRANCH_HALT,
1008 	.clkr = {
1009 		.enable_reg = 0x11024,
1010 		.enable_mask = BIT(0),
1011 		.hw.init = &(const struct clk_init_data) {
1012 			.name = "cam_cc_cpas_ife_0_clk",
1013 			.parent_hws = (const struct clk_hw*[]) {
1014 				&cam_cc_ife_0_clk_src.clkr.hw,
1015 			},
1016 			.num_parents = 1,
1017 			.flags = CLK_SET_RATE_PARENT,
1018 			.ops = &clk_branch2_ops,
1019 		},
1020 	},
1021 };
1022 
1023 static struct clk_branch cam_cc_cpas_ife_1_clk = {
1024 	.halt_reg = 0x12024,
1025 	.halt_check = BRANCH_HALT,
1026 	.clkr = {
1027 		.enable_reg = 0x12024,
1028 		.enable_mask = BIT(0),
1029 		.hw.init = &(const struct clk_init_data) {
1030 			.name = "cam_cc_cpas_ife_1_clk",
1031 			.parent_hws = (const struct clk_hw*[]) {
1032 				&cam_cc_ife_1_clk_src.clkr.hw,
1033 			},
1034 			.num_parents = 1,
1035 			.flags = CLK_SET_RATE_PARENT,
1036 			.ops = &clk_branch2_ops,
1037 		},
1038 	},
1039 };
1040 
1041 static struct clk_branch cam_cc_cpas_ife_lite_clk = {
1042 	.halt_reg = 0x1301c,
1043 	.halt_check = BRANCH_HALT,
1044 	.clkr = {
1045 		.enable_reg = 0x1301c,
1046 		.enable_mask = BIT(0),
1047 		.hw.init = &(const struct clk_init_data) {
1048 			.name = "cam_cc_cpas_ife_lite_clk",
1049 			.parent_hws = (const struct clk_hw*[]) {
1050 				&cam_cc_ife_lite_clk_src.clkr.hw,
1051 			},
1052 			.num_parents = 1,
1053 			.flags = CLK_SET_RATE_PARENT,
1054 			.ops = &clk_branch2_ops,
1055 		},
1056 	},
1057 };
1058 
1059 static struct clk_branch cam_cc_cpas_ipe_clk = {
1060 	.halt_reg = 0x10024,
1061 	.halt_check = BRANCH_HALT,
1062 	.clkr = {
1063 		.enable_reg = 0x10024,
1064 		.enable_mask = BIT(0),
1065 		.hw.init = &(const struct clk_init_data) {
1066 			.name = "cam_cc_cpas_ipe_clk",
1067 			.parent_hws = (const struct clk_hw*[]) {
1068 				&cam_cc_ipe_clk_src.clkr.hw,
1069 			},
1070 			.num_parents = 1,
1071 			.flags = CLK_SET_RATE_PARENT,
1072 			.ops = &clk_branch2_ops,
1073 		},
1074 	},
1075 };
1076 
1077 static struct clk_branch cam_cc_cpas_sfe_lite_0_clk = {
1078 	.halt_reg = 0x13050,
1079 	.halt_check = BRANCH_HALT,
1080 	.clkr = {
1081 		.enable_reg = 0x13050,
1082 		.enable_mask = BIT(0),
1083 		.hw.init = &(const struct clk_init_data) {
1084 			.name = "cam_cc_cpas_sfe_lite_0_clk",
1085 			.parent_hws = (const struct clk_hw*[]) {
1086 				&cam_cc_ife_0_clk_src.clkr.hw,
1087 			},
1088 			.num_parents = 1,
1089 			.flags = CLK_SET_RATE_PARENT,
1090 			.ops = &clk_branch2_ops,
1091 		},
1092 	},
1093 };
1094 
1095 static struct clk_branch cam_cc_cpas_sfe_lite_1_clk = {
1096 	.halt_reg = 0x13068,
1097 	.halt_check = BRANCH_HALT,
1098 	.clkr = {
1099 		.enable_reg = 0x13068,
1100 		.enable_mask = BIT(0),
1101 		.hw.init = &(const struct clk_init_data) {
1102 			.name = "cam_cc_cpas_sfe_lite_1_clk",
1103 			.parent_hws = (const struct clk_hw*[]) {
1104 				&cam_cc_ife_1_clk_src.clkr.hw,
1105 			},
1106 			.num_parents = 1,
1107 			.flags = CLK_SET_RATE_PARENT,
1108 			.ops = &clk_branch2_ops,
1109 		},
1110 	},
1111 };
1112 
1113 static struct clk_branch cam_cc_csi0phytimer_clk = {
1114 	.halt_reg = 0x1508c,
1115 	.halt_check = BRANCH_HALT,
1116 	.clkr = {
1117 		.enable_reg = 0x1508c,
1118 		.enable_mask = BIT(0),
1119 		.hw.init = &(const struct clk_init_data) {
1120 			.name = "cam_cc_csi0phytimer_clk",
1121 			.parent_hws = (const struct clk_hw*[]) {
1122 				&cam_cc_csi0phytimer_clk_src.clkr.hw,
1123 			},
1124 			.num_parents = 1,
1125 			.flags = CLK_SET_RATE_PARENT,
1126 			.ops = &clk_branch2_ops,
1127 		},
1128 	},
1129 };
1130 
1131 static struct clk_branch cam_cc_csi1phytimer_clk = {
1132 	.halt_reg = 0x150b0,
1133 	.halt_check = BRANCH_HALT,
1134 	.clkr = {
1135 		.enable_reg = 0x150b0,
1136 		.enable_mask = BIT(0),
1137 		.hw.init = &(const struct clk_init_data) {
1138 			.name = "cam_cc_csi1phytimer_clk",
1139 			.parent_hws = (const struct clk_hw*[]) {
1140 				&cam_cc_csi1phytimer_clk_src.clkr.hw,
1141 			},
1142 			.num_parents = 1,
1143 			.flags = CLK_SET_RATE_PARENT,
1144 			.ops = &clk_branch2_ops,
1145 		},
1146 	},
1147 };
1148 
1149 static struct clk_branch cam_cc_csi2phytimer_clk = {
1150 	.halt_reg = 0x150d0,
1151 	.halt_check = BRANCH_HALT,
1152 	.clkr = {
1153 		.enable_reg = 0x150d0,
1154 		.enable_mask = BIT(0),
1155 		.hw.init = &(const struct clk_init_data) {
1156 			.name = "cam_cc_csi2phytimer_clk",
1157 			.parent_hws = (const struct clk_hw*[]) {
1158 				&cam_cc_csi2phytimer_clk_src.clkr.hw,
1159 			},
1160 			.num_parents = 1,
1161 			.flags = CLK_SET_RATE_PARENT,
1162 			.ops = &clk_branch2_ops,
1163 		},
1164 	},
1165 };
1166 
1167 static struct clk_branch cam_cc_csi3phytimer_clk = {
1168 	.halt_reg = 0x150f0,
1169 	.halt_check = BRANCH_HALT,
1170 	.clkr = {
1171 		.enable_reg = 0x150f0,
1172 		.enable_mask = BIT(0),
1173 		.hw.init = &(const struct clk_init_data) {
1174 			.name = "cam_cc_csi3phytimer_clk",
1175 			.parent_hws = (const struct clk_hw*[]) {
1176 				&cam_cc_csi3phytimer_clk_src.clkr.hw,
1177 			},
1178 			.num_parents = 1,
1179 			.flags = CLK_SET_RATE_PARENT,
1180 			.ops = &clk_branch2_ops,
1181 		},
1182 	},
1183 };
1184 
1185 static struct clk_branch cam_cc_csid_clk = {
1186 	.halt_reg = 0x13168,
1187 	.halt_check = BRANCH_HALT,
1188 	.clkr = {
1189 		.enable_reg = 0x13168,
1190 		.enable_mask = BIT(0),
1191 		.hw.init = &(const struct clk_init_data) {
1192 			.name = "cam_cc_csid_clk",
1193 			.parent_hws = (const struct clk_hw*[]) {
1194 				&cam_cc_csid_clk_src.clkr.hw,
1195 			},
1196 			.num_parents = 1,
1197 			.flags = CLK_SET_RATE_PARENT,
1198 			.ops = &clk_branch2_ops,
1199 		},
1200 	},
1201 };
1202 
1203 static struct clk_branch cam_cc_csid_csiphy_rx_clk = {
1204 	.halt_reg = 0x15094,
1205 	.halt_check = BRANCH_HALT,
1206 	.clkr = {
1207 		.enable_reg = 0x15094,
1208 		.enable_mask = BIT(0),
1209 		.hw.init = &(const struct clk_init_data) {
1210 			.name = "cam_cc_csid_csiphy_rx_clk",
1211 			.parent_hws = (const struct clk_hw*[]) {
1212 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1213 			},
1214 			.num_parents = 1,
1215 			.flags = CLK_SET_RATE_PARENT,
1216 			.ops = &clk_branch2_ops,
1217 		},
1218 	},
1219 };
1220 
1221 static struct clk_branch cam_cc_csiphy0_clk = {
1222 	.halt_reg = 0x15090,
1223 	.halt_check = BRANCH_HALT,
1224 	.clkr = {
1225 		.enable_reg = 0x15090,
1226 		.enable_mask = BIT(0),
1227 		.hw.init = &(const struct clk_init_data) {
1228 			.name = "cam_cc_csiphy0_clk",
1229 			.parent_hws = (const struct clk_hw*[]) {
1230 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1231 			},
1232 			.num_parents = 1,
1233 			.flags = CLK_SET_RATE_PARENT,
1234 			.ops = &clk_branch2_ops,
1235 		},
1236 	},
1237 };
1238 
1239 static struct clk_branch cam_cc_csiphy1_clk = {
1240 	.halt_reg = 0x150b4,
1241 	.halt_check = BRANCH_HALT,
1242 	.clkr = {
1243 		.enable_reg = 0x150b4,
1244 		.enable_mask = BIT(0),
1245 		.hw.init = &(const struct clk_init_data) {
1246 			.name = "cam_cc_csiphy1_clk",
1247 			.parent_hws = (const struct clk_hw*[]) {
1248 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1249 			},
1250 			.num_parents = 1,
1251 			.flags = CLK_SET_RATE_PARENT,
1252 			.ops = &clk_branch2_ops,
1253 		},
1254 	},
1255 };
1256 
1257 static struct clk_branch cam_cc_csiphy2_clk = {
1258 	.halt_reg = 0x150d4,
1259 	.halt_check = BRANCH_HALT,
1260 	.clkr = {
1261 		.enable_reg = 0x150d4,
1262 		.enable_mask = BIT(0),
1263 		.hw.init = &(const struct clk_init_data) {
1264 			.name = "cam_cc_csiphy2_clk",
1265 			.parent_hws = (const struct clk_hw*[]) {
1266 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1267 			},
1268 			.num_parents = 1,
1269 			.flags = CLK_SET_RATE_PARENT,
1270 			.ops = &clk_branch2_ops,
1271 		},
1272 	},
1273 };
1274 
1275 static struct clk_branch cam_cc_csiphy3_clk = {
1276 	.halt_reg = 0x150f4,
1277 	.halt_check = BRANCH_HALT,
1278 	.clkr = {
1279 		.enable_reg = 0x150f4,
1280 		.enable_mask = BIT(0),
1281 		.hw.init = &(const struct clk_init_data) {
1282 			.name = "cam_cc_csiphy3_clk",
1283 			.parent_hws = (const struct clk_hw*[]) {
1284 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1285 			},
1286 			.num_parents = 1,
1287 			.flags = CLK_SET_RATE_PARENT,
1288 			.ops = &clk_branch2_ops,
1289 		},
1290 	},
1291 };
1292 
1293 static struct clk_branch cam_cc_icp_ahb_clk = {
1294 	.halt_reg = 0x1309c,
1295 	.halt_check = BRANCH_HALT,
1296 	.clkr = {
1297 		.enable_reg = 0x1309c,
1298 		.enable_mask = BIT(0),
1299 		.hw.init = &(const struct clk_init_data) {
1300 			.name = "cam_cc_icp_ahb_clk",
1301 			.parent_hws = (const struct clk_hw*[]) {
1302 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1303 			},
1304 			.num_parents = 1,
1305 			.flags = CLK_SET_RATE_PARENT,
1306 			.ops = &clk_branch2_ops,
1307 		},
1308 	},
1309 };
1310 
1311 static struct clk_branch cam_cc_icp_clk = {
1312 	.halt_reg = 0x13094,
1313 	.halt_check = BRANCH_HALT,
1314 	.clkr = {
1315 		.enable_reg = 0x13094,
1316 		.enable_mask = BIT(0),
1317 		.hw.init = &(const struct clk_init_data) {
1318 			.name = "cam_cc_icp_clk",
1319 			.parent_hws = (const struct clk_hw*[]) {
1320 				&cam_cc_icp_clk_src.clkr.hw,
1321 			},
1322 			.num_parents = 1,
1323 			.flags = CLK_SET_RATE_PARENT,
1324 			.ops = &clk_branch2_ops,
1325 		},
1326 	},
1327 };
1328 
1329 static struct clk_branch cam_cc_ife_0_clk = {
1330 	.halt_reg = 0x1101c,
1331 	.halt_check = BRANCH_HALT,
1332 	.clkr = {
1333 		.enable_reg = 0x1101c,
1334 		.enable_mask = BIT(0),
1335 		.hw.init = &(const struct clk_init_data) {
1336 			.name = "cam_cc_ife_0_clk",
1337 			.parent_hws = (const struct clk_hw*[]) {
1338 				&cam_cc_ife_0_clk_src.clkr.hw,
1339 			},
1340 			.num_parents = 1,
1341 			.flags = CLK_SET_RATE_PARENT,
1342 			.ops = &clk_branch2_ops,
1343 		},
1344 	},
1345 };
1346 
1347 static struct clk_branch cam_cc_ife_0_fast_ahb_clk = {
1348 	.halt_reg = 0x11030,
1349 	.halt_check = BRANCH_HALT,
1350 	.clkr = {
1351 		.enable_reg = 0x11030,
1352 		.enable_mask = BIT(0),
1353 		.hw.init = &(const struct clk_init_data) {
1354 			.name = "cam_cc_ife_0_fast_ahb_clk",
1355 			.parent_hws = (const struct clk_hw*[]) {
1356 				&cam_cc_fast_ahb_clk_src.clkr.hw,
1357 			},
1358 			.num_parents = 1,
1359 			.flags = CLK_SET_RATE_PARENT,
1360 			.ops = &clk_branch2_ops,
1361 		},
1362 	},
1363 };
1364 
1365 static struct clk_branch cam_cc_ife_1_clk = {
1366 	.halt_reg = 0x1201c,
1367 	.halt_check = BRANCH_HALT,
1368 	.clkr = {
1369 		.enable_reg = 0x1201c,
1370 		.enable_mask = BIT(0),
1371 		.hw.init = &(const struct clk_init_data) {
1372 			.name = "cam_cc_ife_1_clk",
1373 			.parent_hws = (const struct clk_hw*[]) {
1374 				&cam_cc_ife_1_clk_src.clkr.hw,
1375 			},
1376 			.num_parents = 1,
1377 			.flags = CLK_SET_RATE_PARENT,
1378 			.ops = &clk_branch2_ops,
1379 		},
1380 	},
1381 };
1382 
1383 static struct clk_branch cam_cc_ife_1_fast_ahb_clk = {
1384 	.halt_reg = 0x12030,
1385 	.halt_check = BRANCH_HALT,
1386 	.clkr = {
1387 		.enable_reg = 0x12030,
1388 		.enable_mask = BIT(0),
1389 		.hw.init = &(const struct clk_init_data) {
1390 			.name = "cam_cc_ife_1_fast_ahb_clk",
1391 			.parent_hws = (const struct clk_hw*[]) {
1392 				&cam_cc_fast_ahb_clk_src.clkr.hw,
1393 			},
1394 			.num_parents = 1,
1395 			.flags = CLK_SET_RATE_PARENT,
1396 			.ops = &clk_branch2_ops,
1397 		},
1398 	},
1399 };
1400 
1401 static struct clk_branch cam_cc_ife_lite_ahb_clk = {
1402 	.halt_reg = 0x13044,
1403 	.halt_check = BRANCH_HALT,
1404 	.clkr = {
1405 		.enable_reg = 0x13044,
1406 		.enable_mask = BIT(0),
1407 		.hw.init = &(const struct clk_init_data) {
1408 			.name = "cam_cc_ife_lite_ahb_clk",
1409 			.parent_hws = (const struct clk_hw*[]) {
1410 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1411 			},
1412 			.num_parents = 1,
1413 			.flags = CLK_SET_RATE_PARENT,
1414 			.ops = &clk_branch2_ops,
1415 		},
1416 	},
1417 };
1418 
1419 static struct clk_branch cam_cc_ife_lite_clk = {
1420 	.halt_reg = 0x13018,
1421 	.halt_check = BRANCH_HALT,
1422 	.clkr = {
1423 		.enable_reg = 0x13018,
1424 		.enable_mask = BIT(0),
1425 		.hw.init = &(const struct clk_init_data) {
1426 			.name = "cam_cc_ife_lite_clk",
1427 			.parent_hws = (const struct clk_hw*[]) {
1428 				&cam_cc_ife_lite_clk_src.clkr.hw,
1429 			},
1430 			.num_parents = 1,
1431 			.flags = CLK_SET_RATE_PARENT,
1432 			.ops = &clk_branch2_ops,
1433 		},
1434 	},
1435 };
1436 
1437 static struct clk_branch cam_cc_ife_lite_cphy_rx_clk = {
1438 	.halt_reg = 0x13040,
1439 	.halt_check = BRANCH_HALT,
1440 	.clkr = {
1441 		.enable_reg = 0x13040,
1442 		.enable_mask = BIT(0),
1443 		.hw.init = &(const struct clk_init_data) {
1444 			.name = "cam_cc_ife_lite_cphy_rx_clk",
1445 			.parent_hws = (const struct clk_hw*[]) {
1446 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1447 			},
1448 			.num_parents = 1,
1449 			.flags = CLK_SET_RATE_PARENT,
1450 			.ops = &clk_branch2_ops,
1451 		},
1452 	},
1453 };
1454 
1455 static struct clk_branch cam_cc_ife_lite_csid_clk = {
1456 	.halt_reg = 0x13038,
1457 	.halt_check = BRANCH_HALT,
1458 	.clkr = {
1459 		.enable_reg = 0x13038,
1460 		.enable_mask = BIT(0),
1461 		.hw.init = &(const struct clk_init_data) {
1462 			.name = "cam_cc_ife_lite_csid_clk",
1463 			.parent_hws = (const struct clk_hw*[]) {
1464 				&cam_cc_ife_lite_csid_clk_src.clkr.hw,
1465 			},
1466 			.num_parents = 1,
1467 			.flags = CLK_SET_RATE_PARENT,
1468 			.ops = &clk_branch2_ops,
1469 		},
1470 	},
1471 };
1472 
1473 static struct clk_branch cam_cc_ipe_ahb_clk = {
1474 	.halt_reg = 0x10030,
1475 	.halt_check = BRANCH_HALT,
1476 	.clkr = {
1477 		.enable_reg = 0x10030,
1478 		.enable_mask = BIT(0),
1479 		.hw.init = &(const struct clk_init_data) {
1480 			.name = "cam_cc_ipe_ahb_clk",
1481 			.parent_hws = (const struct clk_hw*[]) {
1482 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1483 			},
1484 			.num_parents = 1,
1485 			.flags = CLK_SET_RATE_PARENT,
1486 			.ops = &clk_branch2_ops,
1487 		},
1488 	},
1489 };
1490 
1491 static struct clk_branch cam_cc_ipe_clk = {
1492 	.halt_reg = 0x1001c,
1493 	.halt_check = BRANCH_HALT,
1494 	.clkr = {
1495 		.enable_reg = 0x1001c,
1496 		.enable_mask = BIT(0),
1497 		.hw.init = &(const struct clk_init_data) {
1498 			.name = "cam_cc_ipe_clk",
1499 			.parent_hws = (const struct clk_hw*[]) {
1500 				&cam_cc_ipe_clk_src.clkr.hw,
1501 			},
1502 			.num_parents = 1,
1503 			.flags = CLK_SET_RATE_PARENT,
1504 			.ops = &clk_branch2_ops,
1505 		},
1506 	},
1507 };
1508 
1509 static struct clk_branch cam_cc_ipe_fast_ahb_clk = {
1510 	.halt_reg = 0x10034,
1511 	.halt_check = BRANCH_HALT,
1512 	.clkr = {
1513 		.enable_reg = 0x10034,
1514 		.enable_mask = BIT(0),
1515 		.hw.init = &(const struct clk_init_data) {
1516 			.name = "cam_cc_ipe_fast_ahb_clk",
1517 			.parent_hws = (const struct clk_hw*[]) {
1518 				&cam_cc_fast_ahb_clk_src.clkr.hw,
1519 			},
1520 			.num_parents = 1,
1521 			.flags = CLK_SET_RATE_PARENT,
1522 			.ops = &clk_branch2_ops,
1523 		},
1524 	},
1525 };
1526 
1527 static struct clk_branch cam_cc_mclk0_clk = {
1528 	.halt_reg = 0x1501c,
1529 	.halt_check = BRANCH_HALT,
1530 	.clkr = {
1531 		.enable_reg = 0x1501c,
1532 		.enable_mask = BIT(0),
1533 		.hw.init = &(const struct clk_init_data) {
1534 			.name = "cam_cc_mclk0_clk",
1535 			.parent_hws = (const struct clk_hw*[]) {
1536 				&cam_cc_mclk0_clk_src.clkr.hw,
1537 			},
1538 			.num_parents = 1,
1539 			.flags = CLK_SET_RATE_PARENT,
1540 			.ops = &clk_branch2_ops,
1541 		},
1542 	},
1543 };
1544 
1545 static struct clk_branch cam_cc_mclk1_clk = {
1546 	.halt_reg = 0x15038,
1547 	.halt_check = BRANCH_HALT,
1548 	.clkr = {
1549 		.enable_reg = 0x15038,
1550 		.enable_mask = BIT(0),
1551 		.hw.init = &(const struct clk_init_data) {
1552 			.name = "cam_cc_mclk1_clk",
1553 			.parent_hws = (const struct clk_hw*[]) {
1554 				&cam_cc_mclk1_clk_src.clkr.hw,
1555 			},
1556 			.num_parents = 1,
1557 			.flags = CLK_SET_RATE_PARENT,
1558 			.ops = &clk_branch2_ops,
1559 		},
1560 	},
1561 };
1562 
1563 static struct clk_branch cam_cc_mclk2_clk = {
1564 	.halt_reg = 0x15054,
1565 	.halt_check = BRANCH_HALT,
1566 	.clkr = {
1567 		.enable_reg = 0x15054,
1568 		.enable_mask = BIT(0),
1569 		.hw.init = &(const struct clk_init_data) {
1570 			.name = "cam_cc_mclk2_clk",
1571 			.parent_hws = (const struct clk_hw*[]) {
1572 				&cam_cc_mclk2_clk_src.clkr.hw,
1573 			},
1574 			.num_parents = 1,
1575 			.flags = CLK_SET_RATE_PARENT,
1576 			.ops = &clk_branch2_ops,
1577 		},
1578 	},
1579 };
1580 
1581 static struct clk_branch cam_cc_mclk3_clk = {
1582 	.halt_reg = 0x15070,
1583 	.halt_check = BRANCH_HALT,
1584 	.clkr = {
1585 		.enable_reg = 0x15070,
1586 		.enable_mask = BIT(0),
1587 		.hw.init = &(const struct clk_init_data) {
1588 			.name = "cam_cc_mclk3_clk",
1589 			.parent_hws = (const struct clk_hw*[]) {
1590 				&cam_cc_mclk3_clk_src.clkr.hw,
1591 			},
1592 			.num_parents = 1,
1593 			.flags = CLK_SET_RATE_PARENT,
1594 			.ops = &clk_branch2_ops,
1595 		},
1596 	},
1597 };
1598 
1599 static struct clk_branch cam_cc_sfe_lite_0_clk = {
1600 	.halt_reg = 0x1304c,
1601 	.halt_check = BRANCH_HALT,
1602 	.clkr = {
1603 		.enable_reg = 0x1304c,
1604 		.enable_mask = BIT(0),
1605 		.hw.init = &(const struct clk_init_data) {
1606 			.name = "cam_cc_sfe_lite_0_clk",
1607 			.parent_hws = (const struct clk_hw*[]) {
1608 				&cam_cc_ife_0_clk_src.clkr.hw,
1609 			},
1610 			.num_parents = 1,
1611 			.flags = CLK_SET_RATE_PARENT,
1612 			.ops = &clk_branch2_ops,
1613 		},
1614 	},
1615 };
1616 
1617 static struct clk_branch cam_cc_sfe_lite_0_fast_ahb_clk = {
1618 	.halt_reg = 0x1305c,
1619 	.halt_check = BRANCH_HALT,
1620 	.clkr = {
1621 		.enable_reg = 0x1305c,
1622 		.enable_mask = BIT(0),
1623 		.hw.init = &(const struct clk_init_data) {
1624 			.name = "cam_cc_sfe_lite_0_fast_ahb_clk",
1625 			.parent_hws = (const struct clk_hw*[]) {
1626 				&cam_cc_fast_ahb_clk_src.clkr.hw,
1627 			},
1628 			.num_parents = 1,
1629 			.flags = CLK_SET_RATE_PARENT,
1630 			.ops = &clk_branch2_ops,
1631 		},
1632 	},
1633 };
1634 
1635 static struct clk_branch cam_cc_sfe_lite_1_clk = {
1636 	.halt_reg = 0x13064,
1637 	.halt_check = BRANCH_HALT,
1638 	.clkr = {
1639 		.enable_reg = 0x13064,
1640 		.enable_mask = BIT(0),
1641 		.hw.init = &(const struct clk_init_data) {
1642 			.name = "cam_cc_sfe_lite_1_clk",
1643 			.parent_hws = (const struct clk_hw*[]) {
1644 				&cam_cc_ife_1_clk_src.clkr.hw,
1645 			},
1646 			.num_parents = 1,
1647 			.flags = CLK_SET_RATE_PARENT,
1648 			.ops = &clk_branch2_ops,
1649 		},
1650 	},
1651 };
1652 
1653 static struct clk_branch cam_cc_sfe_lite_1_fast_ahb_clk = {
1654 	.halt_reg = 0x13074,
1655 	.halt_check = BRANCH_HALT,
1656 	.clkr = {
1657 		.enable_reg = 0x13074,
1658 		.enable_mask = BIT(0),
1659 		.hw.init = &(const struct clk_init_data) {
1660 			.name = "cam_cc_sfe_lite_1_fast_ahb_clk",
1661 			.parent_hws = (const struct clk_hw*[]) {
1662 				&cam_cc_fast_ahb_clk_src.clkr.hw,
1663 			},
1664 			.num_parents = 1,
1665 			.flags = CLK_SET_RATE_PARENT,
1666 			.ops = &clk_branch2_ops,
1667 		},
1668 	},
1669 };
1670 
1671 static struct clk_branch cam_cc_sm_obs_clk = {
1672 	.halt_reg = 0x1510c,
1673 	.halt_check = BRANCH_HALT_SKIP,
1674 	.clkr = {
1675 		.enable_reg = 0x1510c,
1676 		.enable_mask = BIT(0),
1677 		.hw.init = &(const struct clk_init_data) {
1678 			.name = "cam_cc_sm_obs_clk",
1679 			.ops = &clk_branch2_ops,
1680 		},
1681 	},
1682 };
1683 
1684 static struct clk_branch cam_cc_titan_top_accu_shift_clk = {
1685 	.halt_reg = 0x131f0,
1686 	.halt_check = BRANCH_HALT_VOTED,
1687 	.clkr = {
1688 		.enable_reg = 0x131f0,
1689 		.enable_mask = BIT(0),
1690 		.hw.init = &(const struct clk_init_data) {
1691 			.name = "cam_cc_titan_top_accu_shift_clk",
1692 			.parent_hws = (const struct clk_hw*[]) {
1693 				&cam_cc_xo_clk_src.clkr.hw,
1694 			},
1695 			.num_parents = 1,
1696 			.flags = CLK_SET_RATE_PARENT,
1697 			.ops = &clk_branch2_ops,
1698 		},
1699 	},
1700 };
1701 
1702 static struct gdsc cam_cc_titan_top_gdsc = {
1703 	.gdscr = 0x131bc,
1704 	.en_rest_wait_val = 0x2,
1705 	.en_few_wait_val = 0x2,
1706 	.clk_dis_wait_val = 0xf,
1707 	.pd = {
1708 		.name = "cam_cc_titan_top_gdsc",
1709 	},
1710 	.pwrsts = PWRSTS_OFF_ON,
1711 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
1712 };
1713 
1714 static struct clk_regmap *cam_cc_sa8775p_clocks[] = {
1715 	[CAM_CC_CAMNOC_AXI_CLK] = &cam_cc_camnoc_axi_clk.clkr,
1716 	[CAM_CC_CAMNOC_AXI_CLK_SRC] = &cam_cc_camnoc_axi_clk_src.clkr,
1717 	[CAM_CC_CAMNOC_DCD_XO_CLK] = &cam_cc_camnoc_dcd_xo_clk.clkr,
1718 	[CAM_CC_CCI_0_CLK] = &cam_cc_cci_0_clk.clkr,
1719 	[CAM_CC_CCI_0_CLK_SRC] = &cam_cc_cci_0_clk_src.clkr,
1720 	[CAM_CC_CCI_1_CLK] = &cam_cc_cci_1_clk.clkr,
1721 	[CAM_CC_CCI_1_CLK_SRC] = &cam_cc_cci_1_clk_src.clkr,
1722 	[CAM_CC_CCI_2_CLK] = &cam_cc_cci_2_clk.clkr,
1723 	[CAM_CC_CCI_2_CLK_SRC] = &cam_cc_cci_2_clk_src.clkr,
1724 	[CAM_CC_CCI_3_CLK] = &cam_cc_cci_3_clk.clkr,
1725 	[CAM_CC_CCI_3_CLK_SRC] = &cam_cc_cci_3_clk_src.clkr,
1726 	[CAM_CC_CORE_AHB_CLK] = &cam_cc_core_ahb_clk.clkr,
1727 	[CAM_CC_CPAS_AHB_CLK] = &cam_cc_cpas_ahb_clk.clkr,
1728 	[CAM_CC_CPAS_FAST_AHB_CLK] = &cam_cc_cpas_fast_ahb_clk.clkr,
1729 	[CAM_CC_CPAS_IFE_0_CLK] = &cam_cc_cpas_ife_0_clk.clkr,
1730 	[CAM_CC_CPAS_IFE_1_CLK] = &cam_cc_cpas_ife_1_clk.clkr,
1731 	[CAM_CC_CPAS_IFE_LITE_CLK] = &cam_cc_cpas_ife_lite_clk.clkr,
1732 	[CAM_CC_CPAS_IPE_CLK] = &cam_cc_cpas_ipe_clk.clkr,
1733 	[CAM_CC_CPAS_SFE_LITE_0_CLK] = &cam_cc_cpas_sfe_lite_0_clk.clkr,
1734 	[CAM_CC_CPAS_SFE_LITE_1_CLK] = &cam_cc_cpas_sfe_lite_1_clk.clkr,
1735 	[CAM_CC_CPHY_RX_CLK_SRC] = &cam_cc_cphy_rx_clk_src.clkr,
1736 	[CAM_CC_CSI0PHYTIMER_CLK] = &cam_cc_csi0phytimer_clk.clkr,
1737 	[CAM_CC_CSI0PHYTIMER_CLK_SRC] = &cam_cc_csi0phytimer_clk_src.clkr,
1738 	[CAM_CC_CSI1PHYTIMER_CLK] = &cam_cc_csi1phytimer_clk.clkr,
1739 	[CAM_CC_CSI1PHYTIMER_CLK_SRC] = &cam_cc_csi1phytimer_clk_src.clkr,
1740 	[CAM_CC_CSI2PHYTIMER_CLK] = &cam_cc_csi2phytimer_clk.clkr,
1741 	[CAM_CC_CSI2PHYTIMER_CLK_SRC] = &cam_cc_csi2phytimer_clk_src.clkr,
1742 	[CAM_CC_CSI3PHYTIMER_CLK] = &cam_cc_csi3phytimer_clk.clkr,
1743 	[CAM_CC_CSI3PHYTIMER_CLK_SRC] = &cam_cc_csi3phytimer_clk_src.clkr,
1744 	[CAM_CC_CSID_CLK] = &cam_cc_csid_clk.clkr,
1745 	[CAM_CC_CSID_CLK_SRC] = &cam_cc_csid_clk_src.clkr,
1746 	[CAM_CC_CSID_CSIPHY_RX_CLK] = &cam_cc_csid_csiphy_rx_clk.clkr,
1747 	[CAM_CC_CSIPHY0_CLK] = &cam_cc_csiphy0_clk.clkr,
1748 	[CAM_CC_CSIPHY1_CLK] = &cam_cc_csiphy1_clk.clkr,
1749 	[CAM_CC_CSIPHY2_CLK] = &cam_cc_csiphy2_clk.clkr,
1750 	[CAM_CC_CSIPHY3_CLK] = &cam_cc_csiphy3_clk.clkr,
1751 	[CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
1752 	[CAM_CC_ICP_AHB_CLK] = &cam_cc_icp_ahb_clk.clkr,
1753 	[CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
1754 	[CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr,
1755 	[CAM_CC_IFE_0_CLK] = &cam_cc_ife_0_clk.clkr,
1756 	[CAM_CC_IFE_0_CLK_SRC] = &cam_cc_ife_0_clk_src.clkr,
1757 	[CAM_CC_IFE_0_FAST_AHB_CLK] = &cam_cc_ife_0_fast_ahb_clk.clkr,
1758 	[CAM_CC_IFE_1_CLK] = &cam_cc_ife_1_clk.clkr,
1759 	[CAM_CC_IFE_1_CLK_SRC] = &cam_cc_ife_1_clk_src.clkr,
1760 	[CAM_CC_IFE_1_FAST_AHB_CLK] = &cam_cc_ife_1_fast_ahb_clk.clkr,
1761 	[CAM_CC_IFE_LITE_AHB_CLK] = &cam_cc_ife_lite_ahb_clk.clkr,
1762 	[CAM_CC_IFE_LITE_CLK] = &cam_cc_ife_lite_clk.clkr,
1763 	[CAM_CC_IFE_LITE_CLK_SRC] = &cam_cc_ife_lite_clk_src.clkr,
1764 	[CAM_CC_IFE_LITE_CPHY_RX_CLK] = &cam_cc_ife_lite_cphy_rx_clk.clkr,
1765 	[CAM_CC_IFE_LITE_CSID_CLK] = &cam_cc_ife_lite_csid_clk.clkr,
1766 	[CAM_CC_IFE_LITE_CSID_CLK_SRC] = &cam_cc_ife_lite_csid_clk_src.clkr,
1767 	[CAM_CC_IPE_AHB_CLK] = &cam_cc_ipe_ahb_clk.clkr,
1768 	[CAM_CC_IPE_CLK] = &cam_cc_ipe_clk.clkr,
1769 	[CAM_CC_IPE_CLK_SRC] = &cam_cc_ipe_clk_src.clkr,
1770 	[CAM_CC_IPE_FAST_AHB_CLK] = &cam_cc_ipe_fast_ahb_clk.clkr,
1771 	[CAM_CC_MCLK0_CLK] = &cam_cc_mclk0_clk.clkr,
1772 	[CAM_CC_MCLK0_CLK_SRC] = &cam_cc_mclk0_clk_src.clkr,
1773 	[CAM_CC_MCLK1_CLK] = &cam_cc_mclk1_clk.clkr,
1774 	[CAM_CC_MCLK1_CLK_SRC] = &cam_cc_mclk1_clk_src.clkr,
1775 	[CAM_CC_MCLK2_CLK] = &cam_cc_mclk2_clk.clkr,
1776 	[CAM_CC_MCLK2_CLK_SRC] = &cam_cc_mclk2_clk_src.clkr,
1777 	[CAM_CC_MCLK3_CLK] = &cam_cc_mclk3_clk.clkr,
1778 	[CAM_CC_MCLK3_CLK_SRC] = &cam_cc_mclk3_clk_src.clkr,
1779 	[CAM_CC_PLL0] = &cam_cc_pll0.clkr,
1780 	[CAM_CC_PLL0_OUT_EVEN] = &cam_cc_pll0_out_even.clkr,
1781 	[CAM_CC_PLL0_OUT_ODD] = &cam_cc_pll0_out_odd.clkr,
1782 	[CAM_CC_PLL2] = &cam_cc_pll2.clkr,
1783 	[CAM_CC_PLL3] = &cam_cc_pll3.clkr,
1784 	[CAM_CC_PLL3_OUT_EVEN] = &cam_cc_pll3_out_even.clkr,
1785 	[CAM_CC_PLL4] = &cam_cc_pll4.clkr,
1786 	[CAM_CC_PLL4_OUT_EVEN] = &cam_cc_pll4_out_even.clkr,
1787 	[CAM_CC_PLL5] = &cam_cc_pll5.clkr,
1788 	[CAM_CC_PLL5_OUT_EVEN] = &cam_cc_pll5_out_even.clkr,
1789 	[CAM_CC_SFE_LITE_0_CLK] = &cam_cc_sfe_lite_0_clk.clkr,
1790 	[CAM_CC_SFE_LITE_0_FAST_AHB_CLK] = &cam_cc_sfe_lite_0_fast_ahb_clk.clkr,
1791 	[CAM_CC_SFE_LITE_1_CLK] = &cam_cc_sfe_lite_1_clk.clkr,
1792 	[CAM_CC_SFE_LITE_1_FAST_AHB_CLK] = &cam_cc_sfe_lite_1_fast_ahb_clk.clkr,
1793 	[CAM_CC_SLEEP_CLK_SRC] = &cam_cc_sleep_clk_src.clkr,
1794 	[CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr,
1795 	[CAM_CC_SM_OBS_CLK] = &cam_cc_sm_obs_clk.clkr,
1796 	[CAM_CC_TITAN_TOP_ACCU_SHIFT_CLK] = NULL,
1797 	[CAM_CC_XO_CLK_SRC] = &cam_cc_xo_clk_src.clkr,
1798 	[CAM_CC_QDSS_DEBUG_XO_CLK] = &cam_cc_qdss_debug_xo_clk.clkr,
1799 };
1800 
1801 static struct gdsc *cam_cc_sa8775p_gdscs[] = {
1802 	[CAM_CC_TITAN_TOP_GDSC] = &cam_cc_titan_top_gdsc,
1803 };
1804 
1805 static const struct qcom_reset_map cam_cc_sa8775p_resets[] = {
1806 	[CAM_CC_ICP_BCR] = { 0x13078 },
1807 	[CAM_CC_IFE_0_BCR] = { 0x11000 },
1808 	[CAM_CC_IFE_1_BCR] = { 0x12000 },
1809 	[CAM_CC_IPE_0_BCR] = { 0x10000 },
1810 	[CAM_CC_SFE_LITE_0_BCR] = { 0x13048 },
1811 	[CAM_CC_SFE_LITE_1_BCR] = { 0x13060 },
1812 };
1813 
1814 static const struct regmap_config cam_cc_sa8775p_regmap_config = {
1815 	.reg_bits = 32,
1816 	.reg_stride = 4,
1817 	.val_bits = 32,
1818 	.max_register = 0x16218,
1819 	.fast_io = true,
1820 };
1821 
1822 static const struct qcom_cc_desc cam_cc_sa8775p_desc = {
1823 	.config = &cam_cc_sa8775p_regmap_config,
1824 	.clks = cam_cc_sa8775p_clocks,
1825 	.num_clks = ARRAY_SIZE(cam_cc_sa8775p_clocks),
1826 	.resets = cam_cc_sa8775p_resets,
1827 	.num_resets = ARRAY_SIZE(cam_cc_sa8775p_resets),
1828 	.gdscs = cam_cc_sa8775p_gdscs,
1829 	.num_gdscs = ARRAY_SIZE(cam_cc_sa8775p_gdscs),
1830 };
1831 
1832 static const struct of_device_id cam_cc_sa8775p_match_table[] = {
1833 	{ .compatible = "qcom,qcs8300-camcc" },
1834 	{ .compatible = "qcom,sa8775p-camcc" },
1835 	{ }
1836 };
1837 MODULE_DEVICE_TABLE(of, cam_cc_sa8775p_match_table);
1838 
cam_cc_sa8775p_probe(struct platform_device * pdev)1839 static int cam_cc_sa8775p_probe(struct platform_device *pdev)
1840 {
1841 	struct regmap *regmap;
1842 	int ret;
1843 
1844 	ret = devm_pm_runtime_enable(&pdev->dev);
1845 	if (ret)
1846 		return ret;
1847 
1848 	ret = pm_runtime_resume_and_get(&pdev->dev);
1849 	if (ret)
1850 		return ret;
1851 
1852 	regmap = qcom_cc_map(pdev, &cam_cc_sa8775p_desc);
1853 	if (IS_ERR(regmap)) {
1854 		pm_runtime_put(&pdev->dev);
1855 		return PTR_ERR(regmap);
1856 	}
1857 
1858 	clk_lucid_evo_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
1859 	clk_rivian_evo_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll2_config);
1860 	clk_lucid_evo_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll3_config);
1861 	clk_lucid_evo_pll_configure(&cam_cc_pll4, regmap, &cam_cc_pll4_config);
1862 	clk_lucid_evo_pll_configure(&cam_cc_pll5, regmap, &cam_cc_pll5_config);
1863 
1864 	if (device_is_compatible(&pdev->dev, "qcom,qcs8300-camcc")) {
1865 		cam_cc_camnoc_axi_clk_src.cmd_rcgr = 0x13154;
1866 		cam_cc_camnoc_axi_clk.halt_reg = 0x1316c;
1867 		cam_cc_camnoc_axi_clk.clkr.enable_reg = 0x1316c;
1868 		cam_cc_camnoc_dcd_xo_clk.halt_reg = 0x13174;
1869 		cam_cc_camnoc_dcd_xo_clk.clkr.enable_reg = 0x13174;
1870 
1871 		cam_cc_csi0phytimer_clk_src.cmd_rcgr = 0x15054;
1872 		cam_cc_csi1phytimer_clk_src.cmd_rcgr = 0x15078;
1873 		cam_cc_csi2phytimer_clk_src.cmd_rcgr = 0x15098;
1874 		cam_cc_csid_clk_src.cmd_rcgr = 0x13134;
1875 
1876 		cam_cc_mclk0_clk_src.cmd_rcgr = 0x15000;
1877 		cam_cc_mclk1_clk_src.cmd_rcgr = 0x1501c;
1878 		cam_cc_mclk2_clk_src.cmd_rcgr = 0x15038;
1879 
1880 		cam_cc_fast_ahb_clk_src.cmd_rcgr = 0x13104;
1881 		cam_cc_slow_ahb_clk_src.cmd_rcgr = 0x1311c;
1882 		cam_cc_xo_clk_src.cmd_rcgr = 0x131b8;
1883 		cam_cc_sleep_clk_src.cmd_rcgr = 0x131d4;
1884 
1885 		cam_cc_core_ahb_clk.halt_reg = 0x131b4;
1886 		cam_cc_core_ahb_clk.clkr.enable_reg = 0x131b4;
1887 
1888 		cam_cc_cpas_ahb_clk.halt_reg = 0x130f4;
1889 		cam_cc_cpas_ahb_clk.clkr.enable_reg = 0x130f4;
1890 		cam_cc_cpas_fast_ahb_clk.halt_reg = 0x130fc;
1891 		cam_cc_cpas_fast_ahb_clk.clkr.enable_reg = 0x130fc;
1892 
1893 		cam_cc_csi0phytimer_clk.halt_reg = 0x1506c;
1894 		cam_cc_csi0phytimer_clk.clkr.enable_reg = 0x1506c;
1895 		cam_cc_csi1phytimer_clk.halt_reg = 0x15090;
1896 		cam_cc_csi1phytimer_clk.clkr.enable_reg = 0x15090;
1897 		cam_cc_csi2phytimer_clk.halt_reg = 0x150b0;
1898 		cam_cc_csi2phytimer_clk.clkr.enable_reg = 0x150b0;
1899 		cam_cc_csid_clk.halt_reg = 0x1314c;
1900 		cam_cc_csid_clk.clkr.enable_reg = 0x1314c;
1901 		cam_cc_csid_csiphy_rx_clk.halt_reg = 0x15074;
1902 		cam_cc_csid_csiphy_rx_clk.clkr.enable_reg = 0x15074;
1903 		cam_cc_csiphy0_clk.halt_reg = 0x15070;
1904 		cam_cc_csiphy0_clk.clkr.enable_reg = 0x15070;
1905 		cam_cc_csiphy1_clk.halt_reg = 0x15094;
1906 		cam_cc_csiphy1_clk.clkr.enable_reg = 0x15094;
1907 		cam_cc_csiphy2_clk.halt_reg = 0x150b4;
1908 		cam_cc_csiphy2_clk.clkr.enable_reg = 0x150b4;
1909 
1910 		cam_cc_mclk0_clk.halt_reg = 0x15018;
1911 		cam_cc_mclk0_clk.clkr.enable_reg = 0x15018;
1912 		cam_cc_mclk1_clk.halt_reg = 0x15034;
1913 		cam_cc_mclk1_clk.clkr.enable_reg = 0x15034;
1914 		cam_cc_mclk2_clk.halt_reg = 0x15050;
1915 		cam_cc_mclk2_clk.clkr.enable_reg = 0x15050;
1916 		cam_cc_qdss_debug_xo_clk.halt_reg = 0x1319c;
1917 		cam_cc_qdss_debug_xo_clk.clkr.enable_reg = 0x1319c;
1918 
1919 		cam_cc_titan_top_gdsc.gdscr = 0x131a0;
1920 
1921 		cam_cc_sa8775p_clocks[CAM_CC_CCI_3_CLK] = NULL;
1922 		cam_cc_sa8775p_clocks[CAM_CC_CCI_3_CLK_SRC] = NULL;
1923 		cam_cc_sa8775p_clocks[CAM_CC_CSI3PHYTIMER_CLK] = NULL;
1924 		cam_cc_sa8775p_clocks[CAM_CC_CSI3PHYTIMER_CLK_SRC] = NULL;
1925 		cam_cc_sa8775p_clocks[CAM_CC_CSIPHY3_CLK] = NULL;
1926 		cam_cc_sa8775p_clocks[CAM_CC_MCLK3_CLK] = NULL;
1927 		cam_cc_sa8775p_clocks[CAM_CC_MCLK3_CLK_SRC] = NULL;
1928 		cam_cc_sa8775p_clocks[CAM_CC_TITAN_TOP_ACCU_SHIFT_CLK] =
1929 				&cam_cc_titan_top_accu_shift_clk.clkr;
1930 
1931 		/* Keep some clocks always enabled */
1932 		qcom_branch_set_clk_en(regmap, 0x13178); /* CAM_CC_CAMNOC_XO_CLK */
1933 		qcom_branch_set_clk_en(regmap, 0x131d0); /* CAM_CC_GDSC_CLK */
1934 		qcom_branch_set_clk_en(regmap, 0x131ec); /* CAM_CC_SLEEP_CLK */
1935 	} else {
1936 		/* Keep some clocks always enabled */
1937 		qcom_branch_set_clk_en(regmap, 0x13194); /* CAM_CC_CAMNOC_XO_CLK */
1938 		qcom_branch_set_clk_en(regmap, 0x131ec); /* CAM_CC_GDSC_CLK */
1939 		qcom_branch_set_clk_en(regmap, 0x13208); /* CAM_CC_SLEEP_CLK */
1940 	}
1941 
1942 	ret = qcom_cc_really_probe(&pdev->dev, &cam_cc_sa8775p_desc, regmap);
1943 
1944 	pm_runtime_put(&pdev->dev);
1945 
1946 	return ret;
1947 }
1948 
1949 static struct platform_driver cam_cc_sa8775p_driver = {
1950 	.probe = cam_cc_sa8775p_probe,
1951 	.driver = {
1952 		.name = "camcc-sa8775p",
1953 		.of_match_table = cam_cc_sa8775p_match_table,
1954 	},
1955 };
1956 
1957 module_platform_driver(cam_cc_sa8775p_driver);
1958 
1959 MODULE_DESCRIPTION("QTI CAMCC SA8775P Driver");
1960 MODULE_LICENSE("GPL");
1961