xref: /linux/drivers/clk/qcom/videocc-sm6350.c (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
1*720b1e8fSKonrad Dybcio // SPDX-License-Identifier: GPL-2.0-only
2*720b1e8fSKonrad Dybcio /*
3*720b1e8fSKonrad Dybcio  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
4*720b1e8fSKonrad Dybcio  * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org>
5*720b1e8fSKonrad Dybcio  * Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
6*720b1e8fSKonrad Dybcio  */
7*720b1e8fSKonrad Dybcio 
8*720b1e8fSKonrad Dybcio #include <linux/clk-provider.h>
9*720b1e8fSKonrad Dybcio #include <linux/module.h>
10*720b1e8fSKonrad Dybcio #include <linux/platform_device.h>
11*720b1e8fSKonrad Dybcio #include <linux/regmap.h>
12*720b1e8fSKonrad Dybcio 
13*720b1e8fSKonrad Dybcio #include <dt-bindings/clock/qcom,sm6350-videocc.h>
14*720b1e8fSKonrad Dybcio 
15*720b1e8fSKonrad Dybcio #include "clk-alpha-pll.h"
16*720b1e8fSKonrad Dybcio #include "clk-branch.h"
17*720b1e8fSKonrad Dybcio #include "clk-rcg.h"
18*720b1e8fSKonrad Dybcio #include "clk-regmap.h"
19*720b1e8fSKonrad Dybcio #include "common.h"
20*720b1e8fSKonrad Dybcio #include "gdsc.h"
21*720b1e8fSKonrad Dybcio 
22*720b1e8fSKonrad Dybcio enum {
23*720b1e8fSKonrad Dybcio 	DT_IFACE,
24*720b1e8fSKonrad Dybcio 	DT_BI_TCXO,
25*720b1e8fSKonrad Dybcio 	DT_SLEEP_CLK,
26*720b1e8fSKonrad Dybcio };
27*720b1e8fSKonrad Dybcio 
28*720b1e8fSKonrad Dybcio enum {
29*720b1e8fSKonrad Dybcio 	P_BI_TCXO,
30*720b1e8fSKonrad Dybcio 	P_CHIP_SLEEP_CLK,
31*720b1e8fSKonrad Dybcio 	P_VIDEO_PLL0_OUT_EVEN,
32*720b1e8fSKonrad Dybcio };
33*720b1e8fSKonrad Dybcio 
34*720b1e8fSKonrad Dybcio static const struct pll_vco fabia_vco[] = {
35*720b1e8fSKonrad Dybcio 	{ 125000000, 1000000000, 1 },
36*720b1e8fSKonrad Dybcio };
37*720b1e8fSKonrad Dybcio 
38*720b1e8fSKonrad Dybcio /* 600 MHz */
39*720b1e8fSKonrad Dybcio static const struct alpha_pll_config video_pll0_config = {
40*720b1e8fSKonrad Dybcio 	.l = 0x1f,
41*720b1e8fSKonrad Dybcio 	.alpha = 0x4000,
42*720b1e8fSKonrad Dybcio 	.config_ctl_val = 0x20485699,
43*720b1e8fSKonrad Dybcio 	.config_ctl_hi_val = 0x00002067,
44*720b1e8fSKonrad Dybcio 	.test_ctl_val = 0x40000000,
45*720b1e8fSKonrad Dybcio 	.test_ctl_hi_val = 0x00000002,
46*720b1e8fSKonrad Dybcio 	.user_ctl_val = 0x00000101,
47*720b1e8fSKonrad Dybcio 	.user_ctl_hi_val = 0x00004005,
48*720b1e8fSKonrad Dybcio };
49*720b1e8fSKonrad Dybcio 
50*720b1e8fSKonrad Dybcio static struct clk_alpha_pll video_pll0 = {
51*720b1e8fSKonrad Dybcio 	.offset = 0x0,
52*720b1e8fSKonrad Dybcio 	.vco_table = fabia_vco,
53*720b1e8fSKonrad Dybcio 	.num_vco = ARRAY_SIZE(fabia_vco),
54*720b1e8fSKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
55*720b1e8fSKonrad Dybcio 	.clkr = {
56*720b1e8fSKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
57*720b1e8fSKonrad Dybcio 			.name = "video_pll0",
58*720b1e8fSKonrad Dybcio 			.parent_data = &(const struct clk_parent_data) {
59*720b1e8fSKonrad Dybcio 				.index = DT_BI_TCXO,
60*720b1e8fSKonrad Dybcio 			},
61*720b1e8fSKonrad Dybcio 			.num_parents = 1,
62*720b1e8fSKonrad Dybcio 			.ops = &clk_alpha_pll_fabia_ops,
63*720b1e8fSKonrad Dybcio 		},
64*720b1e8fSKonrad Dybcio 	},
65*720b1e8fSKonrad Dybcio };
66*720b1e8fSKonrad Dybcio 
67*720b1e8fSKonrad Dybcio static const struct clk_div_table post_div_table_video_pll0_out_even[] = {
68*720b1e8fSKonrad Dybcio 	{ 0x1, 2 },
69*720b1e8fSKonrad Dybcio 	{ }
70*720b1e8fSKonrad Dybcio };
71*720b1e8fSKonrad Dybcio 
72*720b1e8fSKonrad Dybcio static struct clk_alpha_pll_postdiv video_pll0_out_even = {
73*720b1e8fSKonrad Dybcio 	.offset = 0x0,
74*720b1e8fSKonrad Dybcio 	.post_div_shift = 8,
75*720b1e8fSKonrad Dybcio 	.post_div_table = post_div_table_video_pll0_out_even,
76*720b1e8fSKonrad Dybcio 	.num_post_div = ARRAY_SIZE(post_div_table_video_pll0_out_even),
77*720b1e8fSKonrad Dybcio 	.width = 4,
78*720b1e8fSKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
79*720b1e8fSKonrad Dybcio 	.clkr.hw.init = &(const struct clk_init_data) {
80*720b1e8fSKonrad Dybcio 		.name = "video_pll0_out_even",
81*720b1e8fSKonrad Dybcio 		.parent_hws = (const struct clk_hw*[]) {
82*720b1e8fSKonrad Dybcio 			&video_pll0.clkr.hw,
83*720b1e8fSKonrad Dybcio 		},
84*720b1e8fSKonrad Dybcio 		.num_parents = 1,
85*720b1e8fSKonrad Dybcio 		.flags = CLK_SET_RATE_PARENT,
86*720b1e8fSKonrad Dybcio 		.ops = &clk_alpha_pll_postdiv_fabia_ops,
87*720b1e8fSKonrad Dybcio 	},
88*720b1e8fSKonrad Dybcio };
89*720b1e8fSKonrad Dybcio 
90*720b1e8fSKonrad Dybcio static const struct parent_map video_cc_parent_map_0[] = {
91*720b1e8fSKonrad Dybcio 	{ P_BI_TCXO, 0 },
92*720b1e8fSKonrad Dybcio 	{ P_VIDEO_PLL0_OUT_EVEN, 3 },
93*720b1e8fSKonrad Dybcio };
94*720b1e8fSKonrad Dybcio 
95*720b1e8fSKonrad Dybcio static const struct clk_parent_data video_cc_parent_data_0[] = {
96*720b1e8fSKonrad Dybcio 	{ .index = DT_BI_TCXO },
97*720b1e8fSKonrad Dybcio 	{ .hw = &video_pll0_out_even.clkr.hw },
98*720b1e8fSKonrad Dybcio };
99*720b1e8fSKonrad Dybcio 
100*720b1e8fSKonrad Dybcio static const struct parent_map video_cc_parent_map_1[] = {
101*720b1e8fSKonrad Dybcio 	{ P_CHIP_SLEEP_CLK, 0 },
102*720b1e8fSKonrad Dybcio };
103*720b1e8fSKonrad Dybcio 
104*720b1e8fSKonrad Dybcio static const struct clk_parent_data video_cc_parent_data_1[] = {
105*720b1e8fSKonrad Dybcio 	{ .index = DT_SLEEP_CLK },
106*720b1e8fSKonrad Dybcio };
107*720b1e8fSKonrad Dybcio 
108*720b1e8fSKonrad Dybcio static const struct freq_tbl ftbl_video_cc_iris_clk_src[] = {
109*720b1e8fSKonrad Dybcio 	F(133250000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
110*720b1e8fSKonrad Dybcio 	F(240000000, P_VIDEO_PLL0_OUT_EVEN, 1.5, 0, 0),
111*720b1e8fSKonrad Dybcio 	F(300000000, P_VIDEO_PLL0_OUT_EVEN, 1, 0, 0),
112*720b1e8fSKonrad Dybcio 	F(380000000, P_VIDEO_PLL0_OUT_EVEN, 1, 0, 0),
113*720b1e8fSKonrad Dybcio 	F(460000000, P_VIDEO_PLL0_OUT_EVEN, 1, 0, 0),
114*720b1e8fSKonrad Dybcio 	{ }
115*720b1e8fSKonrad Dybcio };
116*720b1e8fSKonrad Dybcio 
117*720b1e8fSKonrad Dybcio static struct clk_rcg2 video_cc_iris_clk_src = {
118*720b1e8fSKonrad Dybcio 	.cmd_rcgr = 0x1000,
119*720b1e8fSKonrad Dybcio 	.mnd_width = 0,
120*720b1e8fSKonrad Dybcio 	.hid_width = 5,
121*720b1e8fSKonrad Dybcio 	.parent_map = video_cc_parent_map_0,
122*720b1e8fSKonrad Dybcio 	.freq_tbl = ftbl_video_cc_iris_clk_src,
123*720b1e8fSKonrad Dybcio 	.clkr.hw.init = &(const struct clk_init_data) {
124*720b1e8fSKonrad Dybcio 		.name = "video_cc_iris_clk_src",
125*720b1e8fSKonrad Dybcio 		.parent_data = video_cc_parent_data_0,
126*720b1e8fSKonrad Dybcio 		.num_parents = ARRAY_SIZE(video_cc_parent_data_0),
127*720b1e8fSKonrad Dybcio 		.flags = CLK_SET_RATE_PARENT,
128*720b1e8fSKonrad Dybcio 		.ops = &clk_rcg2_shared_ops,
129*720b1e8fSKonrad Dybcio 	},
130*720b1e8fSKonrad Dybcio };
131*720b1e8fSKonrad Dybcio 
132*720b1e8fSKonrad Dybcio static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = {
133*720b1e8fSKonrad Dybcio 	F(32764, P_CHIP_SLEEP_CLK, 1, 0, 0),
134*720b1e8fSKonrad Dybcio 	{ }
135*720b1e8fSKonrad Dybcio };
136*720b1e8fSKonrad Dybcio 
137*720b1e8fSKonrad Dybcio static struct clk_rcg2 video_cc_sleep_clk_src = {
138*720b1e8fSKonrad Dybcio 	.cmd_rcgr = 0x701c,
139*720b1e8fSKonrad Dybcio 	.mnd_width = 0,
140*720b1e8fSKonrad Dybcio 	.hid_width = 5,
141*720b1e8fSKonrad Dybcio 	.parent_map = video_cc_parent_map_1,
142*720b1e8fSKonrad Dybcio 	.freq_tbl = ftbl_video_cc_sleep_clk_src,
143*720b1e8fSKonrad Dybcio 	.clkr.hw.init = &(const struct clk_init_data) {
144*720b1e8fSKonrad Dybcio 		.name = "video_cc_sleep_clk_src",
145*720b1e8fSKonrad Dybcio 		.parent_data = video_cc_parent_data_1,
146*720b1e8fSKonrad Dybcio 		.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
147*720b1e8fSKonrad Dybcio 		.ops = &clk_rcg2_ops,
148*720b1e8fSKonrad Dybcio 	},
149*720b1e8fSKonrad Dybcio };
150*720b1e8fSKonrad Dybcio 
151*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_iris_ahb_clk = {
152*720b1e8fSKonrad Dybcio 	.halt_reg = 0x5004,
153*720b1e8fSKonrad Dybcio 	.halt_check = BRANCH_VOTED,
154*720b1e8fSKonrad Dybcio 	.clkr = {
155*720b1e8fSKonrad Dybcio 		.enable_reg = 0x5004,
156*720b1e8fSKonrad Dybcio 		.enable_mask = BIT(0),
157*720b1e8fSKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
158*720b1e8fSKonrad Dybcio 			.name = "video_cc_iris_ahb_clk",
159*720b1e8fSKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
160*720b1e8fSKonrad Dybcio 				&video_cc_iris_clk_src.clkr.hw,
161*720b1e8fSKonrad Dybcio 			},
162*720b1e8fSKonrad Dybcio 			.num_parents = 1,
163*720b1e8fSKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
164*720b1e8fSKonrad Dybcio 			.ops = &clk_branch2_ops,
165*720b1e8fSKonrad Dybcio 		},
166*720b1e8fSKonrad Dybcio 	},
167*720b1e8fSKonrad Dybcio };
168*720b1e8fSKonrad Dybcio 
169*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_mvs0_axi_clk = {
170*720b1e8fSKonrad Dybcio 	.halt_reg = 0x800c,
171*720b1e8fSKonrad Dybcio 	.halt_check = BRANCH_HALT,
172*720b1e8fSKonrad Dybcio 	.clkr = {
173*720b1e8fSKonrad Dybcio 		.enable_reg = 0x800c,
174*720b1e8fSKonrad Dybcio 		.enable_mask = BIT(0),
175*720b1e8fSKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
176*720b1e8fSKonrad Dybcio 			.name = "video_cc_mvs0_axi_clk",
177*720b1e8fSKonrad Dybcio 			.ops = &clk_branch2_ops,
178*720b1e8fSKonrad Dybcio 		},
179*720b1e8fSKonrad Dybcio 	},
180*720b1e8fSKonrad Dybcio };
181*720b1e8fSKonrad Dybcio 
182*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_mvs0_core_clk = {
183*720b1e8fSKonrad Dybcio 	.halt_reg = 0x3010,
184*720b1e8fSKonrad Dybcio 	.halt_check = BRANCH_VOTED,
185*720b1e8fSKonrad Dybcio 	.hwcg_reg = 0x3010,
186*720b1e8fSKonrad Dybcio 	.hwcg_bit = 1,
187*720b1e8fSKonrad Dybcio 	.clkr = {
188*720b1e8fSKonrad Dybcio 		.enable_reg = 0x3010,
189*720b1e8fSKonrad Dybcio 		.enable_mask = BIT(0),
190*720b1e8fSKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
191*720b1e8fSKonrad Dybcio 			.name = "video_cc_mvs0_core_clk",
192*720b1e8fSKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
193*720b1e8fSKonrad Dybcio 				&video_cc_iris_clk_src.clkr.hw,
194*720b1e8fSKonrad Dybcio 			},
195*720b1e8fSKonrad Dybcio 			.num_parents = 1,
196*720b1e8fSKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
197*720b1e8fSKonrad Dybcio 			.ops = &clk_branch2_ops,
198*720b1e8fSKonrad Dybcio 		},
199*720b1e8fSKonrad Dybcio 	},
200*720b1e8fSKonrad Dybcio };
201*720b1e8fSKonrad Dybcio 
202*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_mvsc_core_clk = {
203*720b1e8fSKonrad Dybcio 	.halt_reg = 0x2014,
204*720b1e8fSKonrad Dybcio 	.halt_check = BRANCH_HALT,
205*720b1e8fSKonrad Dybcio 	.clkr = {
206*720b1e8fSKonrad Dybcio 		.enable_reg = 0x2014,
207*720b1e8fSKonrad Dybcio 		.enable_mask = BIT(0),
208*720b1e8fSKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
209*720b1e8fSKonrad Dybcio 			.name = "video_cc_mvsc_core_clk",
210*720b1e8fSKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
211*720b1e8fSKonrad Dybcio 				&video_cc_iris_clk_src.clkr.hw,
212*720b1e8fSKonrad Dybcio 			},
213*720b1e8fSKonrad Dybcio 			.num_parents = 1,
214*720b1e8fSKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
215*720b1e8fSKonrad Dybcio 			.ops = &clk_branch2_ops,
216*720b1e8fSKonrad Dybcio 		},
217*720b1e8fSKonrad Dybcio 	},
218*720b1e8fSKonrad Dybcio };
219*720b1e8fSKonrad Dybcio 
220*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_mvsc_ctl_axi_clk = {
221*720b1e8fSKonrad Dybcio 	.halt_reg = 0x8004,
222*720b1e8fSKonrad Dybcio 	.halt_check = BRANCH_HALT,
223*720b1e8fSKonrad Dybcio 	.clkr = {
224*720b1e8fSKonrad Dybcio 		.enable_reg = 0x8004,
225*720b1e8fSKonrad Dybcio 		.enable_mask = BIT(0),
226*720b1e8fSKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
227*720b1e8fSKonrad Dybcio 			.name = "video_cc_mvsc_ctl_axi_clk",
228*720b1e8fSKonrad Dybcio 			.ops = &clk_branch2_ops,
229*720b1e8fSKonrad Dybcio 		},
230*720b1e8fSKonrad Dybcio 	},
231*720b1e8fSKonrad Dybcio };
232*720b1e8fSKonrad Dybcio 
233*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_sleep_clk = {
234*720b1e8fSKonrad Dybcio 	.halt_reg = 0x7034,
235*720b1e8fSKonrad Dybcio 	.halt_check = BRANCH_HALT,
236*720b1e8fSKonrad Dybcio 	.clkr = {
237*720b1e8fSKonrad Dybcio 		.enable_reg = 0x7034,
238*720b1e8fSKonrad Dybcio 		.enable_mask = BIT(0),
239*720b1e8fSKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
240*720b1e8fSKonrad Dybcio 			.name = "video_cc_sleep_clk",
241*720b1e8fSKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
242*720b1e8fSKonrad Dybcio 				&video_cc_sleep_clk_src.clkr.hw,
243*720b1e8fSKonrad Dybcio 			},
244*720b1e8fSKonrad Dybcio 			.num_parents = 1,
245*720b1e8fSKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
246*720b1e8fSKonrad Dybcio 			.ops = &clk_branch2_ops,
247*720b1e8fSKonrad Dybcio 		},
248*720b1e8fSKonrad Dybcio 	},
249*720b1e8fSKonrad Dybcio };
250*720b1e8fSKonrad Dybcio 
251*720b1e8fSKonrad Dybcio static struct clk_branch video_cc_venus_ahb_clk = {
252*720b1e8fSKonrad Dybcio 	.halt_reg = 0x801c,
253*720b1e8fSKonrad Dybcio 	.halt_check = BRANCH_HALT,
254*720b1e8fSKonrad Dybcio 	.clkr = {
255*720b1e8fSKonrad Dybcio 		.enable_reg = 0x801c,
256*720b1e8fSKonrad Dybcio 		.enable_mask = BIT(0),
257*720b1e8fSKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
258*720b1e8fSKonrad Dybcio 			.name = "video_cc_venus_ahb_clk",
259*720b1e8fSKonrad Dybcio 			.ops = &clk_branch2_ops,
260*720b1e8fSKonrad Dybcio 		},
261*720b1e8fSKonrad Dybcio 	},
262*720b1e8fSKonrad Dybcio };
263*720b1e8fSKonrad Dybcio 
264*720b1e8fSKonrad Dybcio static struct gdsc mvsc_gdsc = {
265*720b1e8fSKonrad Dybcio 	.gdscr = 0x2004,
266*720b1e8fSKonrad Dybcio 	.en_rest_wait_val = 0x2,
267*720b1e8fSKonrad Dybcio 	.en_few_wait_val = 0x2,
268*720b1e8fSKonrad Dybcio 	.clk_dis_wait_val = 0x6,
269*720b1e8fSKonrad Dybcio 	.pd = {
270*720b1e8fSKonrad Dybcio 		.name = "mvsc_gdsc",
271*720b1e8fSKonrad Dybcio 	},
272*720b1e8fSKonrad Dybcio 	.pwrsts = PWRSTS_OFF_ON,
273*720b1e8fSKonrad Dybcio };
274*720b1e8fSKonrad Dybcio 
275*720b1e8fSKonrad Dybcio static struct gdsc mvs0_gdsc = {
276*720b1e8fSKonrad Dybcio 	.gdscr = 0x3004,
277*720b1e8fSKonrad Dybcio 	.en_rest_wait_val = 0x2,
278*720b1e8fSKonrad Dybcio 	.en_few_wait_val = 0x2,
279*720b1e8fSKonrad Dybcio 	.clk_dis_wait_val = 0x6,
280*720b1e8fSKonrad Dybcio 	.pd = {
281*720b1e8fSKonrad Dybcio 		.name = "mvs0_gdsc",
282*720b1e8fSKonrad Dybcio 	},
283*720b1e8fSKonrad Dybcio 	.pwrsts = PWRSTS_OFF_ON,
284*720b1e8fSKonrad Dybcio 	.flags = HW_CTRL_TRIGGER,
285*720b1e8fSKonrad Dybcio };
286*720b1e8fSKonrad Dybcio 
287*720b1e8fSKonrad Dybcio static struct gdsc *video_cc_sm6350_gdscs[] = {
288*720b1e8fSKonrad Dybcio 	[MVSC_GDSC] = &mvsc_gdsc,
289*720b1e8fSKonrad Dybcio 	[MVS0_GDSC] = &mvs0_gdsc,
290*720b1e8fSKonrad Dybcio };
291*720b1e8fSKonrad Dybcio 
292*720b1e8fSKonrad Dybcio static struct clk_regmap *video_cc_sm6350_clocks[] = {
293*720b1e8fSKonrad Dybcio 	[VIDEO_CC_IRIS_AHB_CLK] = &video_cc_iris_ahb_clk.clkr,
294*720b1e8fSKonrad Dybcio 	[VIDEO_CC_IRIS_CLK_SRC] = &video_cc_iris_clk_src.clkr,
295*720b1e8fSKonrad Dybcio 	[VIDEO_CC_MVS0_AXI_CLK] = &video_cc_mvs0_axi_clk.clkr,
296*720b1e8fSKonrad Dybcio 	[VIDEO_CC_MVS0_CORE_CLK] = &video_cc_mvs0_core_clk.clkr,
297*720b1e8fSKonrad Dybcio 	[VIDEO_CC_MVSC_CORE_CLK] = &video_cc_mvsc_core_clk.clkr,
298*720b1e8fSKonrad Dybcio 	[VIDEO_CC_MVSC_CTL_AXI_CLK] = &video_cc_mvsc_ctl_axi_clk.clkr,
299*720b1e8fSKonrad Dybcio 	[VIDEO_CC_SLEEP_CLK] = &video_cc_sleep_clk.clkr,
300*720b1e8fSKonrad Dybcio 	[VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
301*720b1e8fSKonrad Dybcio 	[VIDEO_CC_VENUS_AHB_CLK] = &video_cc_venus_ahb_clk.clkr,
302*720b1e8fSKonrad Dybcio 	[VIDEO_PLL0] = &video_pll0.clkr,
303*720b1e8fSKonrad Dybcio 	[VIDEO_PLL0_OUT_EVEN] = &video_pll0_out_even.clkr,
304*720b1e8fSKonrad Dybcio };
305*720b1e8fSKonrad Dybcio 
306*720b1e8fSKonrad Dybcio static const struct regmap_config video_cc_sm6350_regmap_config = {
307*720b1e8fSKonrad Dybcio 	.reg_bits = 32,
308*720b1e8fSKonrad Dybcio 	.reg_stride = 4,
309*720b1e8fSKonrad Dybcio 	.val_bits = 32,
310*720b1e8fSKonrad Dybcio 	.max_register = 0xb000,
311*720b1e8fSKonrad Dybcio 	.fast_io = true,
312*720b1e8fSKonrad Dybcio };
313*720b1e8fSKonrad Dybcio 
314*720b1e8fSKonrad Dybcio static const struct qcom_cc_desc video_cc_sm6350_desc = {
315*720b1e8fSKonrad Dybcio 	.config = &video_cc_sm6350_regmap_config,
316*720b1e8fSKonrad Dybcio 	.clks = video_cc_sm6350_clocks,
317*720b1e8fSKonrad Dybcio 	.num_clks = ARRAY_SIZE(video_cc_sm6350_clocks),
318*720b1e8fSKonrad Dybcio 	.gdscs = video_cc_sm6350_gdscs,
319*720b1e8fSKonrad Dybcio 	.num_gdscs = ARRAY_SIZE(video_cc_sm6350_gdscs),
320*720b1e8fSKonrad Dybcio };
321*720b1e8fSKonrad Dybcio 
322*720b1e8fSKonrad Dybcio static const struct of_device_id video_cc_sm6350_match_table[] = {
323*720b1e8fSKonrad Dybcio 	{ .compatible = "qcom,sm6350-videocc" },
324*720b1e8fSKonrad Dybcio 	{ }
325*720b1e8fSKonrad Dybcio };
326*720b1e8fSKonrad Dybcio MODULE_DEVICE_TABLE(of, video_cc_sm6350_match_table);
327*720b1e8fSKonrad Dybcio 
328*720b1e8fSKonrad Dybcio static int video_cc_sm6350_probe(struct platform_device *pdev)
329*720b1e8fSKonrad Dybcio {
330*720b1e8fSKonrad Dybcio 	struct regmap *regmap;
331*720b1e8fSKonrad Dybcio 
332*720b1e8fSKonrad Dybcio 	regmap = qcom_cc_map(pdev, &video_cc_sm6350_desc);
333*720b1e8fSKonrad Dybcio 	if (IS_ERR(regmap))
334*720b1e8fSKonrad Dybcio 		return PTR_ERR(regmap);
335*720b1e8fSKonrad Dybcio 
336*720b1e8fSKonrad Dybcio 	clk_fabia_pll_configure(&video_pll0, regmap, &video_pll0_config);
337*720b1e8fSKonrad Dybcio 
338*720b1e8fSKonrad Dybcio 	/* Keep some clocks always-on */
339*720b1e8fSKonrad Dybcio 	qcom_branch_set_clk_en(regmap, 0x7018); /* VIDEO_CC_XO_CLK */
340*720b1e8fSKonrad Dybcio 
341*720b1e8fSKonrad Dybcio 	return qcom_cc_really_probe(&pdev->dev, &video_cc_sm6350_desc, regmap);
342*720b1e8fSKonrad Dybcio }
343*720b1e8fSKonrad Dybcio 
344*720b1e8fSKonrad Dybcio static struct platform_driver video_cc_sm6350_driver = {
345*720b1e8fSKonrad Dybcio 	.probe = video_cc_sm6350_probe,
346*720b1e8fSKonrad Dybcio 	.driver = {
347*720b1e8fSKonrad Dybcio 		.name = "video_cc-sm6350",
348*720b1e8fSKonrad Dybcio 		.of_match_table = video_cc_sm6350_match_table,
349*720b1e8fSKonrad Dybcio 	},
350*720b1e8fSKonrad Dybcio };
351*720b1e8fSKonrad Dybcio 
352*720b1e8fSKonrad Dybcio module_platform_driver(video_cc_sm6350_driver);
353*720b1e8fSKonrad Dybcio 
354*720b1e8fSKonrad Dybcio MODULE_DESCRIPTION("QTI VIDEO_CC SM6350 Driver");
355*720b1e8fSKonrad Dybcio MODULE_LICENSE("GPL");
356