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