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