xref: /linux/drivers/clk/qcom/videocc-sm8750.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1a1608605STaniya Das // SPDX-License-Identifier: GPL-2.0-only
2a1608605STaniya Das /*
3a1608605STaniya Das  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4a1608605STaniya Das  */
5a1608605STaniya Das 
6a1608605STaniya Das #include <linux/clk-provider.h>
7a1608605STaniya Das #include <linux/mod_devicetable.h>
8a1608605STaniya Das #include <linux/module.h>
9a1608605STaniya Das #include <linux/platform_device.h>
10a1608605STaniya Das #include <linux/pm_runtime.h>
11a1608605STaniya Das #include <linux/regmap.h>
12a1608605STaniya Das 
13a1608605STaniya Das #include <dt-bindings/clock/qcom,sm8750-videocc.h>
14a1608605STaniya Das 
15a1608605STaniya Das #include "clk-alpha-pll.h"
16a1608605STaniya Das #include "clk-branch.h"
17a1608605STaniya Das #include "clk-pll.h"
18a1608605STaniya Das #include "clk-rcg.h"
19a1608605STaniya Das #include "clk-regmap.h"
20a1608605STaniya Das #include "clk-regmap-divider.h"
21a1608605STaniya Das #include "clk-regmap-mux.h"
22a1608605STaniya Das #include "common.h"
23a1608605STaniya Das #include "gdsc.h"
24a1608605STaniya Das #include "reset.h"
25a1608605STaniya Das 
26a1608605STaniya Das enum {
27a1608605STaniya Das 	DT_BI_TCXO,
28a1608605STaniya Das 	DT_BI_TCXO_AO,
29a1608605STaniya Das 	DT_SLEEP_CLK,
30a1608605STaniya Das };
31a1608605STaniya Das 
32a1608605STaniya Das enum {
33a1608605STaniya Das 	P_BI_TCXO,
34a1608605STaniya Das 	P_SLEEP_CLK,
35a1608605STaniya Das 	P_VIDEO_CC_PLL0_OUT_MAIN,
36a1608605STaniya Das };
37a1608605STaniya Das 
38a1608605STaniya Das static const struct pll_vco taycan_elu_vco[] = {
39a1608605STaniya Das 	{ 249600000, 2500000000, 0 },
40a1608605STaniya Das };
41a1608605STaniya Das 
42a1608605STaniya Das static const struct alpha_pll_config video_cc_pll0_config = {
43a1608605STaniya Das 	.l = 0x25,
44a1608605STaniya Das 	.alpha = 0x8000,
45a1608605STaniya Das 	.config_ctl_val = 0x19660387,
46a1608605STaniya Das 	.config_ctl_hi_val = 0x098060a0,
47a1608605STaniya Das 	.config_ctl_hi1_val = 0xb416cb20,
48a1608605STaniya Das 	.user_ctl_val = 0x00000000,
49a1608605STaniya Das 	.user_ctl_hi_val = 0x00000002,
50a1608605STaniya Das };
51a1608605STaniya Das 
52a1608605STaniya Das static struct clk_alpha_pll video_cc_pll0 = {
53a1608605STaniya Das 	.offset = 0x0,
54a1608605STaniya Das 	.config = &video_cc_pll0_config,
55a1608605STaniya Das 	.vco_table = taycan_elu_vco,
56a1608605STaniya Das 	.num_vco = ARRAY_SIZE(taycan_elu_vco),
57a1608605STaniya Das 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU],
58a1608605STaniya Das 	.clkr = {
59a1608605STaniya Das 		.hw.init = &(const struct clk_init_data) {
60a1608605STaniya Das 			.name = "video_cc_pll0",
61a1608605STaniya Das 			.parent_data = &(const struct clk_parent_data) {
62a1608605STaniya Das 				.index = DT_BI_TCXO,
63a1608605STaniya Das 			},
64a1608605STaniya Das 			.num_parents = 1,
65a1608605STaniya Das 			.ops = &clk_alpha_pll_taycan_elu_ops,
66a1608605STaniya Das 		},
67a1608605STaniya Das 	},
68a1608605STaniya Das };
69a1608605STaniya Das 
70a1608605STaniya Das static const struct parent_map video_cc_parent_map_0[] = {
71a1608605STaniya Das 	{ P_BI_TCXO, 0 },
72a1608605STaniya Das };
73a1608605STaniya Das 
74a1608605STaniya Das static const struct clk_parent_data video_cc_parent_data_0_ao[] = {
75a1608605STaniya Das 	{ .index = DT_BI_TCXO_AO },
76a1608605STaniya Das };
77a1608605STaniya Das 
78a1608605STaniya Das static const struct parent_map video_cc_parent_map_1[] = {
79a1608605STaniya Das 	{ P_BI_TCXO, 0 },
80a1608605STaniya Das 	{ P_VIDEO_CC_PLL0_OUT_MAIN, 1 },
81a1608605STaniya Das };
82a1608605STaniya Das 
83a1608605STaniya Das static const struct clk_parent_data video_cc_parent_data_1[] = {
84a1608605STaniya Das 	{ .index = DT_BI_TCXO },
85a1608605STaniya Das 	{ .hw = &video_cc_pll0.clkr.hw },
86a1608605STaniya Das };
87a1608605STaniya Das 
88a1608605STaniya Das static const struct parent_map video_cc_parent_map_2[] = {
89a1608605STaniya Das 	{ P_SLEEP_CLK, 0 },
90a1608605STaniya Das };
91a1608605STaniya Das 
92a1608605STaniya Das static const struct clk_parent_data video_cc_parent_data_2_ao[] = {
93a1608605STaniya Das 	{ .index = DT_SLEEP_CLK },
94a1608605STaniya Das };
95a1608605STaniya Das 
96a1608605STaniya Das static const struct freq_tbl ftbl_video_cc_ahb_clk_src[] = {
97a1608605STaniya Das 	F(19200000, P_BI_TCXO, 1, 0, 0),
98a1608605STaniya Das 	{ }
99a1608605STaniya Das };
100a1608605STaniya Das 
101a1608605STaniya Das static struct clk_rcg2 video_cc_ahb_clk_src = {
102a1608605STaniya Das 	.cmd_rcgr = 0x8018,
103a1608605STaniya Das 	.mnd_width = 0,
104a1608605STaniya Das 	.hid_width = 5,
105a1608605STaniya Das 	.parent_map = video_cc_parent_map_0,
106a1608605STaniya Das 	.freq_tbl = ftbl_video_cc_ahb_clk_src,
107a1608605STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
108a1608605STaniya Das 		.name = "video_cc_ahb_clk_src",
109a1608605STaniya Das 		.parent_data = video_cc_parent_data_0_ao,
110a1608605STaniya Das 		.num_parents = ARRAY_SIZE(video_cc_parent_data_0_ao),
111a1608605STaniya Das 		.flags = CLK_SET_RATE_PARENT,
112a1608605STaniya Das 		.ops = &clk_rcg2_ops,
113a1608605STaniya Das 	},
114a1608605STaniya Das };
115a1608605STaniya Das 
116a1608605STaniya Das static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = {
117a1608605STaniya Das 	F(720000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
118a1608605STaniya Das 	F(1014000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
119a1608605STaniya Das 	F(1260000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
120a1608605STaniya Das 	F(1332000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
121a1608605STaniya Das 	F(1600000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
122a1608605STaniya Das 	F(1710000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
123a1608605STaniya Das 	F(1890000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
124a1608605STaniya Das 	{ }
125a1608605STaniya Das };
126a1608605STaniya Das 
127a1608605STaniya Das static struct clk_rcg2 video_cc_mvs0_clk_src = {
128a1608605STaniya Das 	.cmd_rcgr = 0x8000,
129a1608605STaniya Das 	.mnd_width = 0,
130a1608605STaniya Das 	.hid_width = 5,
131a1608605STaniya Das 	.parent_map = video_cc_parent_map_1,
132a1608605STaniya Das 	.freq_tbl = ftbl_video_cc_mvs0_clk_src,
133a1608605STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
134a1608605STaniya Das 		.name = "video_cc_mvs0_clk_src",
135a1608605STaniya Das 		.parent_data = video_cc_parent_data_1,
136a1608605STaniya Das 		.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
137a1608605STaniya Das 		.flags = CLK_SET_RATE_PARENT,
138a1608605STaniya Das 		.ops = &clk_rcg2_shared_ops,
139a1608605STaniya Das 	},
140a1608605STaniya Das };
141a1608605STaniya Das 
142a1608605STaniya Das static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = {
143a1608605STaniya Das 	F(32000, P_SLEEP_CLK, 1, 0, 0),
144a1608605STaniya Das 	{ }
145a1608605STaniya Das };
146a1608605STaniya Das 
147a1608605STaniya Das static struct clk_rcg2 video_cc_sleep_clk_src = {
148a1608605STaniya Das 	.cmd_rcgr = 0x80e0,
149a1608605STaniya Das 	.mnd_width = 0,
150a1608605STaniya Das 	.hid_width = 5,
151a1608605STaniya Das 	.parent_map = video_cc_parent_map_2,
152a1608605STaniya Das 	.freq_tbl = ftbl_video_cc_sleep_clk_src,
153a1608605STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
154a1608605STaniya Das 		.name = "video_cc_sleep_clk_src",
155a1608605STaniya Das 		.parent_data = video_cc_parent_data_2_ao,
156a1608605STaniya Das 		.num_parents = ARRAY_SIZE(video_cc_parent_data_2_ao),
157a1608605STaniya Das 		.flags = CLK_SET_RATE_PARENT,
158a1608605STaniya Das 		.ops = &clk_rcg2_ops,
159a1608605STaniya Das 	},
160a1608605STaniya Das };
161a1608605STaniya Das 
162a1608605STaniya Das static struct clk_rcg2 video_cc_xo_clk_src = {
163a1608605STaniya Das 	.cmd_rcgr = 0x80bc,
164a1608605STaniya Das 	.mnd_width = 0,
165a1608605STaniya Das 	.hid_width = 5,
166a1608605STaniya Das 	.parent_map = video_cc_parent_map_0,
167a1608605STaniya Das 	.freq_tbl = ftbl_video_cc_ahb_clk_src,
168a1608605STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
169a1608605STaniya Das 		.name = "video_cc_xo_clk_src",
170a1608605STaniya Das 		.parent_data = video_cc_parent_data_0_ao,
171a1608605STaniya Das 		.num_parents = ARRAY_SIZE(video_cc_parent_data_0_ao),
172a1608605STaniya Das 		.flags = CLK_SET_RATE_PARENT,
173a1608605STaniya Das 		.ops = &clk_rcg2_ops,
174a1608605STaniya Das 	},
175a1608605STaniya Das };
176a1608605STaniya Das 
177a1608605STaniya Das static struct clk_regmap_div video_cc_mvs0_div_clk_src = {
178a1608605STaniya Das 	.reg = 0x809c,
179a1608605STaniya Das 	.shift = 0,
180a1608605STaniya Das 	.width = 4,
181a1608605STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
182a1608605STaniya Das 		.name = "video_cc_mvs0_div_clk_src",
183a1608605STaniya Das 		.parent_hws = (const struct clk_hw*[]) {
184a1608605STaniya Das 			&video_cc_mvs0_clk_src.clkr.hw,
185a1608605STaniya Das 		},
186a1608605STaniya Das 		.num_parents = 1,
187a1608605STaniya Das 		.flags = CLK_SET_RATE_PARENT,
188a1608605STaniya Das 		.ops = &clk_regmap_div_ro_ops,
189a1608605STaniya Das 	},
190a1608605STaniya Das };
191a1608605STaniya Das 
192a1608605STaniya Das static struct clk_regmap_div video_cc_mvs0c_div2_div_clk_src = {
193a1608605STaniya Das 	.reg = 0x8060,
194a1608605STaniya Das 	.shift = 0,
195a1608605STaniya Das 	.width = 4,
196a1608605STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
197a1608605STaniya Das 		.name = "video_cc_mvs0c_div2_div_clk_src",
198a1608605STaniya Das 		.parent_hws = (const struct clk_hw*[]) {
199a1608605STaniya Das 			&video_cc_mvs0_clk_src.clkr.hw,
200a1608605STaniya Das 		},
201a1608605STaniya Das 		.num_parents = 1,
202a1608605STaniya Das 		.flags = CLK_SET_RATE_PARENT,
203a1608605STaniya Das 		.ops = &clk_regmap_div_ro_ops,
204a1608605STaniya Das 	},
205a1608605STaniya Das };
206a1608605STaniya Das 
207a1608605STaniya Das static struct clk_branch video_cc_mvs0_clk = {
208a1608605STaniya Das 	.halt_reg = 0x807c,
209a1608605STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
210a1608605STaniya Das 	.hwcg_reg = 0x807c,
211a1608605STaniya Das 	.hwcg_bit = 1,
212a1608605STaniya Das 	.clkr = {
213a1608605STaniya Das 		.enable_reg = 0x807c,
214a1608605STaniya Das 		.enable_mask = BIT(0),
215a1608605STaniya Das 		.hw.init = &(const struct clk_init_data) {
216a1608605STaniya Das 			.name = "video_cc_mvs0_clk",
217a1608605STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
218a1608605STaniya Das 				&video_cc_mvs0_div_clk_src.clkr.hw,
219a1608605STaniya Das 			},
220a1608605STaniya Das 			.num_parents = 1,
221a1608605STaniya Das 			.flags = CLK_SET_RATE_PARENT,
222a1608605STaniya Das 			.ops = &clk_branch2_ops,
223a1608605STaniya Das 		},
224a1608605STaniya Das 	},
225a1608605STaniya Das };
226a1608605STaniya Das 
227a1608605STaniya Das static struct clk_mem_branch video_cc_mvs0_freerun_clk = {
228a1608605STaniya Das 	.mem_enable_reg = 0x8090,
229a1608605STaniya Das 	.mem_ack_reg =  0x8090,
230a1608605STaniya Das 	.mem_enable_mask = BIT(3),
231a1608605STaniya Das 	.mem_enable_ack_mask = GENMASK(11, 10),
232a1608605STaniya Das 	.mem_enable_invert = true,
233a1608605STaniya Das 	.branch = {
234a1608605STaniya Das 		.halt_reg = 0x808c,
235a1608605STaniya Das 		.halt_check = BRANCH_HALT,
236a1608605STaniya Das 		.clkr = {
237a1608605STaniya Das 			.enable_reg = 0x808c,
238a1608605STaniya Das 			.enable_mask = BIT(0),
239a1608605STaniya Das 			.hw.init = &(const struct clk_init_data) {
240a1608605STaniya Das 				.name = "video_cc_mvs0_freerun_clk",
241a1608605STaniya Das 				.parent_hws = (const struct clk_hw*[]) {
242a1608605STaniya Das 					&video_cc_mvs0_div_clk_src.clkr.hw,
243a1608605STaniya Das 				},
244a1608605STaniya Das 				.num_parents = 1,
245a1608605STaniya Das 				.flags = CLK_SET_RATE_PARENT,
246a1608605STaniya Das 				.ops = &clk_branch2_mem_ops,
247a1608605STaniya Das 			},
248a1608605STaniya Das 		},
249a1608605STaniya Das 	},
250a1608605STaniya Das };
251a1608605STaniya Das 
252a1608605STaniya Das static struct clk_branch video_cc_mvs0_shift_clk = {
253a1608605STaniya Das 	.halt_reg = 0x80d8,
254a1608605STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
255a1608605STaniya Das 	.hwcg_reg = 0x80d8,
256a1608605STaniya Das 	.hwcg_bit = 1,
257a1608605STaniya Das 	.clkr = {
258a1608605STaniya Das 		.enable_reg = 0x80d8,
259a1608605STaniya Das 		.enable_mask = BIT(0),
260a1608605STaniya Das 		.hw.init = &(const struct clk_init_data) {
261a1608605STaniya Das 			.name = "video_cc_mvs0_shift_clk",
262a1608605STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
263a1608605STaniya Das 				&video_cc_xo_clk_src.clkr.hw,
264a1608605STaniya Das 			},
265a1608605STaniya Das 			.num_parents = 1,
266a1608605STaniya Das 			.flags = CLK_SET_RATE_PARENT,
267a1608605STaniya Das 			.ops = &clk_branch2_ops,
268a1608605STaniya Das 		},
269a1608605STaniya Das 	},
270a1608605STaniya Das };
271a1608605STaniya Das 
272a1608605STaniya Das static struct clk_branch video_cc_mvs0c_clk = {
273a1608605STaniya Das 	.halt_reg = 0x804c,
274a1608605STaniya Das 	.halt_check = BRANCH_HALT,
275a1608605STaniya Das 	.clkr = {
276a1608605STaniya Das 		.enable_reg = 0x804c,
277a1608605STaniya Das 		.enable_mask = BIT(0),
278a1608605STaniya Das 		.hw.init = &(const struct clk_init_data) {
279a1608605STaniya Das 			.name = "video_cc_mvs0c_clk",
280a1608605STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
281a1608605STaniya Das 				&video_cc_mvs0c_div2_div_clk_src.clkr.hw,
282a1608605STaniya Das 			},
283a1608605STaniya Das 			.num_parents = 1,
284a1608605STaniya Das 			.flags = CLK_SET_RATE_PARENT,
285a1608605STaniya Das 			.ops = &clk_branch2_ops,
286a1608605STaniya Das 		},
287a1608605STaniya Das 	},
288a1608605STaniya Das };
289a1608605STaniya Das 
290a1608605STaniya Das static struct clk_branch video_cc_mvs0c_freerun_clk = {
291a1608605STaniya Das 	.halt_reg = 0x805c,
292a1608605STaniya Das 	.halt_check = BRANCH_HALT,
293a1608605STaniya Das 	.clkr = {
294a1608605STaniya Das 		.enable_reg = 0x805c,
295a1608605STaniya Das 		.enable_mask = BIT(0),
296a1608605STaniya Das 		.hw.init = &(const struct clk_init_data) {
297a1608605STaniya Das 			.name = "video_cc_mvs0c_freerun_clk",
298a1608605STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
299a1608605STaniya Das 				&video_cc_mvs0c_div2_div_clk_src.clkr.hw,
300a1608605STaniya Das 			},
301a1608605STaniya Das 			.num_parents = 1,
302a1608605STaniya Das 			.flags = CLK_SET_RATE_PARENT,
303a1608605STaniya Das 			.ops = &clk_branch2_ops,
304a1608605STaniya Das 		},
305a1608605STaniya Das 	},
306a1608605STaniya Das };
307a1608605STaniya Das 
308a1608605STaniya Das static struct clk_branch video_cc_mvs0c_shift_clk = {
309a1608605STaniya Das 	.halt_reg = 0x80dc,
310a1608605STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
311a1608605STaniya Das 	.hwcg_reg = 0x80dc,
312a1608605STaniya Das 	.hwcg_bit = 1,
313a1608605STaniya Das 	.clkr = {
314a1608605STaniya Das 		.enable_reg = 0x80dc,
315a1608605STaniya Das 		.enable_mask = BIT(0),
316a1608605STaniya Das 		.hw.init = &(const struct clk_init_data) {
317a1608605STaniya Das 			.name = "video_cc_mvs0c_shift_clk",
318a1608605STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
319a1608605STaniya Das 				&video_cc_xo_clk_src.clkr.hw,
320a1608605STaniya Das 			},
321a1608605STaniya Das 			.num_parents = 1,
322a1608605STaniya Das 			.flags = CLK_SET_RATE_PARENT,
323a1608605STaniya Das 			.ops = &clk_branch2_ops,
324a1608605STaniya Das 		},
325a1608605STaniya Das 	},
326a1608605STaniya Das };
327a1608605STaniya Das 
328a1608605STaniya Das static struct gdsc video_cc_mvs0c_gdsc = {
329a1608605STaniya Das 	.gdscr = 0x8034,
330a1608605STaniya Das 	.en_rest_wait_val = 0x2,
331a1608605STaniya Das 	.en_few_wait_val = 0x2,
332a1608605STaniya Das 	.clk_dis_wait_val = 0x6,
333a1608605STaniya Das 	.pd = {
334a1608605STaniya Das 		.name = "video_cc_mvs0c_gdsc",
335a1608605STaniya Das 	},
336a1608605STaniya Das 	.pwrsts = PWRSTS_OFF_ON,
337a1608605STaniya Das 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
338a1608605STaniya Das };
339a1608605STaniya Das 
340a1608605STaniya Das static struct gdsc video_cc_mvs0_gdsc = {
341a1608605STaniya Das 	.gdscr = 0x8068,
342a1608605STaniya Das 	.en_rest_wait_val = 0x2,
343a1608605STaniya Das 	.en_few_wait_val = 0x2,
344a1608605STaniya Das 	.clk_dis_wait_val = 0x6,
345a1608605STaniya Das 	.pd = {
346a1608605STaniya Das 		.name = "video_cc_mvs0_gdsc",
347a1608605STaniya Das 	},
348a1608605STaniya Das 	.pwrsts = PWRSTS_OFF_ON,
349a1608605STaniya Das 	.parent = &video_cc_mvs0c_gdsc.pd,
350a1608605STaniya Das 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE | HW_CTRL_TRIGGER,
351a1608605STaniya Das };
352a1608605STaniya Das 
353a1608605STaniya Das static struct clk_regmap *video_cc_sm8750_clocks[] = {
354a1608605STaniya Das 	[VIDEO_CC_AHB_CLK_SRC] = &video_cc_ahb_clk_src.clkr,
355a1608605STaniya Das 	[VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr,
356a1608605STaniya Das 	[VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr,
357a1608605STaniya Das 	[VIDEO_CC_MVS0_DIV_CLK_SRC] = &video_cc_mvs0_div_clk_src.clkr,
358a1608605STaniya Das 	[VIDEO_CC_MVS0_FREERUN_CLK] = &video_cc_mvs0_freerun_clk.branch.clkr,
359a1608605STaniya Das 	[VIDEO_CC_MVS0_SHIFT_CLK] = &video_cc_mvs0_shift_clk.clkr,
360a1608605STaniya Das 	[VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr,
361a1608605STaniya Das 	[VIDEO_CC_MVS0C_DIV2_DIV_CLK_SRC] = &video_cc_mvs0c_div2_div_clk_src.clkr,
362a1608605STaniya Das 	[VIDEO_CC_MVS0C_FREERUN_CLK] = &video_cc_mvs0c_freerun_clk.clkr,
363a1608605STaniya Das 	[VIDEO_CC_MVS0C_SHIFT_CLK] = &video_cc_mvs0c_shift_clk.clkr,
364a1608605STaniya Das 	[VIDEO_CC_PLL0] = &video_cc_pll0.clkr,
365a1608605STaniya Das 	[VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
366a1608605STaniya Das 	[VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr,
367a1608605STaniya Das };
368a1608605STaniya Das 
369a1608605STaniya Das static struct gdsc *video_cc_sm8750_gdscs[] = {
370a1608605STaniya Das 	[VIDEO_CC_MVS0_GDSC] = &video_cc_mvs0_gdsc,
371a1608605STaniya Das 	[VIDEO_CC_MVS0C_GDSC] = &video_cc_mvs0c_gdsc,
372a1608605STaniya Das };
373a1608605STaniya Das 
374a1608605STaniya Das static const struct qcom_reset_map video_cc_sm8750_resets[] = {
375a1608605STaniya Das 	[VIDEO_CC_INTERFACE_BCR] = { 0x80a0 },
376a1608605STaniya Das 	[VIDEO_CC_MVS0_BCR] = { 0x8064 },
377a1608605STaniya Das 	[VIDEO_CC_MVS0C_CLK_ARES] = { 0x804c, 2 },
378a1608605STaniya Das 	[VIDEO_CC_MVS0C_BCR] = { 0x8030 },
379a1608605STaniya Das 	[VIDEO_CC_MVS0_FREERUN_CLK_ARES] = { 0x808c, 2 },
380a1608605STaniya Das 	[VIDEO_CC_MVS0C_FREERUN_CLK_ARES] = { 0x805c, 2 },
381a1608605STaniya Das 	[VIDEO_CC_XO_CLK_ARES] = { 0x80d4, 2 },
382a1608605STaniya Das };
383a1608605STaniya Das 
384a1608605STaniya Das static const struct regmap_config video_cc_sm8750_regmap_config = {
385a1608605STaniya Das 	.reg_bits = 32,
386a1608605STaniya Das 	.reg_stride = 4,
387a1608605STaniya Das 	.val_bits = 32,
388a1608605STaniya Das 	.max_register = 0x9f4c,
389a1608605STaniya Das 	.fast_io = true,
390a1608605STaniya Das };
391a1608605STaniya Das 
392a1608605STaniya Das static struct clk_alpha_pll *video_cc_sm8750_plls[] = {
393a1608605STaniya Das 	&video_cc_pll0,
394a1608605STaniya Das };
395a1608605STaniya Das 
396a1608605STaniya Das static u32 video_cc_sm8750_critical_cbcrs[] = {
397a1608605STaniya Das 	0x80a4, /* VIDEO_CC_AHB_CLK */
398a1608605STaniya Das 	0x80f8, /* VIDEO_CC_SLEEP_CLK */
399a1608605STaniya Das 	0x80d4, /* VIDEO_CC_XO_CLK */
400a1608605STaniya Das };
401a1608605STaniya Das 
402a1608605STaniya Das static void clk_sm8750_regs_configure(struct device *dev, struct regmap *regmap)
403a1608605STaniya Das {
404a1608605STaniya Das 	/* Update DLY_ACCU_RED_SHIFTER_DONE to 0xF for mvs0, mvs0c */
405a1608605STaniya Das 	regmap_update_bits(regmap, 0x8074, GENMASK(25, 21), GENMASK(25, 21));
406a1608605STaniya Das 	regmap_update_bits(regmap, 0x8040, GENMASK(25, 21), GENMASK(25, 21));
407a1608605STaniya Das 
408a1608605STaniya Das 	regmap_update_bits(regmap, 0x9f24, BIT(0), BIT(0));
409a1608605STaniya Das }
410a1608605STaniya Das 
411a1608605STaniya Das static struct qcom_cc_driver_data video_cc_sm8750_driver_data = {
412a1608605STaniya Das 	.alpha_plls = video_cc_sm8750_plls,
413a1608605STaniya Das 	.num_alpha_plls = ARRAY_SIZE(video_cc_sm8750_plls),
414a1608605STaniya Das 	.clk_cbcrs = video_cc_sm8750_critical_cbcrs,
415a1608605STaniya Das 	.num_clk_cbcrs = ARRAY_SIZE(video_cc_sm8750_critical_cbcrs),
416a1608605STaniya Das 	.clk_regs_configure = clk_sm8750_regs_configure,
417a1608605STaniya Das };
418a1608605STaniya Das 
419*77d0ea71SKrzysztof Kozlowski static const struct qcom_cc_desc video_cc_sm8750_desc = {
420a1608605STaniya Das 	.config = &video_cc_sm8750_regmap_config,
421a1608605STaniya Das 	.clks = video_cc_sm8750_clocks,
422a1608605STaniya Das 	.num_clks = ARRAY_SIZE(video_cc_sm8750_clocks),
423a1608605STaniya Das 	.resets = video_cc_sm8750_resets,
424a1608605STaniya Das 	.num_resets = ARRAY_SIZE(video_cc_sm8750_resets),
425a1608605STaniya Das 	.gdscs = video_cc_sm8750_gdscs,
426a1608605STaniya Das 	.num_gdscs = ARRAY_SIZE(video_cc_sm8750_gdscs),
427a1608605STaniya Das 	.use_rpm = true,
428a1608605STaniya Das 	.driver_data = &video_cc_sm8750_driver_data,
429a1608605STaniya Das };
430a1608605STaniya Das 
431a1608605STaniya Das static const struct of_device_id video_cc_sm8750_match_table[] = {
432a1608605STaniya Das 	{ .compatible = "qcom,sm8750-videocc" },
433a1608605STaniya Das 	{ }
434a1608605STaniya Das };
435a1608605STaniya Das MODULE_DEVICE_TABLE(of, video_cc_sm8750_match_table);
436a1608605STaniya Das 
437a1608605STaniya Das static int video_cc_sm8750_probe(struct platform_device *pdev)
438a1608605STaniya Das {
439a1608605STaniya Das 	return qcom_cc_probe(pdev, &video_cc_sm8750_desc);
440a1608605STaniya Das }
441a1608605STaniya Das 
442a1608605STaniya Das static struct platform_driver video_cc_sm8750_driver = {
443a1608605STaniya Das 	.probe = video_cc_sm8750_probe,
444a1608605STaniya Das 	.driver = {
445a1608605STaniya Das 		.name = "video_cc-sm8750",
446a1608605STaniya Das 		.of_match_table = video_cc_sm8750_match_table,
447a1608605STaniya Das 	},
448a1608605STaniya Das };
449a1608605STaniya Das 
450a1608605STaniya Das static int __init video_cc_sm8750_init(void)
451a1608605STaniya Das {
452a1608605STaniya Das 	return platform_driver_register(&video_cc_sm8750_driver);
453a1608605STaniya Das }
454a1608605STaniya Das subsys_initcall(video_cc_sm8750_init);
455a1608605STaniya Das 
456a1608605STaniya Das static void __exit video_cc_sm8750_exit(void)
457a1608605STaniya Das {
458a1608605STaniya Das 	platform_driver_unregister(&video_cc_sm8750_driver);
459a1608605STaniya Das }
460a1608605STaniya Das module_exit(video_cc_sm8750_exit);
461a1608605STaniya Das 
462a1608605STaniya Das MODULE_DESCRIPTION("QTI VIDEO_CC SM8750 Driver");
463a1608605STaniya Das MODULE_LICENSE("GPL");
464