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