xref: /linux/drivers/clk/qcom/cambistmclkcc-kaanapali.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*92aae35fSTaniya Das // SPDX-License-Identifier: GPL-2.0-only
2*92aae35fSTaniya Das /*
3*92aae35fSTaniya Das  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4*92aae35fSTaniya Das  */
5*92aae35fSTaniya Das 
6*92aae35fSTaniya Das #include <linux/clk-provider.h>
7*92aae35fSTaniya Das #include <linux/mod_devicetable.h>
8*92aae35fSTaniya Das #include <linux/module.h>
9*92aae35fSTaniya Das #include <linux/of.h>
10*92aae35fSTaniya Das #include <linux/platform_device.h>
11*92aae35fSTaniya Das #include <linux/pm_runtime.h>
12*92aae35fSTaniya Das #include <linux/regmap.h>
13*92aae35fSTaniya Das 
14*92aae35fSTaniya Das #include <dt-bindings/clock/qcom,kaanapali-cambistmclkcc.h>
15*92aae35fSTaniya Das 
16*92aae35fSTaniya Das #include "clk-alpha-pll.h"
17*92aae35fSTaniya Das #include "clk-branch.h"
18*92aae35fSTaniya Das #include "clk-pll.h"
19*92aae35fSTaniya Das #include "clk-rcg.h"
20*92aae35fSTaniya Das #include "clk-regmap.h"
21*92aae35fSTaniya Das #include "clk-regmap-divider.h"
22*92aae35fSTaniya Das #include "clk-regmap-mux.h"
23*92aae35fSTaniya Das #include "common.h"
24*92aae35fSTaniya Das #include "gdsc.h"
25*92aae35fSTaniya Das #include "reset.h"
26*92aae35fSTaniya Das 
27*92aae35fSTaniya Das enum {
28*92aae35fSTaniya Das 	DT_AHB_CLK,
29*92aae35fSTaniya Das 	DT_BI_TCXO,
30*92aae35fSTaniya Das 	DT_BI_TCXO_AO,
31*92aae35fSTaniya Das 	DT_SLEEP_CLK,
32*92aae35fSTaniya Das };
33*92aae35fSTaniya Das 
34*92aae35fSTaniya Das enum {
35*92aae35fSTaniya Das 	P_BI_TCXO,
36*92aae35fSTaniya Das 	P_CAM_BIST_MCLK_CC_PLL0_OUT_EVEN,
37*92aae35fSTaniya Das 	P_CAM_BIST_MCLK_CC_PLL0_OUT_MAIN,
38*92aae35fSTaniya Das };
39*92aae35fSTaniya Das 
40*92aae35fSTaniya Das static const struct pll_vco rivian_eko_t_vco[] = {
41*92aae35fSTaniya Das 	{ 883200000, 1171200000, 0 },
42*92aae35fSTaniya Das };
43*92aae35fSTaniya Das 
44*92aae35fSTaniya Das /* 960.0 MHz Configuration */
45*92aae35fSTaniya Das static const struct alpha_pll_config cam_bist_mclk_cc_pll0_config = {
46*92aae35fSTaniya Das 	.l = 0x32,
47*92aae35fSTaniya Das 	.cal_l = 0x32,
48*92aae35fSTaniya Das 	.alpha = 0x0,
49*92aae35fSTaniya Das 	.config_ctl_val = 0x12000000,
50*92aae35fSTaniya Das 	.config_ctl_hi_val = 0x00890263,
51*92aae35fSTaniya Das 	.config_ctl_hi1_val = 0x1af04237,
52*92aae35fSTaniya Das 	.config_ctl_hi2_val = 0x00000000,
53*92aae35fSTaniya Das };
54*92aae35fSTaniya Das 
55*92aae35fSTaniya Das static struct clk_alpha_pll cam_bist_mclk_cc_pll0 = {
56*92aae35fSTaniya Das 	.offset = 0x0,
57*92aae35fSTaniya Das 	.config = &cam_bist_mclk_cc_pll0_config,
58*92aae35fSTaniya Das 	.vco_table = rivian_eko_t_vco,
59*92aae35fSTaniya Das 	.num_vco = ARRAY_SIZE(rivian_eko_t_vco),
60*92aae35fSTaniya Das 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EKO_T],
61*92aae35fSTaniya Das 	.clkr = {
62*92aae35fSTaniya Das 		.hw.init = &(const struct clk_init_data) {
63*92aae35fSTaniya Das 			.name = "cam_bist_mclk_cc_pll0",
64*92aae35fSTaniya Das 			.parent_data = &(const struct clk_parent_data) {
65*92aae35fSTaniya Das 				.index = DT_BI_TCXO,
66*92aae35fSTaniya Das 			},
67*92aae35fSTaniya Das 			.num_parents = 1,
68*92aae35fSTaniya Das 			.ops = &clk_alpha_pll_rivian_eko_t_ops,
69*92aae35fSTaniya Das 		},
70*92aae35fSTaniya Das 	},
71*92aae35fSTaniya Das };
72*92aae35fSTaniya Das 
73*92aae35fSTaniya Das static const struct parent_map cam_bist_mclk_cc_parent_map_0[] = {
74*92aae35fSTaniya Das 	{ P_BI_TCXO, 0 },
75*92aae35fSTaniya Das 	{ P_CAM_BIST_MCLK_CC_PLL0_OUT_EVEN, 3 },
76*92aae35fSTaniya Das 	{ P_CAM_BIST_MCLK_CC_PLL0_OUT_MAIN, 5 },
77*92aae35fSTaniya Das };
78*92aae35fSTaniya Das 
79*92aae35fSTaniya Das static const struct clk_parent_data cam_bist_mclk_cc_parent_data_0[] = {
80*92aae35fSTaniya Das 	{ .index = DT_BI_TCXO },
81*92aae35fSTaniya Das 	{ .hw = &cam_bist_mclk_cc_pll0.clkr.hw },
82*92aae35fSTaniya Das 	{ .hw = &cam_bist_mclk_cc_pll0.clkr.hw },
83*92aae35fSTaniya Das };
84*92aae35fSTaniya Das 
85*92aae35fSTaniya Das static const struct freq_tbl ftbl_cam_bist_mclk_cc_mclk0_clk_src[] = {
86*92aae35fSTaniya Das 	F(19200000, P_BI_TCXO, 1, 0, 0),
87*92aae35fSTaniya Das 	F(24000000, P_CAM_BIST_MCLK_CC_PLL0_OUT_EVEN, 10, 1, 4),
88*92aae35fSTaniya Das 	F(68571429, P_CAM_BIST_MCLK_CC_PLL0_OUT_MAIN, 14, 0, 0),
89*92aae35fSTaniya Das 	{ }
90*92aae35fSTaniya Das };
91*92aae35fSTaniya Das 
92*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk0_clk_src = {
93*92aae35fSTaniya Das 	.cmd_rcgr = 0x4000,
94*92aae35fSTaniya Das 	.mnd_width = 8,
95*92aae35fSTaniya Das 	.hid_width = 5,
96*92aae35fSTaniya Das 	.parent_map = cam_bist_mclk_cc_parent_map_0,
97*92aae35fSTaniya Das 	.hw_clk_ctrl = true,
98*92aae35fSTaniya Das 	.freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src,
99*92aae35fSTaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
100*92aae35fSTaniya Das 		.name = "cam_bist_mclk_cc_mclk0_clk_src",
101*92aae35fSTaniya Das 		.parent_data = cam_bist_mclk_cc_parent_data_0,
102*92aae35fSTaniya Das 		.num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0),
103*92aae35fSTaniya Das 		.flags = CLK_SET_RATE_PARENT,
104*92aae35fSTaniya Das 		.ops = &clk_rcg2_shared_ops,
105*92aae35fSTaniya Das 	},
106*92aae35fSTaniya Das };
107*92aae35fSTaniya Das 
108*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk1_clk_src = {
109*92aae35fSTaniya Das 	.cmd_rcgr = 0x401c,
110*92aae35fSTaniya Das 	.mnd_width = 8,
111*92aae35fSTaniya Das 	.hid_width = 5,
112*92aae35fSTaniya Das 	.parent_map = cam_bist_mclk_cc_parent_map_0,
113*92aae35fSTaniya Das 	.hw_clk_ctrl = true,
114*92aae35fSTaniya Das 	.freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src,
115*92aae35fSTaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
116*92aae35fSTaniya Das 		.name = "cam_bist_mclk_cc_mclk1_clk_src",
117*92aae35fSTaniya Das 		.parent_data = cam_bist_mclk_cc_parent_data_0,
118*92aae35fSTaniya Das 		.num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0),
119*92aae35fSTaniya Das 		.flags = CLK_SET_RATE_PARENT,
120*92aae35fSTaniya Das 		.ops = &clk_rcg2_shared_ops,
121*92aae35fSTaniya Das 	},
122*92aae35fSTaniya Das };
123*92aae35fSTaniya Das 
124*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk2_clk_src = {
125*92aae35fSTaniya Das 	.cmd_rcgr = 0x4038,
126*92aae35fSTaniya Das 	.mnd_width = 8,
127*92aae35fSTaniya Das 	.hid_width = 5,
128*92aae35fSTaniya Das 	.parent_map = cam_bist_mclk_cc_parent_map_0,
129*92aae35fSTaniya Das 	.hw_clk_ctrl = true,
130*92aae35fSTaniya Das 	.freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src,
131*92aae35fSTaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
132*92aae35fSTaniya Das 		.name = "cam_bist_mclk_cc_mclk2_clk_src",
133*92aae35fSTaniya Das 		.parent_data = cam_bist_mclk_cc_parent_data_0,
134*92aae35fSTaniya Das 		.num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0),
135*92aae35fSTaniya Das 		.flags = CLK_SET_RATE_PARENT,
136*92aae35fSTaniya Das 		.ops = &clk_rcg2_shared_ops,
137*92aae35fSTaniya Das 	},
138*92aae35fSTaniya Das };
139*92aae35fSTaniya Das 
140*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk3_clk_src = {
141*92aae35fSTaniya Das 	.cmd_rcgr = 0x4054,
142*92aae35fSTaniya Das 	.mnd_width = 8,
143*92aae35fSTaniya Das 	.hid_width = 5,
144*92aae35fSTaniya Das 	.parent_map = cam_bist_mclk_cc_parent_map_0,
145*92aae35fSTaniya Das 	.hw_clk_ctrl = true,
146*92aae35fSTaniya Das 	.freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src,
147*92aae35fSTaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
148*92aae35fSTaniya Das 		.name = "cam_bist_mclk_cc_mclk3_clk_src",
149*92aae35fSTaniya Das 		.parent_data = cam_bist_mclk_cc_parent_data_0,
150*92aae35fSTaniya Das 		.num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0),
151*92aae35fSTaniya Das 		.flags = CLK_SET_RATE_PARENT,
152*92aae35fSTaniya Das 		.ops = &clk_rcg2_shared_ops,
153*92aae35fSTaniya Das 	},
154*92aae35fSTaniya Das };
155*92aae35fSTaniya Das 
156*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk4_clk_src = {
157*92aae35fSTaniya Das 	.cmd_rcgr = 0x4070,
158*92aae35fSTaniya Das 	.mnd_width = 8,
159*92aae35fSTaniya Das 	.hid_width = 5,
160*92aae35fSTaniya Das 	.parent_map = cam_bist_mclk_cc_parent_map_0,
161*92aae35fSTaniya Das 	.hw_clk_ctrl = true,
162*92aae35fSTaniya Das 	.freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src,
163*92aae35fSTaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
164*92aae35fSTaniya Das 		.name = "cam_bist_mclk_cc_mclk4_clk_src",
165*92aae35fSTaniya Das 		.parent_data = cam_bist_mclk_cc_parent_data_0,
166*92aae35fSTaniya Das 		.num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0),
167*92aae35fSTaniya Das 		.flags = CLK_SET_RATE_PARENT,
168*92aae35fSTaniya Das 		.ops = &clk_rcg2_shared_ops,
169*92aae35fSTaniya Das 	},
170*92aae35fSTaniya Das };
171*92aae35fSTaniya Das 
172*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk5_clk_src = {
173*92aae35fSTaniya Das 	.cmd_rcgr = 0x408c,
174*92aae35fSTaniya Das 	.mnd_width = 8,
175*92aae35fSTaniya Das 	.hid_width = 5,
176*92aae35fSTaniya Das 	.parent_map = cam_bist_mclk_cc_parent_map_0,
177*92aae35fSTaniya Das 	.hw_clk_ctrl = true,
178*92aae35fSTaniya Das 	.freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src,
179*92aae35fSTaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
180*92aae35fSTaniya Das 		.name = "cam_bist_mclk_cc_mclk5_clk_src",
181*92aae35fSTaniya Das 		.parent_data = cam_bist_mclk_cc_parent_data_0,
182*92aae35fSTaniya Das 		.num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0),
183*92aae35fSTaniya Das 		.flags = CLK_SET_RATE_PARENT,
184*92aae35fSTaniya Das 		.ops = &clk_rcg2_shared_ops,
185*92aae35fSTaniya Das 	},
186*92aae35fSTaniya Das };
187*92aae35fSTaniya Das 
188*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk6_clk_src = {
189*92aae35fSTaniya Das 	.cmd_rcgr = 0x40a8,
190*92aae35fSTaniya Das 	.mnd_width = 8,
191*92aae35fSTaniya Das 	.hid_width = 5,
192*92aae35fSTaniya Das 	.parent_map = cam_bist_mclk_cc_parent_map_0,
193*92aae35fSTaniya Das 	.hw_clk_ctrl = true,
194*92aae35fSTaniya Das 	.freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src,
195*92aae35fSTaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
196*92aae35fSTaniya Das 		.name = "cam_bist_mclk_cc_mclk6_clk_src",
197*92aae35fSTaniya Das 		.parent_data = cam_bist_mclk_cc_parent_data_0,
198*92aae35fSTaniya Das 		.num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0),
199*92aae35fSTaniya Das 		.flags = CLK_SET_RATE_PARENT,
200*92aae35fSTaniya Das 		.ops = &clk_rcg2_shared_ops,
201*92aae35fSTaniya Das 	},
202*92aae35fSTaniya Das };
203*92aae35fSTaniya Das 
204*92aae35fSTaniya Das static struct clk_rcg2 cam_bist_mclk_cc_mclk7_clk_src = {
205*92aae35fSTaniya Das 	.cmd_rcgr = 0x40c4,
206*92aae35fSTaniya Das 	.mnd_width = 8,
207*92aae35fSTaniya Das 	.hid_width = 5,
208*92aae35fSTaniya Das 	.parent_map = cam_bist_mclk_cc_parent_map_0,
209*92aae35fSTaniya Das 	.hw_clk_ctrl = true,
210*92aae35fSTaniya Das 	.freq_tbl = ftbl_cam_bist_mclk_cc_mclk0_clk_src,
211*92aae35fSTaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
212*92aae35fSTaniya Das 		.name = "cam_bist_mclk_cc_mclk7_clk_src",
213*92aae35fSTaniya Das 		.parent_data = cam_bist_mclk_cc_parent_data_0,
214*92aae35fSTaniya Das 		.num_parents = ARRAY_SIZE(cam_bist_mclk_cc_parent_data_0),
215*92aae35fSTaniya Das 		.flags = CLK_SET_RATE_PARENT,
216*92aae35fSTaniya Das 		.ops = &clk_rcg2_shared_ops,
217*92aae35fSTaniya Das 	},
218*92aae35fSTaniya Das };
219*92aae35fSTaniya Das 
220*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk0_clk = {
221*92aae35fSTaniya Das 	.halt_reg = 0x4018,
222*92aae35fSTaniya Das 	.halt_check = BRANCH_HALT,
223*92aae35fSTaniya Das 	.clkr = {
224*92aae35fSTaniya Das 		.enable_reg = 0x4018,
225*92aae35fSTaniya Das 		.enable_mask = BIT(0),
226*92aae35fSTaniya Das 		.hw.init = &(const struct clk_init_data) {
227*92aae35fSTaniya Das 			.name = "cam_bist_mclk_cc_mclk0_clk",
228*92aae35fSTaniya Das 			.parent_hws = (const struct clk_hw*[]) {
229*92aae35fSTaniya Das 				&cam_bist_mclk_cc_mclk0_clk_src.clkr.hw,
230*92aae35fSTaniya Das 			},
231*92aae35fSTaniya Das 			.num_parents = 1,
232*92aae35fSTaniya Das 			.flags = CLK_SET_RATE_PARENT,
233*92aae35fSTaniya Das 			.ops = &clk_branch2_ops,
234*92aae35fSTaniya Das 		},
235*92aae35fSTaniya Das 	},
236*92aae35fSTaniya Das };
237*92aae35fSTaniya Das 
238*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk1_clk = {
239*92aae35fSTaniya Das 	.halt_reg = 0x4034,
240*92aae35fSTaniya Das 	.halt_check = BRANCH_HALT,
241*92aae35fSTaniya Das 	.clkr = {
242*92aae35fSTaniya Das 		.enable_reg = 0x4034,
243*92aae35fSTaniya Das 		.enable_mask = BIT(0),
244*92aae35fSTaniya Das 		.hw.init = &(const struct clk_init_data) {
245*92aae35fSTaniya Das 			.name = "cam_bist_mclk_cc_mclk1_clk",
246*92aae35fSTaniya Das 			.parent_hws = (const struct clk_hw*[]) {
247*92aae35fSTaniya Das 				&cam_bist_mclk_cc_mclk1_clk_src.clkr.hw,
248*92aae35fSTaniya Das 			},
249*92aae35fSTaniya Das 			.num_parents = 1,
250*92aae35fSTaniya Das 			.flags = CLK_SET_RATE_PARENT,
251*92aae35fSTaniya Das 			.ops = &clk_branch2_ops,
252*92aae35fSTaniya Das 		},
253*92aae35fSTaniya Das 	},
254*92aae35fSTaniya Das };
255*92aae35fSTaniya Das 
256*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk2_clk = {
257*92aae35fSTaniya Das 	.halt_reg = 0x4050,
258*92aae35fSTaniya Das 	.halt_check = BRANCH_HALT,
259*92aae35fSTaniya Das 	.clkr = {
260*92aae35fSTaniya Das 		.enable_reg = 0x4050,
261*92aae35fSTaniya Das 		.enable_mask = BIT(0),
262*92aae35fSTaniya Das 		.hw.init = &(const struct clk_init_data) {
263*92aae35fSTaniya Das 			.name = "cam_bist_mclk_cc_mclk2_clk",
264*92aae35fSTaniya Das 			.parent_hws = (const struct clk_hw*[]) {
265*92aae35fSTaniya Das 				&cam_bist_mclk_cc_mclk2_clk_src.clkr.hw,
266*92aae35fSTaniya Das 			},
267*92aae35fSTaniya Das 			.num_parents = 1,
268*92aae35fSTaniya Das 			.flags = CLK_SET_RATE_PARENT,
269*92aae35fSTaniya Das 			.ops = &clk_branch2_ops,
270*92aae35fSTaniya Das 		},
271*92aae35fSTaniya Das 	},
272*92aae35fSTaniya Das };
273*92aae35fSTaniya Das 
274*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk3_clk = {
275*92aae35fSTaniya Das 	.halt_reg = 0x406c,
276*92aae35fSTaniya Das 	.halt_check = BRANCH_HALT,
277*92aae35fSTaniya Das 	.clkr = {
278*92aae35fSTaniya Das 		.enable_reg = 0x406c,
279*92aae35fSTaniya Das 		.enable_mask = BIT(0),
280*92aae35fSTaniya Das 		.hw.init = &(const struct clk_init_data) {
281*92aae35fSTaniya Das 			.name = "cam_bist_mclk_cc_mclk3_clk",
282*92aae35fSTaniya Das 			.parent_hws = (const struct clk_hw*[]) {
283*92aae35fSTaniya Das 				&cam_bist_mclk_cc_mclk3_clk_src.clkr.hw,
284*92aae35fSTaniya Das 			},
285*92aae35fSTaniya Das 			.num_parents = 1,
286*92aae35fSTaniya Das 			.flags = CLK_SET_RATE_PARENT,
287*92aae35fSTaniya Das 			.ops = &clk_branch2_ops,
288*92aae35fSTaniya Das 		},
289*92aae35fSTaniya Das 	},
290*92aae35fSTaniya Das };
291*92aae35fSTaniya Das 
292*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk4_clk = {
293*92aae35fSTaniya Das 	.halt_reg = 0x4088,
294*92aae35fSTaniya Das 	.halt_check = BRANCH_HALT,
295*92aae35fSTaniya Das 	.clkr = {
296*92aae35fSTaniya Das 		.enable_reg = 0x4088,
297*92aae35fSTaniya Das 		.enable_mask = BIT(0),
298*92aae35fSTaniya Das 		.hw.init = &(const struct clk_init_data) {
299*92aae35fSTaniya Das 			.name = "cam_bist_mclk_cc_mclk4_clk",
300*92aae35fSTaniya Das 			.parent_hws = (const struct clk_hw*[]) {
301*92aae35fSTaniya Das 				&cam_bist_mclk_cc_mclk4_clk_src.clkr.hw,
302*92aae35fSTaniya Das 			},
303*92aae35fSTaniya Das 			.num_parents = 1,
304*92aae35fSTaniya Das 			.flags = CLK_SET_RATE_PARENT,
305*92aae35fSTaniya Das 			.ops = &clk_branch2_ops,
306*92aae35fSTaniya Das 		},
307*92aae35fSTaniya Das 	},
308*92aae35fSTaniya Das };
309*92aae35fSTaniya Das 
310*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk5_clk = {
311*92aae35fSTaniya Das 	.halt_reg = 0x40a4,
312*92aae35fSTaniya Das 	.halt_check = BRANCH_HALT,
313*92aae35fSTaniya Das 	.clkr = {
314*92aae35fSTaniya Das 		.enable_reg = 0x40a4,
315*92aae35fSTaniya Das 		.enable_mask = BIT(0),
316*92aae35fSTaniya Das 		.hw.init = &(const struct clk_init_data) {
317*92aae35fSTaniya Das 			.name = "cam_bist_mclk_cc_mclk5_clk",
318*92aae35fSTaniya Das 			.parent_hws = (const struct clk_hw*[]) {
319*92aae35fSTaniya Das 				&cam_bist_mclk_cc_mclk5_clk_src.clkr.hw,
320*92aae35fSTaniya Das 			},
321*92aae35fSTaniya Das 			.num_parents = 1,
322*92aae35fSTaniya Das 			.flags = CLK_SET_RATE_PARENT,
323*92aae35fSTaniya Das 			.ops = &clk_branch2_ops,
324*92aae35fSTaniya Das 		},
325*92aae35fSTaniya Das 	},
326*92aae35fSTaniya Das };
327*92aae35fSTaniya Das 
328*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk6_clk = {
329*92aae35fSTaniya Das 	.halt_reg = 0x40c0,
330*92aae35fSTaniya Das 	.halt_check = BRANCH_HALT,
331*92aae35fSTaniya Das 	.clkr = {
332*92aae35fSTaniya Das 		.enable_reg = 0x40c0,
333*92aae35fSTaniya Das 		.enable_mask = BIT(0),
334*92aae35fSTaniya Das 		.hw.init = &(const struct clk_init_data) {
335*92aae35fSTaniya Das 			.name = "cam_bist_mclk_cc_mclk6_clk",
336*92aae35fSTaniya Das 			.parent_hws = (const struct clk_hw*[]) {
337*92aae35fSTaniya Das 				&cam_bist_mclk_cc_mclk6_clk_src.clkr.hw,
338*92aae35fSTaniya Das 			},
339*92aae35fSTaniya Das 			.num_parents = 1,
340*92aae35fSTaniya Das 			.flags = CLK_SET_RATE_PARENT,
341*92aae35fSTaniya Das 			.ops = &clk_branch2_ops,
342*92aae35fSTaniya Das 		},
343*92aae35fSTaniya Das 	},
344*92aae35fSTaniya Das };
345*92aae35fSTaniya Das 
346*92aae35fSTaniya Das static struct clk_branch cam_bist_mclk_cc_mclk7_clk = {
347*92aae35fSTaniya Das 	.halt_reg = 0x40dc,
348*92aae35fSTaniya Das 	.halt_check = BRANCH_HALT,
349*92aae35fSTaniya Das 	.clkr = {
350*92aae35fSTaniya Das 		.enable_reg = 0x40dc,
351*92aae35fSTaniya Das 		.enable_mask = BIT(0),
352*92aae35fSTaniya Das 		.hw.init = &(const struct clk_init_data) {
353*92aae35fSTaniya Das 			.name = "cam_bist_mclk_cc_mclk7_clk",
354*92aae35fSTaniya Das 			.parent_hws = (const struct clk_hw*[]) {
355*92aae35fSTaniya Das 				&cam_bist_mclk_cc_mclk7_clk_src.clkr.hw,
356*92aae35fSTaniya Das 			},
357*92aae35fSTaniya Das 			.num_parents = 1,
358*92aae35fSTaniya Das 			.flags = CLK_SET_RATE_PARENT,
359*92aae35fSTaniya Das 			.ops = &clk_branch2_ops,
360*92aae35fSTaniya Das 		},
361*92aae35fSTaniya Das 	},
362*92aae35fSTaniya Das };
363*92aae35fSTaniya Das 
364*92aae35fSTaniya Das static struct clk_regmap *cam_bist_mclk_cc_kaanapali_clocks[] = {
365*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK0_CLK] = &cam_bist_mclk_cc_mclk0_clk.clkr,
366*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK0_CLK_SRC] = &cam_bist_mclk_cc_mclk0_clk_src.clkr,
367*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK1_CLK] = &cam_bist_mclk_cc_mclk1_clk.clkr,
368*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK1_CLK_SRC] = &cam_bist_mclk_cc_mclk1_clk_src.clkr,
369*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK2_CLK] = &cam_bist_mclk_cc_mclk2_clk.clkr,
370*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK2_CLK_SRC] = &cam_bist_mclk_cc_mclk2_clk_src.clkr,
371*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK3_CLK] = &cam_bist_mclk_cc_mclk3_clk.clkr,
372*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK3_CLK_SRC] = &cam_bist_mclk_cc_mclk3_clk_src.clkr,
373*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK4_CLK] = &cam_bist_mclk_cc_mclk4_clk.clkr,
374*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK4_CLK_SRC] = &cam_bist_mclk_cc_mclk4_clk_src.clkr,
375*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK5_CLK] = &cam_bist_mclk_cc_mclk5_clk.clkr,
376*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK5_CLK_SRC] = &cam_bist_mclk_cc_mclk5_clk_src.clkr,
377*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK6_CLK] = &cam_bist_mclk_cc_mclk6_clk.clkr,
378*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK6_CLK_SRC] = &cam_bist_mclk_cc_mclk6_clk_src.clkr,
379*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK7_CLK] = &cam_bist_mclk_cc_mclk7_clk.clkr,
380*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_MCLK7_CLK_SRC] = &cam_bist_mclk_cc_mclk7_clk_src.clkr,
381*92aae35fSTaniya Das 	[CAM_BIST_MCLK_CC_PLL0] = &cam_bist_mclk_cc_pll0.clkr,
382*92aae35fSTaniya Das };
383*92aae35fSTaniya Das 
384*92aae35fSTaniya Das static struct clk_alpha_pll *cam_bist_mclk_cc_kaanapali_plls[] = {
385*92aae35fSTaniya Das 	&cam_bist_mclk_cc_pll0,
386*92aae35fSTaniya Das };
387*92aae35fSTaniya Das 
388*92aae35fSTaniya Das static u32 cam_bist_mclk_cc_kaanapali_critical_cbcrs[] = {
389*92aae35fSTaniya Das 	0x40e0, /* CAM_BIST_MCLK_CC_SLEEP_CLK */
390*92aae35fSTaniya Das };
391*92aae35fSTaniya Das 
392*92aae35fSTaniya Das static const struct regmap_config cam_bist_mclk_cc_kaanapali_regmap_config = {
393*92aae35fSTaniya Das 	.reg_bits = 32,
394*92aae35fSTaniya Das 	.reg_stride = 4,
395*92aae35fSTaniya Das 	.val_bits = 32,
396*92aae35fSTaniya Das 	.max_register = 0x5010,
397*92aae35fSTaniya Das 	.fast_io = true,
398*92aae35fSTaniya Das };
399*92aae35fSTaniya Das 
400*92aae35fSTaniya Das static struct qcom_cc_driver_data cam_bist_mclk_cc_kaanapali_driver_data = {
401*92aae35fSTaniya Das 	.alpha_plls = cam_bist_mclk_cc_kaanapali_plls,
402*92aae35fSTaniya Das 	.num_alpha_plls = ARRAY_SIZE(cam_bist_mclk_cc_kaanapali_plls),
403*92aae35fSTaniya Das 	.clk_cbcrs = cam_bist_mclk_cc_kaanapali_critical_cbcrs,
404*92aae35fSTaniya Das 	.num_clk_cbcrs = ARRAY_SIZE(cam_bist_mclk_cc_kaanapali_critical_cbcrs),
405*92aae35fSTaniya Das };
406*92aae35fSTaniya Das 
407*92aae35fSTaniya Das static const struct qcom_cc_desc cam_bist_mclk_cc_kaanapali_desc = {
408*92aae35fSTaniya Das 	.config = &cam_bist_mclk_cc_kaanapali_regmap_config,
409*92aae35fSTaniya Das 	.clks = cam_bist_mclk_cc_kaanapali_clocks,
410*92aae35fSTaniya Das 	.num_clks = ARRAY_SIZE(cam_bist_mclk_cc_kaanapali_clocks),
411*92aae35fSTaniya Das 	.use_rpm = true,
412*92aae35fSTaniya Das 	.driver_data = &cam_bist_mclk_cc_kaanapali_driver_data,
413*92aae35fSTaniya Das };
414*92aae35fSTaniya Das 
415*92aae35fSTaniya Das static const struct of_device_id cam_bist_mclk_cc_kaanapali_match_table[] = {
416*92aae35fSTaniya Das 	{ .compatible = "qcom,kaanapali-cambistmclkcc" },
417*92aae35fSTaniya Das 	{ }
418*92aae35fSTaniya Das };
419*92aae35fSTaniya Das MODULE_DEVICE_TABLE(of, cam_bist_mclk_cc_kaanapali_match_table);
420*92aae35fSTaniya Das 
421*92aae35fSTaniya Das static int cam_bist_mclk_cc_kaanapali_probe(struct platform_device *pdev)
422*92aae35fSTaniya Das {
423*92aae35fSTaniya Das 	return qcom_cc_probe(pdev, &cam_bist_mclk_cc_kaanapali_desc);
424*92aae35fSTaniya Das }
425*92aae35fSTaniya Das 
426*92aae35fSTaniya Das static struct platform_driver cam_bist_mclk_cc_kaanapali_driver = {
427*92aae35fSTaniya Das 	.probe = cam_bist_mclk_cc_kaanapali_probe,
428*92aae35fSTaniya Das 	.driver = {
429*92aae35fSTaniya Das 		.name = "cambistmclkcc-kaanapali",
430*92aae35fSTaniya Das 		.of_match_table = cam_bist_mclk_cc_kaanapali_match_table,
431*92aae35fSTaniya Das 	},
432*92aae35fSTaniya Das };
433*92aae35fSTaniya Das 
434*92aae35fSTaniya Das module_platform_driver(cam_bist_mclk_cc_kaanapali_driver);
435*92aae35fSTaniya Das 
436*92aae35fSTaniya Das MODULE_DESCRIPTION("QTI CAMBISTMCLKCC Kaanapali Driver");
437*92aae35fSTaniya Das MODULE_LICENSE("GPL");
438