xref: /linux/drivers/clk/qcom/videocc-x1p42100.c (revision 8c04c1292dca29a57ea82c6a44348be49749fc22)
1*cfc34906SJagadeesh Kona // SPDX-License-Identifier: GPL-2.0-only
2*cfc34906SJagadeesh Kona /*
3*cfc34906SJagadeesh Kona  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4*cfc34906SJagadeesh Kona  */
5*cfc34906SJagadeesh Kona 
6*cfc34906SJagadeesh Kona #include <linux/clk-provider.h>
7*cfc34906SJagadeesh Kona #include <linux/mod_devicetable.h>
8*cfc34906SJagadeesh Kona #include <linux/module.h>
9*cfc34906SJagadeesh Kona #include <linux/platform_device.h>
10*cfc34906SJagadeesh Kona #include <linux/regmap.h>
11*cfc34906SJagadeesh Kona 
12*cfc34906SJagadeesh Kona #include <dt-bindings/clock/qcom,x1p42100-videocc.h>
13*cfc34906SJagadeesh Kona 
14*cfc34906SJagadeesh Kona #include "clk-alpha-pll.h"
15*cfc34906SJagadeesh Kona #include "clk-branch.h"
16*cfc34906SJagadeesh Kona #include "clk-rcg.h"
17*cfc34906SJagadeesh Kona #include "clk-regmap.h"
18*cfc34906SJagadeesh Kona #include "clk-regmap-divider.h"
19*cfc34906SJagadeesh Kona #include "common.h"
20*cfc34906SJagadeesh Kona #include "gdsc.h"
21*cfc34906SJagadeesh Kona #include "reset.h"
22*cfc34906SJagadeesh Kona 
23*cfc34906SJagadeesh Kona enum {
24*cfc34906SJagadeesh Kona 	DT_BI_TCXO,
25*cfc34906SJagadeesh Kona };
26*cfc34906SJagadeesh Kona 
27*cfc34906SJagadeesh Kona enum {
28*cfc34906SJagadeesh Kona 	P_BI_TCXO,
29*cfc34906SJagadeesh Kona 	P_VIDEO_CC_PLL0_OUT_MAIN,
30*cfc34906SJagadeesh Kona 	P_VIDEO_CC_PLL1_OUT_MAIN,
31*cfc34906SJagadeesh Kona };
32*cfc34906SJagadeesh Kona 
33*cfc34906SJagadeesh Kona static const struct pll_vco lucid_ole_vco[] = {
34*cfc34906SJagadeesh Kona 	{ 249600000, 2300000000, 0 },
35*cfc34906SJagadeesh Kona };
36*cfc34906SJagadeesh Kona 
37*cfc34906SJagadeesh Kona /* 420.0 MHz Configuration */
38*cfc34906SJagadeesh Kona static const struct alpha_pll_config video_cc_pll0_config = {
39*cfc34906SJagadeesh Kona 	.l = 0x15,
40*cfc34906SJagadeesh Kona 	.alpha = 0xe000,
41*cfc34906SJagadeesh Kona 	.config_ctl_val = 0x20485699,
42*cfc34906SJagadeesh Kona 	.config_ctl_hi_val = 0x00182261,
43*cfc34906SJagadeesh Kona 	.config_ctl_hi1_val = 0x82aa299c,
44*cfc34906SJagadeesh Kona 	.test_ctl_val = 0x00000000,
45*cfc34906SJagadeesh Kona 	.test_ctl_hi_val = 0x00000003,
46*cfc34906SJagadeesh Kona 	.test_ctl_hi1_val = 0x00009000,
47*cfc34906SJagadeesh Kona 	.test_ctl_hi2_val = 0x00000034,
48*cfc34906SJagadeesh Kona 	.user_ctl_val = 0x00000000,
49*cfc34906SJagadeesh Kona 	.user_ctl_hi_val = 0x00000005,
50*cfc34906SJagadeesh Kona };
51*cfc34906SJagadeesh Kona 
52*cfc34906SJagadeesh Kona static struct clk_alpha_pll video_cc_pll0 = {
53*cfc34906SJagadeesh Kona 	.offset = 0x0,
54*cfc34906SJagadeesh Kona 	.config = &video_cc_pll0_config,
55*cfc34906SJagadeesh Kona 	.vco_table = lucid_ole_vco,
56*cfc34906SJagadeesh Kona 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
57*cfc34906SJagadeesh Kona 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
58*cfc34906SJagadeesh Kona 	.clkr = {
59*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
60*cfc34906SJagadeesh Kona 			.name = "video_cc_pll0",
61*cfc34906SJagadeesh Kona 			.parent_data = &(const struct clk_parent_data) {
62*cfc34906SJagadeesh Kona 				.index = DT_BI_TCXO,
63*cfc34906SJagadeesh Kona 			},
64*cfc34906SJagadeesh Kona 			.num_parents = 1,
65*cfc34906SJagadeesh Kona 			.ops = &clk_alpha_pll_lucid_evo_ops,
66*cfc34906SJagadeesh Kona 		},
67*cfc34906SJagadeesh Kona 	},
68*cfc34906SJagadeesh Kona };
69*cfc34906SJagadeesh Kona 
70*cfc34906SJagadeesh Kona /* 1050.0 MHz Configuration */
71*cfc34906SJagadeesh Kona static const struct alpha_pll_config video_cc_pll1_config = {
72*cfc34906SJagadeesh Kona 	.l = 0x36,
73*cfc34906SJagadeesh Kona 	.alpha = 0xb000,
74*cfc34906SJagadeesh Kona 	.config_ctl_val = 0x20485699,
75*cfc34906SJagadeesh Kona 	.config_ctl_hi_val = 0x00182261,
76*cfc34906SJagadeesh Kona 	.config_ctl_hi1_val = 0x82aa299c,
77*cfc34906SJagadeesh Kona 	.test_ctl_val = 0x00000000,
78*cfc34906SJagadeesh Kona 	.test_ctl_hi_val = 0x00000003,
79*cfc34906SJagadeesh Kona 	.test_ctl_hi1_val = 0x00009000,
80*cfc34906SJagadeesh Kona 	.test_ctl_hi2_val = 0x00000034,
81*cfc34906SJagadeesh Kona 	.user_ctl_val = 0x00000000,
82*cfc34906SJagadeesh Kona 	.user_ctl_hi_val = 0x00000005,
83*cfc34906SJagadeesh Kona };
84*cfc34906SJagadeesh Kona 
85*cfc34906SJagadeesh Kona static struct clk_alpha_pll video_cc_pll1 = {
86*cfc34906SJagadeesh Kona 	.offset = 0x1000,
87*cfc34906SJagadeesh Kona 	.config = &video_cc_pll1_config,
88*cfc34906SJagadeesh Kona 	.vco_table = lucid_ole_vco,
89*cfc34906SJagadeesh Kona 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
90*cfc34906SJagadeesh Kona 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
91*cfc34906SJagadeesh Kona 	.clkr = {
92*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
93*cfc34906SJagadeesh Kona 			.name = "video_cc_pll1",
94*cfc34906SJagadeesh Kona 			.parent_data = &(const struct clk_parent_data) {
95*cfc34906SJagadeesh Kona 				.index = DT_BI_TCXO,
96*cfc34906SJagadeesh Kona 			},
97*cfc34906SJagadeesh Kona 			.num_parents = 1,
98*cfc34906SJagadeesh Kona 			.ops = &clk_alpha_pll_lucid_evo_ops,
99*cfc34906SJagadeesh Kona 		},
100*cfc34906SJagadeesh Kona 	},
101*cfc34906SJagadeesh Kona };
102*cfc34906SJagadeesh Kona 
103*cfc34906SJagadeesh Kona static const struct parent_map video_cc_parent_map_0[] = {
104*cfc34906SJagadeesh Kona 	{ P_BI_TCXO, 0 },
105*cfc34906SJagadeesh Kona };
106*cfc34906SJagadeesh Kona 
107*cfc34906SJagadeesh Kona static const struct clk_parent_data video_cc_parent_data_0[] = {
108*cfc34906SJagadeesh Kona 	{ .index = DT_BI_TCXO },
109*cfc34906SJagadeesh Kona };
110*cfc34906SJagadeesh Kona 
111*cfc34906SJagadeesh Kona static const struct parent_map video_cc_parent_map_1[] = {
112*cfc34906SJagadeesh Kona 	{ P_BI_TCXO, 0 },
113*cfc34906SJagadeesh Kona 	{ P_VIDEO_CC_PLL0_OUT_MAIN, 1 },
114*cfc34906SJagadeesh Kona };
115*cfc34906SJagadeesh Kona 
116*cfc34906SJagadeesh Kona static const struct clk_parent_data video_cc_parent_data_1[] = {
117*cfc34906SJagadeesh Kona 	{ .index = DT_BI_TCXO },
118*cfc34906SJagadeesh Kona 	{ .hw = &video_cc_pll0.clkr.hw },
119*cfc34906SJagadeesh Kona };
120*cfc34906SJagadeesh Kona 
121*cfc34906SJagadeesh Kona static const struct parent_map video_cc_parent_map_2[] = {
122*cfc34906SJagadeesh Kona 	{ P_BI_TCXO, 0 },
123*cfc34906SJagadeesh Kona 	{ P_VIDEO_CC_PLL1_OUT_MAIN, 1 },
124*cfc34906SJagadeesh Kona };
125*cfc34906SJagadeesh Kona 
126*cfc34906SJagadeesh Kona static const struct clk_parent_data video_cc_parent_data_2[] = {
127*cfc34906SJagadeesh Kona 	{ .index = DT_BI_TCXO },
128*cfc34906SJagadeesh Kona 	{ .hw = &video_cc_pll1.clkr.hw },
129*cfc34906SJagadeesh Kona };
130*cfc34906SJagadeesh Kona 
131*cfc34906SJagadeesh Kona static const struct freq_tbl ftbl_video_cc_mvs0_bse_clk_src[] = {
132*cfc34906SJagadeesh Kona 	F(420000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
133*cfc34906SJagadeesh Kona 	F(600000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
134*cfc34906SJagadeesh Kona 	F(670000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
135*cfc34906SJagadeesh Kona 	F(848000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
136*cfc34906SJagadeesh Kona 	F(920000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
137*cfc34906SJagadeesh Kona 	{ }
138*cfc34906SJagadeesh Kona };
139*cfc34906SJagadeesh Kona 
140*cfc34906SJagadeesh Kona static struct clk_rcg2 video_cc_mvs0_bse_clk_src = {
141*cfc34906SJagadeesh Kona 	.cmd_rcgr = 0x8154,
142*cfc34906SJagadeesh Kona 	.mnd_width = 0,
143*cfc34906SJagadeesh Kona 	.hid_width = 5,
144*cfc34906SJagadeesh Kona 	.parent_map = video_cc_parent_map_1,
145*cfc34906SJagadeesh Kona 	.freq_tbl = ftbl_video_cc_mvs0_bse_clk_src,
146*cfc34906SJagadeesh Kona 	.hw_clk_ctrl = true,
147*cfc34906SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
148*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs0_bse_clk_src",
149*cfc34906SJagadeesh Kona 		.parent_data = video_cc_parent_data_1,
150*cfc34906SJagadeesh Kona 		.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
151*cfc34906SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
152*cfc34906SJagadeesh Kona 		.ops = &clk_rcg2_shared_ops,
153*cfc34906SJagadeesh Kona 	},
154*cfc34906SJagadeesh Kona };
155*cfc34906SJagadeesh Kona 
156*cfc34906SJagadeesh Kona static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = {
157*cfc34906SJagadeesh Kona 	F(210000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0),
158*cfc34906SJagadeesh Kona 	F(300000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0),
159*cfc34906SJagadeesh Kona 	F(335000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0),
160*cfc34906SJagadeesh Kona 	F(424000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0),
161*cfc34906SJagadeesh Kona 	F(460000000, P_VIDEO_CC_PLL0_OUT_MAIN, 2, 0, 0),
162*cfc34906SJagadeesh Kona 	{ }
163*cfc34906SJagadeesh Kona };
164*cfc34906SJagadeesh Kona 
165*cfc34906SJagadeesh Kona static struct clk_rcg2 video_cc_mvs0_clk_src = {
166*cfc34906SJagadeesh Kona 	.cmd_rcgr = 0x8000,
167*cfc34906SJagadeesh Kona 	.mnd_width = 0,
168*cfc34906SJagadeesh Kona 	.hid_width = 5,
169*cfc34906SJagadeesh Kona 	.parent_map = video_cc_parent_map_1,
170*cfc34906SJagadeesh Kona 	.freq_tbl = ftbl_video_cc_mvs0_clk_src,
171*cfc34906SJagadeesh Kona 	.hw_clk_ctrl = true,
172*cfc34906SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
173*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs0_clk_src",
174*cfc34906SJagadeesh Kona 		.parent_data = video_cc_parent_data_1,
175*cfc34906SJagadeesh Kona 		.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
176*cfc34906SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
177*cfc34906SJagadeesh Kona 		.ops = &clk_rcg2_shared_ops,
178*cfc34906SJagadeesh Kona 	},
179*cfc34906SJagadeesh Kona };
180*cfc34906SJagadeesh Kona 
181*cfc34906SJagadeesh Kona static const struct freq_tbl ftbl_video_cc_mvs1_clk_src[] = {
182*cfc34906SJagadeesh Kona 	F(1050000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0),
183*cfc34906SJagadeesh Kona 	F(1350000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0),
184*cfc34906SJagadeesh Kona 	F(1650000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0),
185*cfc34906SJagadeesh Kona 	{ }
186*cfc34906SJagadeesh Kona };
187*cfc34906SJagadeesh Kona 
188*cfc34906SJagadeesh Kona static struct clk_rcg2 video_cc_mvs1_clk_src = {
189*cfc34906SJagadeesh Kona 	.cmd_rcgr = 0x8018,
190*cfc34906SJagadeesh Kona 	.mnd_width = 0,
191*cfc34906SJagadeesh Kona 	.hid_width = 5,
192*cfc34906SJagadeesh Kona 	.parent_map = video_cc_parent_map_2,
193*cfc34906SJagadeesh Kona 	.freq_tbl = ftbl_video_cc_mvs1_clk_src,
194*cfc34906SJagadeesh Kona 	.hw_clk_ctrl = true,
195*cfc34906SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
196*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs1_clk_src",
197*cfc34906SJagadeesh Kona 		.parent_data = video_cc_parent_data_2,
198*cfc34906SJagadeesh Kona 		.num_parents = ARRAY_SIZE(video_cc_parent_data_2),
199*cfc34906SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
200*cfc34906SJagadeesh Kona 		.ops = &clk_rcg2_shared_ops,
201*cfc34906SJagadeesh Kona 	},
202*cfc34906SJagadeesh Kona };
203*cfc34906SJagadeesh Kona 
204*cfc34906SJagadeesh Kona static const struct freq_tbl ftbl_video_cc_xo_clk_src[] = {
205*cfc34906SJagadeesh Kona 	F(19200000, P_BI_TCXO, 1, 0, 0),
206*cfc34906SJagadeesh Kona 	{ }
207*cfc34906SJagadeesh Kona };
208*cfc34906SJagadeesh Kona 
209*cfc34906SJagadeesh Kona static struct clk_rcg2 video_cc_xo_clk_src = {
210*cfc34906SJagadeesh Kona 	.cmd_rcgr = 0x810c,
211*cfc34906SJagadeesh Kona 	.mnd_width = 0,
212*cfc34906SJagadeesh Kona 	.hid_width = 5,
213*cfc34906SJagadeesh Kona 	.parent_map = video_cc_parent_map_0,
214*cfc34906SJagadeesh Kona 	.freq_tbl = ftbl_video_cc_xo_clk_src,
215*cfc34906SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
216*cfc34906SJagadeesh Kona 		.name = "video_cc_xo_clk_src",
217*cfc34906SJagadeesh Kona 		.parent_data = video_cc_parent_data_0,
218*cfc34906SJagadeesh Kona 		.num_parents = ARRAY_SIZE(video_cc_parent_data_0),
219*cfc34906SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
220*cfc34906SJagadeesh Kona 		.ops = &clk_rcg2_shared_ops,
221*cfc34906SJagadeesh Kona 	},
222*cfc34906SJagadeesh Kona };
223*cfc34906SJagadeesh Kona 
224*cfc34906SJagadeesh Kona static struct clk_regmap_div video_cc_mvs0_bse_div4_div_clk_src = {
225*cfc34906SJagadeesh Kona 	.reg = 0x817c,
226*cfc34906SJagadeesh Kona 	.shift = 0,
227*cfc34906SJagadeesh Kona 	.width = 4,
228*cfc34906SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
229*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs0_bse_div4_div_clk_src",
230*cfc34906SJagadeesh Kona 		.parent_hws = (const struct clk_hw*[]) {
231*cfc34906SJagadeesh Kona 			&video_cc_mvs0_bse_clk_src.clkr.hw,
232*cfc34906SJagadeesh Kona 		},
233*cfc34906SJagadeesh Kona 		.num_parents = 1,
234*cfc34906SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
235*cfc34906SJagadeesh Kona 		.ops = &clk_regmap_div_ro_ops,
236*cfc34906SJagadeesh Kona 	},
237*cfc34906SJagadeesh Kona };
238*cfc34906SJagadeesh Kona 
239*cfc34906SJagadeesh Kona static struct clk_regmap_div video_cc_mvs1_div_clk_src = {
240*cfc34906SJagadeesh Kona 	.reg = 0x80ec,
241*cfc34906SJagadeesh Kona 	.shift = 0,
242*cfc34906SJagadeesh Kona 	.width = 4,
243*cfc34906SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
244*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs1_div_clk_src",
245*cfc34906SJagadeesh Kona 		.parent_hws = (const struct clk_hw*[]) {
246*cfc34906SJagadeesh Kona 			&video_cc_mvs1_clk_src.clkr.hw,
247*cfc34906SJagadeesh Kona 		},
248*cfc34906SJagadeesh Kona 		.num_parents = 1,
249*cfc34906SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
250*cfc34906SJagadeesh Kona 		.ops = &clk_regmap_div_ro_ops,
251*cfc34906SJagadeesh Kona 	},
252*cfc34906SJagadeesh Kona };
253*cfc34906SJagadeesh Kona 
254*cfc34906SJagadeesh Kona static struct clk_regmap_div video_cc_mvs1c_div2_div_clk_src = {
255*cfc34906SJagadeesh Kona 	.reg = 0x809c,
256*cfc34906SJagadeesh Kona 	.shift = 0,
257*cfc34906SJagadeesh Kona 	.width = 4,
258*cfc34906SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
259*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs1c_div2_div_clk_src",
260*cfc34906SJagadeesh Kona 		.parent_hws = (const struct clk_hw*[]) {
261*cfc34906SJagadeesh Kona 			&video_cc_mvs1_clk_src.clkr.hw,
262*cfc34906SJagadeesh Kona 		},
263*cfc34906SJagadeesh Kona 		.num_parents = 1,
264*cfc34906SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
265*cfc34906SJagadeesh Kona 		.ops = &clk_regmap_div_ro_ops,
266*cfc34906SJagadeesh Kona 	},
267*cfc34906SJagadeesh Kona };
268*cfc34906SJagadeesh Kona 
269*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0_bse_clk = {
270*cfc34906SJagadeesh Kona 	.halt_reg = 0x8170,
271*cfc34906SJagadeesh Kona 	.halt_check = BRANCH_HALT,
272*cfc34906SJagadeesh Kona 	.clkr = {
273*cfc34906SJagadeesh Kona 		.enable_reg = 0x8170,
274*cfc34906SJagadeesh Kona 		.enable_mask = BIT(0),
275*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
276*cfc34906SJagadeesh Kona 			.name = "video_cc_mvs0_bse_clk",
277*cfc34906SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
278*cfc34906SJagadeesh Kona 				&video_cc_mvs0_bse_div4_div_clk_src.clkr.hw,
279*cfc34906SJagadeesh Kona 			},
280*cfc34906SJagadeesh Kona 			.num_parents = 1,
281*cfc34906SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
282*cfc34906SJagadeesh Kona 			.ops = &clk_branch2_ops,
283*cfc34906SJagadeesh Kona 		},
284*cfc34906SJagadeesh Kona 	},
285*cfc34906SJagadeesh Kona };
286*cfc34906SJagadeesh Kona 
287*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0_clk = {
288*cfc34906SJagadeesh Kona 	.halt_reg = 0x80b8,
289*cfc34906SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
290*cfc34906SJagadeesh Kona 	.hwcg_reg = 0x80b8,
291*cfc34906SJagadeesh Kona 	.hwcg_bit = 1,
292*cfc34906SJagadeesh Kona 	.clkr = {
293*cfc34906SJagadeesh Kona 		.enable_reg = 0x80b8,
294*cfc34906SJagadeesh Kona 		.enable_mask = BIT(0),
295*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
296*cfc34906SJagadeesh Kona 			.name = "video_cc_mvs0_clk",
297*cfc34906SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
298*cfc34906SJagadeesh Kona 				&video_cc_mvs0_clk_src.clkr.hw,
299*cfc34906SJagadeesh Kona 			},
300*cfc34906SJagadeesh Kona 			.num_parents = 1,
301*cfc34906SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
302*cfc34906SJagadeesh Kona 			.ops = &clk_branch2_ops,
303*cfc34906SJagadeesh Kona 		},
304*cfc34906SJagadeesh Kona 	},
305*cfc34906SJagadeesh Kona };
306*cfc34906SJagadeesh Kona 
307*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0_shift_clk = {
308*cfc34906SJagadeesh Kona 	.halt_reg = 0x8128,
309*cfc34906SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
310*cfc34906SJagadeesh Kona 	.clkr = {
311*cfc34906SJagadeesh Kona 		.enable_reg = 0x8128,
312*cfc34906SJagadeesh Kona 		.enable_mask = BIT(0),
313*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
314*cfc34906SJagadeesh Kona 			.name = "video_cc_mvs0_shift_clk",
315*cfc34906SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
316*cfc34906SJagadeesh Kona 				&video_cc_xo_clk_src.clkr.hw,
317*cfc34906SJagadeesh Kona 			},
318*cfc34906SJagadeesh Kona 			.num_parents = 1,
319*cfc34906SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
320*cfc34906SJagadeesh Kona 			.ops = &clk_branch2_ops,
321*cfc34906SJagadeesh Kona 		},
322*cfc34906SJagadeesh Kona 	},
323*cfc34906SJagadeesh Kona };
324*cfc34906SJagadeesh Kona 
325*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0c_clk = {
326*cfc34906SJagadeesh Kona 	.halt_reg = 0x8064,
327*cfc34906SJagadeesh Kona 	.halt_check = BRANCH_HALT,
328*cfc34906SJagadeesh Kona 	.clkr = {
329*cfc34906SJagadeesh Kona 		.enable_reg = 0x8064,
330*cfc34906SJagadeesh Kona 		.enable_mask = BIT(0),
331*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
332*cfc34906SJagadeesh Kona 			.name = "video_cc_mvs0c_clk",
333*cfc34906SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
334*cfc34906SJagadeesh Kona 				&video_cc_mvs0_clk_src.clkr.hw,
335*cfc34906SJagadeesh Kona 			},
336*cfc34906SJagadeesh Kona 			.num_parents = 1,
337*cfc34906SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
338*cfc34906SJagadeesh Kona 			.ops = &clk_branch2_ops,
339*cfc34906SJagadeesh Kona 		},
340*cfc34906SJagadeesh Kona 	},
341*cfc34906SJagadeesh Kona };
342*cfc34906SJagadeesh Kona 
343*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs0c_shift_clk = {
344*cfc34906SJagadeesh Kona 	.halt_reg = 0x812c,
345*cfc34906SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
346*cfc34906SJagadeesh Kona 	.clkr = {
347*cfc34906SJagadeesh Kona 		.enable_reg = 0x812c,
348*cfc34906SJagadeesh Kona 		.enable_mask = BIT(0),
349*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
350*cfc34906SJagadeesh Kona 			.name = "video_cc_mvs0c_shift_clk",
351*cfc34906SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
352*cfc34906SJagadeesh Kona 				&video_cc_xo_clk_src.clkr.hw,
353*cfc34906SJagadeesh Kona 			},
354*cfc34906SJagadeesh Kona 			.num_parents = 1,
355*cfc34906SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
356*cfc34906SJagadeesh Kona 			.ops = &clk_branch2_ops,
357*cfc34906SJagadeesh Kona 		},
358*cfc34906SJagadeesh Kona 	},
359*cfc34906SJagadeesh Kona };
360*cfc34906SJagadeesh Kona 
361*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs1_clk = {
362*cfc34906SJagadeesh Kona 	.halt_reg = 0x80e0,
363*cfc34906SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
364*cfc34906SJagadeesh Kona 	.hwcg_reg = 0x80e0,
365*cfc34906SJagadeesh Kona 	.hwcg_bit = 1,
366*cfc34906SJagadeesh Kona 	.clkr = {
367*cfc34906SJagadeesh Kona 		.enable_reg = 0x80e0,
368*cfc34906SJagadeesh Kona 		.enable_mask = BIT(0),
369*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
370*cfc34906SJagadeesh Kona 			.name = "video_cc_mvs1_clk",
371*cfc34906SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
372*cfc34906SJagadeesh Kona 				&video_cc_mvs1_div_clk_src.clkr.hw,
373*cfc34906SJagadeesh Kona 			},
374*cfc34906SJagadeesh Kona 			.num_parents = 1,
375*cfc34906SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
376*cfc34906SJagadeesh Kona 			.ops = &clk_branch2_ops,
377*cfc34906SJagadeesh Kona 		},
378*cfc34906SJagadeesh Kona 	},
379*cfc34906SJagadeesh Kona };
380*cfc34906SJagadeesh Kona 
381*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs1_shift_clk = {
382*cfc34906SJagadeesh Kona 	.halt_reg = 0x8130,
383*cfc34906SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
384*cfc34906SJagadeesh Kona 	.clkr = {
385*cfc34906SJagadeesh Kona 		.enable_reg = 0x8130,
386*cfc34906SJagadeesh Kona 		.enable_mask = BIT(0),
387*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
388*cfc34906SJagadeesh Kona 			.name = "video_cc_mvs1_shift_clk",
389*cfc34906SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
390*cfc34906SJagadeesh Kona 				&video_cc_xo_clk_src.clkr.hw,
391*cfc34906SJagadeesh Kona 			},
392*cfc34906SJagadeesh Kona 			.num_parents = 1,
393*cfc34906SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
394*cfc34906SJagadeesh Kona 			.ops = &clk_branch2_ops,
395*cfc34906SJagadeesh Kona 		},
396*cfc34906SJagadeesh Kona 	},
397*cfc34906SJagadeesh Kona };
398*cfc34906SJagadeesh Kona 
399*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs1c_clk = {
400*cfc34906SJagadeesh Kona 	.halt_reg = 0x8090,
401*cfc34906SJagadeesh Kona 	.halt_check = BRANCH_HALT,
402*cfc34906SJagadeesh Kona 	.clkr = {
403*cfc34906SJagadeesh Kona 		.enable_reg = 0x8090,
404*cfc34906SJagadeesh Kona 		.enable_mask = BIT(0),
405*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
406*cfc34906SJagadeesh Kona 			.name = "video_cc_mvs1c_clk",
407*cfc34906SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
408*cfc34906SJagadeesh Kona 				&video_cc_mvs1c_div2_div_clk_src.clkr.hw,
409*cfc34906SJagadeesh Kona 			},
410*cfc34906SJagadeesh Kona 			.num_parents = 1,
411*cfc34906SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
412*cfc34906SJagadeesh Kona 			.ops = &clk_branch2_ops,
413*cfc34906SJagadeesh Kona 		},
414*cfc34906SJagadeesh Kona 	},
415*cfc34906SJagadeesh Kona };
416*cfc34906SJagadeesh Kona 
417*cfc34906SJagadeesh Kona static struct clk_branch video_cc_mvs1c_shift_clk = {
418*cfc34906SJagadeesh Kona 	.halt_reg = 0x8134,
419*cfc34906SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
420*cfc34906SJagadeesh Kona 	.clkr = {
421*cfc34906SJagadeesh Kona 		.enable_reg = 0x8134,
422*cfc34906SJagadeesh Kona 		.enable_mask = BIT(0),
423*cfc34906SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
424*cfc34906SJagadeesh Kona 			.name = "video_cc_mvs1c_shift_clk",
425*cfc34906SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
426*cfc34906SJagadeesh Kona 				&video_cc_xo_clk_src.clkr.hw,
427*cfc34906SJagadeesh Kona 			},
428*cfc34906SJagadeesh Kona 			.num_parents = 1,
429*cfc34906SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
430*cfc34906SJagadeesh Kona 			.ops = &clk_branch2_ops,
431*cfc34906SJagadeesh Kona 		},
432*cfc34906SJagadeesh Kona 	},
433*cfc34906SJagadeesh Kona };
434*cfc34906SJagadeesh Kona 
435*cfc34906SJagadeesh Kona static struct gdsc video_cc_mvs0c_gdsc = {
436*cfc34906SJagadeesh Kona 	.gdscr = 0x804c,
437*cfc34906SJagadeesh Kona 	.en_rest_wait_val = 0x2,
438*cfc34906SJagadeesh Kona 	.en_few_wait_val = 0x2,
439*cfc34906SJagadeesh Kona 	.clk_dis_wait_val = 0x6,
440*cfc34906SJagadeesh Kona 	.pd = {
441*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs0c_gdsc",
442*cfc34906SJagadeesh Kona 	},
443*cfc34906SJagadeesh Kona 	.pwrsts = PWRSTS_OFF_ON,
444*cfc34906SJagadeesh Kona 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
445*cfc34906SJagadeesh Kona };
446*cfc34906SJagadeesh Kona 
447*cfc34906SJagadeesh Kona static struct gdsc video_cc_mvs0_gdsc = {
448*cfc34906SJagadeesh Kona 	.gdscr = 0x80a4,
449*cfc34906SJagadeesh Kona 	.en_rest_wait_val = 0x2,
450*cfc34906SJagadeesh Kona 	.en_few_wait_val = 0x2,
451*cfc34906SJagadeesh Kona 	.clk_dis_wait_val = 0x6,
452*cfc34906SJagadeesh Kona 	.pd = {
453*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs0_gdsc",
454*cfc34906SJagadeesh Kona 	},
455*cfc34906SJagadeesh Kona 	.pwrsts = PWRSTS_OFF_ON,
456*cfc34906SJagadeesh Kona 	.parent = &video_cc_mvs0c_gdsc.pd,
457*cfc34906SJagadeesh Kona 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
458*cfc34906SJagadeesh Kona };
459*cfc34906SJagadeesh Kona 
460*cfc34906SJagadeesh Kona static struct gdsc video_cc_mvs1c_gdsc = {
461*cfc34906SJagadeesh Kona 	.gdscr = 0x8078,
462*cfc34906SJagadeesh Kona 	.en_rest_wait_val = 0x2,
463*cfc34906SJagadeesh Kona 	.en_few_wait_val = 0x2,
464*cfc34906SJagadeesh Kona 	.clk_dis_wait_val = 0xf,
465*cfc34906SJagadeesh Kona 	.pd = {
466*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs1c_gdsc",
467*cfc34906SJagadeesh Kona 	},
468*cfc34906SJagadeesh Kona 	.pwrsts = PWRSTS_OFF_ON,
469*cfc34906SJagadeesh Kona 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
470*cfc34906SJagadeesh Kona };
471*cfc34906SJagadeesh Kona 
472*cfc34906SJagadeesh Kona static struct gdsc video_cc_mvs1_gdsc = {
473*cfc34906SJagadeesh Kona 	.gdscr = 0x80cc,
474*cfc34906SJagadeesh Kona 	.en_rest_wait_val = 0x2,
475*cfc34906SJagadeesh Kona 	.en_few_wait_val = 0x2,
476*cfc34906SJagadeesh Kona 	.clk_dis_wait_val = 0xf,
477*cfc34906SJagadeesh Kona 	.pd = {
478*cfc34906SJagadeesh Kona 		.name = "video_cc_mvs1_gdsc",
479*cfc34906SJagadeesh Kona 	},
480*cfc34906SJagadeesh Kona 	.pwrsts = PWRSTS_OFF_ON,
481*cfc34906SJagadeesh Kona 	.parent = &video_cc_mvs1c_gdsc.pd,
482*cfc34906SJagadeesh Kona 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
483*cfc34906SJagadeesh Kona };
484*cfc34906SJagadeesh Kona 
485*cfc34906SJagadeesh Kona static struct clk_regmap *video_cc_x1p42100_clocks[] = {
486*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0_BSE_CLK] = &video_cc_mvs0_bse_clk.clkr,
487*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0_BSE_CLK_SRC] = &video_cc_mvs0_bse_clk_src.clkr,
488*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0_BSE_DIV4_DIV_CLK_SRC] = &video_cc_mvs0_bse_div4_div_clk_src.clkr,
489*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr,
490*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr,
491*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0_SHIFT_CLK] = &video_cc_mvs0_shift_clk.clkr,
492*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr,
493*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0C_SHIFT_CLK] = &video_cc_mvs0c_shift_clk.clkr,
494*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1_CLK] = &video_cc_mvs1_clk.clkr,
495*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1_CLK_SRC] = &video_cc_mvs1_clk_src.clkr,
496*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1_DIV_CLK_SRC] = &video_cc_mvs1_div_clk_src.clkr,
497*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1_SHIFT_CLK] = &video_cc_mvs1_shift_clk.clkr,
498*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1C_CLK] = &video_cc_mvs1c_clk.clkr,
499*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1C_DIV2_DIV_CLK_SRC] = &video_cc_mvs1c_div2_div_clk_src.clkr,
500*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1C_SHIFT_CLK] = &video_cc_mvs1c_shift_clk.clkr,
501*cfc34906SJagadeesh Kona 	[VIDEO_CC_PLL0] = &video_cc_pll0.clkr,
502*cfc34906SJagadeesh Kona 	[VIDEO_CC_PLL1] = &video_cc_pll1.clkr,
503*cfc34906SJagadeesh Kona 	[VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr,
504*cfc34906SJagadeesh Kona };
505*cfc34906SJagadeesh Kona 
506*cfc34906SJagadeesh Kona static struct gdsc *video_cc_x1p42100_gdscs[] = {
507*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0_GDSC] = &video_cc_mvs0_gdsc,
508*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0C_GDSC] = &video_cc_mvs0c_gdsc,
509*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1_GDSC] = &video_cc_mvs1_gdsc,
510*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1C_GDSC] = &video_cc_mvs1c_gdsc,
511*cfc34906SJagadeesh Kona };
512*cfc34906SJagadeesh Kona 
513*cfc34906SJagadeesh Kona static const struct qcom_reset_map video_cc_x1p42100_resets[] = {
514*cfc34906SJagadeesh Kona 	[CVP_VIDEO_CC_INTERFACE_BCR] = { 0x80f0 },
515*cfc34906SJagadeesh Kona 	[CVP_VIDEO_CC_MVS0_BCR] = { 0x80a0 },
516*cfc34906SJagadeesh Kona 	[CVP_VIDEO_CC_MVS0C_BCR] = { 0x8048 },
517*cfc34906SJagadeesh Kona 	[CVP_VIDEO_CC_MVS1_BCR] = { 0x80c8 },
518*cfc34906SJagadeesh Kona 	[CVP_VIDEO_CC_MVS1C_BCR] = { 0x8074 },
519*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0_BSE_BCR] = { 0x816c },
520*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS0C_CLK_ARES] = { 0x8064, 2 },
521*cfc34906SJagadeesh Kona 	[VIDEO_CC_MVS1C_CLK_ARES] = { 0x8090, 2 },
522*cfc34906SJagadeesh Kona 	[VIDEO_CC_XO_CLK_ARES] = { 0x8124, 2 },
523*cfc34906SJagadeesh Kona };
524*cfc34906SJagadeesh Kona 
525*cfc34906SJagadeesh Kona static struct clk_alpha_pll *video_cc_x1p42100_plls[] = {
526*cfc34906SJagadeesh Kona 	&video_cc_pll0,
527*cfc34906SJagadeesh Kona 	&video_cc_pll1,
528*cfc34906SJagadeesh Kona };
529*cfc34906SJagadeesh Kona 
530*cfc34906SJagadeesh Kona static u32 video_cc_x1p42100_critical_cbcrs[] = {
531*cfc34906SJagadeesh Kona 	0x80f4, /* VIDEO_CC_AHB_CLK */
532*cfc34906SJagadeesh Kona 	0x8150, /* VIDEO_CC_SLEEP_CLK */
533*cfc34906SJagadeesh Kona 	0x8124, /* VIDEO_CC_XO_CLK */
534*cfc34906SJagadeesh Kona };
535*cfc34906SJagadeesh Kona 
536*cfc34906SJagadeesh Kona static const struct regmap_config video_cc_x1p42100_regmap_config = {
537*cfc34906SJagadeesh Kona 	.reg_bits = 32,
538*cfc34906SJagadeesh Kona 	.reg_stride = 4,
539*cfc34906SJagadeesh Kona 	.val_bits = 32,
540*cfc34906SJagadeesh Kona 	.max_register = 0x9f54,
541*cfc34906SJagadeesh Kona 	.fast_io = true,
542*cfc34906SJagadeesh Kona };
543*cfc34906SJagadeesh Kona 
544*cfc34906SJagadeesh Kona static struct qcom_cc_driver_data video_cc_x1p42100_driver_data = {
545*cfc34906SJagadeesh Kona 	.alpha_plls = video_cc_x1p42100_plls,
546*cfc34906SJagadeesh Kona 	.num_alpha_plls = ARRAY_SIZE(video_cc_x1p42100_plls),
547*cfc34906SJagadeesh Kona 	.clk_cbcrs = video_cc_x1p42100_critical_cbcrs,
548*cfc34906SJagadeesh Kona 	.num_clk_cbcrs = ARRAY_SIZE(video_cc_x1p42100_critical_cbcrs),
549*cfc34906SJagadeesh Kona };
550*cfc34906SJagadeesh Kona 
551*cfc34906SJagadeesh Kona static const struct qcom_cc_desc video_cc_x1p42100_desc = {
552*cfc34906SJagadeesh Kona 	.config = &video_cc_x1p42100_regmap_config,
553*cfc34906SJagadeesh Kona 	.clks = video_cc_x1p42100_clocks,
554*cfc34906SJagadeesh Kona 	.num_clks = ARRAY_SIZE(video_cc_x1p42100_clocks),
555*cfc34906SJagadeesh Kona 	.resets = video_cc_x1p42100_resets,
556*cfc34906SJagadeesh Kona 	.num_resets = ARRAY_SIZE(video_cc_x1p42100_resets),
557*cfc34906SJagadeesh Kona 	.gdscs = video_cc_x1p42100_gdscs,
558*cfc34906SJagadeesh Kona 	.num_gdscs = ARRAY_SIZE(video_cc_x1p42100_gdscs),
559*cfc34906SJagadeesh Kona 	.use_rpm = true,
560*cfc34906SJagadeesh Kona 	.driver_data = &video_cc_x1p42100_driver_data,
561*cfc34906SJagadeesh Kona };
562*cfc34906SJagadeesh Kona 
563*cfc34906SJagadeesh Kona static const struct of_device_id video_cc_x1p42100_match_table[] = {
564*cfc34906SJagadeesh Kona 	{ .compatible = "qcom,x1p42100-videocc" },
565*cfc34906SJagadeesh Kona 	{ }
566*cfc34906SJagadeesh Kona };
567*cfc34906SJagadeesh Kona MODULE_DEVICE_TABLE(of, video_cc_x1p42100_match_table);
568*cfc34906SJagadeesh Kona 
569*cfc34906SJagadeesh Kona static int video_cc_x1p42100_probe(struct platform_device *pdev)
570*cfc34906SJagadeesh Kona {
571*cfc34906SJagadeesh Kona 	return qcom_cc_probe(pdev, &video_cc_x1p42100_desc);
572*cfc34906SJagadeesh Kona }
573*cfc34906SJagadeesh Kona 
574*cfc34906SJagadeesh Kona static struct platform_driver video_cc_x1p42100_driver = {
575*cfc34906SJagadeesh Kona 	.probe = video_cc_x1p42100_probe,
576*cfc34906SJagadeesh Kona 	.driver = {
577*cfc34906SJagadeesh Kona 		.name = "videocc-x1p42100",
578*cfc34906SJagadeesh Kona 		.of_match_table = video_cc_x1p42100_match_table,
579*cfc34906SJagadeesh Kona 	},
580*cfc34906SJagadeesh Kona };
581*cfc34906SJagadeesh Kona 
582*cfc34906SJagadeesh Kona module_platform_driver(video_cc_x1p42100_driver);
583*cfc34906SJagadeesh Kona 
584*cfc34906SJagadeesh Kona MODULE_DESCRIPTION("QTI VIDEOCC X1P42100 Driver");
585*cfc34906SJagadeesh Kona MODULE_LICENSE("GPL");
586