1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
4  */
5 
6 #include <linux/clk-provider.h>
7 #include <linux/module.h>
8 #include <linux/platform_device.h>
9 #include <linux/regmap.h>
10 
11 #include <dt-bindings/clock/qcom,camcc-sdm845.h>
12 
13 #include "common.h"
14 #include "clk-alpha-pll.h"
15 #include "clk-branch.h"
16 #include "clk-rcg.h"
17 #include "clk-regmap.h"
18 #include "gdsc.h"
19 
20 enum {
21 	P_BI_TCXO,
22 	P_CAM_CC_PLL0_OUT_EVEN,
23 	P_CAM_CC_PLL1_OUT_EVEN,
24 	P_CAM_CC_PLL2_OUT_EVEN,
25 	P_CAM_CC_PLL3_OUT_EVEN,
26 };
27 
28 static struct clk_alpha_pll cam_cc_pll0 = {
29 	.offset = 0x0,
30 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
31 	.clkr = {
32 		.hw.init = &(struct clk_init_data){
33 			.name = "cam_cc_pll0",
34 			.parent_data = &(const struct clk_parent_data){
35 				.fw_name = "bi_tcxo", .name = "bi_tcxo",
36 			},
37 			.num_parents = 1,
38 			.ops = &clk_alpha_pll_fabia_ops,
39 		},
40 	},
41 };
42 
43 static const struct clk_div_table post_div_table_fabia_even[] = {
44 	{ 0x0, 1 },
45 	{ 0x1, 2 },
46 	{ }
47 };
48 
49 static struct clk_alpha_pll_postdiv cam_cc_pll0_out_even = {
50 	.offset = 0x0,
51 	.post_div_shift = 8,
52 	.post_div_table = post_div_table_fabia_even,
53 	.num_post_div = ARRAY_SIZE(post_div_table_fabia_even),
54 	.width = 4,
55 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
56 	.clkr.hw.init = &(struct clk_init_data){
57 		.name = "cam_cc_pll0_out_even",
58 		.parent_hws = (const struct clk_hw*[]){
59 			&cam_cc_pll0.clkr.hw,
60 		},
61 		.num_parents = 1,
62 		.ops = &clk_alpha_pll_postdiv_fabia_ops,
63 	},
64 };
65 
66 static struct clk_alpha_pll cam_cc_pll1 = {
67 	.offset = 0x1000,
68 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
69 	.clkr = {
70 		.hw.init = &(struct clk_init_data){
71 			.name = "cam_cc_pll1",
72 			.parent_data = &(const struct clk_parent_data){
73 				.fw_name = "bi_tcxo", .name = "bi_tcxo",
74 			},
75 			.num_parents = 1,
76 			.ops = &clk_alpha_pll_fabia_ops,
77 		},
78 	},
79 };
80 
81 static struct clk_alpha_pll_postdiv cam_cc_pll1_out_even = {
82 	.offset = 0x1000,
83 	.post_div_shift = 8,
84 	.post_div_table = post_div_table_fabia_even,
85 	.num_post_div = ARRAY_SIZE(post_div_table_fabia_even),
86 	.width = 4,
87 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
88 	.clkr.hw.init = &(struct clk_init_data){
89 		.name = "cam_cc_pll1_out_even",
90 		.parent_hws = (const struct clk_hw*[]){
91 			&cam_cc_pll1.clkr.hw,
92 		},
93 		.num_parents = 1,
94 		.ops = &clk_alpha_pll_postdiv_fabia_ops,
95 	},
96 };
97 
98 static struct clk_alpha_pll cam_cc_pll2 = {
99 	.offset = 0x2000,
100 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
101 	.clkr = {
102 		.hw.init = &(struct clk_init_data){
103 			.name = "cam_cc_pll2",
104 			.parent_data = &(const struct clk_parent_data){
105 				.fw_name = "bi_tcxo", .name = "bi_tcxo",
106 			},
107 			.num_parents = 1,
108 			.ops = &clk_alpha_pll_fabia_ops,
109 		},
110 	},
111 };
112 
113 static struct clk_alpha_pll_postdiv cam_cc_pll2_out_even = {
114 	.offset = 0x2000,
115 	.post_div_shift = 8,
116 	.post_div_table = post_div_table_fabia_even,
117 	.num_post_div = ARRAY_SIZE(post_div_table_fabia_even),
118 	.width = 4,
119 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
120 	.clkr.hw.init = &(struct clk_init_data){
121 		.name = "cam_cc_pll2_out_even",
122 		.parent_hws = (const struct clk_hw*[]){
123 			&cam_cc_pll2.clkr.hw,
124 		},
125 		.num_parents = 1,
126 		.ops = &clk_alpha_pll_postdiv_fabia_ops,
127 	},
128 };
129 
130 static struct clk_alpha_pll cam_cc_pll3 = {
131 	.offset = 0x3000,
132 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
133 	.clkr = {
134 		.hw.init = &(struct clk_init_data){
135 			.name = "cam_cc_pll3",
136 			.parent_data = &(const struct clk_parent_data){
137 				.fw_name = "bi_tcxo", .name = "bi_tcxo",
138 			},
139 			.num_parents = 1,
140 			.ops = &clk_alpha_pll_fabia_ops,
141 		},
142 	},
143 };
144 
145 static struct clk_alpha_pll_postdiv cam_cc_pll3_out_even = {
146 	.offset = 0x3000,
147 	.post_div_shift = 8,
148 	.post_div_table = post_div_table_fabia_even,
149 	.num_post_div = ARRAY_SIZE(post_div_table_fabia_even),
150 	.width = 4,
151 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
152 	.clkr.hw.init = &(struct clk_init_data){
153 		.name = "cam_cc_pll3_out_even",
154 		.parent_hws = (const struct clk_hw*[]){
155 			&cam_cc_pll3.clkr.hw,
156 		},
157 		.num_parents = 1,
158 		.ops = &clk_alpha_pll_postdiv_fabia_ops,
159 	},
160 };
161 
162 static const struct parent_map cam_cc_parent_map_0[] = {
163 	{ P_BI_TCXO, 0 },
164 	{ P_CAM_CC_PLL2_OUT_EVEN, 1 },
165 	{ P_CAM_CC_PLL1_OUT_EVEN, 2 },
166 	{ P_CAM_CC_PLL3_OUT_EVEN, 5 },
167 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 },
168 };
169 
170 static const struct clk_parent_data cam_cc_parent_data_0[] = {
171 	{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
172 	{ .hw = &cam_cc_pll2_out_even.clkr.hw },
173 	{ .hw = &cam_cc_pll1_out_even.clkr.hw },
174 	{ .hw = &cam_cc_pll3_out_even.clkr.hw },
175 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
176 };
177 
178 static const struct freq_tbl ftbl_cam_cc_bps_clk_src[] = {
179 	F(19200000, P_BI_TCXO, 1, 0, 0),
180 	F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
181 	F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
182 	F(404000000, P_CAM_CC_PLL1_OUT_EVEN, 2, 0, 0),
183 	F(480000000, P_CAM_CC_PLL2_OUT_EVEN, 1, 0, 0),
184 	F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
185 	{ }
186 };
187 
188 /*
189  * As per HW design, some of the CAMCC RCGs needs to
190  * move to XO clock during their clock disable so using
191  * clk_rcg2_shared_ops for such RCGs. This is required
192  * to power down the camera memories gracefully.
193  * Also, use CLK_SET_RATE_PARENT flag for the RCGs which
194  * have CAM_CC_PLL2_OUT_EVEN PLL as parent in frequency
195  * table and requires reconfiguration of the PLL frequency.
196  */
197 static struct clk_rcg2 cam_cc_bps_clk_src = {
198 	.cmd_rcgr = 0x600c,
199 	.mnd_width = 0,
200 	.hid_width = 5,
201 	.parent_map = cam_cc_parent_map_0,
202 	.freq_tbl = ftbl_cam_cc_bps_clk_src,
203 	.clkr.hw.init = &(struct clk_init_data){
204 		.name = "cam_cc_bps_clk_src",
205 		.parent_data = cam_cc_parent_data_0,
206 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
207 		.flags = CLK_SET_RATE_PARENT,
208 		.ops = &clk_rcg2_shared_ops,
209 	},
210 };
211 
212 static const struct freq_tbl ftbl_cam_cc_cci_clk_src[] = {
213 	F(19200000, P_BI_TCXO, 1, 0, 0),
214 	F(37500000, P_CAM_CC_PLL0_OUT_EVEN, 16, 0, 0),
215 	F(50000000, P_CAM_CC_PLL0_OUT_EVEN, 12, 0, 0),
216 	F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
217 	{ }
218 };
219 
220 static struct clk_rcg2 cam_cc_cci_clk_src = {
221 	.cmd_rcgr = 0xb0d8,
222 	.mnd_width = 8,
223 	.hid_width = 5,
224 	.parent_map = cam_cc_parent_map_0,
225 	.freq_tbl = ftbl_cam_cc_cci_clk_src,
226 	.clkr.hw.init = &(struct clk_init_data){
227 		.name = "cam_cc_cci_clk_src",
228 		.parent_data = cam_cc_parent_data_0,
229 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
230 		.ops = &clk_rcg2_ops,
231 	},
232 };
233 
234 static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = {
235 	F(19200000, P_BI_TCXO, 1, 0, 0),
236 	F(384000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
237 	{ }
238 };
239 
240 static struct clk_rcg2 cam_cc_cphy_rx_clk_src = {
241 	.cmd_rcgr = 0x9060,
242 	.mnd_width = 0,
243 	.hid_width = 5,
244 	.parent_map = cam_cc_parent_map_0,
245 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
246 	.clkr.hw.init = &(struct clk_init_data){
247 		.name = "cam_cc_cphy_rx_clk_src",
248 		.parent_data = cam_cc_parent_data_0,
249 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
250 		.ops = &clk_rcg2_ops,
251 	},
252 };
253 
254 static const struct freq_tbl ftbl_cam_cc_csi0phytimer_clk_src[] = {
255 	F(19200000, P_BI_TCXO, 1, 0, 0),
256 	F(240000000, P_CAM_CC_PLL2_OUT_EVEN, 2, 0, 0),
257 	F(269333333, P_CAM_CC_PLL1_OUT_EVEN, 3, 0, 0),
258 	{ }
259 };
260 
261 static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
262 	.cmd_rcgr = 0x5004,
263 	.mnd_width = 0,
264 	.hid_width = 5,
265 	.parent_map = cam_cc_parent_map_0,
266 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
267 	.clkr.hw.init = &(struct clk_init_data){
268 		.name = "cam_cc_csi0phytimer_clk_src",
269 		.parent_data = cam_cc_parent_data_0,
270 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
271 		.flags = CLK_SET_RATE_PARENT,
272 		.ops = &clk_rcg2_ops,
273 	},
274 };
275 
276 static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
277 	.cmd_rcgr = 0x5028,
278 	.mnd_width = 0,
279 	.hid_width = 5,
280 	.parent_map = cam_cc_parent_map_0,
281 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
282 	.clkr.hw.init = &(struct clk_init_data){
283 		.name = "cam_cc_csi1phytimer_clk_src",
284 		.parent_data = cam_cc_parent_data_0,
285 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
286 		.flags = CLK_SET_RATE_PARENT,
287 		.ops = &clk_rcg2_ops,
288 	},
289 };
290 
291 static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = {
292 	.cmd_rcgr = 0x504c,
293 	.mnd_width = 0,
294 	.hid_width = 5,
295 	.parent_map = cam_cc_parent_map_0,
296 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
297 	.clkr.hw.init = &(struct clk_init_data){
298 		.name = "cam_cc_csi2phytimer_clk_src",
299 		.parent_data = cam_cc_parent_data_0,
300 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
301 		.flags = CLK_SET_RATE_PARENT,
302 		.ops = &clk_rcg2_ops,
303 	},
304 };
305 
306 static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = {
307 	.cmd_rcgr = 0x5070,
308 	.mnd_width = 0,
309 	.hid_width = 5,
310 	.parent_map = cam_cc_parent_map_0,
311 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
312 	.clkr.hw.init = &(struct clk_init_data){
313 		.name = "cam_cc_csi3phytimer_clk_src",
314 		.parent_data = cam_cc_parent_data_0,
315 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
316 		.flags = CLK_SET_RATE_PARENT,
317 		.ops = &clk_rcg2_ops,
318 	},
319 };
320 
321 static const struct freq_tbl ftbl_cam_cc_fast_ahb_clk_src[] = {
322 	F(19200000, P_BI_TCXO, 1, 0, 0),
323 	F(50000000, P_CAM_CC_PLL0_OUT_EVEN, 12, 0, 0),
324 	F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
325 	F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
326 	F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
327 	F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0),
328 	{ }
329 };
330 
331 static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
332 	.cmd_rcgr = 0x6038,
333 	.mnd_width = 0,
334 	.hid_width = 5,
335 	.parent_map = cam_cc_parent_map_0,
336 	.freq_tbl = ftbl_cam_cc_fast_ahb_clk_src,
337 	.clkr.hw.init = &(struct clk_init_data){
338 		.name = "cam_cc_fast_ahb_clk_src",
339 		.parent_data = cam_cc_parent_data_0,
340 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
341 		.ops = &clk_rcg2_ops,
342 	},
343 };
344 
345 static const struct freq_tbl ftbl_cam_cc_fd_core_clk_src[] = {
346 	F(19200000, P_BI_TCXO, 1, 0, 0),
347 	F(384000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
348 	F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0),
349 	F(538666667, P_CAM_CC_PLL1_OUT_EVEN, 1.5, 0, 0),
350 	F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
351 	{ }
352 };
353 
354 static struct clk_rcg2 cam_cc_fd_core_clk_src = {
355 	.cmd_rcgr = 0xb0b0,
356 	.mnd_width = 0,
357 	.hid_width = 5,
358 	.parent_map = cam_cc_parent_map_0,
359 	.freq_tbl = ftbl_cam_cc_fd_core_clk_src,
360 	.clkr.hw.init = &(struct clk_init_data){
361 		.name = "cam_cc_fd_core_clk_src",
362 		.parent_data = cam_cc_parent_data_0,
363 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
364 		.ops = &clk_rcg2_shared_ops,
365 	},
366 };
367 
368 static const struct freq_tbl ftbl_cam_cc_icp_clk_src[] = {
369 	F(19200000, P_BI_TCXO, 1, 0, 0),
370 	F(384000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
371 	F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0),
372 	F(538666667, P_CAM_CC_PLL1_OUT_EVEN, 1.5, 0, 0),
373 	F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
374 	{ }
375 };
376 
377 static struct clk_rcg2 cam_cc_icp_clk_src = {
378 	.cmd_rcgr = 0xb088,
379 	.mnd_width = 0,
380 	.hid_width = 5,
381 	.parent_map = cam_cc_parent_map_0,
382 	.freq_tbl = ftbl_cam_cc_icp_clk_src,
383 	.clkr.hw.init = &(struct clk_init_data){
384 		.name = "cam_cc_icp_clk_src",
385 		.parent_data = cam_cc_parent_data_0,
386 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
387 		.ops = &clk_rcg2_shared_ops,
388 	},
389 };
390 
391 static const struct freq_tbl ftbl_cam_cc_ife_0_clk_src[] = {
392 	F(19200000, P_BI_TCXO, 1, 0, 0),
393 	F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
394 	F(320000000, P_CAM_CC_PLL2_OUT_EVEN, 1.5, 0, 0),
395 	F(404000000, P_CAM_CC_PLL1_OUT_EVEN, 2, 0, 0),
396 	F(480000000, P_CAM_CC_PLL2_OUT_EVEN, 1, 0, 0),
397 	F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
398 	{ }
399 };
400 
401 static struct clk_rcg2 cam_cc_ife_0_clk_src = {
402 	.cmd_rcgr = 0x900c,
403 	.mnd_width = 0,
404 	.hid_width = 5,
405 	.parent_map = cam_cc_parent_map_0,
406 	.freq_tbl = ftbl_cam_cc_ife_0_clk_src,
407 	.clkr.hw.init = &(struct clk_init_data){
408 		.name = "cam_cc_ife_0_clk_src",
409 		.parent_data = cam_cc_parent_data_0,
410 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
411 		.flags = CLK_SET_RATE_PARENT,
412 		.ops = &clk_rcg2_shared_ops,
413 	},
414 };
415 
416 static const struct freq_tbl ftbl_cam_cc_ife_0_csid_clk_src[] = {
417 	F(19200000, P_BI_TCXO, 1, 0, 0),
418 	F(75000000, P_CAM_CC_PLL0_OUT_EVEN, 8, 0, 0),
419 	F(384000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
420 	F(538666667, P_CAM_CC_PLL1_OUT_EVEN, 1.5, 0, 0),
421 	{ }
422 };
423 
424 static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = {
425 	.cmd_rcgr = 0x9038,
426 	.mnd_width = 0,
427 	.hid_width = 5,
428 	.parent_map = cam_cc_parent_map_0,
429 	.freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
430 	.clkr.hw.init = &(struct clk_init_data){
431 		.name = "cam_cc_ife_0_csid_clk_src",
432 		.parent_data = cam_cc_parent_data_0,
433 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
434 		.ops = &clk_rcg2_shared_ops,
435 	},
436 };
437 
438 static struct clk_rcg2 cam_cc_ife_1_clk_src = {
439 	.cmd_rcgr = 0xa00c,
440 	.mnd_width = 0,
441 	.hid_width = 5,
442 	.parent_map = cam_cc_parent_map_0,
443 	.freq_tbl = ftbl_cam_cc_ife_0_clk_src,
444 	.clkr.hw.init = &(struct clk_init_data){
445 		.name = "cam_cc_ife_1_clk_src",
446 		.parent_data = cam_cc_parent_data_0,
447 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
448 		.flags = CLK_SET_RATE_PARENT,
449 		.ops = &clk_rcg2_shared_ops,
450 	},
451 };
452 
453 static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = {
454 	.cmd_rcgr = 0xa030,
455 	.mnd_width = 0,
456 	.hid_width = 5,
457 	.parent_map = cam_cc_parent_map_0,
458 	.freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
459 	.clkr.hw.init = &(struct clk_init_data){
460 		.name = "cam_cc_ife_1_csid_clk_src",
461 		.parent_data = cam_cc_parent_data_0,
462 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
463 		.ops = &clk_rcg2_shared_ops,
464 	},
465 };
466 
467 static struct clk_rcg2 cam_cc_ife_lite_clk_src = {
468 	.cmd_rcgr = 0xb004,
469 	.mnd_width = 0,
470 	.hid_width = 5,
471 	.parent_map = cam_cc_parent_map_0,
472 	.freq_tbl = ftbl_cam_cc_ife_0_clk_src,
473 	.clkr.hw.init = &(struct clk_init_data){
474 		.name = "cam_cc_ife_lite_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_ife_lite_csid_clk_src = {
483 	.cmd_rcgr = 0xb024,
484 	.mnd_width = 0,
485 	.hid_width = 5,
486 	.parent_map = cam_cc_parent_map_0,
487 	.freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
488 	.clkr.hw.init = &(struct clk_init_data){
489 		.name = "cam_cc_ife_lite_csid_clk_src",
490 		.parent_data = cam_cc_parent_data_0,
491 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
492 		.ops = &clk_rcg2_shared_ops,
493 	},
494 };
495 
496 static const struct freq_tbl ftbl_cam_cc_ipe_0_clk_src[] = {
497 	F(19200000, P_BI_TCXO, 1, 0, 0),
498 	F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
499 	F(240000000, P_CAM_CC_PLL0_OUT_EVEN, 2.5, 0, 0),
500 	F(404000000, P_CAM_CC_PLL1_OUT_EVEN, 2, 0, 0),
501 	F(480000000, P_CAM_CC_PLL2_OUT_EVEN, 1, 0, 0),
502 	F(538666667, P_CAM_CC_PLL1_OUT_EVEN, 1.5, 0, 0),
503 	F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
504 	{ }
505 };
506 
507 static struct clk_rcg2 cam_cc_ipe_0_clk_src = {
508 	.cmd_rcgr = 0x700c,
509 	.mnd_width = 0,
510 	.hid_width = 5,
511 	.parent_map = cam_cc_parent_map_0,
512 	.freq_tbl = ftbl_cam_cc_ipe_0_clk_src,
513 	.clkr.hw.init = &(struct clk_init_data){
514 		.name = "cam_cc_ipe_0_clk_src",
515 		.parent_data = cam_cc_parent_data_0,
516 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
517 		.flags = CLK_SET_RATE_PARENT,
518 		.ops = &clk_rcg2_shared_ops,
519 	},
520 };
521 
522 static struct clk_rcg2 cam_cc_ipe_1_clk_src = {
523 	.cmd_rcgr = 0x800c,
524 	.mnd_width = 0,
525 	.hid_width = 5,
526 	.parent_map = cam_cc_parent_map_0,
527 	.freq_tbl = ftbl_cam_cc_ipe_0_clk_src,
528 	.clkr.hw.init = &(struct clk_init_data){
529 		.name = "cam_cc_ipe_1_clk_src",
530 		.parent_data = cam_cc_parent_data_0,
531 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
532 		.flags = CLK_SET_RATE_PARENT,
533 		.ops = &clk_rcg2_shared_ops,
534 	},
535 };
536 
537 static struct clk_rcg2 cam_cc_jpeg_clk_src = {
538 	.cmd_rcgr = 0xb04c,
539 	.mnd_width = 0,
540 	.hid_width = 5,
541 	.parent_map = cam_cc_parent_map_0,
542 	.freq_tbl = ftbl_cam_cc_bps_clk_src,
543 	.clkr.hw.init = &(struct clk_init_data){
544 		.name = "cam_cc_jpeg_clk_src",
545 		.parent_data = cam_cc_parent_data_0,
546 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
547 		.flags = CLK_SET_RATE_PARENT,
548 		.ops = &clk_rcg2_shared_ops,
549 	},
550 };
551 
552 static const struct freq_tbl ftbl_cam_cc_lrme_clk_src[] = {
553 	F(19200000, P_BI_TCXO, 1, 0, 0),
554 	F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
555 	F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
556 	F(269333333, P_CAM_CC_PLL1_OUT_EVEN, 3, 0, 0),
557 	F(320000000, P_CAM_CC_PLL2_OUT_EVEN, 1.5, 0, 0),
558 	F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0),
559 	{ }
560 };
561 
562 static struct clk_rcg2 cam_cc_lrme_clk_src = {
563 	.cmd_rcgr = 0xb0f8,
564 	.mnd_width = 0,
565 	.hid_width = 5,
566 	.parent_map = cam_cc_parent_map_0,
567 	.freq_tbl = ftbl_cam_cc_lrme_clk_src,
568 	.clkr.hw.init = &(struct clk_init_data){
569 		.name = "cam_cc_lrme_clk_src",
570 		.parent_data = cam_cc_parent_data_0,
571 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
572 		.flags = CLK_SET_RATE_PARENT,
573 		.ops = &clk_rcg2_shared_ops,
574 	},
575 };
576 
577 static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = {
578 	F(19200000, P_BI_TCXO, 1, 0, 0),
579 	F(24000000, P_CAM_CC_PLL2_OUT_EVEN, 10, 1, 2),
580 	F(33333333, P_CAM_CC_PLL0_OUT_EVEN, 2, 1, 9),
581 	F(34285714, P_CAM_CC_PLL2_OUT_EVEN, 14, 0, 0),
582 	{ }
583 };
584 
585 static struct clk_rcg2 cam_cc_mclk0_clk_src = {
586 	.cmd_rcgr = 0x4004,
587 	.mnd_width = 8,
588 	.hid_width = 5,
589 	.parent_map = cam_cc_parent_map_0,
590 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
591 	.clkr.hw.init = &(struct clk_init_data){
592 		.name = "cam_cc_mclk0_clk_src",
593 		.parent_data = cam_cc_parent_data_0,
594 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
595 		.flags = CLK_SET_RATE_PARENT,
596 		.ops = &clk_rcg2_ops,
597 	},
598 };
599 
600 static struct clk_rcg2 cam_cc_mclk1_clk_src = {
601 	.cmd_rcgr = 0x4024,
602 	.mnd_width = 8,
603 	.hid_width = 5,
604 	.parent_map = cam_cc_parent_map_0,
605 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
606 	.clkr.hw.init = &(struct clk_init_data){
607 		.name = "cam_cc_mclk1_clk_src",
608 		.parent_data = cam_cc_parent_data_0,
609 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
610 		.flags = CLK_SET_RATE_PARENT,
611 		.ops = &clk_rcg2_ops,
612 	},
613 };
614 
615 static struct clk_rcg2 cam_cc_mclk2_clk_src = {
616 	.cmd_rcgr = 0x4044,
617 	.mnd_width = 8,
618 	.hid_width = 5,
619 	.parent_map = cam_cc_parent_map_0,
620 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
621 	.clkr.hw.init = &(struct clk_init_data){
622 		.name = "cam_cc_mclk2_clk_src",
623 		.parent_data = cam_cc_parent_data_0,
624 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
625 		.flags = CLK_SET_RATE_PARENT,
626 		.ops = &clk_rcg2_ops,
627 	},
628 };
629 
630 static struct clk_rcg2 cam_cc_mclk3_clk_src = {
631 	.cmd_rcgr = 0x4064,
632 	.mnd_width = 8,
633 	.hid_width = 5,
634 	.parent_map = cam_cc_parent_map_0,
635 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
636 	.clkr.hw.init = &(struct clk_init_data){
637 		.name = "cam_cc_mclk3_clk_src",
638 		.parent_data = cam_cc_parent_data_0,
639 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
640 		.flags = CLK_SET_RATE_PARENT,
641 		.ops = &clk_rcg2_ops,
642 	},
643 };
644 
645 static const struct freq_tbl ftbl_cam_cc_slow_ahb_clk_src[] = {
646 	F(19200000, P_BI_TCXO, 1, 0, 0),
647 	F(60000000, P_CAM_CC_PLL0_OUT_EVEN, 10, 0, 0),
648 	F(66666667, P_CAM_CC_PLL0_OUT_EVEN, 9, 0, 0),
649 	F(73846154, P_CAM_CC_PLL2_OUT_EVEN, 6.5, 0, 0),
650 	F(80000000, P_CAM_CC_PLL2_OUT_EVEN, 6, 0, 0),
651 	{ }
652 };
653 
654 static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
655 	.cmd_rcgr = 0x6054,
656 	.mnd_width = 0,
657 	.hid_width = 5,
658 	.parent_map = cam_cc_parent_map_0,
659 	.freq_tbl = ftbl_cam_cc_slow_ahb_clk_src,
660 	.clkr.hw.init = &(struct clk_init_data){
661 		.name = "cam_cc_slow_ahb_clk_src",
662 		.parent_data = cam_cc_parent_data_0,
663 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
664 		.flags = CLK_SET_RATE_PARENT,
665 		.ops = &clk_rcg2_ops,
666 	},
667 };
668 
669 static struct clk_branch cam_cc_bps_ahb_clk = {
670 	.halt_reg = 0x606c,
671 	.halt_check = BRANCH_HALT,
672 	.clkr = {
673 		.enable_reg = 0x606c,
674 		.enable_mask = BIT(0),
675 		.hw.init = &(struct clk_init_data){
676 			.name = "cam_cc_bps_ahb_clk",
677 			.parent_hws = (const struct clk_hw*[]){
678 				&cam_cc_slow_ahb_clk_src.clkr.hw,
679 			},
680 			.num_parents = 1,
681 			.flags = CLK_SET_RATE_PARENT,
682 			.ops = &clk_branch2_ops,
683 		},
684 	},
685 };
686 
687 static struct clk_branch cam_cc_bps_areg_clk = {
688 	.halt_reg = 0x6050,
689 	.halt_check = BRANCH_HALT,
690 	.clkr = {
691 		.enable_reg = 0x6050,
692 		.enable_mask = BIT(0),
693 		.hw.init = &(struct clk_init_data){
694 			.name = "cam_cc_bps_areg_clk",
695 			.parent_hws = (const struct clk_hw*[]){
696 				&cam_cc_fast_ahb_clk_src.clkr.hw,
697 			},
698 			.num_parents = 1,
699 			.flags = CLK_SET_RATE_PARENT,
700 			.ops = &clk_branch2_ops,
701 		},
702 	},
703 };
704 
705 static struct clk_branch cam_cc_bps_axi_clk = {
706 	.halt_reg = 0x6034,
707 	.halt_check = BRANCH_HALT,
708 	.clkr = {
709 		.enable_reg = 0x6034,
710 		.enable_mask = BIT(0),
711 		.hw.init = &(struct clk_init_data){
712 			.name = "cam_cc_bps_axi_clk",
713 			.ops = &clk_branch2_ops,
714 		},
715 	},
716 };
717 
718 static struct clk_branch cam_cc_bps_clk = {
719 	.halt_reg = 0x6024,
720 	.halt_check = BRANCH_HALT,
721 	.clkr = {
722 		.enable_reg = 0x6024,
723 		.enable_mask = BIT(0),
724 		.hw.init = &(struct clk_init_data){
725 			.name = "cam_cc_bps_clk",
726 			.parent_hws = (const struct clk_hw*[]){
727 				&cam_cc_bps_clk_src.clkr.hw,
728 			},
729 			.num_parents = 1,
730 			.flags = CLK_SET_RATE_PARENT,
731 			.ops = &clk_branch2_ops,
732 		},
733 	},
734 };
735 
736 static struct clk_branch cam_cc_camnoc_atb_clk = {
737 	.halt_reg = 0xb12c,
738 	.halt_check = BRANCH_HALT,
739 	.clkr = {
740 		.enable_reg = 0xb12c,
741 		.enable_mask = BIT(0),
742 		.hw.init = &(struct clk_init_data){
743 			.name = "cam_cc_camnoc_atb_clk",
744 			.ops = &clk_branch2_ops,
745 		},
746 	},
747 };
748 
749 static struct clk_branch cam_cc_camnoc_axi_clk = {
750 	.halt_reg = 0xb124,
751 	.halt_check = BRANCH_HALT,
752 	.clkr = {
753 		.enable_reg = 0xb124,
754 		.enable_mask = BIT(0),
755 		.hw.init = &(struct clk_init_data){
756 			.name = "cam_cc_camnoc_axi_clk",
757 			.ops = &clk_branch2_ops,
758 		},
759 	},
760 };
761 
762 static struct clk_branch cam_cc_cci_clk = {
763 	.halt_reg = 0xb0f0,
764 	.halt_check = BRANCH_HALT,
765 	.clkr = {
766 		.enable_reg = 0xb0f0,
767 		.enable_mask = BIT(0),
768 		.hw.init = &(struct clk_init_data){
769 			.name = "cam_cc_cci_clk",
770 			.parent_hws = (const struct clk_hw*[]){
771 				&cam_cc_cci_clk_src.clkr.hw,
772 			},
773 			.num_parents = 1,
774 			.flags = CLK_SET_RATE_PARENT,
775 			.ops = &clk_branch2_ops,
776 		},
777 	},
778 };
779 
780 static struct clk_branch cam_cc_cpas_ahb_clk = {
781 	.halt_reg = 0xb11c,
782 	.halt_check = BRANCH_HALT,
783 	.clkr = {
784 		.enable_reg = 0xb11c,
785 		.enable_mask = BIT(0),
786 		.hw.init = &(struct clk_init_data){
787 			.name = "cam_cc_cpas_ahb_clk",
788 			.parent_hws = (const struct clk_hw*[]){
789 				&cam_cc_slow_ahb_clk_src.clkr.hw,
790 			},
791 			.num_parents = 1,
792 			.flags = CLK_SET_RATE_PARENT,
793 			.ops = &clk_branch2_ops,
794 		},
795 	},
796 };
797 
798 static struct clk_branch cam_cc_csi0phytimer_clk = {
799 	.halt_reg = 0x501c,
800 	.halt_check = BRANCH_HALT,
801 	.clkr = {
802 		.enable_reg = 0x501c,
803 		.enable_mask = BIT(0),
804 		.hw.init = &(struct clk_init_data){
805 			.name = "cam_cc_csi0phytimer_clk",
806 			.parent_hws = (const struct clk_hw*[]){
807 				&cam_cc_csi0phytimer_clk_src.clkr.hw,
808 			},
809 			.num_parents = 1,
810 			.flags = CLK_SET_RATE_PARENT,
811 			.ops = &clk_branch2_ops,
812 		},
813 	},
814 };
815 
816 static struct clk_branch cam_cc_csi1phytimer_clk = {
817 	.halt_reg = 0x5040,
818 	.halt_check = BRANCH_HALT,
819 	.clkr = {
820 		.enable_reg = 0x5040,
821 		.enable_mask = BIT(0),
822 		.hw.init = &(struct clk_init_data){
823 			.name = "cam_cc_csi1phytimer_clk",
824 			.parent_hws = (const struct clk_hw*[]){
825 				&cam_cc_csi1phytimer_clk_src.clkr.hw,
826 			},
827 			.num_parents = 1,
828 			.flags = CLK_SET_RATE_PARENT,
829 			.ops = &clk_branch2_ops,
830 		},
831 	},
832 };
833 
834 static struct clk_branch cam_cc_csi2phytimer_clk = {
835 	.halt_reg = 0x5064,
836 	.halt_check = BRANCH_HALT,
837 	.clkr = {
838 		.enable_reg = 0x5064,
839 		.enable_mask = BIT(0),
840 		.hw.init = &(struct clk_init_data){
841 			.name = "cam_cc_csi2phytimer_clk",
842 			.parent_hws = (const struct clk_hw*[]){
843 				&cam_cc_csi2phytimer_clk_src.clkr.hw,
844 			},
845 			.num_parents = 1,
846 			.flags = CLK_SET_RATE_PARENT,
847 			.ops = &clk_branch2_ops,
848 		},
849 	},
850 };
851 
852 static struct clk_branch cam_cc_csi3phytimer_clk = {
853 	.halt_reg = 0x5088,
854 	.halt_check = BRANCH_HALT,
855 	.clkr = {
856 		.enable_reg = 0x5088,
857 		.enable_mask = BIT(0),
858 		.hw.init = &(struct clk_init_data){
859 			.name = "cam_cc_csi3phytimer_clk",
860 			.parent_hws = (const struct clk_hw*[]){
861 				&cam_cc_csi3phytimer_clk_src.clkr.hw,
862 			},
863 			.num_parents = 1,
864 			.flags = CLK_SET_RATE_PARENT,
865 			.ops = &clk_branch2_ops,
866 		},
867 	},
868 };
869 
870 static struct clk_branch cam_cc_csiphy0_clk = {
871 	.halt_reg = 0x5020,
872 	.halt_check = BRANCH_HALT,
873 	.clkr = {
874 		.enable_reg = 0x5020,
875 		.enable_mask = BIT(0),
876 		.hw.init = &(struct clk_init_data){
877 			.name = "cam_cc_csiphy0_clk",
878 			.parent_hws = (const struct clk_hw*[]){
879 				&cam_cc_cphy_rx_clk_src.clkr.hw,
880 			},
881 			.num_parents = 1,
882 			.flags = CLK_SET_RATE_PARENT,
883 			.ops = &clk_branch2_ops,
884 		},
885 	},
886 };
887 
888 static struct clk_branch cam_cc_csiphy1_clk = {
889 	.halt_reg = 0x5044,
890 	.halt_check = BRANCH_HALT,
891 	.clkr = {
892 		.enable_reg = 0x5044,
893 		.enable_mask = BIT(0),
894 		.hw.init = &(struct clk_init_data){
895 			.name = "cam_cc_csiphy1_clk",
896 			.parent_hws = (const struct clk_hw*[]){
897 				&cam_cc_cphy_rx_clk_src.clkr.hw,
898 			},
899 			.num_parents = 1,
900 			.flags = CLK_SET_RATE_PARENT,
901 			.ops = &clk_branch2_ops,
902 		},
903 	},
904 };
905 
906 static struct clk_branch cam_cc_csiphy2_clk = {
907 	.halt_reg = 0x5068,
908 	.halt_check = BRANCH_HALT,
909 	.clkr = {
910 		.enable_reg = 0x5068,
911 		.enable_mask = BIT(0),
912 		.hw.init = &(struct clk_init_data){
913 			.name = "cam_cc_csiphy2_clk",
914 			.parent_hws = (const struct clk_hw*[]){
915 				&cam_cc_cphy_rx_clk_src.clkr.hw,
916 			},
917 			.num_parents = 1,
918 			.flags = CLK_SET_RATE_PARENT,
919 			.ops = &clk_branch2_ops,
920 		},
921 	},
922 };
923 
924 static struct clk_branch cam_cc_csiphy3_clk = {
925 	.halt_reg = 0x508c,
926 	.halt_check = BRANCH_HALT,
927 	.clkr = {
928 		.enable_reg = 0x508c,
929 		.enable_mask = BIT(0),
930 		.hw.init = &(struct clk_init_data){
931 			.name = "cam_cc_csiphy3_clk",
932 			.parent_hws = (const struct clk_hw*[]){
933 				&cam_cc_cphy_rx_clk_src.clkr.hw,
934 			},
935 			.num_parents = 1,
936 			.flags = CLK_SET_RATE_PARENT,
937 			.ops = &clk_branch2_ops,
938 		},
939 	},
940 };
941 
942 static struct clk_branch cam_cc_fd_core_clk = {
943 	.halt_reg = 0xb0c8,
944 	.halt_check = BRANCH_HALT,
945 	.clkr = {
946 		.enable_reg = 0xb0c8,
947 		.enable_mask = BIT(0),
948 		.hw.init = &(struct clk_init_data){
949 			.name = "cam_cc_fd_core_clk",
950 			.parent_hws = (const struct clk_hw*[]){
951 				&cam_cc_fd_core_clk_src.clkr.hw,
952 			},
953 			.num_parents = 1,
954 			.flags = CLK_SET_RATE_PARENT,
955 			.ops = &clk_branch2_ops,
956 		},
957 	},
958 };
959 
960 static struct clk_branch cam_cc_fd_core_uar_clk = {
961 	.halt_reg = 0xb0d0,
962 	.halt_check = BRANCH_HALT,
963 	.clkr = {
964 		.enable_reg = 0xb0d0,
965 		.enable_mask = BIT(0),
966 		.hw.init = &(struct clk_init_data){
967 			.name = "cam_cc_fd_core_uar_clk",
968 			.parent_hws = (const struct clk_hw*[]){
969 				&cam_cc_fd_core_clk_src.clkr.hw,
970 			},
971 			.num_parents = 1,
972 			.ops = &clk_branch2_ops,
973 		},
974 	},
975 };
976 
977 static struct clk_branch cam_cc_icp_apb_clk = {
978 	.halt_reg = 0xb084,
979 	.halt_check = BRANCH_HALT,
980 	.clkr = {
981 		.enable_reg = 0xb084,
982 		.enable_mask = BIT(0),
983 		.hw.init = &(struct clk_init_data){
984 			.name = "cam_cc_icp_apb_clk",
985 			.ops = &clk_branch2_ops,
986 		},
987 	},
988 };
989 
990 static struct clk_branch cam_cc_icp_atb_clk = {
991 	.halt_reg = 0xb078,
992 	.halt_check = BRANCH_HALT,
993 	.clkr = {
994 		.enable_reg = 0xb078,
995 		.enable_mask = BIT(0),
996 		.hw.init = &(struct clk_init_data){
997 			.name = "cam_cc_icp_atb_clk",
998 			.ops = &clk_branch2_ops,
999 		},
1000 	},
1001 };
1002 
1003 static struct clk_branch cam_cc_icp_clk = {
1004 	.halt_reg = 0xb0a0,
1005 	.halt_check = BRANCH_HALT,
1006 	.clkr = {
1007 		.enable_reg = 0xb0a0,
1008 		.enable_mask = BIT(0),
1009 		.hw.init = &(struct clk_init_data){
1010 			.name = "cam_cc_icp_clk",
1011 			.parent_hws = (const struct clk_hw*[]){
1012 				&cam_cc_icp_clk_src.clkr.hw,
1013 			},
1014 			.num_parents = 1,
1015 			.flags = CLK_SET_RATE_PARENT,
1016 			.ops = &clk_branch2_ops,
1017 		},
1018 	},
1019 };
1020 
1021 static struct clk_branch cam_cc_icp_cti_clk = {
1022 	.halt_reg = 0xb07c,
1023 	.halt_check = BRANCH_HALT,
1024 	.clkr = {
1025 		.enable_reg = 0xb07c,
1026 		.enable_mask = BIT(0),
1027 		.hw.init = &(struct clk_init_data){
1028 			.name = "cam_cc_icp_cti_clk",
1029 			.ops = &clk_branch2_ops,
1030 		},
1031 	},
1032 };
1033 
1034 static struct clk_branch cam_cc_icp_ts_clk = {
1035 	.halt_reg = 0xb080,
1036 	.halt_check = BRANCH_HALT,
1037 	.clkr = {
1038 		.enable_reg = 0xb080,
1039 		.enable_mask = BIT(0),
1040 		.hw.init = &(struct clk_init_data){
1041 			.name = "cam_cc_icp_ts_clk",
1042 			.ops = &clk_branch2_ops,
1043 		},
1044 	},
1045 };
1046 
1047 static struct clk_branch cam_cc_ife_0_axi_clk = {
1048 	.halt_reg = 0x907c,
1049 	.halt_check = BRANCH_HALT,
1050 	.clkr = {
1051 		.enable_reg = 0x907c,
1052 		.enable_mask = BIT(0),
1053 		.hw.init = &(struct clk_init_data){
1054 			.name = "cam_cc_ife_0_axi_clk",
1055 			.ops = &clk_branch2_ops,
1056 		},
1057 	},
1058 };
1059 
1060 static struct clk_branch cam_cc_ife_0_clk = {
1061 	.halt_reg = 0x9024,
1062 	.halt_check = BRANCH_HALT,
1063 	.clkr = {
1064 		.enable_reg = 0x9024,
1065 		.enable_mask = BIT(0),
1066 		.hw.init = &(struct clk_init_data){
1067 			.name = "cam_cc_ife_0_clk",
1068 			.parent_hws = (const struct clk_hw*[]){
1069 				&cam_cc_ife_0_clk_src.clkr.hw,
1070 			},
1071 			.num_parents = 1,
1072 			.flags = CLK_SET_RATE_PARENT,
1073 			.ops = &clk_branch2_ops,
1074 		},
1075 	},
1076 };
1077 
1078 static struct clk_branch cam_cc_ife_0_cphy_rx_clk = {
1079 	.halt_reg = 0x9078,
1080 	.halt_check = BRANCH_HALT,
1081 	.clkr = {
1082 		.enable_reg = 0x9078,
1083 		.enable_mask = BIT(0),
1084 		.hw.init = &(struct clk_init_data){
1085 			.name = "cam_cc_ife_0_cphy_rx_clk",
1086 			.parent_hws = (const struct clk_hw*[]){
1087 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1088 			},
1089 			.num_parents = 1,
1090 			.flags = CLK_SET_RATE_PARENT,
1091 			.ops = &clk_branch2_ops,
1092 		},
1093 	},
1094 };
1095 
1096 static struct clk_branch cam_cc_ife_0_csid_clk = {
1097 	.halt_reg = 0x9050,
1098 	.halt_check = BRANCH_HALT,
1099 	.clkr = {
1100 		.enable_reg = 0x9050,
1101 		.enable_mask = BIT(0),
1102 		.hw.init = &(struct clk_init_data){
1103 			.name = "cam_cc_ife_0_csid_clk",
1104 			.parent_hws = (const struct clk_hw*[]){
1105 				&cam_cc_ife_0_csid_clk_src.clkr.hw,
1106 			},
1107 			.num_parents = 1,
1108 			.flags = CLK_SET_RATE_PARENT,
1109 			.ops = &clk_branch2_ops,
1110 		},
1111 	},
1112 };
1113 
1114 static struct clk_branch cam_cc_ife_0_dsp_clk = {
1115 	.halt_reg = 0x9034,
1116 	.halt_check = BRANCH_HALT,
1117 	.clkr = {
1118 		.enable_reg = 0x9034,
1119 		.enable_mask = BIT(0),
1120 		.hw.init = &(struct clk_init_data){
1121 			.name = "cam_cc_ife_0_dsp_clk",
1122 			.parent_hws = (const struct clk_hw*[]){
1123 				&cam_cc_ife_0_clk_src.clkr.hw,
1124 			},
1125 			.num_parents = 1,
1126 			.ops = &clk_branch2_ops,
1127 		},
1128 	},
1129 };
1130 
1131 static struct clk_branch cam_cc_ife_1_axi_clk = {
1132 	.halt_reg = 0xa054,
1133 	.halt_check = BRANCH_HALT,
1134 	.clkr = {
1135 		.enable_reg = 0xa054,
1136 		.enable_mask = BIT(0),
1137 		.hw.init = &(struct clk_init_data){
1138 			.name = "cam_cc_ife_1_axi_clk",
1139 			.ops = &clk_branch2_ops,
1140 		},
1141 	},
1142 };
1143 
1144 static struct clk_branch cam_cc_ife_1_clk = {
1145 	.halt_reg = 0xa024,
1146 	.halt_check = BRANCH_HALT,
1147 	.clkr = {
1148 		.enable_reg = 0xa024,
1149 		.enable_mask = BIT(0),
1150 		.hw.init = &(struct clk_init_data){
1151 			.name = "cam_cc_ife_1_clk",
1152 			.parent_hws = (const struct clk_hw*[]){
1153 				&cam_cc_ife_1_clk_src.clkr.hw,
1154 			},
1155 			.num_parents = 1,
1156 			.flags = CLK_SET_RATE_PARENT,
1157 			.ops = &clk_branch2_ops,
1158 		},
1159 	},
1160 };
1161 
1162 static struct clk_branch cam_cc_ife_1_cphy_rx_clk = {
1163 	.halt_reg = 0xa050,
1164 	.halt_check = BRANCH_HALT,
1165 	.clkr = {
1166 		.enable_reg = 0xa050,
1167 		.enable_mask = BIT(0),
1168 		.hw.init = &(struct clk_init_data){
1169 			.name = "cam_cc_ife_1_cphy_rx_clk",
1170 			.parent_hws = (const struct clk_hw*[]){
1171 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1172 			},
1173 			.num_parents = 1,
1174 			.flags = CLK_SET_RATE_PARENT,
1175 			.ops = &clk_branch2_ops,
1176 		},
1177 	},
1178 };
1179 
1180 static struct clk_branch cam_cc_ife_1_csid_clk = {
1181 	.halt_reg = 0xa048,
1182 	.halt_check = BRANCH_HALT,
1183 	.clkr = {
1184 		.enable_reg = 0xa048,
1185 		.enable_mask = BIT(0),
1186 		.hw.init = &(struct clk_init_data){
1187 			.name = "cam_cc_ife_1_csid_clk",
1188 			.parent_hws = (const struct clk_hw*[]){
1189 				&cam_cc_ife_1_csid_clk_src.clkr.hw,
1190 			},
1191 			.num_parents = 1,
1192 			.flags = CLK_SET_RATE_PARENT,
1193 			.ops = &clk_branch2_ops,
1194 		},
1195 	},
1196 };
1197 
1198 static struct clk_branch cam_cc_ife_1_dsp_clk = {
1199 	.halt_reg = 0xa02c,
1200 	.halt_check = BRANCH_HALT,
1201 	.clkr = {
1202 		.enable_reg = 0xa02c,
1203 		.enable_mask = BIT(0),
1204 		.hw.init = &(struct clk_init_data){
1205 			.name = "cam_cc_ife_1_dsp_clk",
1206 			.parent_hws = (const struct clk_hw*[]){
1207 				&cam_cc_ife_1_clk_src.clkr.hw,
1208 			},
1209 			.num_parents = 1,
1210 			.ops = &clk_branch2_ops,
1211 		},
1212 	},
1213 };
1214 
1215 static struct clk_branch cam_cc_ife_lite_clk = {
1216 	.halt_reg = 0xb01c,
1217 	.halt_check = BRANCH_HALT,
1218 	.clkr = {
1219 		.enable_reg = 0xb01c,
1220 		.enable_mask = BIT(0),
1221 		.hw.init = &(struct clk_init_data){
1222 			.name = "cam_cc_ife_lite_clk",
1223 			.parent_hws = (const struct clk_hw*[]){
1224 				&cam_cc_ife_lite_clk_src.clkr.hw,
1225 			},
1226 			.num_parents = 1,
1227 			.flags = CLK_SET_RATE_PARENT,
1228 			.ops = &clk_branch2_ops,
1229 		},
1230 	},
1231 };
1232 
1233 static struct clk_branch cam_cc_ife_lite_cphy_rx_clk = {
1234 	.halt_reg = 0xb044,
1235 	.halt_check = BRANCH_HALT,
1236 	.clkr = {
1237 		.enable_reg = 0xb044,
1238 		.enable_mask = BIT(0),
1239 		.hw.init = &(struct clk_init_data){
1240 			.name = "cam_cc_ife_lite_cphy_rx_clk",
1241 			.parent_hws = (const struct clk_hw*[]){
1242 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1243 			},
1244 			.num_parents = 1,
1245 			.flags = CLK_SET_RATE_PARENT,
1246 			.ops = &clk_branch2_ops,
1247 		},
1248 	},
1249 };
1250 
1251 static struct clk_branch cam_cc_ife_lite_csid_clk = {
1252 	.halt_reg = 0xb03c,
1253 	.halt_check = BRANCH_HALT,
1254 	.clkr = {
1255 		.enable_reg = 0xb03c,
1256 		.enable_mask = BIT(0),
1257 		.hw.init = &(struct clk_init_data){
1258 			.name = "cam_cc_ife_lite_csid_clk",
1259 			.parent_hws = (const struct clk_hw*[]){
1260 				&cam_cc_ife_lite_csid_clk_src.clkr.hw,
1261 			},
1262 			.num_parents = 1,
1263 			.flags = CLK_SET_RATE_PARENT,
1264 			.ops = &clk_branch2_ops,
1265 		},
1266 	},
1267 };
1268 
1269 static struct clk_branch cam_cc_ipe_0_ahb_clk = {
1270 	.halt_reg = 0x703c,
1271 	.halt_check = BRANCH_HALT,
1272 	.clkr = {
1273 		.enable_reg = 0x703c,
1274 		.enable_mask = BIT(0),
1275 		.hw.init = &(struct clk_init_data){
1276 			.name = "cam_cc_ipe_0_ahb_clk",
1277 			.parent_hws = (const struct clk_hw*[]){
1278 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1279 			},
1280 			.num_parents = 1,
1281 			.flags = CLK_SET_RATE_PARENT,
1282 			.ops = &clk_branch2_ops,
1283 		},
1284 	},
1285 };
1286 
1287 static struct clk_branch cam_cc_ipe_0_areg_clk = {
1288 	.halt_reg = 0x7038,
1289 	.halt_check = BRANCH_HALT,
1290 	.clkr = {
1291 		.enable_reg = 0x7038,
1292 		.enable_mask = BIT(0),
1293 		.hw.init = &(struct clk_init_data){
1294 			.name = "cam_cc_ipe_0_areg_clk",
1295 			.parent_hws = (const struct clk_hw*[]){
1296 				&cam_cc_fast_ahb_clk_src.clkr.hw,
1297 			},
1298 			.num_parents = 1,
1299 			.flags = CLK_SET_RATE_PARENT,
1300 			.ops = &clk_branch2_ops,
1301 		},
1302 	},
1303 };
1304 
1305 static struct clk_branch cam_cc_ipe_0_axi_clk = {
1306 	.halt_reg = 0x7034,
1307 	.halt_check = BRANCH_HALT,
1308 	.clkr = {
1309 		.enable_reg = 0x7034,
1310 		.enable_mask = BIT(0),
1311 		.hw.init = &(struct clk_init_data){
1312 			.name = "cam_cc_ipe_0_axi_clk",
1313 			.ops = &clk_branch2_ops,
1314 		},
1315 	},
1316 };
1317 
1318 static struct clk_branch cam_cc_ipe_0_clk = {
1319 	.halt_reg = 0x7024,
1320 	.halt_check = BRANCH_HALT,
1321 	.clkr = {
1322 		.enable_reg = 0x7024,
1323 		.enable_mask = BIT(0),
1324 		.hw.init = &(struct clk_init_data){
1325 			.name = "cam_cc_ipe_0_clk",
1326 			.parent_hws = (const struct clk_hw*[]){
1327 				&cam_cc_ipe_0_clk_src.clkr.hw,
1328 			},
1329 			.num_parents = 1,
1330 			.flags = CLK_SET_RATE_PARENT,
1331 			.ops = &clk_branch2_ops,
1332 		},
1333 	},
1334 };
1335 
1336 static struct clk_branch cam_cc_ipe_1_ahb_clk = {
1337 	.halt_reg = 0x803c,
1338 	.halt_check = BRANCH_HALT,
1339 	.clkr = {
1340 		.enable_reg = 0x803c,
1341 		.enable_mask = BIT(0),
1342 		.hw.init = &(struct clk_init_data){
1343 			.name = "cam_cc_ipe_1_ahb_clk",
1344 			.parent_hws = (const struct clk_hw*[]){
1345 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1346 			},
1347 			.num_parents = 1,
1348 			.flags = CLK_SET_RATE_PARENT,
1349 			.ops = &clk_branch2_ops,
1350 		},
1351 	},
1352 };
1353 
1354 static struct clk_branch cam_cc_ipe_1_areg_clk = {
1355 	.halt_reg = 0x8038,
1356 	.halt_check = BRANCH_HALT,
1357 	.clkr = {
1358 		.enable_reg = 0x8038,
1359 		.enable_mask = BIT(0),
1360 		.hw.init = &(struct clk_init_data){
1361 			.name = "cam_cc_ipe_1_areg_clk",
1362 			.parent_hws = (const struct clk_hw*[]){
1363 				&cam_cc_fast_ahb_clk_src.clkr.hw,
1364 			},
1365 			.num_parents = 1,
1366 			.flags = CLK_SET_RATE_PARENT,
1367 			.ops = &clk_branch2_ops,
1368 		},
1369 	},
1370 };
1371 
1372 static struct clk_branch cam_cc_ipe_1_axi_clk = {
1373 	.halt_reg = 0x8034,
1374 	.halt_check = BRANCH_HALT,
1375 	.clkr = {
1376 		.enable_reg = 0x8034,
1377 		.enable_mask = BIT(0),
1378 		.hw.init = &(struct clk_init_data){
1379 			.name = "cam_cc_ipe_1_axi_clk",
1380 			.ops = &clk_branch2_ops,
1381 		},
1382 	},
1383 };
1384 
1385 static struct clk_branch cam_cc_ipe_1_clk = {
1386 	.halt_reg = 0x8024,
1387 	.halt_check = BRANCH_HALT,
1388 	.clkr = {
1389 		.enable_reg = 0x8024,
1390 		.enable_mask = BIT(0),
1391 		.hw.init = &(struct clk_init_data){
1392 			.name = "cam_cc_ipe_1_clk",
1393 			.parent_hws = (const struct clk_hw*[]){
1394 				&cam_cc_ipe_1_clk_src.clkr.hw,
1395 			},
1396 			.num_parents = 1,
1397 			.flags = CLK_SET_RATE_PARENT,
1398 			.ops = &clk_branch2_ops,
1399 		},
1400 	},
1401 };
1402 
1403 static struct clk_branch cam_cc_jpeg_clk = {
1404 	.halt_reg = 0xb064,
1405 	.halt_check = BRANCH_HALT,
1406 	.clkr = {
1407 		.enable_reg = 0xb064,
1408 		.enable_mask = BIT(0),
1409 		.hw.init = &(struct clk_init_data){
1410 			.name = "cam_cc_jpeg_clk",
1411 			.parent_hws = (const struct clk_hw*[]){
1412 				&cam_cc_jpeg_clk_src.clkr.hw,
1413 			},
1414 			.num_parents = 1,
1415 			.flags = CLK_SET_RATE_PARENT,
1416 			.ops = &clk_branch2_ops,
1417 		},
1418 	},
1419 };
1420 
1421 static struct clk_branch cam_cc_lrme_clk = {
1422 	.halt_reg = 0xb110,
1423 	.halt_check = BRANCH_HALT,
1424 	.clkr = {
1425 		.enable_reg = 0xb110,
1426 		.enable_mask = BIT(0),
1427 		.hw.init = &(struct clk_init_data){
1428 			.name = "cam_cc_lrme_clk",
1429 			.parent_hws = (const struct clk_hw*[]){
1430 				&cam_cc_lrme_clk_src.clkr.hw,
1431 			},
1432 			.num_parents = 1,
1433 			.flags = CLK_SET_RATE_PARENT,
1434 			.ops = &clk_branch2_ops,
1435 		},
1436 	},
1437 };
1438 
1439 static struct clk_branch cam_cc_mclk0_clk = {
1440 	.halt_reg = 0x401c,
1441 	.halt_check = BRANCH_HALT,
1442 	.clkr = {
1443 		.enable_reg = 0x401c,
1444 		.enable_mask = BIT(0),
1445 		.hw.init = &(struct clk_init_data){
1446 			.name = "cam_cc_mclk0_clk",
1447 			.parent_hws = (const struct clk_hw*[]){
1448 				&cam_cc_mclk0_clk_src.clkr.hw,
1449 			},
1450 			.num_parents = 1,
1451 			.flags = CLK_SET_RATE_PARENT,
1452 			.ops = &clk_branch2_ops,
1453 		},
1454 	},
1455 };
1456 
1457 static struct clk_branch cam_cc_mclk1_clk = {
1458 	.halt_reg = 0x403c,
1459 	.halt_check = BRANCH_HALT,
1460 	.clkr = {
1461 		.enable_reg = 0x403c,
1462 		.enable_mask = BIT(0),
1463 		.hw.init = &(struct clk_init_data){
1464 			.name = "cam_cc_mclk1_clk",
1465 			.parent_hws = (const struct clk_hw*[]){
1466 				&cam_cc_mclk1_clk_src.clkr.hw,
1467 			},
1468 			.num_parents = 1,
1469 			.flags = CLK_SET_RATE_PARENT,
1470 			.ops = &clk_branch2_ops,
1471 		},
1472 	},
1473 };
1474 
1475 static struct clk_branch cam_cc_mclk2_clk = {
1476 	.halt_reg = 0x405c,
1477 	.halt_check = BRANCH_HALT,
1478 	.clkr = {
1479 		.enable_reg = 0x405c,
1480 		.enable_mask = BIT(0),
1481 		.hw.init = &(struct clk_init_data){
1482 			.name = "cam_cc_mclk2_clk",
1483 			.parent_hws = (const struct clk_hw*[]){
1484 				&cam_cc_mclk2_clk_src.clkr.hw,
1485 			},
1486 			.num_parents = 1,
1487 			.flags = CLK_SET_RATE_PARENT,
1488 			.ops = &clk_branch2_ops,
1489 		},
1490 	},
1491 };
1492 
1493 static struct clk_branch cam_cc_mclk3_clk = {
1494 	.halt_reg = 0x407c,
1495 	.halt_check = BRANCH_HALT,
1496 	.clkr = {
1497 		.enable_reg = 0x407c,
1498 		.enable_mask = BIT(0),
1499 		.hw.init = &(struct clk_init_data){
1500 			.name = "cam_cc_mclk3_clk",
1501 			.parent_hws = (const struct clk_hw*[]){
1502 				&cam_cc_mclk3_clk_src.clkr.hw,
1503 			},
1504 			.num_parents = 1,
1505 			.flags = CLK_SET_RATE_PARENT,
1506 			.ops = &clk_branch2_ops,
1507 		},
1508 	},
1509 };
1510 
1511 static struct clk_branch cam_cc_soc_ahb_clk = {
1512 	.halt_reg = 0xb13c,
1513 	.halt_check = BRANCH_HALT,
1514 	.clkr = {
1515 		.enable_reg = 0xb13c,
1516 		.enable_mask = BIT(0),
1517 		.hw.init = &(struct clk_init_data){
1518 			.name = "cam_cc_soc_ahb_clk",
1519 			.ops = &clk_branch2_ops,
1520 		},
1521 	},
1522 };
1523 
1524 static struct clk_branch cam_cc_sys_tmr_clk = {
1525 	.halt_reg = 0xb0a8,
1526 	.halt_check = BRANCH_HALT,
1527 	.clkr = {
1528 		.enable_reg = 0xb0a8,
1529 		.enable_mask = BIT(0),
1530 		.hw.init = &(struct clk_init_data){
1531 			.name = "cam_cc_sys_tmr_clk",
1532 			.ops = &clk_branch2_ops,
1533 		},
1534 	},
1535 };
1536 
1537 static struct gdsc titan_top_gdsc;
1538 
1539 static struct gdsc bps_gdsc = {
1540 	.gdscr = 0x6004,
1541 	.pd = {
1542 		.name = "bps_gdsc",
1543 	},
1544 	.flags = HW_CTRL | POLL_CFG_GDSCR,
1545 	.pwrsts = PWRSTS_OFF_ON,
1546 };
1547 
1548 static struct gdsc ipe_0_gdsc = {
1549 	.gdscr = 0x7004,
1550 	.pd = {
1551 		.name = "ipe_0_gdsc",
1552 	},
1553 	.flags = HW_CTRL | POLL_CFG_GDSCR,
1554 	.pwrsts = PWRSTS_OFF_ON,
1555 };
1556 
1557 static struct gdsc ipe_1_gdsc = {
1558 	.gdscr = 0x8004,
1559 	.pd = {
1560 		.name = "ipe_1_gdsc",
1561 	},
1562 	.flags = HW_CTRL | POLL_CFG_GDSCR,
1563 	.pwrsts = PWRSTS_OFF_ON,
1564 };
1565 
1566 static struct gdsc ife_0_gdsc = {
1567 	.gdscr = 0x9004,
1568 	.pd = {
1569 		.name = "ife_0_gdsc",
1570 	},
1571 	.flags = POLL_CFG_GDSCR,
1572 	.parent = &titan_top_gdsc.pd,
1573 	.pwrsts = PWRSTS_OFF_ON,
1574 };
1575 
1576 static struct gdsc ife_1_gdsc = {
1577 	.gdscr = 0xa004,
1578 	.pd = {
1579 		.name = "ife_1_gdsc",
1580 	},
1581 	.flags = POLL_CFG_GDSCR,
1582 	.parent = &titan_top_gdsc.pd,
1583 	.pwrsts = PWRSTS_OFF_ON,
1584 };
1585 
1586 static struct gdsc titan_top_gdsc = {
1587 	.gdscr = 0xb134,
1588 	.pd = {
1589 		.name = "titan_top_gdsc",
1590 	},
1591 	.flags = POLL_CFG_GDSCR,
1592 	.pwrsts = PWRSTS_OFF_ON,
1593 };
1594 
1595 static struct clk_regmap *cam_cc_sdm845_clocks[] = {
1596 	[CAM_CC_BPS_AHB_CLK] = &cam_cc_bps_ahb_clk.clkr,
1597 	[CAM_CC_BPS_AREG_CLK] = &cam_cc_bps_areg_clk.clkr,
1598 	[CAM_CC_BPS_AXI_CLK] = &cam_cc_bps_axi_clk.clkr,
1599 	[CAM_CC_BPS_CLK] = &cam_cc_bps_clk.clkr,
1600 	[CAM_CC_BPS_CLK_SRC] = &cam_cc_bps_clk_src.clkr,
1601 	[CAM_CC_CAMNOC_ATB_CLK] = &cam_cc_camnoc_atb_clk.clkr,
1602 	[CAM_CC_CAMNOC_AXI_CLK] = &cam_cc_camnoc_axi_clk.clkr,
1603 	[CAM_CC_CCI_CLK] = &cam_cc_cci_clk.clkr,
1604 	[CAM_CC_CCI_CLK_SRC] = &cam_cc_cci_clk_src.clkr,
1605 	[CAM_CC_CPAS_AHB_CLK] = &cam_cc_cpas_ahb_clk.clkr,
1606 	[CAM_CC_CPHY_RX_CLK_SRC] = &cam_cc_cphy_rx_clk_src.clkr,
1607 	[CAM_CC_CSI0PHYTIMER_CLK] = &cam_cc_csi0phytimer_clk.clkr,
1608 	[CAM_CC_CSI0PHYTIMER_CLK_SRC] = &cam_cc_csi0phytimer_clk_src.clkr,
1609 	[CAM_CC_CSI1PHYTIMER_CLK] = &cam_cc_csi1phytimer_clk.clkr,
1610 	[CAM_CC_CSI1PHYTIMER_CLK_SRC] = &cam_cc_csi1phytimer_clk_src.clkr,
1611 	[CAM_CC_CSI2PHYTIMER_CLK] = &cam_cc_csi2phytimer_clk.clkr,
1612 	[CAM_CC_CSI2PHYTIMER_CLK_SRC] = &cam_cc_csi2phytimer_clk_src.clkr,
1613 	[CAM_CC_CSI3PHYTIMER_CLK] = &cam_cc_csi3phytimer_clk.clkr,
1614 	[CAM_CC_CSI3PHYTIMER_CLK_SRC] = &cam_cc_csi3phytimer_clk_src.clkr,
1615 	[CAM_CC_CSIPHY0_CLK] = &cam_cc_csiphy0_clk.clkr,
1616 	[CAM_CC_CSIPHY1_CLK] = &cam_cc_csiphy1_clk.clkr,
1617 	[CAM_CC_CSIPHY2_CLK] = &cam_cc_csiphy2_clk.clkr,
1618 	[CAM_CC_CSIPHY3_CLK] = &cam_cc_csiphy3_clk.clkr,
1619 	[CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
1620 	[CAM_CC_FD_CORE_CLK] = &cam_cc_fd_core_clk.clkr,
1621 	[CAM_CC_FD_CORE_CLK_SRC] = &cam_cc_fd_core_clk_src.clkr,
1622 	[CAM_CC_FD_CORE_UAR_CLK] = &cam_cc_fd_core_uar_clk.clkr,
1623 	[CAM_CC_ICP_APB_CLK] = &cam_cc_icp_apb_clk.clkr,
1624 	[CAM_CC_ICP_ATB_CLK] = &cam_cc_icp_atb_clk.clkr,
1625 	[CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
1626 	[CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr,
1627 	[CAM_CC_ICP_CTI_CLK] = &cam_cc_icp_cti_clk.clkr,
1628 	[CAM_CC_ICP_TS_CLK] = &cam_cc_icp_ts_clk.clkr,
1629 	[CAM_CC_IFE_0_AXI_CLK] = &cam_cc_ife_0_axi_clk.clkr,
1630 	[CAM_CC_IFE_0_CLK] = &cam_cc_ife_0_clk.clkr,
1631 	[CAM_CC_IFE_0_CLK_SRC] = &cam_cc_ife_0_clk_src.clkr,
1632 	[CAM_CC_IFE_0_CPHY_RX_CLK] = &cam_cc_ife_0_cphy_rx_clk.clkr,
1633 	[CAM_CC_IFE_0_CSID_CLK] = &cam_cc_ife_0_csid_clk.clkr,
1634 	[CAM_CC_IFE_0_CSID_CLK_SRC] = &cam_cc_ife_0_csid_clk_src.clkr,
1635 	[CAM_CC_IFE_0_DSP_CLK] = &cam_cc_ife_0_dsp_clk.clkr,
1636 	[CAM_CC_IFE_1_AXI_CLK] = &cam_cc_ife_1_axi_clk.clkr,
1637 	[CAM_CC_IFE_1_CLK] = &cam_cc_ife_1_clk.clkr,
1638 	[CAM_CC_IFE_1_CLK_SRC] = &cam_cc_ife_1_clk_src.clkr,
1639 	[CAM_CC_IFE_1_CPHY_RX_CLK] = &cam_cc_ife_1_cphy_rx_clk.clkr,
1640 	[CAM_CC_IFE_1_CSID_CLK] = &cam_cc_ife_1_csid_clk.clkr,
1641 	[CAM_CC_IFE_1_CSID_CLK_SRC] = &cam_cc_ife_1_csid_clk_src.clkr,
1642 	[CAM_CC_IFE_1_DSP_CLK] = &cam_cc_ife_1_dsp_clk.clkr,
1643 	[CAM_CC_IFE_LITE_CLK] = &cam_cc_ife_lite_clk.clkr,
1644 	[CAM_CC_IFE_LITE_CLK_SRC] = &cam_cc_ife_lite_clk_src.clkr,
1645 	[CAM_CC_IFE_LITE_CPHY_RX_CLK] = &cam_cc_ife_lite_cphy_rx_clk.clkr,
1646 	[CAM_CC_IFE_LITE_CSID_CLK] = &cam_cc_ife_lite_csid_clk.clkr,
1647 	[CAM_CC_IFE_LITE_CSID_CLK_SRC] = &cam_cc_ife_lite_csid_clk_src.clkr,
1648 	[CAM_CC_IPE_0_AHB_CLK] = &cam_cc_ipe_0_ahb_clk.clkr,
1649 	[CAM_CC_IPE_0_AREG_CLK] = &cam_cc_ipe_0_areg_clk.clkr,
1650 	[CAM_CC_IPE_0_AXI_CLK] = &cam_cc_ipe_0_axi_clk.clkr,
1651 	[CAM_CC_IPE_0_CLK] = &cam_cc_ipe_0_clk.clkr,
1652 	[CAM_CC_IPE_0_CLK_SRC] = &cam_cc_ipe_0_clk_src.clkr,
1653 	[CAM_CC_IPE_1_AHB_CLK] = &cam_cc_ipe_1_ahb_clk.clkr,
1654 	[CAM_CC_IPE_1_AREG_CLK] = &cam_cc_ipe_1_areg_clk.clkr,
1655 	[CAM_CC_IPE_1_AXI_CLK] = &cam_cc_ipe_1_axi_clk.clkr,
1656 	[CAM_CC_IPE_1_CLK] = &cam_cc_ipe_1_clk.clkr,
1657 	[CAM_CC_IPE_1_CLK_SRC] = &cam_cc_ipe_1_clk_src.clkr,
1658 	[CAM_CC_JPEG_CLK] = &cam_cc_jpeg_clk.clkr,
1659 	[CAM_CC_JPEG_CLK_SRC] = &cam_cc_jpeg_clk_src.clkr,
1660 	[CAM_CC_LRME_CLK] = &cam_cc_lrme_clk.clkr,
1661 	[CAM_CC_LRME_CLK_SRC] = &cam_cc_lrme_clk_src.clkr,
1662 	[CAM_CC_MCLK0_CLK] = &cam_cc_mclk0_clk.clkr,
1663 	[CAM_CC_MCLK0_CLK_SRC] = &cam_cc_mclk0_clk_src.clkr,
1664 	[CAM_CC_MCLK1_CLK] = &cam_cc_mclk1_clk.clkr,
1665 	[CAM_CC_MCLK1_CLK_SRC] = &cam_cc_mclk1_clk_src.clkr,
1666 	[CAM_CC_MCLK2_CLK] = &cam_cc_mclk2_clk.clkr,
1667 	[CAM_CC_MCLK2_CLK_SRC] = &cam_cc_mclk2_clk_src.clkr,
1668 	[CAM_CC_MCLK3_CLK] = &cam_cc_mclk3_clk.clkr,
1669 	[CAM_CC_MCLK3_CLK_SRC] = &cam_cc_mclk3_clk_src.clkr,
1670 	[CAM_CC_PLL0] = &cam_cc_pll0.clkr,
1671 	[CAM_CC_PLL0_OUT_EVEN] = &cam_cc_pll0_out_even.clkr,
1672 	[CAM_CC_PLL1] = &cam_cc_pll1.clkr,
1673 	[CAM_CC_PLL1_OUT_EVEN] = &cam_cc_pll1_out_even.clkr,
1674 	[CAM_CC_PLL2] = &cam_cc_pll2.clkr,
1675 	[CAM_CC_PLL2_OUT_EVEN] = &cam_cc_pll2_out_even.clkr,
1676 	[CAM_CC_PLL3] = &cam_cc_pll3.clkr,
1677 	[CAM_CC_PLL3_OUT_EVEN] = &cam_cc_pll3_out_even.clkr,
1678 	[CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr,
1679 	[CAM_CC_SOC_AHB_CLK] = &cam_cc_soc_ahb_clk.clkr,
1680 	[CAM_CC_SYS_TMR_CLK] = &cam_cc_sys_tmr_clk.clkr,
1681 };
1682 
1683 static struct gdsc *cam_cc_sdm845_gdscs[] = {
1684 	[BPS_GDSC] = &bps_gdsc,
1685 	[IPE_0_GDSC] = &ipe_0_gdsc,
1686 	[IPE_1_GDSC] = &ipe_1_gdsc,
1687 	[IFE_0_GDSC] = &ife_0_gdsc,
1688 	[IFE_1_GDSC] = &ife_1_gdsc,
1689 	[TITAN_TOP_GDSC] = &titan_top_gdsc,
1690 };
1691 
1692 static const struct regmap_config cam_cc_sdm845_regmap_config = {
1693 	.reg_bits	= 32,
1694 	.reg_stride	= 4,
1695 	.val_bits	= 32,
1696 	.max_register	= 0xd004,
1697 	.fast_io	= true,
1698 };
1699 
1700 static const struct qcom_cc_desc cam_cc_sdm845_desc = {
1701 	.config = &cam_cc_sdm845_regmap_config,
1702 	.clks = cam_cc_sdm845_clocks,
1703 	.num_clks = ARRAY_SIZE(cam_cc_sdm845_clocks),
1704 	.gdscs = cam_cc_sdm845_gdscs,
1705 	.num_gdscs = ARRAY_SIZE(cam_cc_sdm845_gdscs),
1706 };
1707 
1708 static const struct of_device_id cam_cc_sdm845_match_table[] = {
1709 	{ .compatible = "qcom,sdm845-camcc" },
1710 	{ }
1711 };
1712 MODULE_DEVICE_TABLE(of, cam_cc_sdm845_match_table);
1713 
cam_cc_sdm845_probe(struct platform_device * pdev)1714 static int cam_cc_sdm845_probe(struct platform_device *pdev)
1715 {
1716 	struct regmap *regmap;
1717 	struct alpha_pll_config cam_cc_pll_config = { };
1718 
1719 	regmap = qcom_cc_map(pdev, &cam_cc_sdm845_desc);
1720 	if (IS_ERR(regmap))
1721 		return PTR_ERR(regmap);
1722 
1723 	cam_cc_pll_config.l = 0x1f;
1724 	cam_cc_pll_config.alpha = 0x4000;
1725 	clk_fabia_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll_config);
1726 
1727 	cam_cc_pll_config.l = 0x2a;
1728 	cam_cc_pll_config.alpha = 0x1556;
1729 	clk_fabia_pll_configure(&cam_cc_pll1, regmap, &cam_cc_pll_config);
1730 
1731 	cam_cc_pll_config.l = 0x32;
1732 	cam_cc_pll_config.alpha = 0x0;
1733 	clk_fabia_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll_config);
1734 
1735 	cam_cc_pll_config.l = 0x14;
1736 	clk_fabia_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll_config);
1737 
1738 	return qcom_cc_really_probe(pdev, &cam_cc_sdm845_desc, regmap);
1739 }
1740 
1741 static struct platform_driver cam_cc_sdm845_driver = {
1742 	.probe	= cam_cc_sdm845_probe,
1743 	.driver	= {
1744 		.name = "sdm845-camcc",
1745 		.of_match_table = cam_cc_sdm845_match_table,
1746 	},
1747 };
1748 
cam_cc_sdm845_init(void)1749 static int __init cam_cc_sdm845_init(void)
1750 {
1751 	return platform_driver_register(&cam_cc_sdm845_driver);
1752 }
1753 subsys_initcall(cam_cc_sdm845_init);
1754 
cam_cc_sdm845_exit(void)1755 static void __exit cam_cc_sdm845_exit(void)
1756 {
1757 	platform_driver_unregister(&cam_cc_sdm845_driver);
1758 }
1759 module_exit(cam_cc_sdm845_exit);
1760 
1761 MODULE_DESCRIPTION("QTI CAM_CC SDM845 Driver");
1762 MODULE_LICENSE("GPL v2");
1763