xref: /linux/drivers/clk/qcom/camcc-milos.c (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
1*f003800eSLuca Weiss // SPDX-License-Identifier: GPL-2.0-only
2*f003800eSLuca Weiss /*
3*f003800eSLuca Weiss  * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
4*f003800eSLuca Weiss  * Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
5*f003800eSLuca Weiss  */
6*f003800eSLuca Weiss 
7*f003800eSLuca Weiss #include <linux/clk-provider.h>
8*f003800eSLuca Weiss #include <linux/mod_devicetable.h>
9*f003800eSLuca Weiss #include <linux/module.h>
10*f003800eSLuca Weiss #include <linux/platform_device.h>
11*f003800eSLuca Weiss #include <linux/regmap.h>
12*f003800eSLuca Weiss 
13*f003800eSLuca Weiss #include <dt-bindings/clock/qcom,milos-camcc.h>
14*f003800eSLuca Weiss 
15*f003800eSLuca Weiss #include "clk-alpha-pll.h"
16*f003800eSLuca Weiss #include "clk-branch.h"
17*f003800eSLuca Weiss #include "clk-pll.h"
18*f003800eSLuca Weiss #include "clk-rcg.h"
19*f003800eSLuca Weiss #include "clk-regmap.h"
20*f003800eSLuca Weiss #include "clk-regmap-divider.h"
21*f003800eSLuca Weiss #include "clk-regmap-mux.h"
22*f003800eSLuca Weiss #include "common.h"
23*f003800eSLuca Weiss #include "gdsc.h"
24*f003800eSLuca Weiss #include "reset.h"
25*f003800eSLuca Weiss 
26*f003800eSLuca Weiss /* Need to match the order of clocks in DT binding */
27*f003800eSLuca Weiss enum {
28*f003800eSLuca Weiss 	DT_BI_TCXO,
29*f003800eSLuca Weiss 	DT_SLEEP_CLK,
30*f003800eSLuca Weiss 	DT_IFACE,
31*f003800eSLuca Weiss };
32*f003800eSLuca Weiss 
33*f003800eSLuca Weiss enum {
34*f003800eSLuca Weiss 	P_BI_TCXO,
35*f003800eSLuca Weiss 	P_CAM_CC_PLL0_OUT_EVEN,
36*f003800eSLuca Weiss 	P_CAM_CC_PLL0_OUT_MAIN,
37*f003800eSLuca Weiss 	P_CAM_CC_PLL0_OUT_ODD,
38*f003800eSLuca Weiss 	P_CAM_CC_PLL1_OUT_EVEN,
39*f003800eSLuca Weiss 	P_CAM_CC_PLL1_OUT_MAIN,
40*f003800eSLuca Weiss 	P_CAM_CC_PLL2_OUT_MAIN,
41*f003800eSLuca Weiss 	P_CAM_CC_PLL3_OUT_EVEN,
42*f003800eSLuca Weiss 	P_CAM_CC_PLL4_OUT_EVEN,
43*f003800eSLuca Weiss 	P_CAM_CC_PLL4_OUT_MAIN,
44*f003800eSLuca Weiss 	P_CAM_CC_PLL5_OUT_EVEN,
45*f003800eSLuca Weiss 	P_CAM_CC_PLL5_OUT_MAIN,
46*f003800eSLuca Weiss 	P_CAM_CC_PLL6_OUT_EVEN,
47*f003800eSLuca Weiss 	P_CAM_CC_PLL6_OUT_MAIN,
48*f003800eSLuca Weiss 	P_SLEEP_CLK,
49*f003800eSLuca Weiss };
50*f003800eSLuca Weiss 
51*f003800eSLuca Weiss static const struct pll_vco lucid_ole_vco[] = {
52*f003800eSLuca Weiss 	{ 249600000, 2300000000, 0 },
53*f003800eSLuca Weiss };
54*f003800eSLuca Weiss 
55*f003800eSLuca Weiss static const struct pll_vco rivian_ole_vco[] = {
56*f003800eSLuca Weiss 	{ 777000000, 1285000000, 0 },
57*f003800eSLuca Weiss };
58*f003800eSLuca Weiss 
59*f003800eSLuca Weiss /* 1200.0 MHz Configuration */
60*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll0_config = {
61*f003800eSLuca Weiss 	.l = 0x3e,
62*f003800eSLuca Weiss 	.alpha = 0x8000,
63*f003800eSLuca Weiss 	.config_ctl_val = 0x20485699,
64*f003800eSLuca Weiss 	.config_ctl_hi_val = 0x00182261,
65*f003800eSLuca Weiss 	.config_ctl_hi1_val = 0x82aa299c,
66*f003800eSLuca Weiss 	.test_ctl_val = 0x00000000,
67*f003800eSLuca Weiss 	.test_ctl_hi_val = 0x00000003,
68*f003800eSLuca Weiss 	.test_ctl_hi1_val = 0x00009000,
69*f003800eSLuca Weiss 	.test_ctl_hi2_val = 0x00000034,
70*f003800eSLuca Weiss 	.user_ctl_val = 0x00008400,
71*f003800eSLuca Weiss 	.user_ctl_hi_val = 0x00000005,
72*f003800eSLuca Weiss };
73*f003800eSLuca Weiss 
74*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll0 = {
75*f003800eSLuca Weiss 	.offset = 0x0,
76*f003800eSLuca Weiss 	.config = &cam_cc_pll0_config,
77*f003800eSLuca Weiss 	.vco_table = lucid_ole_vco,
78*f003800eSLuca Weiss 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
79*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
80*f003800eSLuca Weiss 	.clkr = {
81*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
82*f003800eSLuca Weiss 			.name = "cam_cc_pll0",
83*f003800eSLuca Weiss 			.parent_data = &(const struct clk_parent_data) {
84*f003800eSLuca Weiss 				.index = DT_BI_TCXO,
85*f003800eSLuca Weiss 			},
86*f003800eSLuca Weiss 			.num_parents = 1,
87*f003800eSLuca Weiss 			.ops = &clk_alpha_pll_lucid_evo_ops,
88*f003800eSLuca Weiss 		},
89*f003800eSLuca Weiss 	},
90*f003800eSLuca Weiss };
91*f003800eSLuca Weiss 
92*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll0_out_even[] = {
93*f003800eSLuca Weiss 	{ 0x1, 2 },
94*f003800eSLuca Weiss 	{ }
95*f003800eSLuca Weiss };
96*f003800eSLuca Weiss 
97*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll0_out_even = {
98*f003800eSLuca Weiss 	.offset = 0x0,
99*f003800eSLuca Weiss 	.post_div_shift = 10,
100*f003800eSLuca Weiss 	.post_div_table = post_div_table_cam_cc_pll0_out_even,
101*f003800eSLuca Weiss 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_even),
102*f003800eSLuca Weiss 	.width = 4,
103*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
104*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
105*f003800eSLuca Weiss 		.name = "cam_cc_pll0_out_even",
106*f003800eSLuca Weiss 		.parent_hws = (const struct clk_hw*[]) {
107*f003800eSLuca Weiss 			&cam_cc_pll0.clkr.hw,
108*f003800eSLuca Weiss 		},
109*f003800eSLuca Weiss 		.num_parents = 1,
110*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
111*f003800eSLuca Weiss 		.ops = &clk_alpha_pll_postdiv_lucid_ole_ops,
112*f003800eSLuca Weiss 	},
113*f003800eSLuca Weiss };
114*f003800eSLuca Weiss 
115*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll0_out_odd[] = {
116*f003800eSLuca Weiss 	{ 0x2, 3 },
117*f003800eSLuca Weiss 	{ }
118*f003800eSLuca Weiss };
119*f003800eSLuca Weiss 
120*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll0_out_odd = {
121*f003800eSLuca Weiss 	.offset = 0x0,
122*f003800eSLuca Weiss 	.post_div_shift = 14,
123*f003800eSLuca Weiss 	.post_div_table = post_div_table_cam_cc_pll0_out_odd,
124*f003800eSLuca Weiss 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_odd),
125*f003800eSLuca Weiss 	.width = 4,
126*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
127*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
128*f003800eSLuca Weiss 		.name = "cam_cc_pll0_out_odd",
129*f003800eSLuca Weiss 		.parent_hws = (const struct clk_hw*[]) {
130*f003800eSLuca Weiss 			&cam_cc_pll0.clkr.hw,
131*f003800eSLuca Weiss 		},
132*f003800eSLuca Weiss 		.num_parents = 1,
133*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
134*f003800eSLuca Weiss 		.ops = &clk_alpha_pll_postdiv_lucid_ole_ops,
135*f003800eSLuca Weiss 	},
136*f003800eSLuca Weiss };
137*f003800eSLuca Weiss 
138*f003800eSLuca Weiss /* 600.0 MHz Configuration */
139*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll1_config = {
140*f003800eSLuca Weiss 	.l = 0x1f,
141*f003800eSLuca Weiss 	.alpha = 0x4000,
142*f003800eSLuca Weiss 	.config_ctl_val = 0x20485699,
143*f003800eSLuca Weiss 	.config_ctl_hi_val = 0x00182261,
144*f003800eSLuca Weiss 	.config_ctl_hi1_val = 0x82aa299c,
145*f003800eSLuca Weiss 	.test_ctl_val = 0x00000000,
146*f003800eSLuca Weiss 	.test_ctl_hi_val = 0x00000003,
147*f003800eSLuca Weiss 	.test_ctl_hi1_val = 0x00009000,
148*f003800eSLuca Weiss 	.test_ctl_hi2_val = 0x00000034,
149*f003800eSLuca Weiss 	.user_ctl_val = 0x00000400,
150*f003800eSLuca Weiss 	.user_ctl_hi_val = 0x00000005,
151*f003800eSLuca Weiss };
152*f003800eSLuca Weiss 
153*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll1 = {
154*f003800eSLuca Weiss 	.offset = 0x1000,
155*f003800eSLuca Weiss 	.config = &cam_cc_pll1_config,
156*f003800eSLuca Weiss 	.vco_table = lucid_ole_vco,
157*f003800eSLuca Weiss 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
158*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
159*f003800eSLuca Weiss 	.clkr = {
160*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
161*f003800eSLuca Weiss 			.name = "cam_cc_pll1",
162*f003800eSLuca Weiss 			.parent_data = &(const struct clk_parent_data) {
163*f003800eSLuca Weiss 				.index = DT_BI_TCXO,
164*f003800eSLuca Weiss 			},
165*f003800eSLuca Weiss 			.num_parents = 1,
166*f003800eSLuca Weiss 			.ops = &clk_alpha_pll_lucid_evo_ops,
167*f003800eSLuca Weiss 		},
168*f003800eSLuca Weiss 	},
169*f003800eSLuca Weiss };
170*f003800eSLuca Weiss 
171*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll1_out_even[] = {
172*f003800eSLuca Weiss 	{ 0x1, 2 },
173*f003800eSLuca Weiss 	{ }
174*f003800eSLuca Weiss };
175*f003800eSLuca Weiss 
176*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll1_out_even = {
177*f003800eSLuca Weiss 	.offset = 0x1000,
178*f003800eSLuca Weiss 	.post_div_shift = 10,
179*f003800eSLuca Weiss 	.post_div_table = post_div_table_cam_cc_pll1_out_even,
180*f003800eSLuca Weiss 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll1_out_even),
181*f003800eSLuca Weiss 	.width = 4,
182*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
183*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
184*f003800eSLuca Weiss 		.name = "cam_cc_pll1_out_even",
185*f003800eSLuca Weiss 		.parent_hws = (const struct clk_hw*[]) {
186*f003800eSLuca Weiss 			&cam_cc_pll1.clkr.hw,
187*f003800eSLuca Weiss 		},
188*f003800eSLuca Weiss 		.num_parents = 1,
189*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
190*f003800eSLuca Weiss 		.ops = &clk_alpha_pll_postdiv_lucid_ole_ops,
191*f003800eSLuca Weiss 	},
192*f003800eSLuca Weiss };
193*f003800eSLuca Weiss 
194*f003800eSLuca Weiss /* 960.0 MHz Configuration */
195*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll2_config = {
196*f003800eSLuca Weiss 	.l = 0x32,
197*f003800eSLuca Weiss 	.alpha = 0x0,
198*f003800eSLuca Weiss 	.config_ctl_val = 0x10000030,
199*f003800eSLuca Weiss 	.config_ctl_hi_val = 0x80890263,
200*f003800eSLuca Weiss 	.config_ctl_hi1_val = 0x00000217,
201*f003800eSLuca Weiss 	.user_ctl_val = 0x00000001,
202*f003800eSLuca Weiss 	.user_ctl_hi_val = 0x00100000,
203*f003800eSLuca Weiss };
204*f003800eSLuca Weiss 
205*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll2 = {
206*f003800eSLuca Weiss 	.offset = 0x2000,
207*f003800eSLuca Weiss 	.config = &cam_cc_pll2_config,
208*f003800eSLuca Weiss 	.vco_table = rivian_ole_vco,
209*f003800eSLuca Weiss 	.num_vco = ARRAY_SIZE(rivian_ole_vco),
210*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EVO],
211*f003800eSLuca Weiss 	.clkr = {
212*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
213*f003800eSLuca Weiss 			.name = "cam_cc_pll2",
214*f003800eSLuca Weiss 			.parent_data = &(const struct clk_parent_data) {
215*f003800eSLuca Weiss 				.index = DT_BI_TCXO,
216*f003800eSLuca Weiss 			},
217*f003800eSLuca Weiss 			.num_parents = 1,
218*f003800eSLuca Weiss 			.ops = &clk_alpha_pll_rivian_evo_ops,
219*f003800eSLuca Weiss 		},
220*f003800eSLuca Weiss 	},
221*f003800eSLuca Weiss };
222*f003800eSLuca Weiss 
223*f003800eSLuca Weiss /* 600.0 MHz Configuration */
224*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll3_config = {
225*f003800eSLuca Weiss 	.l = 0x1f,
226*f003800eSLuca Weiss 	.alpha = 0x4000,
227*f003800eSLuca Weiss 	.config_ctl_val = 0x20485699,
228*f003800eSLuca Weiss 	.config_ctl_hi_val = 0x00182261,
229*f003800eSLuca Weiss 	.config_ctl_hi1_val = 0x82aa299c,
230*f003800eSLuca Weiss 	.test_ctl_val = 0x00000000,
231*f003800eSLuca Weiss 	.test_ctl_hi_val = 0x00000003,
232*f003800eSLuca Weiss 	.test_ctl_hi1_val = 0x00009000,
233*f003800eSLuca Weiss 	.test_ctl_hi2_val = 0x00000034,
234*f003800eSLuca Weiss 	.user_ctl_val = 0x00000400,
235*f003800eSLuca Weiss 	.user_ctl_hi_val = 0x00000005,
236*f003800eSLuca Weiss };
237*f003800eSLuca Weiss 
238*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll3 = {
239*f003800eSLuca Weiss 	.offset = 0x3000,
240*f003800eSLuca Weiss 	.config = &cam_cc_pll3_config,
241*f003800eSLuca Weiss 	.vco_table = lucid_ole_vco,
242*f003800eSLuca Weiss 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
243*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
244*f003800eSLuca Weiss 	.clkr = {
245*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
246*f003800eSLuca Weiss 			.name = "cam_cc_pll3",
247*f003800eSLuca Weiss 			.parent_data = &(const struct clk_parent_data) {
248*f003800eSLuca Weiss 				.index = DT_BI_TCXO,
249*f003800eSLuca Weiss 			},
250*f003800eSLuca Weiss 			.num_parents = 1,
251*f003800eSLuca Weiss 			.ops = &clk_alpha_pll_lucid_evo_ops,
252*f003800eSLuca Weiss 		},
253*f003800eSLuca Weiss 	},
254*f003800eSLuca Weiss };
255*f003800eSLuca Weiss 
256*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll3_out_even[] = {
257*f003800eSLuca Weiss 	{ 0x1, 2 },
258*f003800eSLuca Weiss 	{ }
259*f003800eSLuca Weiss };
260*f003800eSLuca Weiss 
261*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll3_out_even = {
262*f003800eSLuca Weiss 	.offset = 0x3000,
263*f003800eSLuca Weiss 	.post_div_shift = 10,
264*f003800eSLuca Weiss 	.post_div_table = post_div_table_cam_cc_pll3_out_even,
265*f003800eSLuca Weiss 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll3_out_even),
266*f003800eSLuca Weiss 	.width = 4,
267*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
268*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
269*f003800eSLuca Weiss 		.name = "cam_cc_pll3_out_even",
270*f003800eSLuca Weiss 		.parent_hws = (const struct clk_hw*[]) {
271*f003800eSLuca Weiss 			&cam_cc_pll3.clkr.hw,
272*f003800eSLuca Weiss 		},
273*f003800eSLuca Weiss 		.num_parents = 1,
274*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
275*f003800eSLuca Weiss 		.ops = &clk_alpha_pll_postdiv_lucid_ole_ops,
276*f003800eSLuca Weiss 	},
277*f003800eSLuca Weiss };
278*f003800eSLuca Weiss 
279*f003800eSLuca Weiss /* 700.0 MHz Configuration */
280*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll4_config = {
281*f003800eSLuca Weiss 	.l = 0x24,
282*f003800eSLuca Weiss 	.alpha = 0x7555,
283*f003800eSLuca Weiss 	.config_ctl_val = 0x20485699,
284*f003800eSLuca Weiss 	.config_ctl_hi_val = 0x00182261,
285*f003800eSLuca Weiss 	.config_ctl_hi1_val = 0x82aa299c,
286*f003800eSLuca Weiss 	.test_ctl_val = 0x00000000,
287*f003800eSLuca Weiss 	.test_ctl_hi_val = 0x00000003,
288*f003800eSLuca Weiss 	.test_ctl_hi1_val = 0x00009000,
289*f003800eSLuca Weiss 	.test_ctl_hi2_val = 0x00000034,
290*f003800eSLuca Weiss 	.user_ctl_val = 0x00000400,
291*f003800eSLuca Weiss 	.user_ctl_hi_val = 0x00000005,
292*f003800eSLuca Weiss };
293*f003800eSLuca Weiss 
294*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll4 = {
295*f003800eSLuca Weiss 	.offset = 0x4000,
296*f003800eSLuca Weiss 	.config = &cam_cc_pll4_config,
297*f003800eSLuca Weiss 	.vco_table = lucid_ole_vco,
298*f003800eSLuca Weiss 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
299*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
300*f003800eSLuca Weiss 	.clkr = {
301*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
302*f003800eSLuca Weiss 			.name = "cam_cc_pll4",
303*f003800eSLuca Weiss 			.parent_data = &(const struct clk_parent_data) {
304*f003800eSLuca Weiss 				.index = DT_BI_TCXO,
305*f003800eSLuca Weiss 			},
306*f003800eSLuca Weiss 			.num_parents = 1,
307*f003800eSLuca Weiss 			.ops = &clk_alpha_pll_lucid_evo_ops,
308*f003800eSLuca Weiss 		},
309*f003800eSLuca Weiss 	},
310*f003800eSLuca Weiss };
311*f003800eSLuca Weiss 
312*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll4_out_even[] = {
313*f003800eSLuca Weiss 	{ 0x1, 2 },
314*f003800eSLuca Weiss 	{ }
315*f003800eSLuca Weiss };
316*f003800eSLuca Weiss 
317*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll4_out_even = {
318*f003800eSLuca Weiss 	.offset = 0x4000,
319*f003800eSLuca Weiss 	.post_div_shift = 10,
320*f003800eSLuca Weiss 	.post_div_table = post_div_table_cam_cc_pll4_out_even,
321*f003800eSLuca Weiss 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll4_out_even),
322*f003800eSLuca Weiss 	.width = 4,
323*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
324*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
325*f003800eSLuca Weiss 		.name = "cam_cc_pll4_out_even",
326*f003800eSLuca Weiss 		.parent_hws = (const struct clk_hw*[]) {
327*f003800eSLuca Weiss 			&cam_cc_pll4.clkr.hw,
328*f003800eSLuca Weiss 		},
329*f003800eSLuca Weiss 		.num_parents = 1,
330*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
331*f003800eSLuca Weiss 		.ops = &clk_alpha_pll_postdiv_lucid_ole_ops,
332*f003800eSLuca Weiss 	},
333*f003800eSLuca Weiss };
334*f003800eSLuca Weiss 
335*f003800eSLuca Weiss /* 700.0 MHz Configuration */
336*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll5_config = {
337*f003800eSLuca Weiss 	.l = 0x24,
338*f003800eSLuca Weiss 	.alpha = 0x7555,
339*f003800eSLuca Weiss 	.config_ctl_val = 0x20485699,
340*f003800eSLuca Weiss 	.config_ctl_hi_val = 0x00182261,
341*f003800eSLuca Weiss 	.config_ctl_hi1_val = 0x82aa299c,
342*f003800eSLuca Weiss 	.test_ctl_val = 0x00000000,
343*f003800eSLuca Weiss 	.test_ctl_hi_val = 0x00000003,
344*f003800eSLuca Weiss 	.test_ctl_hi1_val = 0x00009000,
345*f003800eSLuca Weiss 	.test_ctl_hi2_val = 0x00000034,
346*f003800eSLuca Weiss 	.user_ctl_val = 0x00000400,
347*f003800eSLuca Weiss 	.user_ctl_hi_val = 0x00000005,
348*f003800eSLuca Weiss };
349*f003800eSLuca Weiss 
350*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll5 = {
351*f003800eSLuca Weiss 	.offset = 0x5000,
352*f003800eSLuca Weiss 	.config = &cam_cc_pll5_config,
353*f003800eSLuca Weiss 	.vco_table = lucid_ole_vco,
354*f003800eSLuca Weiss 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
355*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
356*f003800eSLuca Weiss 	.clkr = {
357*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
358*f003800eSLuca Weiss 			.name = "cam_cc_pll5",
359*f003800eSLuca Weiss 			.parent_data = &(const struct clk_parent_data) {
360*f003800eSLuca Weiss 				.index = DT_BI_TCXO,
361*f003800eSLuca Weiss 			},
362*f003800eSLuca Weiss 			.num_parents = 1,
363*f003800eSLuca Weiss 			.ops = &clk_alpha_pll_lucid_evo_ops,
364*f003800eSLuca Weiss 		},
365*f003800eSLuca Weiss 	},
366*f003800eSLuca Weiss };
367*f003800eSLuca Weiss 
368*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll5_out_even[] = {
369*f003800eSLuca Weiss 	{ 0x1, 2 },
370*f003800eSLuca Weiss 	{ }
371*f003800eSLuca Weiss };
372*f003800eSLuca Weiss 
373*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll5_out_even = {
374*f003800eSLuca Weiss 	.offset = 0x5000,
375*f003800eSLuca Weiss 	.post_div_shift = 10,
376*f003800eSLuca Weiss 	.post_div_table = post_div_table_cam_cc_pll5_out_even,
377*f003800eSLuca Weiss 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll5_out_even),
378*f003800eSLuca Weiss 	.width = 4,
379*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
380*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
381*f003800eSLuca Weiss 		.name = "cam_cc_pll5_out_even",
382*f003800eSLuca Weiss 		.parent_hws = (const struct clk_hw*[]) {
383*f003800eSLuca Weiss 			&cam_cc_pll5.clkr.hw,
384*f003800eSLuca Weiss 		},
385*f003800eSLuca Weiss 		.num_parents = 1,
386*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
387*f003800eSLuca Weiss 		.ops = &clk_alpha_pll_postdiv_lucid_ole_ops,
388*f003800eSLuca Weiss 	},
389*f003800eSLuca Weiss };
390*f003800eSLuca Weiss 
391*f003800eSLuca Weiss /* 700.0 MHz Configuration */
392*f003800eSLuca Weiss static const struct alpha_pll_config cam_cc_pll6_config = {
393*f003800eSLuca Weiss 	.l = 0x24,
394*f003800eSLuca Weiss 	.alpha = 0x7555,
395*f003800eSLuca Weiss 	.config_ctl_val = 0x20485699,
396*f003800eSLuca Weiss 	.config_ctl_hi_val = 0x00182261,
397*f003800eSLuca Weiss 	.config_ctl_hi1_val = 0x82aa299c,
398*f003800eSLuca Weiss 	.test_ctl_val = 0x00000000,
399*f003800eSLuca Weiss 	.test_ctl_hi_val = 0x00000003,
400*f003800eSLuca Weiss 	.test_ctl_hi1_val = 0x00009000,
401*f003800eSLuca Weiss 	.test_ctl_hi2_val = 0x00000034,
402*f003800eSLuca Weiss 	.user_ctl_val = 0x00000400,
403*f003800eSLuca Weiss 	.user_ctl_hi_val = 0x00000005,
404*f003800eSLuca Weiss };
405*f003800eSLuca Weiss 
406*f003800eSLuca Weiss static struct clk_alpha_pll cam_cc_pll6 = {
407*f003800eSLuca Weiss 	.offset = 0x6000,
408*f003800eSLuca Weiss 	.config = &cam_cc_pll6_config,
409*f003800eSLuca Weiss 	.vco_table = lucid_ole_vco,
410*f003800eSLuca Weiss 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
411*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
412*f003800eSLuca Weiss 	.clkr = {
413*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
414*f003800eSLuca Weiss 			.name = "cam_cc_pll6",
415*f003800eSLuca Weiss 			.parent_data = &(const struct clk_parent_data) {
416*f003800eSLuca Weiss 				.index = DT_BI_TCXO,
417*f003800eSLuca Weiss 			},
418*f003800eSLuca Weiss 			.num_parents = 1,
419*f003800eSLuca Weiss 			.ops = &clk_alpha_pll_lucid_evo_ops,
420*f003800eSLuca Weiss 		},
421*f003800eSLuca Weiss 	},
422*f003800eSLuca Weiss };
423*f003800eSLuca Weiss 
424*f003800eSLuca Weiss static const struct clk_div_table post_div_table_cam_cc_pll6_out_even[] = {
425*f003800eSLuca Weiss 	{ 0x1, 2 },
426*f003800eSLuca Weiss 	{ }
427*f003800eSLuca Weiss };
428*f003800eSLuca Weiss 
429*f003800eSLuca Weiss static struct clk_alpha_pll_postdiv cam_cc_pll6_out_even = {
430*f003800eSLuca Weiss 	.offset = 0x6000,
431*f003800eSLuca Weiss 	.post_div_shift = 10,
432*f003800eSLuca Weiss 	.post_div_table = post_div_table_cam_cc_pll6_out_even,
433*f003800eSLuca Weiss 	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll6_out_even),
434*f003800eSLuca Weiss 	.width = 4,
435*f003800eSLuca Weiss 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
436*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
437*f003800eSLuca Weiss 		.name = "cam_cc_pll6_out_even",
438*f003800eSLuca Weiss 		.parent_hws = (const struct clk_hw*[]) {
439*f003800eSLuca Weiss 			&cam_cc_pll6.clkr.hw,
440*f003800eSLuca Weiss 		},
441*f003800eSLuca Weiss 		.num_parents = 1,
442*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
443*f003800eSLuca Weiss 		.ops = &clk_alpha_pll_postdiv_lucid_ole_ops,
444*f003800eSLuca Weiss 	},
445*f003800eSLuca Weiss };
446*f003800eSLuca Weiss 
447*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_0[] = {
448*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
449*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_MAIN, 1 },
450*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_ODD, 5 },
451*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 },
452*f003800eSLuca Weiss };
453*f003800eSLuca Weiss 
454*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_0[] = {
455*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
456*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0.clkr.hw },
457*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_odd.clkr.hw },
458*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
459*f003800eSLuca Weiss };
460*f003800eSLuca Weiss 
461*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_1[] = {
462*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
463*f003800eSLuca Weiss 	{ P_CAM_CC_PLL2_OUT_MAIN, 4 },
464*f003800eSLuca Weiss };
465*f003800eSLuca Weiss 
466*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_1[] = {
467*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
468*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll2.clkr.hw },
469*f003800eSLuca Weiss };
470*f003800eSLuca Weiss 
471*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_2[] = {
472*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
473*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_MAIN, 1 },
474*f003800eSLuca Weiss 	{ P_CAM_CC_PLL1_OUT_MAIN, 2 },
475*f003800eSLuca Weiss 	{ P_CAM_CC_PLL1_OUT_EVEN, 3 },
476*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_ODD, 5 },
477*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 },
478*f003800eSLuca Weiss };
479*f003800eSLuca Weiss 
480*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_2[] = {
481*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
482*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0.clkr.hw },
483*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll1.clkr.hw },
484*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll1_out_even.clkr.hw },
485*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_odd.clkr.hw },
486*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
487*f003800eSLuca Weiss };
488*f003800eSLuca Weiss 
489*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_3[] = {
490*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
491*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_ODD, 5 },
492*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 },
493*f003800eSLuca Weiss };
494*f003800eSLuca Weiss 
495*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_3[] = {
496*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
497*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_odd.clkr.hw },
498*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
499*f003800eSLuca Weiss };
500*f003800eSLuca Weiss 
501*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_4[] = {
502*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
503*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_MAIN, 1 },
504*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 },
505*f003800eSLuca Weiss };
506*f003800eSLuca Weiss 
507*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_4[] = {
508*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
509*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0.clkr.hw },
510*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
511*f003800eSLuca Weiss };
512*f003800eSLuca Weiss 
513*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_5[] = {
514*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
515*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_MAIN, 1 },
516*f003800eSLuca Weiss 	{ P_CAM_CC_PLL3_OUT_EVEN, 5 },
517*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 },
518*f003800eSLuca Weiss };
519*f003800eSLuca Weiss 
520*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_5[] = {
521*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
522*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0.clkr.hw },
523*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll3_out_even.clkr.hw },
524*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
525*f003800eSLuca Weiss };
526*f003800eSLuca Weiss 
527*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_6[] = {
528*f003800eSLuca Weiss 	{ P_SLEEP_CLK, 0 },
529*f003800eSLuca Weiss };
530*f003800eSLuca Weiss 
531*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_6_ao[] = {
532*f003800eSLuca Weiss 	{ .index = DT_SLEEP_CLK },
533*f003800eSLuca Weiss };
534*f003800eSLuca Weiss 
535*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_7[] = {
536*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
537*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_MAIN, 1 },
538*f003800eSLuca Weiss 	{ P_CAM_CC_PLL4_OUT_EVEN, 2 },
539*f003800eSLuca Weiss 	{ P_CAM_CC_PLL4_OUT_MAIN, 3 },
540*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_ODD, 5 },
541*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 },
542*f003800eSLuca Weiss };
543*f003800eSLuca Weiss 
544*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_7[] = {
545*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
546*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0.clkr.hw },
547*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll4_out_even.clkr.hw },
548*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll4.clkr.hw },
549*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_odd.clkr.hw },
550*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
551*f003800eSLuca Weiss };
552*f003800eSLuca Weiss 
553*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_8[] = {
554*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
555*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_MAIN, 1 },
556*f003800eSLuca Weiss 	{ P_CAM_CC_PLL5_OUT_EVEN, 2 },
557*f003800eSLuca Weiss 	{ P_CAM_CC_PLL5_OUT_MAIN, 3 },
558*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_ODD, 5 },
559*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 },
560*f003800eSLuca Weiss };
561*f003800eSLuca Weiss 
562*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_8[] = {
563*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
564*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0.clkr.hw },
565*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll5_out_even.clkr.hw },
566*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll5.clkr.hw },
567*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_odd.clkr.hw },
568*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
569*f003800eSLuca Weiss };
570*f003800eSLuca Weiss 
571*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_9[] = {
572*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
573*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_MAIN, 1 },
574*f003800eSLuca Weiss 	{ P_CAM_CC_PLL6_OUT_EVEN, 2 },
575*f003800eSLuca Weiss 	{ P_CAM_CC_PLL6_OUT_MAIN, 3 },
576*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_ODD, 5 },
577*f003800eSLuca Weiss 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 },
578*f003800eSLuca Weiss };
579*f003800eSLuca Weiss 
580*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_9[] = {
581*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
582*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0.clkr.hw },
583*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll6_out_even.clkr.hw },
584*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll6.clkr.hw },
585*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_odd.clkr.hw },
586*f003800eSLuca Weiss 	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
587*f003800eSLuca Weiss };
588*f003800eSLuca Weiss 
589*f003800eSLuca Weiss static const struct parent_map cam_cc_parent_map_10[] = {
590*f003800eSLuca Weiss 	{ P_BI_TCXO, 0 },
591*f003800eSLuca Weiss };
592*f003800eSLuca Weiss 
593*f003800eSLuca Weiss static const struct clk_parent_data cam_cc_parent_data_10[] = {
594*f003800eSLuca Weiss 	{ .index = DT_BI_TCXO },
595*f003800eSLuca Weiss };
596*f003800eSLuca Weiss 
597*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_bps_clk_src[] = {
598*f003800eSLuca Weiss 	F(300000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0),
599*f003800eSLuca Weiss 	F(410000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0),
600*f003800eSLuca Weiss 	F(460000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0),
601*f003800eSLuca Weiss 	F(600000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0),
602*f003800eSLuca Weiss 	F(700000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0),
603*f003800eSLuca Weiss 	{ }
604*f003800eSLuca Weiss };
605*f003800eSLuca Weiss 
606*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_bps_clk_src = {
607*f003800eSLuca Weiss 	.cmd_rcgr = 0x1a004,
608*f003800eSLuca Weiss 	.mnd_width = 0,
609*f003800eSLuca Weiss 	.hid_width = 5,
610*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_2,
611*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_bps_clk_src,
612*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
613*f003800eSLuca Weiss 		.name = "cam_cc_bps_clk_src",
614*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_2,
615*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
616*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
617*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
618*f003800eSLuca Weiss 	},
619*f003800eSLuca Weiss };
620*f003800eSLuca Weiss 
621*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_camnoc_axi_clk_src[] = {
622*f003800eSLuca Weiss 	F(150000000, P_CAM_CC_PLL0_OUT_EVEN, 4, 0, 0),
623*f003800eSLuca Weiss 	F(240000000, P_CAM_CC_PLL0_OUT_EVEN, 2.5, 0, 0),
624*f003800eSLuca Weiss 	F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
625*f003800eSLuca Weiss 	F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0),
626*f003800eSLuca Weiss 	{ }
627*f003800eSLuca Weiss };
628*f003800eSLuca Weiss 
629*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_camnoc_axi_clk_src = {
630*f003800eSLuca Weiss 	.cmd_rcgr = 0x2401c,
631*f003800eSLuca Weiss 	.mnd_width = 0,
632*f003800eSLuca Weiss 	.hid_width = 5,
633*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
634*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_camnoc_axi_clk_src,
635*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
636*f003800eSLuca Weiss 		.name = "cam_cc_camnoc_axi_clk_src",
637*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
638*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
639*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
640*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
641*f003800eSLuca Weiss 	},
642*f003800eSLuca Weiss };
643*f003800eSLuca Weiss 
644*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_cci_0_clk_src[] = {
645*f003800eSLuca Weiss 	F(37500000, P_CAM_CC_PLL0_OUT_EVEN, 16, 0, 0),
646*f003800eSLuca Weiss 	F(50000000, P_CAM_CC_PLL0_OUT_EVEN, 12, 0, 0),
647*f003800eSLuca Weiss 	F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
648*f003800eSLuca Weiss 	{ }
649*f003800eSLuca Weiss };
650*f003800eSLuca Weiss 
651*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_cci_0_clk_src = {
652*f003800eSLuca Weiss 	.cmd_rcgr = 0x21004,
653*f003800eSLuca Weiss 	.mnd_width = 8,
654*f003800eSLuca Weiss 	.hid_width = 5,
655*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_3,
656*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
657*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
658*f003800eSLuca Weiss 		.name = "cam_cc_cci_0_clk_src",
659*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_3,
660*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
661*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
662*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
663*f003800eSLuca Weiss 	},
664*f003800eSLuca Weiss };
665*f003800eSLuca Weiss 
666*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_cci_1_clk_src = {
667*f003800eSLuca Weiss 	.cmd_rcgr = 0x22004,
668*f003800eSLuca Weiss 	.mnd_width = 8,
669*f003800eSLuca Weiss 	.hid_width = 5,
670*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_3,
671*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
672*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
673*f003800eSLuca Weiss 		.name = "cam_cc_cci_1_clk_src",
674*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_3,
675*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
676*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
677*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
678*f003800eSLuca Weiss 	},
679*f003800eSLuca Weiss };
680*f003800eSLuca Weiss 
681*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = {
682*f003800eSLuca Weiss 	F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
683*f003800eSLuca Weiss 	F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
684*f003800eSLuca Weiss 	F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0),
685*f003800eSLuca Weiss 	{ }
686*f003800eSLuca Weiss };
687*f003800eSLuca Weiss 
688*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_cphy_rx_clk_src = {
689*f003800eSLuca Weiss 	.cmd_rcgr = 0x1c05c,
690*f003800eSLuca Weiss 	.mnd_width = 0,
691*f003800eSLuca Weiss 	.hid_width = 5,
692*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
693*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
694*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
695*f003800eSLuca Weiss 		.name = "cam_cc_cphy_rx_clk_src",
696*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
697*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
698*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
699*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
700*f003800eSLuca Weiss 	},
701*f003800eSLuca Weiss };
702*f003800eSLuca Weiss 
703*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_cre_clk_src[] = {
704*f003800eSLuca Weiss 	F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
705*f003800eSLuca Weiss 	F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0),
706*f003800eSLuca Weiss 	F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0),
707*f003800eSLuca Weiss 	{ }
708*f003800eSLuca Weiss };
709*f003800eSLuca Weiss 
710*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_cre_clk_src = {
711*f003800eSLuca Weiss 	.cmd_rcgr = 0x27004,
712*f003800eSLuca Weiss 	.mnd_width = 0,
713*f003800eSLuca Weiss 	.hid_width = 5,
714*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_2,
715*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_cre_clk_src,
716*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
717*f003800eSLuca Weiss 		.name = "cam_cc_cre_clk_src",
718*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_2,
719*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
720*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
721*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
722*f003800eSLuca Weiss 	},
723*f003800eSLuca Weiss };
724*f003800eSLuca Weiss 
725*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_csi0phytimer_clk_src[] = {
726*f003800eSLuca Weiss 	F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
727*f003800eSLuca Weiss 	{ }
728*f003800eSLuca Weiss };
729*f003800eSLuca Weiss 
730*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
731*f003800eSLuca Weiss 	.cmd_rcgr = 0x19004,
732*f003800eSLuca Weiss 	.mnd_width = 0,
733*f003800eSLuca Weiss 	.hid_width = 5,
734*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
735*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
736*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
737*f003800eSLuca Weiss 		.name = "cam_cc_csi0phytimer_clk_src",
738*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
739*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
740*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
741*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
742*f003800eSLuca Weiss 	},
743*f003800eSLuca Weiss };
744*f003800eSLuca Weiss 
745*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
746*f003800eSLuca Weiss 	.cmd_rcgr = 0x19028,
747*f003800eSLuca Weiss 	.mnd_width = 0,
748*f003800eSLuca Weiss 	.hid_width = 5,
749*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
750*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
751*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
752*f003800eSLuca Weiss 		.name = "cam_cc_csi1phytimer_clk_src",
753*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
754*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
755*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
756*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
757*f003800eSLuca Weiss 	},
758*f003800eSLuca Weiss };
759*f003800eSLuca Weiss 
760*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = {
761*f003800eSLuca Weiss 	.cmd_rcgr = 0x1904c,
762*f003800eSLuca Weiss 	.mnd_width = 0,
763*f003800eSLuca Weiss 	.hid_width = 5,
764*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
765*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
766*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
767*f003800eSLuca Weiss 		.name = "cam_cc_csi2phytimer_clk_src",
768*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
769*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
770*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
771*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
772*f003800eSLuca Weiss 	},
773*f003800eSLuca Weiss };
774*f003800eSLuca Weiss 
775*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = {
776*f003800eSLuca Weiss 	.cmd_rcgr = 0x19070,
777*f003800eSLuca Weiss 	.mnd_width = 0,
778*f003800eSLuca Weiss 	.hid_width = 5,
779*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
780*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
781*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
782*f003800eSLuca Weiss 		.name = "cam_cc_csi3phytimer_clk_src",
783*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
784*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
785*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
786*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
787*f003800eSLuca Weiss 	},
788*f003800eSLuca Weiss };
789*f003800eSLuca Weiss 
790*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_fast_ahb_clk_src[] = {
791*f003800eSLuca Weiss 	F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
792*f003800eSLuca Weiss 	F(150000000, P_CAM_CC_PLL0_OUT_EVEN, 4, 0, 0),
793*f003800eSLuca Weiss 	F(200000000, P_CAM_CC_PLL0_OUT_MAIN, 6, 0, 0),
794*f003800eSLuca Weiss 	F(240000000, P_CAM_CC_PLL0_OUT_MAIN, 5, 0, 0),
795*f003800eSLuca Weiss 	{ }
796*f003800eSLuca Weiss };
797*f003800eSLuca Weiss 
798*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
799*f003800eSLuca Weiss 	.cmd_rcgr = 0x1a030,
800*f003800eSLuca Weiss 	.mnd_width = 0,
801*f003800eSLuca Weiss 	.hid_width = 5,
802*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
803*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_fast_ahb_clk_src,
804*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
805*f003800eSLuca Weiss 		.name = "cam_cc_fast_ahb_clk_src",
806*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
807*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
808*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
809*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
810*f003800eSLuca Weiss 	},
811*f003800eSLuca Weiss };
812*f003800eSLuca Weiss 
813*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_icp_clk_src[] = {
814*f003800eSLuca Weiss 	F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
815*f003800eSLuca Weiss 	F(480000000, P_CAM_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
816*f003800eSLuca Weiss 	F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0),
817*f003800eSLuca Weiss 	{ }
818*f003800eSLuca Weiss };
819*f003800eSLuca Weiss 
820*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_icp_clk_src = {
821*f003800eSLuca Weiss 	.cmd_rcgr = 0x20014,
822*f003800eSLuca Weiss 	.mnd_width = 0,
823*f003800eSLuca Weiss 	.hid_width = 5,
824*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_4,
825*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_icp_clk_src,
826*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
827*f003800eSLuca Weiss 		.name = "cam_cc_icp_clk_src",
828*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_4,
829*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
830*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
831*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
832*f003800eSLuca Weiss 	},
833*f003800eSLuca Weiss };
834*f003800eSLuca Weiss 
835*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = {
836*f003800eSLuca Weiss 	F(19200000, P_CAM_CC_PLL2_OUT_MAIN, 1, 1, 50),
837*f003800eSLuca Weiss 	F(24000000, P_CAM_CC_PLL2_OUT_MAIN, 10, 1, 4),
838*f003800eSLuca Weiss 	F(64000000, P_CAM_CC_PLL2_OUT_MAIN, 15, 0, 0),
839*f003800eSLuca Weiss 	{ }
840*f003800eSLuca Weiss };
841*f003800eSLuca Weiss 
842*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk0_clk_src = {
843*f003800eSLuca Weiss 	.cmd_rcgr = 0x18004,
844*f003800eSLuca Weiss 	.mnd_width = 8,
845*f003800eSLuca Weiss 	.hid_width = 5,
846*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_1,
847*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
848*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
849*f003800eSLuca Weiss 		.name = "cam_cc_mclk0_clk_src",
850*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_1,
851*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
852*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
853*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
854*f003800eSLuca Weiss 	},
855*f003800eSLuca Weiss };
856*f003800eSLuca Weiss 
857*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk1_clk_src = {
858*f003800eSLuca Weiss 	.cmd_rcgr = 0x18024,
859*f003800eSLuca Weiss 	.mnd_width = 8,
860*f003800eSLuca Weiss 	.hid_width = 5,
861*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_1,
862*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
863*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
864*f003800eSLuca Weiss 		.name = "cam_cc_mclk1_clk_src",
865*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_1,
866*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
867*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
868*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
869*f003800eSLuca Weiss 	},
870*f003800eSLuca Weiss };
871*f003800eSLuca Weiss 
872*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk2_clk_src = {
873*f003800eSLuca Weiss 	.cmd_rcgr = 0x18044,
874*f003800eSLuca Weiss 	.mnd_width = 8,
875*f003800eSLuca Weiss 	.hid_width = 5,
876*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_1,
877*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
878*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
879*f003800eSLuca Weiss 		.name = "cam_cc_mclk2_clk_src",
880*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_1,
881*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
882*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
883*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
884*f003800eSLuca Weiss 	},
885*f003800eSLuca Weiss };
886*f003800eSLuca Weiss 
887*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk3_clk_src = {
888*f003800eSLuca Weiss 	.cmd_rcgr = 0x18064,
889*f003800eSLuca Weiss 	.mnd_width = 8,
890*f003800eSLuca Weiss 	.hid_width = 5,
891*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_1,
892*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
893*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
894*f003800eSLuca Weiss 		.name = "cam_cc_mclk3_clk_src",
895*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_1,
896*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
897*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
898*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
899*f003800eSLuca Weiss 	},
900*f003800eSLuca Weiss };
901*f003800eSLuca Weiss 
902*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_mclk4_clk_src = {
903*f003800eSLuca Weiss 	.cmd_rcgr = 0x18084,
904*f003800eSLuca Weiss 	.mnd_width = 8,
905*f003800eSLuca Weiss 	.hid_width = 5,
906*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_1,
907*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
908*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
909*f003800eSLuca Weiss 		.name = "cam_cc_mclk4_clk_src",
910*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_1,
911*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
912*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
913*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
914*f003800eSLuca Weiss 	},
915*f003800eSLuca Weiss };
916*f003800eSLuca Weiss 
917*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_ope_0_clk_src[] = {
918*f003800eSLuca Weiss 	F(300000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
919*f003800eSLuca Weiss 	F(410000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
920*f003800eSLuca Weiss 	F(520000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
921*f003800eSLuca Weiss 	F(645000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
922*f003800eSLuca Weiss 	F(700000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
923*f003800eSLuca Weiss 	{ }
924*f003800eSLuca Weiss };
925*f003800eSLuca Weiss 
926*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_ope_0_clk_src = {
927*f003800eSLuca Weiss 	.cmd_rcgr = 0x1b004,
928*f003800eSLuca Weiss 	.mnd_width = 0,
929*f003800eSLuca Weiss 	.hid_width = 5,
930*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_5,
931*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_ope_0_clk_src,
932*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
933*f003800eSLuca Weiss 		.name = "cam_cc_ope_0_clk_src",
934*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_5,
935*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_5),
936*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
937*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
938*f003800eSLuca Weiss 	},
939*f003800eSLuca Weiss };
940*f003800eSLuca Weiss 
941*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_sleep_clk_src[] = {
942*f003800eSLuca Weiss 	F(32000, P_SLEEP_CLK, 1, 0, 0),
943*f003800eSLuca Weiss 	{ }
944*f003800eSLuca Weiss };
945*f003800eSLuca Weiss 
946*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_sleep_clk_src = {
947*f003800eSLuca Weiss 	.cmd_rcgr = 0x25044,
948*f003800eSLuca Weiss 	.mnd_width = 0,
949*f003800eSLuca Weiss 	.hid_width = 5,
950*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_6,
951*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_sleep_clk_src,
952*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
953*f003800eSLuca Weiss 		.name = "cam_cc_sleep_clk_src",
954*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_6_ao,
955*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_6_ao),
956*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
957*f003800eSLuca Weiss 		.ops = &clk_rcg2_ops,
958*f003800eSLuca Weiss 	},
959*f003800eSLuca Weiss };
960*f003800eSLuca Weiss 
961*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_slow_ahb_clk_src[] = {
962*f003800eSLuca Weiss 	F(80000000, P_CAM_CC_PLL0_OUT_EVEN, 7.5, 0, 0),
963*f003800eSLuca Weiss 	{ }
964*f003800eSLuca Weiss };
965*f003800eSLuca Weiss 
966*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
967*f003800eSLuca Weiss 	.cmd_rcgr = 0x1a04c,
968*f003800eSLuca Weiss 	.mnd_width = 0,
969*f003800eSLuca Weiss 	.hid_width = 5,
970*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
971*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_slow_ahb_clk_src,
972*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
973*f003800eSLuca Weiss 		.name = "cam_cc_slow_ahb_clk_src",
974*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
975*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
976*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
977*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
978*f003800eSLuca Weiss 	},
979*f003800eSLuca Weiss };
980*f003800eSLuca Weiss 
981*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_tfe_0_clk_src[] = {
982*f003800eSLuca Weiss 	F(350000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
983*f003800eSLuca Weiss 	F(570000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
984*f003800eSLuca Weiss 	F(600000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
985*f003800eSLuca Weiss 	F(725000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
986*f003800eSLuca Weiss 	{ }
987*f003800eSLuca Weiss };
988*f003800eSLuca Weiss 
989*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_0_clk_src = {
990*f003800eSLuca Weiss 	.cmd_rcgr = 0x1c004,
991*f003800eSLuca Weiss 	.mnd_width = 0,
992*f003800eSLuca Weiss 	.hid_width = 5,
993*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_7,
994*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_tfe_0_clk_src,
995*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
996*f003800eSLuca Weiss 		.name = "cam_cc_tfe_0_clk_src",
997*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_7,
998*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_7),
999*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
1000*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
1001*f003800eSLuca Weiss 	},
1002*f003800eSLuca Weiss };
1003*f003800eSLuca Weiss 
1004*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_0_csid_clk_src = {
1005*f003800eSLuca Weiss 	.cmd_rcgr = 0x1c030,
1006*f003800eSLuca Weiss 	.mnd_width = 0,
1007*f003800eSLuca Weiss 	.hid_width = 5,
1008*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
1009*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
1010*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
1011*f003800eSLuca Weiss 		.name = "cam_cc_tfe_0_csid_clk_src",
1012*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
1013*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
1014*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
1015*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
1016*f003800eSLuca Weiss 	},
1017*f003800eSLuca Weiss };
1018*f003800eSLuca Weiss 
1019*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_tfe_1_clk_src[] = {
1020*f003800eSLuca Weiss 	F(350000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
1021*f003800eSLuca Weiss 	F(570000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
1022*f003800eSLuca Weiss 	F(600000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
1023*f003800eSLuca Weiss 	F(725000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
1024*f003800eSLuca Weiss 	{ }
1025*f003800eSLuca Weiss };
1026*f003800eSLuca Weiss 
1027*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_1_clk_src = {
1028*f003800eSLuca Weiss 	.cmd_rcgr = 0x1d004,
1029*f003800eSLuca Weiss 	.mnd_width = 0,
1030*f003800eSLuca Weiss 	.hid_width = 5,
1031*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_8,
1032*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_tfe_1_clk_src,
1033*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
1034*f003800eSLuca Weiss 		.name = "cam_cc_tfe_1_clk_src",
1035*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_8,
1036*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_8),
1037*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
1038*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
1039*f003800eSLuca Weiss 	},
1040*f003800eSLuca Weiss };
1041*f003800eSLuca Weiss 
1042*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_1_csid_clk_src = {
1043*f003800eSLuca Weiss 	.cmd_rcgr = 0x1d030,
1044*f003800eSLuca Weiss 	.mnd_width = 0,
1045*f003800eSLuca Weiss 	.hid_width = 5,
1046*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
1047*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
1048*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
1049*f003800eSLuca Weiss 		.name = "cam_cc_tfe_1_csid_clk_src",
1050*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
1051*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
1052*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
1053*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
1054*f003800eSLuca Weiss 	},
1055*f003800eSLuca Weiss };
1056*f003800eSLuca Weiss 
1057*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_tfe_2_clk_src[] = {
1058*f003800eSLuca Weiss 	F(350000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0),
1059*f003800eSLuca Weiss 	F(570000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0),
1060*f003800eSLuca Weiss 	F(600000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0),
1061*f003800eSLuca Weiss 	F(725000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0),
1062*f003800eSLuca Weiss 	{ }
1063*f003800eSLuca Weiss };
1064*f003800eSLuca Weiss 
1065*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_2_clk_src = {
1066*f003800eSLuca Weiss 	.cmd_rcgr = 0x1e004,
1067*f003800eSLuca Weiss 	.mnd_width = 0,
1068*f003800eSLuca Weiss 	.hid_width = 5,
1069*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_9,
1070*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_tfe_2_clk_src,
1071*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
1072*f003800eSLuca Weiss 		.name = "cam_cc_tfe_2_clk_src",
1073*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_9,
1074*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_9),
1075*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
1076*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
1077*f003800eSLuca Weiss 	},
1078*f003800eSLuca Weiss };
1079*f003800eSLuca Weiss 
1080*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_tfe_2_csid_clk_src = {
1081*f003800eSLuca Weiss 	.cmd_rcgr = 0x1e030,
1082*f003800eSLuca Weiss 	.mnd_width = 0,
1083*f003800eSLuca Weiss 	.hid_width = 5,
1084*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_0,
1085*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
1086*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
1087*f003800eSLuca Weiss 		.name = "cam_cc_tfe_2_csid_clk_src",
1088*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_0,
1089*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
1090*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
1091*f003800eSLuca Weiss 		.ops = &clk_rcg2_shared_ops,
1092*f003800eSLuca Weiss 	},
1093*f003800eSLuca Weiss };
1094*f003800eSLuca Weiss 
1095*f003800eSLuca Weiss static const struct freq_tbl ftbl_cam_cc_xo_clk_src[] = {
1096*f003800eSLuca Weiss 	F(19200000, P_BI_TCXO, 1, 0, 0),
1097*f003800eSLuca Weiss 	{ }
1098*f003800eSLuca Weiss };
1099*f003800eSLuca Weiss 
1100*f003800eSLuca Weiss static struct clk_rcg2 cam_cc_xo_clk_src = {
1101*f003800eSLuca Weiss 	.cmd_rcgr = 0x25020,
1102*f003800eSLuca Weiss 	.mnd_width = 0,
1103*f003800eSLuca Weiss 	.hid_width = 5,
1104*f003800eSLuca Weiss 	.parent_map = cam_cc_parent_map_10,
1105*f003800eSLuca Weiss 	.freq_tbl = ftbl_cam_cc_xo_clk_src,
1106*f003800eSLuca Weiss 	.clkr.hw.init = &(const struct clk_init_data) {
1107*f003800eSLuca Weiss 		.name = "cam_cc_xo_clk_src",
1108*f003800eSLuca Weiss 		.parent_data = cam_cc_parent_data_10,
1109*f003800eSLuca Weiss 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_10),
1110*f003800eSLuca Weiss 		.flags = CLK_SET_RATE_PARENT,
1111*f003800eSLuca Weiss 		.ops = &clk_rcg2_ops,
1112*f003800eSLuca Weiss 	},
1113*f003800eSLuca Weiss };
1114*f003800eSLuca Weiss 
1115*f003800eSLuca Weiss static struct clk_branch cam_cc_bps_ahb_clk = {
1116*f003800eSLuca Weiss 	.halt_reg = 0x1a064,
1117*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1118*f003800eSLuca Weiss 	.clkr = {
1119*f003800eSLuca Weiss 		.enable_reg = 0x1a064,
1120*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1121*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1122*f003800eSLuca Weiss 			.name = "cam_cc_bps_ahb_clk",
1123*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1124*f003800eSLuca Weiss 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1125*f003800eSLuca Weiss 			},
1126*f003800eSLuca Weiss 			.num_parents = 1,
1127*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1128*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1129*f003800eSLuca Weiss 		},
1130*f003800eSLuca Weiss 	},
1131*f003800eSLuca Weiss };
1132*f003800eSLuca Weiss 
1133*f003800eSLuca Weiss static struct clk_branch cam_cc_bps_areg_clk = {
1134*f003800eSLuca Weiss 	.halt_reg = 0x1a048,
1135*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1136*f003800eSLuca Weiss 	.clkr = {
1137*f003800eSLuca Weiss 		.enable_reg = 0x1a048,
1138*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1139*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1140*f003800eSLuca Weiss 			.name = "cam_cc_bps_areg_clk",
1141*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1142*f003800eSLuca Weiss 				&cam_cc_fast_ahb_clk_src.clkr.hw,
1143*f003800eSLuca Weiss 			},
1144*f003800eSLuca Weiss 			.num_parents = 1,
1145*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1146*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1147*f003800eSLuca Weiss 		},
1148*f003800eSLuca Weiss 	},
1149*f003800eSLuca Weiss };
1150*f003800eSLuca Weiss 
1151*f003800eSLuca Weiss static struct clk_branch cam_cc_bps_clk = {
1152*f003800eSLuca Weiss 	.halt_reg = 0x1a01c,
1153*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1154*f003800eSLuca Weiss 	.clkr = {
1155*f003800eSLuca Weiss 		.enable_reg = 0x1a01c,
1156*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1157*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1158*f003800eSLuca Weiss 			.name = "cam_cc_bps_clk",
1159*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1160*f003800eSLuca Weiss 				&cam_cc_bps_clk_src.clkr.hw,
1161*f003800eSLuca Weiss 			},
1162*f003800eSLuca Weiss 			.num_parents = 1,
1163*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1164*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1165*f003800eSLuca Weiss 		},
1166*f003800eSLuca Weiss 	},
1167*f003800eSLuca Weiss };
1168*f003800eSLuca Weiss 
1169*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_atb_clk = {
1170*f003800eSLuca Weiss 	.halt_reg = 0x24040,
1171*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1172*f003800eSLuca Weiss 	.clkr = {
1173*f003800eSLuca Weiss 		.enable_reg = 0x24040,
1174*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1175*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1176*f003800eSLuca Weiss 			.name = "cam_cc_camnoc_atb_clk",
1177*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1178*f003800eSLuca Weiss 		},
1179*f003800eSLuca Weiss 	},
1180*f003800eSLuca Weiss };
1181*f003800eSLuca Weiss 
1182*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_axi_hf_clk = {
1183*f003800eSLuca Weiss 	.halt_reg = 0x24010,
1184*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1185*f003800eSLuca Weiss 	.clkr = {
1186*f003800eSLuca Weiss 		.enable_reg = 0x24010,
1187*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1188*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1189*f003800eSLuca Weiss 			.name = "cam_cc_camnoc_axi_hf_clk",
1190*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1191*f003800eSLuca Weiss 		},
1192*f003800eSLuca Weiss 	},
1193*f003800eSLuca Weiss };
1194*f003800eSLuca Weiss 
1195*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_axi_sf_clk = {
1196*f003800eSLuca Weiss 	.halt_reg = 0x24004,
1197*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1198*f003800eSLuca Weiss 	.clkr = {
1199*f003800eSLuca Weiss 		.enable_reg = 0x24004,
1200*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1201*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1202*f003800eSLuca Weiss 			.name = "cam_cc_camnoc_axi_sf_clk",
1203*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1204*f003800eSLuca Weiss 		},
1205*f003800eSLuca Weiss 	},
1206*f003800eSLuca Weiss };
1207*f003800eSLuca Weiss 
1208*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_nrt_axi_clk = {
1209*f003800eSLuca Weiss 	.halt_reg = 0x2404c,
1210*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT_VOTED,
1211*f003800eSLuca Weiss 	.hwcg_reg = 0x2404c,
1212*f003800eSLuca Weiss 	.hwcg_bit = 1,
1213*f003800eSLuca Weiss 	.clkr = {
1214*f003800eSLuca Weiss 		.enable_reg = 0x2404c,
1215*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1216*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1217*f003800eSLuca Weiss 			.name = "cam_cc_camnoc_nrt_axi_clk",
1218*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1219*f003800eSLuca Weiss 				&cam_cc_camnoc_axi_clk_src.clkr.hw,
1220*f003800eSLuca Weiss 			},
1221*f003800eSLuca Weiss 			.num_parents = 1,
1222*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1223*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1224*f003800eSLuca Weiss 		},
1225*f003800eSLuca Weiss 	},
1226*f003800eSLuca Weiss };
1227*f003800eSLuca Weiss 
1228*f003800eSLuca Weiss static struct clk_branch cam_cc_camnoc_rt_axi_clk = {
1229*f003800eSLuca Weiss 	.halt_reg = 0x24034,
1230*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1231*f003800eSLuca Weiss 	.clkr = {
1232*f003800eSLuca Weiss 		.enable_reg = 0x24034,
1233*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1234*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1235*f003800eSLuca Weiss 			.name = "cam_cc_camnoc_rt_axi_clk",
1236*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1237*f003800eSLuca Weiss 				&cam_cc_camnoc_axi_clk_src.clkr.hw,
1238*f003800eSLuca Weiss 			},
1239*f003800eSLuca Weiss 			.num_parents = 1,
1240*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1241*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1242*f003800eSLuca Weiss 		},
1243*f003800eSLuca Weiss 	},
1244*f003800eSLuca Weiss };
1245*f003800eSLuca Weiss 
1246*f003800eSLuca Weiss static struct clk_branch cam_cc_cci_0_clk = {
1247*f003800eSLuca Weiss 	.halt_reg = 0x2101c,
1248*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1249*f003800eSLuca Weiss 	.clkr = {
1250*f003800eSLuca Weiss 		.enable_reg = 0x2101c,
1251*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1252*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1253*f003800eSLuca Weiss 			.name = "cam_cc_cci_0_clk",
1254*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1255*f003800eSLuca Weiss 				&cam_cc_cci_0_clk_src.clkr.hw,
1256*f003800eSLuca Weiss 			},
1257*f003800eSLuca Weiss 			.num_parents = 1,
1258*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1259*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1260*f003800eSLuca Weiss 		},
1261*f003800eSLuca Weiss 	},
1262*f003800eSLuca Weiss };
1263*f003800eSLuca Weiss 
1264*f003800eSLuca Weiss static struct clk_branch cam_cc_cci_1_clk = {
1265*f003800eSLuca Weiss 	.halt_reg = 0x2201c,
1266*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1267*f003800eSLuca Weiss 	.clkr = {
1268*f003800eSLuca Weiss 		.enable_reg = 0x2201c,
1269*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1270*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1271*f003800eSLuca Weiss 			.name = "cam_cc_cci_1_clk",
1272*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1273*f003800eSLuca Weiss 				&cam_cc_cci_1_clk_src.clkr.hw,
1274*f003800eSLuca Weiss 			},
1275*f003800eSLuca Weiss 			.num_parents = 1,
1276*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1277*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1278*f003800eSLuca Weiss 		},
1279*f003800eSLuca Weiss 	},
1280*f003800eSLuca Weiss };
1281*f003800eSLuca Weiss 
1282*f003800eSLuca Weiss static struct clk_branch cam_cc_core_ahb_clk = {
1283*f003800eSLuca Weiss 	.halt_reg = 0x2501c,
1284*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT_DELAY,
1285*f003800eSLuca Weiss 	.clkr = {
1286*f003800eSLuca Weiss 		.enable_reg = 0x2501c,
1287*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1288*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1289*f003800eSLuca Weiss 			.name = "cam_cc_core_ahb_clk",
1290*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1291*f003800eSLuca Weiss 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1292*f003800eSLuca Weiss 			},
1293*f003800eSLuca Weiss 			.num_parents = 1,
1294*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1295*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1296*f003800eSLuca Weiss 		},
1297*f003800eSLuca Weiss 	},
1298*f003800eSLuca Weiss };
1299*f003800eSLuca Weiss 
1300*f003800eSLuca Weiss static struct clk_branch cam_cc_cpas_ahb_clk = {
1301*f003800eSLuca Weiss 	.halt_reg = 0x23004,
1302*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1303*f003800eSLuca Weiss 	.clkr = {
1304*f003800eSLuca Weiss 		.enable_reg = 0x23004,
1305*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1306*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1307*f003800eSLuca Weiss 			.name = "cam_cc_cpas_ahb_clk",
1308*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1309*f003800eSLuca Weiss 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1310*f003800eSLuca Weiss 			},
1311*f003800eSLuca Weiss 			.num_parents = 1,
1312*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1313*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1314*f003800eSLuca Weiss 		},
1315*f003800eSLuca Weiss 	},
1316*f003800eSLuca Weiss };
1317*f003800eSLuca Weiss 
1318*f003800eSLuca Weiss static struct clk_branch cam_cc_cre_ahb_clk = {
1319*f003800eSLuca Weiss 	.halt_reg = 0x27020,
1320*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1321*f003800eSLuca Weiss 	.clkr = {
1322*f003800eSLuca Weiss 		.enable_reg = 0x27020,
1323*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1324*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1325*f003800eSLuca Weiss 			.name = "cam_cc_cre_ahb_clk",
1326*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1327*f003800eSLuca Weiss 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1328*f003800eSLuca Weiss 			},
1329*f003800eSLuca Weiss 			.num_parents = 1,
1330*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1331*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1332*f003800eSLuca Weiss 		},
1333*f003800eSLuca Weiss 	},
1334*f003800eSLuca Weiss };
1335*f003800eSLuca Weiss 
1336*f003800eSLuca Weiss static struct clk_branch cam_cc_cre_clk = {
1337*f003800eSLuca Weiss 	.halt_reg = 0x2701c,
1338*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1339*f003800eSLuca Weiss 	.clkr = {
1340*f003800eSLuca Weiss 		.enable_reg = 0x2701c,
1341*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1342*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1343*f003800eSLuca Weiss 			.name = "cam_cc_cre_clk",
1344*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1345*f003800eSLuca Weiss 				&cam_cc_cre_clk_src.clkr.hw,
1346*f003800eSLuca Weiss 			},
1347*f003800eSLuca Weiss 			.num_parents = 1,
1348*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1349*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1350*f003800eSLuca Weiss 		},
1351*f003800eSLuca Weiss 	},
1352*f003800eSLuca Weiss };
1353*f003800eSLuca Weiss 
1354*f003800eSLuca Weiss static struct clk_branch cam_cc_csi0phytimer_clk = {
1355*f003800eSLuca Weiss 	.halt_reg = 0x1901c,
1356*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1357*f003800eSLuca Weiss 	.clkr = {
1358*f003800eSLuca Weiss 		.enable_reg = 0x1901c,
1359*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1360*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1361*f003800eSLuca Weiss 			.name = "cam_cc_csi0phytimer_clk",
1362*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1363*f003800eSLuca Weiss 				&cam_cc_csi0phytimer_clk_src.clkr.hw,
1364*f003800eSLuca Weiss 			},
1365*f003800eSLuca Weiss 			.num_parents = 1,
1366*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1367*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1368*f003800eSLuca Weiss 		},
1369*f003800eSLuca Weiss 	},
1370*f003800eSLuca Weiss };
1371*f003800eSLuca Weiss 
1372*f003800eSLuca Weiss static struct clk_branch cam_cc_csi1phytimer_clk = {
1373*f003800eSLuca Weiss 	.halt_reg = 0x19040,
1374*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1375*f003800eSLuca Weiss 	.clkr = {
1376*f003800eSLuca Weiss 		.enable_reg = 0x19040,
1377*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1378*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1379*f003800eSLuca Weiss 			.name = "cam_cc_csi1phytimer_clk",
1380*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1381*f003800eSLuca Weiss 				&cam_cc_csi1phytimer_clk_src.clkr.hw,
1382*f003800eSLuca Weiss 			},
1383*f003800eSLuca Weiss 			.num_parents = 1,
1384*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1385*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1386*f003800eSLuca Weiss 		},
1387*f003800eSLuca Weiss 	},
1388*f003800eSLuca Weiss };
1389*f003800eSLuca Weiss 
1390*f003800eSLuca Weiss static struct clk_branch cam_cc_csi2phytimer_clk = {
1391*f003800eSLuca Weiss 	.halt_reg = 0x19064,
1392*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1393*f003800eSLuca Weiss 	.clkr = {
1394*f003800eSLuca Weiss 		.enable_reg = 0x19064,
1395*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1396*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1397*f003800eSLuca Weiss 			.name = "cam_cc_csi2phytimer_clk",
1398*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1399*f003800eSLuca Weiss 				&cam_cc_csi2phytimer_clk_src.clkr.hw,
1400*f003800eSLuca Weiss 			},
1401*f003800eSLuca Weiss 			.num_parents = 1,
1402*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1403*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1404*f003800eSLuca Weiss 		},
1405*f003800eSLuca Weiss 	},
1406*f003800eSLuca Weiss };
1407*f003800eSLuca Weiss 
1408*f003800eSLuca Weiss static struct clk_branch cam_cc_csi3phytimer_clk = {
1409*f003800eSLuca Weiss 	.halt_reg = 0x19088,
1410*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1411*f003800eSLuca Weiss 	.clkr = {
1412*f003800eSLuca Weiss 		.enable_reg = 0x19088,
1413*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1414*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1415*f003800eSLuca Weiss 			.name = "cam_cc_csi3phytimer_clk",
1416*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1417*f003800eSLuca Weiss 				&cam_cc_csi3phytimer_clk_src.clkr.hw,
1418*f003800eSLuca Weiss 			},
1419*f003800eSLuca Weiss 			.num_parents = 1,
1420*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1421*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1422*f003800eSLuca Weiss 		},
1423*f003800eSLuca Weiss 	},
1424*f003800eSLuca Weiss };
1425*f003800eSLuca Weiss 
1426*f003800eSLuca Weiss static struct clk_branch cam_cc_csiphy0_clk = {
1427*f003800eSLuca Weiss 	.halt_reg = 0x19020,
1428*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1429*f003800eSLuca Weiss 	.clkr = {
1430*f003800eSLuca Weiss 		.enable_reg = 0x19020,
1431*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1432*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1433*f003800eSLuca Weiss 			.name = "cam_cc_csiphy0_clk",
1434*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1435*f003800eSLuca Weiss 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1436*f003800eSLuca Weiss 			},
1437*f003800eSLuca Weiss 			.num_parents = 1,
1438*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1439*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1440*f003800eSLuca Weiss 		},
1441*f003800eSLuca Weiss 	},
1442*f003800eSLuca Weiss };
1443*f003800eSLuca Weiss 
1444*f003800eSLuca Weiss static struct clk_branch cam_cc_csiphy1_clk = {
1445*f003800eSLuca Weiss 	.halt_reg = 0x19044,
1446*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1447*f003800eSLuca Weiss 	.clkr = {
1448*f003800eSLuca Weiss 		.enable_reg = 0x19044,
1449*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1450*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1451*f003800eSLuca Weiss 			.name = "cam_cc_csiphy1_clk",
1452*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1453*f003800eSLuca Weiss 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1454*f003800eSLuca Weiss 			},
1455*f003800eSLuca Weiss 			.num_parents = 1,
1456*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1457*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1458*f003800eSLuca Weiss 		},
1459*f003800eSLuca Weiss 	},
1460*f003800eSLuca Weiss };
1461*f003800eSLuca Weiss 
1462*f003800eSLuca Weiss static struct clk_branch cam_cc_csiphy2_clk = {
1463*f003800eSLuca Weiss 	.halt_reg = 0x19068,
1464*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1465*f003800eSLuca Weiss 	.clkr = {
1466*f003800eSLuca Weiss 		.enable_reg = 0x19068,
1467*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1468*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1469*f003800eSLuca Weiss 			.name = "cam_cc_csiphy2_clk",
1470*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1471*f003800eSLuca Weiss 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1472*f003800eSLuca Weiss 			},
1473*f003800eSLuca Weiss 			.num_parents = 1,
1474*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1475*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1476*f003800eSLuca Weiss 		},
1477*f003800eSLuca Weiss 	},
1478*f003800eSLuca Weiss };
1479*f003800eSLuca Weiss 
1480*f003800eSLuca Weiss static struct clk_branch cam_cc_csiphy3_clk = {
1481*f003800eSLuca Weiss 	.halt_reg = 0x1908c,
1482*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1483*f003800eSLuca Weiss 	.clkr = {
1484*f003800eSLuca Weiss 		.enable_reg = 0x1908c,
1485*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1486*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1487*f003800eSLuca Weiss 			.name = "cam_cc_csiphy3_clk",
1488*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1489*f003800eSLuca Weiss 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1490*f003800eSLuca Weiss 			},
1491*f003800eSLuca Weiss 			.num_parents = 1,
1492*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1493*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1494*f003800eSLuca Weiss 		},
1495*f003800eSLuca Weiss 	},
1496*f003800eSLuca Weiss };
1497*f003800eSLuca Weiss 
1498*f003800eSLuca Weiss static struct clk_branch cam_cc_icp_atb_clk = {
1499*f003800eSLuca Weiss 	.halt_reg = 0x20004,
1500*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1501*f003800eSLuca Weiss 	.clkr = {
1502*f003800eSLuca Weiss 		.enable_reg = 0x20004,
1503*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1504*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1505*f003800eSLuca Weiss 			.name = "cam_cc_icp_atb_clk",
1506*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1507*f003800eSLuca Weiss 		},
1508*f003800eSLuca Weiss 	},
1509*f003800eSLuca Weiss };
1510*f003800eSLuca Weiss 
1511*f003800eSLuca Weiss static struct clk_branch cam_cc_icp_clk = {
1512*f003800eSLuca Weiss 	.halt_reg = 0x2002c,
1513*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1514*f003800eSLuca Weiss 	.clkr = {
1515*f003800eSLuca Weiss 		.enable_reg = 0x2002c,
1516*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1517*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1518*f003800eSLuca Weiss 			.name = "cam_cc_icp_clk",
1519*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1520*f003800eSLuca Weiss 				&cam_cc_icp_clk_src.clkr.hw,
1521*f003800eSLuca Weiss 			},
1522*f003800eSLuca Weiss 			.num_parents = 1,
1523*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1524*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1525*f003800eSLuca Weiss 		},
1526*f003800eSLuca Weiss 	},
1527*f003800eSLuca Weiss };
1528*f003800eSLuca Weiss 
1529*f003800eSLuca Weiss static struct clk_branch cam_cc_icp_cti_clk = {
1530*f003800eSLuca Weiss 	.halt_reg = 0x20008,
1531*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1532*f003800eSLuca Weiss 	.clkr = {
1533*f003800eSLuca Weiss 		.enable_reg = 0x20008,
1534*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1535*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1536*f003800eSLuca Weiss 			.name = "cam_cc_icp_cti_clk",
1537*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1538*f003800eSLuca Weiss 		},
1539*f003800eSLuca Weiss 	},
1540*f003800eSLuca Weiss };
1541*f003800eSLuca Weiss 
1542*f003800eSLuca Weiss static struct clk_branch cam_cc_icp_ts_clk = {
1543*f003800eSLuca Weiss 	.halt_reg = 0x2000c,
1544*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1545*f003800eSLuca Weiss 	.clkr = {
1546*f003800eSLuca Weiss 		.enable_reg = 0x2000c,
1547*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1548*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1549*f003800eSLuca Weiss 			.name = "cam_cc_icp_ts_clk",
1550*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1551*f003800eSLuca Weiss 		},
1552*f003800eSLuca Weiss 	},
1553*f003800eSLuca Weiss };
1554*f003800eSLuca Weiss 
1555*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk0_clk = {
1556*f003800eSLuca Weiss 	.halt_reg = 0x1801c,
1557*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1558*f003800eSLuca Weiss 	.clkr = {
1559*f003800eSLuca Weiss 		.enable_reg = 0x1801c,
1560*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1561*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1562*f003800eSLuca Weiss 			.name = "cam_cc_mclk0_clk",
1563*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1564*f003800eSLuca Weiss 				&cam_cc_mclk0_clk_src.clkr.hw,
1565*f003800eSLuca Weiss 			},
1566*f003800eSLuca Weiss 			.num_parents = 1,
1567*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1568*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1569*f003800eSLuca Weiss 		},
1570*f003800eSLuca Weiss 	},
1571*f003800eSLuca Weiss };
1572*f003800eSLuca Weiss 
1573*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk1_clk = {
1574*f003800eSLuca Weiss 	.halt_reg = 0x1803c,
1575*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1576*f003800eSLuca Weiss 	.clkr = {
1577*f003800eSLuca Weiss 		.enable_reg = 0x1803c,
1578*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1579*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1580*f003800eSLuca Weiss 			.name = "cam_cc_mclk1_clk",
1581*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1582*f003800eSLuca Weiss 				&cam_cc_mclk1_clk_src.clkr.hw,
1583*f003800eSLuca Weiss 			},
1584*f003800eSLuca Weiss 			.num_parents = 1,
1585*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1586*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1587*f003800eSLuca Weiss 		},
1588*f003800eSLuca Weiss 	},
1589*f003800eSLuca Weiss };
1590*f003800eSLuca Weiss 
1591*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk2_clk = {
1592*f003800eSLuca Weiss 	.halt_reg = 0x1805c,
1593*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1594*f003800eSLuca Weiss 	.clkr = {
1595*f003800eSLuca Weiss 		.enable_reg = 0x1805c,
1596*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1597*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1598*f003800eSLuca Weiss 			.name = "cam_cc_mclk2_clk",
1599*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1600*f003800eSLuca Weiss 				&cam_cc_mclk2_clk_src.clkr.hw,
1601*f003800eSLuca Weiss 			},
1602*f003800eSLuca Weiss 			.num_parents = 1,
1603*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1604*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1605*f003800eSLuca Weiss 		},
1606*f003800eSLuca Weiss 	},
1607*f003800eSLuca Weiss };
1608*f003800eSLuca Weiss 
1609*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk3_clk = {
1610*f003800eSLuca Weiss 	.halt_reg = 0x1807c,
1611*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1612*f003800eSLuca Weiss 	.clkr = {
1613*f003800eSLuca Weiss 		.enable_reg = 0x1807c,
1614*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1615*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1616*f003800eSLuca Weiss 			.name = "cam_cc_mclk3_clk",
1617*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1618*f003800eSLuca Weiss 				&cam_cc_mclk3_clk_src.clkr.hw,
1619*f003800eSLuca Weiss 			},
1620*f003800eSLuca Weiss 			.num_parents = 1,
1621*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1622*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1623*f003800eSLuca Weiss 		},
1624*f003800eSLuca Weiss 	},
1625*f003800eSLuca Weiss };
1626*f003800eSLuca Weiss 
1627*f003800eSLuca Weiss static struct clk_branch cam_cc_mclk4_clk = {
1628*f003800eSLuca Weiss 	.halt_reg = 0x1809c,
1629*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1630*f003800eSLuca Weiss 	.clkr = {
1631*f003800eSLuca Weiss 		.enable_reg = 0x1809c,
1632*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1633*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1634*f003800eSLuca Weiss 			.name = "cam_cc_mclk4_clk",
1635*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1636*f003800eSLuca Weiss 				&cam_cc_mclk4_clk_src.clkr.hw,
1637*f003800eSLuca Weiss 			},
1638*f003800eSLuca Weiss 			.num_parents = 1,
1639*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1640*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1641*f003800eSLuca Weiss 		},
1642*f003800eSLuca Weiss 	},
1643*f003800eSLuca Weiss };
1644*f003800eSLuca Weiss 
1645*f003800eSLuca Weiss static struct clk_branch cam_cc_ope_0_ahb_clk = {
1646*f003800eSLuca Weiss 	.halt_reg = 0x1b034,
1647*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1648*f003800eSLuca Weiss 	.clkr = {
1649*f003800eSLuca Weiss 		.enable_reg = 0x1b034,
1650*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1651*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1652*f003800eSLuca Weiss 			.name = "cam_cc_ope_0_ahb_clk",
1653*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1654*f003800eSLuca Weiss 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1655*f003800eSLuca Weiss 			},
1656*f003800eSLuca Weiss 			.num_parents = 1,
1657*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1658*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1659*f003800eSLuca Weiss 		},
1660*f003800eSLuca Weiss 	},
1661*f003800eSLuca Weiss };
1662*f003800eSLuca Weiss 
1663*f003800eSLuca Weiss static struct clk_branch cam_cc_ope_0_areg_clk = {
1664*f003800eSLuca Weiss 	.halt_reg = 0x1b030,
1665*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1666*f003800eSLuca Weiss 	.clkr = {
1667*f003800eSLuca Weiss 		.enable_reg = 0x1b030,
1668*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1669*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1670*f003800eSLuca Weiss 			.name = "cam_cc_ope_0_areg_clk",
1671*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1672*f003800eSLuca Weiss 				&cam_cc_fast_ahb_clk_src.clkr.hw,
1673*f003800eSLuca Weiss 			},
1674*f003800eSLuca Weiss 			.num_parents = 1,
1675*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1676*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1677*f003800eSLuca Weiss 		},
1678*f003800eSLuca Weiss 	},
1679*f003800eSLuca Weiss };
1680*f003800eSLuca Weiss 
1681*f003800eSLuca Weiss static struct clk_branch cam_cc_ope_0_clk = {
1682*f003800eSLuca Weiss 	.halt_reg = 0x1b01c,
1683*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1684*f003800eSLuca Weiss 	.clkr = {
1685*f003800eSLuca Weiss 		.enable_reg = 0x1b01c,
1686*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1687*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1688*f003800eSLuca Weiss 			.name = "cam_cc_ope_0_clk",
1689*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1690*f003800eSLuca Weiss 				&cam_cc_ope_0_clk_src.clkr.hw,
1691*f003800eSLuca Weiss 			},
1692*f003800eSLuca Weiss 			.num_parents = 1,
1693*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1694*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1695*f003800eSLuca Weiss 		},
1696*f003800eSLuca Weiss 	},
1697*f003800eSLuca Weiss };
1698*f003800eSLuca Weiss 
1699*f003800eSLuca Weiss static struct clk_branch cam_cc_soc_ahb_clk = {
1700*f003800eSLuca Weiss 	.halt_reg = 0x25018,
1701*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1702*f003800eSLuca Weiss 	.clkr = {
1703*f003800eSLuca Weiss 		.enable_reg = 0x25018,
1704*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1705*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1706*f003800eSLuca Weiss 			.name = "cam_cc_soc_ahb_clk",
1707*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1708*f003800eSLuca Weiss 		},
1709*f003800eSLuca Weiss 	},
1710*f003800eSLuca Weiss };
1711*f003800eSLuca Weiss 
1712*f003800eSLuca Weiss static struct clk_branch cam_cc_sys_tmr_clk = {
1713*f003800eSLuca Weiss 	.halt_reg = 0x20038,
1714*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1715*f003800eSLuca Weiss 	.clkr = {
1716*f003800eSLuca Weiss 		.enable_reg = 0x20038,
1717*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1718*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1719*f003800eSLuca Weiss 			.name = "cam_cc_sys_tmr_clk",
1720*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1721*f003800eSLuca Weiss 				&cam_cc_xo_clk_src.clkr.hw,
1722*f003800eSLuca Weiss 			},
1723*f003800eSLuca Weiss 			.num_parents = 1,
1724*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1725*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1726*f003800eSLuca Weiss 		},
1727*f003800eSLuca Weiss 	},
1728*f003800eSLuca Weiss };
1729*f003800eSLuca Weiss 
1730*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_0_ahb_clk = {
1731*f003800eSLuca Weiss 	.halt_reg = 0x1c078,
1732*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1733*f003800eSLuca Weiss 	.clkr = {
1734*f003800eSLuca Weiss 		.enable_reg = 0x1c078,
1735*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1736*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1737*f003800eSLuca Weiss 			.name = "cam_cc_tfe_0_ahb_clk",
1738*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1739*f003800eSLuca Weiss 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1740*f003800eSLuca Weiss 			},
1741*f003800eSLuca Weiss 			.num_parents = 1,
1742*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1743*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1744*f003800eSLuca Weiss 		},
1745*f003800eSLuca Weiss 	},
1746*f003800eSLuca Weiss };
1747*f003800eSLuca Weiss 
1748*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_0_clk = {
1749*f003800eSLuca Weiss 	.halt_reg = 0x1c01c,
1750*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1751*f003800eSLuca Weiss 	.clkr = {
1752*f003800eSLuca Weiss 		.enable_reg = 0x1c01c,
1753*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1754*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1755*f003800eSLuca Weiss 			.name = "cam_cc_tfe_0_clk",
1756*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1757*f003800eSLuca Weiss 				&cam_cc_tfe_0_clk_src.clkr.hw,
1758*f003800eSLuca Weiss 			},
1759*f003800eSLuca Weiss 			.num_parents = 1,
1760*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1761*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1762*f003800eSLuca Weiss 		},
1763*f003800eSLuca Weiss 	},
1764*f003800eSLuca Weiss };
1765*f003800eSLuca Weiss 
1766*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_0_cphy_rx_clk = {
1767*f003800eSLuca Weiss 	.halt_reg = 0x1c074,
1768*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1769*f003800eSLuca Weiss 	.clkr = {
1770*f003800eSLuca Weiss 		.enable_reg = 0x1c074,
1771*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1772*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1773*f003800eSLuca Weiss 			.name = "cam_cc_tfe_0_cphy_rx_clk",
1774*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1775*f003800eSLuca Weiss 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1776*f003800eSLuca Weiss 			},
1777*f003800eSLuca Weiss 			.num_parents = 1,
1778*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1779*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1780*f003800eSLuca Weiss 		},
1781*f003800eSLuca Weiss 	},
1782*f003800eSLuca Weiss };
1783*f003800eSLuca Weiss 
1784*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_0_csid_clk = {
1785*f003800eSLuca Weiss 	.halt_reg = 0x1c048,
1786*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1787*f003800eSLuca Weiss 	.clkr = {
1788*f003800eSLuca Weiss 		.enable_reg = 0x1c048,
1789*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1790*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1791*f003800eSLuca Weiss 			.name = "cam_cc_tfe_0_csid_clk",
1792*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1793*f003800eSLuca Weiss 				&cam_cc_tfe_0_csid_clk_src.clkr.hw,
1794*f003800eSLuca Weiss 			},
1795*f003800eSLuca Weiss 			.num_parents = 1,
1796*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1797*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1798*f003800eSLuca Weiss 		},
1799*f003800eSLuca Weiss 	},
1800*f003800eSLuca Weiss };
1801*f003800eSLuca Weiss 
1802*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_1_ahb_clk = {
1803*f003800eSLuca Weiss 	.halt_reg = 0x1d058,
1804*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1805*f003800eSLuca Weiss 	.clkr = {
1806*f003800eSLuca Weiss 		.enable_reg = 0x1d058,
1807*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1808*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1809*f003800eSLuca Weiss 			.name = "cam_cc_tfe_1_ahb_clk",
1810*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1811*f003800eSLuca Weiss 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1812*f003800eSLuca Weiss 			},
1813*f003800eSLuca Weiss 			.num_parents = 1,
1814*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1815*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1816*f003800eSLuca Weiss 		},
1817*f003800eSLuca Weiss 	},
1818*f003800eSLuca Weiss };
1819*f003800eSLuca Weiss 
1820*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_1_clk = {
1821*f003800eSLuca Weiss 	.halt_reg = 0x1d01c,
1822*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1823*f003800eSLuca Weiss 	.clkr = {
1824*f003800eSLuca Weiss 		.enable_reg = 0x1d01c,
1825*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1826*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1827*f003800eSLuca Weiss 			.name = "cam_cc_tfe_1_clk",
1828*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1829*f003800eSLuca Weiss 				&cam_cc_tfe_1_clk_src.clkr.hw,
1830*f003800eSLuca Weiss 			},
1831*f003800eSLuca Weiss 			.num_parents = 1,
1832*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1833*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1834*f003800eSLuca Weiss 		},
1835*f003800eSLuca Weiss 	},
1836*f003800eSLuca Weiss };
1837*f003800eSLuca Weiss 
1838*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_1_cphy_rx_clk = {
1839*f003800eSLuca Weiss 	.halt_reg = 0x1d054,
1840*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1841*f003800eSLuca Weiss 	.clkr = {
1842*f003800eSLuca Weiss 		.enable_reg = 0x1d054,
1843*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1844*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1845*f003800eSLuca Weiss 			.name = "cam_cc_tfe_1_cphy_rx_clk",
1846*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1847*f003800eSLuca Weiss 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1848*f003800eSLuca Weiss 			},
1849*f003800eSLuca Weiss 			.num_parents = 1,
1850*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1851*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1852*f003800eSLuca Weiss 		},
1853*f003800eSLuca Weiss 	},
1854*f003800eSLuca Weiss };
1855*f003800eSLuca Weiss 
1856*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_1_csid_clk = {
1857*f003800eSLuca Weiss 	.halt_reg = 0x1d048,
1858*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1859*f003800eSLuca Weiss 	.clkr = {
1860*f003800eSLuca Weiss 		.enable_reg = 0x1d048,
1861*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1862*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1863*f003800eSLuca Weiss 			.name = "cam_cc_tfe_1_csid_clk",
1864*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1865*f003800eSLuca Weiss 				&cam_cc_tfe_1_csid_clk_src.clkr.hw,
1866*f003800eSLuca Weiss 			},
1867*f003800eSLuca Weiss 			.num_parents = 1,
1868*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1869*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1870*f003800eSLuca Weiss 		},
1871*f003800eSLuca Weiss 	},
1872*f003800eSLuca Weiss };
1873*f003800eSLuca Weiss 
1874*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_2_ahb_clk = {
1875*f003800eSLuca Weiss 	.halt_reg = 0x1e058,
1876*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1877*f003800eSLuca Weiss 	.clkr = {
1878*f003800eSLuca Weiss 		.enable_reg = 0x1e058,
1879*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1880*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1881*f003800eSLuca Weiss 			.name = "cam_cc_tfe_2_ahb_clk",
1882*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1883*f003800eSLuca Weiss 				&cam_cc_slow_ahb_clk_src.clkr.hw,
1884*f003800eSLuca Weiss 			},
1885*f003800eSLuca Weiss 			.num_parents = 1,
1886*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1887*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1888*f003800eSLuca Weiss 		},
1889*f003800eSLuca Weiss 	},
1890*f003800eSLuca Weiss };
1891*f003800eSLuca Weiss 
1892*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_2_clk = {
1893*f003800eSLuca Weiss 	.halt_reg = 0x1e01c,
1894*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1895*f003800eSLuca Weiss 	.clkr = {
1896*f003800eSLuca Weiss 		.enable_reg = 0x1e01c,
1897*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1898*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1899*f003800eSLuca Weiss 			.name = "cam_cc_tfe_2_clk",
1900*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1901*f003800eSLuca Weiss 				&cam_cc_tfe_2_clk_src.clkr.hw,
1902*f003800eSLuca Weiss 			},
1903*f003800eSLuca Weiss 			.num_parents = 1,
1904*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1905*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1906*f003800eSLuca Weiss 		},
1907*f003800eSLuca Weiss 	},
1908*f003800eSLuca Weiss };
1909*f003800eSLuca Weiss 
1910*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_2_cphy_rx_clk = {
1911*f003800eSLuca Weiss 	.halt_reg = 0x1e054,
1912*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1913*f003800eSLuca Weiss 	.clkr = {
1914*f003800eSLuca Weiss 		.enable_reg = 0x1e054,
1915*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1916*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1917*f003800eSLuca Weiss 			.name = "cam_cc_tfe_2_cphy_rx_clk",
1918*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1919*f003800eSLuca Weiss 				&cam_cc_cphy_rx_clk_src.clkr.hw,
1920*f003800eSLuca Weiss 			},
1921*f003800eSLuca Weiss 			.num_parents = 1,
1922*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1923*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1924*f003800eSLuca Weiss 		},
1925*f003800eSLuca Weiss 	},
1926*f003800eSLuca Weiss };
1927*f003800eSLuca Weiss 
1928*f003800eSLuca Weiss static struct clk_branch cam_cc_tfe_2_csid_clk = {
1929*f003800eSLuca Weiss 	.halt_reg = 0x1e048,
1930*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT,
1931*f003800eSLuca Weiss 	.clkr = {
1932*f003800eSLuca Weiss 		.enable_reg = 0x1e048,
1933*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1934*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1935*f003800eSLuca Weiss 			.name = "cam_cc_tfe_2_csid_clk",
1936*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1937*f003800eSLuca Weiss 				&cam_cc_tfe_2_csid_clk_src.clkr.hw,
1938*f003800eSLuca Weiss 			},
1939*f003800eSLuca Weiss 			.num_parents = 1,
1940*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1941*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1942*f003800eSLuca Weiss 		},
1943*f003800eSLuca Weiss 	},
1944*f003800eSLuca Weiss };
1945*f003800eSLuca Weiss 
1946*f003800eSLuca Weiss static struct clk_branch cam_cc_top_shift_clk = {
1947*f003800eSLuca Weiss 	.halt_reg = 0x25040,
1948*f003800eSLuca Weiss 	.halt_check = BRANCH_HALT_VOTED,
1949*f003800eSLuca Weiss 	.clkr = {
1950*f003800eSLuca Weiss 		.enable_reg = 0x25040,
1951*f003800eSLuca Weiss 		.enable_mask = BIT(0),
1952*f003800eSLuca Weiss 		.hw.init = &(const struct clk_init_data) {
1953*f003800eSLuca Weiss 			.name = "cam_cc_top_shift_clk",
1954*f003800eSLuca Weiss 			.parent_hws = (const struct clk_hw*[]) {
1955*f003800eSLuca Weiss 				&cam_cc_xo_clk_src.clkr.hw,
1956*f003800eSLuca Weiss 			},
1957*f003800eSLuca Weiss 			.num_parents = 1,
1958*f003800eSLuca Weiss 			.flags = CLK_SET_RATE_PARENT,
1959*f003800eSLuca Weiss 			.ops = &clk_branch2_ops,
1960*f003800eSLuca Weiss 		},
1961*f003800eSLuca Weiss 	},
1962*f003800eSLuca Weiss };
1963*f003800eSLuca Weiss 
1964*f003800eSLuca Weiss static struct gdsc cam_cc_camss_top_gdsc = {
1965*f003800eSLuca Weiss 	.gdscr = 0x25004,
1966*f003800eSLuca Weiss 	.en_rest_wait_val = 0x2,
1967*f003800eSLuca Weiss 	.en_few_wait_val = 0x2,
1968*f003800eSLuca Weiss 	.clk_dis_wait_val = 0xf,
1969*f003800eSLuca Weiss 	.pd = {
1970*f003800eSLuca Weiss 		.name = "cam_cc_camss_top_gdsc",
1971*f003800eSLuca Weiss 	},
1972*f003800eSLuca Weiss 	.pwrsts = PWRSTS_OFF_ON,
1973*f003800eSLuca Weiss 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
1974*f003800eSLuca Weiss };
1975*f003800eSLuca Weiss 
1976*f003800eSLuca Weiss static struct clk_regmap *cam_cc_milos_clocks[] = {
1977*f003800eSLuca Weiss 	[CAM_CC_BPS_AHB_CLK] = &cam_cc_bps_ahb_clk.clkr,
1978*f003800eSLuca Weiss 	[CAM_CC_BPS_AREG_CLK] = &cam_cc_bps_areg_clk.clkr,
1979*f003800eSLuca Weiss 	[CAM_CC_BPS_CLK] = &cam_cc_bps_clk.clkr,
1980*f003800eSLuca Weiss 	[CAM_CC_BPS_CLK_SRC] = &cam_cc_bps_clk_src.clkr,
1981*f003800eSLuca Weiss 	[CAM_CC_CAMNOC_ATB_CLK] = &cam_cc_camnoc_atb_clk.clkr,
1982*f003800eSLuca Weiss 	[CAM_CC_CAMNOC_AXI_CLK_SRC] = &cam_cc_camnoc_axi_clk_src.clkr,
1983*f003800eSLuca Weiss 	[CAM_CC_CAMNOC_AXI_HF_CLK] = &cam_cc_camnoc_axi_hf_clk.clkr,
1984*f003800eSLuca Weiss 	[CAM_CC_CAMNOC_AXI_SF_CLK] = &cam_cc_camnoc_axi_sf_clk.clkr,
1985*f003800eSLuca Weiss 	[CAM_CC_CAMNOC_NRT_AXI_CLK] = &cam_cc_camnoc_nrt_axi_clk.clkr,
1986*f003800eSLuca Weiss 	[CAM_CC_CAMNOC_RT_AXI_CLK] = &cam_cc_camnoc_rt_axi_clk.clkr,
1987*f003800eSLuca Weiss 	[CAM_CC_CCI_0_CLK] = &cam_cc_cci_0_clk.clkr,
1988*f003800eSLuca Weiss 	[CAM_CC_CCI_0_CLK_SRC] = &cam_cc_cci_0_clk_src.clkr,
1989*f003800eSLuca Weiss 	[CAM_CC_CCI_1_CLK] = &cam_cc_cci_1_clk.clkr,
1990*f003800eSLuca Weiss 	[CAM_CC_CCI_1_CLK_SRC] = &cam_cc_cci_1_clk_src.clkr,
1991*f003800eSLuca Weiss 	[CAM_CC_CORE_AHB_CLK] = &cam_cc_core_ahb_clk.clkr,
1992*f003800eSLuca Weiss 	[CAM_CC_CPAS_AHB_CLK] = &cam_cc_cpas_ahb_clk.clkr,
1993*f003800eSLuca Weiss 	[CAM_CC_CPHY_RX_CLK_SRC] = &cam_cc_cphy_rx_clk_src.clkr,
1994*f003800eSLuca Weiss 	[CAM_CC_CRE_AHB_CLK] = &cam_cc_cre_ahb_clk.clkr,
1995*f003800eSLuca Weiss 	[CAM_CC_CRE_CLK] = &cam_cc_cre_clk.clkr,
1996*f003800eSLuca Weiss 	[CAM_CC_CRE_CLK_SRC] = &cam_cc_cre_clk_src.clkr,
1997*f003800eSLuca Weiss 	[CAM_CC_CSI0PHYTIMER_CLK] = &cam_cc_csi0phytimer_clk.clkr,
1998*f003800eSLuca Weiss 	[CAM_CC_CSI0PHYTIMER_CLK_SRC] = &cam_cc_csi0phytimer_clk_src.clkr,
1999*f003800eSLuca Weiss 	[CAM_CC_CSI1PHYTIMER_CLK] = &cam_cc_csi1phytimer_clk.clkr,
2000*f003800eSLuca Weiss 	[CAM_CC_CSI1PHYTIMER_CLK_SRC] = &cam_cc_csi1phytimer_clk_src.clkr,
2001*f003800eSLuca Weiss 	[CAM_CC_CSI2PHYTIMER_CLK] = &cam_cc_csi2phytimer_clk.clkr,
2002*f003800eSLuca Weiss 	[CAM_CC_CSI2PHYTIMER_CLK_SRC] = &cam_cc_csi2phytimer_clk_src.clkr,
2003*f003800eSLuca Weiss 	[CAM_CC_CSI3PHYTIMER_CLK] = &cam_cc_csi3phytimer_clk.clkr,
2004*f003800eSLuca Weiss 	[CAM_CC_CSI3PHYTIMER_CLK_SRC] = &cam_cc_csi3phytimer_clk_src.clkr,
2005*f003800eSLuca Weiss 	[CAM_CC_CSIPHY0_CLK] = &cam_cc_csiphy0_clk.clkr,
2006*f003800eSLuca Weiss 	[CAM_CC_CSIPHY1_CLK] = &cam_cc_csiphy1_clk.clkr,
2007*f003800eSLuca Weiss 	[CAM_CC_CSIPHY2_CLK] = &cam_cc_csiphy2_clk.clkr,
2008*f003800eSLuca Weiss 	[CAM_CC_CSIPHY3_CLK] = &cam_cc_csiphy3_clk.clkr,
2009*f003800eSLuca Weiss 	[CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
2010*f003800eSLuca Weiss 	[CAM_CC_ICP_ATB_CLK] = &cam_cc_icp_atb_clk.clkr,
2011*f003800eSLuca Weiss 	[CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
2012*f003800eSLuca Weiss 	[CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr,
2013*f003800eSLuca Weiss 	[CAM_CC_ICP_CTI_CLK] = &cam_cc_icp_cti_clk.clkr,
2014*f003800eSLuca Weiss 	[CAM_CC_ICP_TS_CLK] = &cam_cc_icp_ts_clk.clkr,
2015*f003800eSLuca Weiss 	[CAM_CC_MCLK0_CLK] = &cam_cc_mclk0_clk.clkr,
2016*f003800eSLuca Weiss 	[CAM_CC_MCLK0_CLK_SRC] = &cam_cc_mclk0_clk_src.clkr,
2017*f003800eSLuca Weiss 	[CAM_CC_MCLK1_CLK] = &cam_cc_mclk1_clk.clkr,
2018*f003800eSLuca Weiss 	[CAM_CC_MCLK1_CLK_SRC] = &cam_cc_mclk1_clk_src.clkr,
2019*f003800eSLuca Weiss 	[CAM_CC_MCLK2_CLK] = &cam_cc_mclk2_clk.clkr,
2020*f003800eSLuca Weiss 	[CAM_CC_MCLK2_CLK_SRC] = &cam_cc_mclk2_clk_src.clkr,
2021*f003800eSLuca Weiss 	[CAM_CC_MCLK3_CLK] = &cam_cc_mclk3_clk.clkr,
2022*f003800eSLuca Weiss 	[CAM_CC_MCLK3_CLK_SRC] = &cam_cc_mclk3_clk_src.clkr,
2023*f003800eSLuca Weiss 	[CAM_CC_MCLK4_CLK] = &cam_cc_mclk4_clk.clkr,
2024*f003800eSLuca Weiss 	[CAM_CC_MCLK4_CLK_SRC] = &cam_cc_mclk4_clk_src.clkr,
2025*f003800eSLuca Weiss 	[CAM_CC_OPE_0_AHB_CLK] = &cam_cc_ope_0_ahb_clk.clkr,
2026*f003800eSLuca Weiss 	[CAM_CC_OPE_0_AREG_CLK] = &cam_cc_ope_0_areg_clk.clkr,
2027*f003800eSLuca Weiss 	[CAM_CC_OPE_0_CLK] = &cam_cc_ope_0_clk.clkr,
2028*f003800eSLuca Weiss 	[CAM_CC_OPE_0_CLK_SRC] = &cam_cc_ope_0_clk_src.clkr,
2029*f003800eSLuca Weiss 	[CAM_CC_PLL0] = &cam_cc_pll0.clkr,
2030*f003800eSLuca Weiss 	[CAM_CC_PLL0_OUT_EVEN] = &cam_cc_pll0_out_even.clkr,
2031*f003800eSLuca Weiss 	[CAM_CC_PLL0_OUT_ODD] = &cam_cc_pll0_out_odd.clkr,
2032*f003800eSLuca Weiss 	[CAM_CC_PLL1] = &cam_cc_pll1.clkr,
2033*f003800eSLuca Weiss 	[CAM_CC_PLL1_OUT_EVEN] = &cam_cc_pll1_out_even.clkr,
2034*f003800eSLuca Weiss 	[CAM_CC_PLL2] = &cam_cc_pll2.clkr,
2035*f003800eSLuca Weiss 	[CAM_CC_PLL3] = &cam_cc_pll3.clkr,
2036*f003800eSLuca Weiss 	[CAM_CC_PLL3_OUT_EVEN] = &cam_cc_pll3_out_even.clkr,
2037*f003800eSLuca Weiss 	[CAM_CC_PLL4] = &cam_cc_pll4.clkr,
2038*f003800eSLuca Weiss 	[CAM_CC_PLL4_OUT_EVEN] = &cam_cc_pll4_out_even.clkr,
2039*f003800eSLuca Weiss 	[CAM_CC_PLL5] = &cam_cc_pll5.clkr,
2040*f003800eSLuca Weiss 	[CAM_CC_PLL5_OUT_EVEN] = &cam_cc_pll5_out_even.clkr,
2041*f003800eSLuca Weiss 	[CAM_CC_PLL6] = &cam_cc_pll6.clkr,
2042*f003800eSLuca Weiss 	[CAM_CC_PLL6_OUT_EVEN] = &cam_cc_pll6_out_even.clkr,
2043*f003800eSLuca Weiss 	[CAM_CC_SLEEP_CLK_SRC] = &cam_cc_sleep_clk_src.clkr,
2044*f003800eSLuca Weiss 	[CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr,
2045*f003800eSLuca Weiss 	[CAM_CC_SOC_AHB_CLK] = &cam_cc_soc_ahb_clk.clkr,
2046*f003800eSLuca Weiss 	[CAM_CC_SYS_TMR_CLK] = &cam_cc_sys_tmr_clk.clkr,
2047*f003800eSLuca Weiss 	[CAM_CC_TFE_0_AHB_CLK] = &cam_cc_tfe_0_ahb_clk.clkr,
2048*f003800eSLuca Weiss 	[CAM_CC_TFE_0_CLK] = &cam_cc_tfe_0_clk.clkr,
2049*f003800eSLuca Weiss 	[CAM_CC_TFE_0_CLK_SRC] = &cam_cc_tfe_0_clk_src.clkr,
2050*f003800eSLuca Weiss 	[CAM_CC_TFE_0_CPHY_RX_CLK] = &cam_cc_tfe_0_cphy_rx_clk.clkr,
2051*f003800eSLuca Weiss 	[CAM_CC_TFE_0_CSID_CLK] = &cam_cc_tfe_0_csid_clk.clkr,
2052*f003800eSLuca Weiss 	[CAM_CC_TFE_0_CSID_CLK_SRC] = &cam_cc_tfe_0_csid_clk_src.clkr,
2053*f003800eSLuca Weiss 	[CAM_CC_TFE_1_AHB_CLK] = &cam_cc_tfe_1_ahb_clk.clkr,
2054*f003800eSLuca Weiss 	[CAM_CC_TFE_1_CLK] = &cam_cc_tfe_1_clk.clkr,
2055*f003800eSLuca Weiss 	[CAM_CC_TFE_1_CLK_SRC] = &cam_cc_tfe_1_clk_src.clkr,
2056*f003800eSLuca Weiss 	[CAM_CC_TFE_1_CPHY_RX_CLK] = &cam_cc_tfe_1_cphy_rx_clk.clkr,
2057*f003800eSLuca Weiss 	[CAM_CC_TFE_1_CSID_CLK] = &cam_cc_tfe_1_csid_clk.clkr,
2058*f003800eSLuca Weiss 	[CAM_CC_TFE_1_CSID_CLK_SRC] = &cam_cc_tfe_1_csid_clk_src.clkr,
2059*f003800eSLuca Weiss 	[CAM_CC_TFE_2_AHB_CLK] = &cam_cc_tfe_2_ahb_clk.clkr,
2060*f003800eSLuca Weiss 	[CAM_CC_TFE_2_CLK] = &cam_cc_tfe_2_clk.clkr,
2061*f003800eSLuca Weiss 	[CAM_CC_TFE_2_CLK_SRC] = &cam_cc_tfe_2_clk_src.clkr,
2062*f003800eSLuca Weiss 	[CAM_CC_TFE_2_CPHY_RX_CLK] = &cam_cc_tfe_2_cphy_rx_clk.clkr,
2063*f003800eSLuca Weiss 	[CAM_CC_TFE_2_CSID_CLK] = &cam_cc_tfe_2_csid_clk.clkr,
2064*f003800eSLuca Weiss 	[CAM_CC_TFE_2_CSID_CLK_SRC] = &cam_cc_tfe_2_csid_clk_src.clkr,
2065*f003800eSLuca Weiss 	[CAM_CC_TOP_SHIFT_CLK] = &cam_cc_top_shift_clk.clkr,
2066*f003800eSLuca Weiss 	[CAM_CC_XO_CLK_SRC] = &cam_cc_xo_clk_src.clkr,
2067*f003800eSLuca Weiss };
2068*f003800eSLuca Weiss 
2069*f003800eSLuca Weiss static const struct qcom_reset_map cam_cc_milos_resets[] = {
2070*f003800eSLuca Weiss 	[CAM_CC_BPS_BCR] = { 0x1a000 },
2071*f003800eSLuca Weiss 	[CAM_CC_CAMNOC_BCR] = { 0x24000 },
2072*f003800eSLuca Weiss 	[CAM_CC_CAMSS_TOP_BCR] = { 0x25000 },
2073*f003800eSLuca Weiss 	[CAM_CC_CCI_0_BCR] = { 0x21000 },
2074*f003800eSLuca Weiss 	[CAM_CC_CCI_1_BCR] = { 0x22000 },
2075*f003800eSLuca Weiss 	[CAM_CC_CPAS_BCR] = { 0x23000 },
2076*f003800eSLuca Weiss 	[CAM_CC_CRE_BCR] = { 0x27000 },
2077*f003800eSLuca Weiss 	[CAM_CC_CSI0PHY_BCR] = { 0x19000 },
2078*f003800eSLuca Weiss 	[CAM_CC_CSI1PHY_BCR] = { 0x19024 },
2079*f003800eSLuca Weiss 	[CAM_CC_CSI2PHY_BCR] = { 0x19048 },
2080*f003800eSLuca Weiss 	[CAM_CC_CSI3PHY_BCR] = { 0x1906c },
2081*f003800eSLuca Weiss 	[CAM_CC_ICP_BCR] = { 0x20000 },
2082*f003800eSLuca Weiss 	[CAM_CC_MCLK0_BCR] = { 0x18000 },
2083*f003800eSLuca Weiss 	[CAM_CC_MCLK1_BCR] = { 0x18020 },
2084*f003800eSLuca Weiss 	[CAM_CC_MCLK2_BCR] = { 0x18040 },
2085*f003800eSLuca Weiss 	[CAM_CC_MCLK3_BCR] = { 0x18060 },
2086*f003800eSLuca Weiss 	[CAM_CC_MCLK4_BCR] = { 0x18080 },
2087*f003800eSLuca Weiss 	[CAM_CC_OPE_0_BCR] = { 0x1b000 },
2088*f003800eSLuca Weiss 	[CAM_CC_TFE_0_BCR] = { 0x1c000 },
2089*f003800eSLuca Weiss 	[CAM_CC_TFE_1_BCR] = { 0x1d000 },
2090*f003800eSLuca Weiss 	[CAM_CC_TFE_2_BCR] = { 0x1e000 },
2091*f003800eSLuca Weiss };
2092*f003800eSLuca Weiss 
2093*f003800eSLuca Weiss static struct gdsc *cam_cc_milos_gdscs[] = {
2094*f003800eSLuca Weiss 	[CAM_CC_CAMSS_TOP_GDSC] = &cam_cc_camss_top_gdsc,
2095*f003800eSLuca Weiss };
2096*f003800eSLuca Weiss 
2097*f003800eSLuca Weiss static struct clk_alpha_pll *cam_cc_milos_plls[] = {
2098*f003800eSLuca Weiss 	&cam_cc_pll0,
2099*f003800eSLuca Weiss 	&cam_cc_pll1,
2100*f003800eSLuca Weiss 	&cam_cc_pll2,
2101*f003800eSLuca Weiss 	&cam_cc_pll3,
2102*f003800eSLuca Weiss 	&cam_cc_pll4,
2103*f003800eSLuca Weiss 	&cam_cc_pll5,
2104*f003800eSLuca Weiss 	&cam_cc_pll6,
2105*f003800eSLuca Weiss };
2106*f003800eSLuca Weiss 
2107*f003800eSLuca Weiss static u32 cam_cc_milos_critical_cbcrs[] = {
2108*f003800eSLuca Weiss 	0x25038, /* CAM_CC_GDSC_CLK */
2109*f003800eSLuca Weiss 	0x2505c, /* CAM_CC_SLEEP_CLK */
2110*f003800eSLuca Weiss };
2111*f003800eSLuca Weiss 
2112*f003800eSLuca Weiss static const struct regmap_config cam_cc_milos_regmap_config = {
2113*f003800eSLuca Weiss 	.reg_bits = 32,
2114*f003800eSLuca Weiss 	.reg_stride = 4,
2115*f003800eSLuca Weiss 	.val_bits = 32,
2116*f003800eSLuca Weiss 	.max_register = 0x30728,
2117*f003800eSLuca Weiss 	.fast_io = true,
2118*f003800eSLuca Weiss };
2119*f003800eSLuca Weiss 
2120*f003800eSLuca Weiss static struct qcom_cc_driver_data cam_cc_milos_driver_data = {
2121*f003800eSLuca Weiss 	.alpha_plls = cam_cc_milos_plls,
2122*f003800eSLuca Weiss 	.num_alpha_plls = ARRAY_SIZE(cam_cc_milos_plls),
2123*f003800eSLuca Weiss 	.clk_cbcrs = cam_cc_milos_critical_cbcrs,
2124*f003800eSLuca Weiss 	.num_clk_cbcrs = ARRAY_SIZE(cam_cc_milos_critical_cbcrs),
2125*f003800eSLuca Weiss };
2126*f003800eSLuca Weiss 
2127*f003800eSLuca Weiss static struct qcom_cc_desc cam_cc_milos_desc = {
2128*f003800eSLuca Weiss 	.config = &cam_cc_milos_regmap_config,
2129*f003800eSLuca Weiss 	.clks = cam_cc_milos_clocks,
2130*f003800eSLuca Weiss 	.num_clks = ARRAY_SIZE(cam_cc_milos_clocks),
2131*f003800eSLuca Weiss 	.resets = cam_cc_milos_resets,
2132*f003800eSLuca Weiss 	.num_resets = ARRAY_SIZE(cam_cc_milos_resets),
2133*f003800eSLuca Weiss 	.gdscs = cam_cc_milos_gdscs,
2134*f003800eSLuca Weiss 	.num_gdscs = ARRAY_SIZE(cam_cc_milos_gdscs),
2135*f003800eSLuca Weiss 	.use_rpm = true,
2136*f003800eSLuca Weiss 	.driver_data = &cam_cc_milos_driver_data,
2137*f003800eSLuca Weiss };
2138*f003800eSLuca Weiss 
2139*f003800eSLuca Weiss static const struct of_device_id cam_cc_milos_match_table[] = {
2140*f003800eSLuca Weiss 	{ .compatible = "qcom,milos-camcc" },
2141*f003800eSLuca Weiss 	{ }
2142*f003800eSLuca Weiss };
2143*f003800eSLuca Weiss MODULE_DEVICE_TABLE(of, cam_cc_milos_match_table);
2144*f003800eSLuca Weiss 
2145*f003800eSLuca Weiss static int cam_cc_milos_probe(struct platform_device *pdev)
2146*f003800eSLuca Weiss {
2147*f003800eSLuca Weiss 	return qcom_cc_probe(pdev, &cam_cc_milos_desc);
2148*f003800eSLuca Weiss }
2149*f003800eSLuca Weiss 
2150*f003800eSLuca Weiss static struct platform_driver cam_cc_milos_driver = {
2151*f003800eSLuca Weiss 	.probe = cam_cc_milos_probe,
2152*f003800eSLuca Weiss 	.driver = {
2153*f003800eSLuca Weiss 		.name = "cam_cc-milos",
2154*f003800eSLuca Weiss 		.of_match_table = cam_cc_milos_match_table,
2155*f003800eSLuca Weiss 	},
2156*f003800eSLuca Weiss };
2157*f003800eSLuca Weiss 
2158*f003800eSLuca Weiss module_platform_driver(cam_cc_milos_driver);
2159*f003800eSLuca Weiss 
2160*f003800eSLuca Weiss MODULE_DESCRIPTION("QTI CAM_CC Milos Driver");
2161*f003800eSLuca Weiss MODULE_LICENSE("GPL");
2162