xref: /linux/drivers/clk/qcom/videocc-hawi.c (revision 502d45774af09f1c681c754c4b7cdfb5d7f72fd9)
1*edbd5d32SLin Li // SPDX-License-Identifier: GPL-2.0-only
2*edbd5d32SLin Li /*
3*edbd5d32SLin Li  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4*edbd5d32SLin Li  */
5*edbd5d32SLin Li 
6*edbd5d32SLin Li #include <linux/clk-provider.h>
7*edbd5d32SLin Li #include <linux/module.h>
8*edbd5d32SLin Li #include <linux/platform_device.h>
9*edbd5d32SLin Li #include <linux/regmap.h>
10*edbd5d32SLin Li 
11*edbd5d32SLin Li #include <dt-bindings/clock/qcom,hawi-videocc.h>
12*edbd5d32SLin Li 
13*edbd5d32SLin Li #include "clk-alpha-pll.h"
14*edbd5d32SLin Li #include "clk-branch.h"
15*edbd5d32SLin Li #include "clk-rcg.h"
16*edbd5d32SLin Li #include "clk-regmap.h"
17*edbd5d32SLin Li #include "clk-regmap-divider.h"
18*edbd5d32SLin Li #include "common.h"
19*edbd5d32SLin Li #include "gdsc.h"
20*edbd5d32SLin Li #include "reset.h"
21*edbd5d32SLin Li 
22*edbd5d32SLin Li enum {
23*edbd5d32SLin Li 	DT_BI_TCXO,
24*edbd5d32SLin Li 	DT_AHB_CLK,
25*edbd5d32SLin Li };
26*edbd5d32SLin Li 
27*edbd5d32SLin Li enum {
28*edbd5d32SLin Li 	P_BI_TCXO,
29*edbd5d32SLin Li 	P_VIDEO_CC_PLL0_OUT_EVEN,
30*edbd5d32SLin Li 	P_VIDEO_CC_PLL0_OUT_MAIN,
31*edbd5d32SLin Li 	P_VIDEO_CC_PLL1_OUT_MAIN,
32*edbd5d32SLin Li 	P_VIDEO_CC_PLL2_OUT_MAIN,
33*edbd5d32SLin Li 	P_VIDEO_CC_PLL3_OUT_MAIN,
34*edbd5d32SLin Li };
35*edbd5d32SLin Li 
36*edbd5d32SLin Li static const struct pll_vco taycan_eha_t_vco[] = {
37*edbd5d32SLin Li 	{ 249600000, 2500000000, 0 },
38*edbd5d32SLin Li };
39*edbd5d32SLin Li 
40*edbd5d32SLin Li /* 360.0 MHz Configuration */
41*edbd5d32SLin Li static const struct alpha_pll_config video_cc_pll0_config = {
42*edbd5d32SLin Li 	.l = 0x12,
43*edbd5d32SLin Li 	.cal_l = 0x48,
44*edbd5d32SLin Li 	.alpha = 0xc000,
45*edbd5d32SLin Li 	.config_ctl_val = 0xa5c400e7,
46*edbd5d32SLin Li 	.config_ctl_hi_val = 0x0a8060e0,
47*edbd5d32SLin Li 	.config_ctl_hi1_val = 0xf51dea20,
48*edbd5d32SLin Li 	.user_ctl_val = 0x00000400,
49*edbd5d32SLin Li 	.user_ctl_hi_val = 0x00000002,
50*edbd5d32SLin Li };
51*edbd5d32SLin Li 
52*edbd5d32SLin Li static struct clk_alpha_pll video_cc_pll0 = {
53*edbd5d32SLin Li 	.offset = 0x0,
54*edbd5d32SLin Li 	.config = &video_cc_pll0_config,
55*edbd5d32SLin Li 	.vco_table = taycan_eha_t_vco,
56*edbd5d32SLin Li 	.num_vco = ARRAY_SIZE(taycan_eha_t_vco),
57*edbd5d32SLin Li 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EHA_T],
58*edbd5d32SLin Li 	.clkr = {
59*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
60*edbd5d32SLin Li 			.name = "video_cc_pll0",
61*edbd5d32SLin Li 			.parent_data = &(const struct clk_parent_data) {
62*edbd5d32SLin Li 				.index = DT_BI_TCXO,
63*edbd5d32SLin Li 			},
64*edbd5d32SLin Li 			.num_parents = 1,
65*edbd5d32SLin Li 			.ops = &clk_alpha_pll_taycan_eha_t_ops,
66*edbd5d32SLin Li 		},
67*edbd5d32SLin Li 	},
68*edbd5d32SLin Li };
69*edbd5d32SLin Li 
70*edbd5d32SLin Li static const struct clk_div_table post_div_table_video_cc_pll0_out_even[] = {
71*edbd5d32SLin Li 	{ 0x1, 2 },
72*edbd5d32SLin Li 	{ }
73*edbd5d32SLin Li };
74*edbd5d32SLin Li 
75*edbd5d32SLin Li static struct clk_alpha_pll_postdiv video_cc_pll0_out_even = {
76*edbd5d32SLin Li 	.offset = 0x0,
77*edbd5d32SLin Li 	.post_div_shift = 10,
78*edbd5d32SLin Li 	.post_div_table = post_div_table_video_cc_pll0_out_even,
79*edbd5d32SLin Li 	.num_post_div = ARRAY_SIZE(post_div_table_video_cc_pll0_out_even),
80*edbd5d32SLin Li 	.width = 4,
81*edbd5d32SLin Li 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EHA_T],
82*edbd5d32SLin Li 	.clkr.hw.init = &(const struct clk_init_data) {
83*edbd5d32SLin Li 		.name = "video_cc_pll0_out_even",
84*edbd5d32SLin Li 		.parent_hws = (const struct clk_hw*[]) {
85*edbd5d32SLin Li 			&video_cc_pll0.clkr.hw,
86*edbd5d32SLin Li 		},
87*edbd5d32SLin Li 		.num_parents = 1,
88*edbd5d32SLin Li 		.flags = CLK_SET_RATE_PARENT,
89*edbd5d32SLin Li 		.ops = &clk_alpha_pll_postdiv_taycan_eha_t_ops,
90*edbd5d32SLin Li 	},
91*edbd5d32SLin Li };
92*edbd5d32SLin Li 
93*edbd5d32SLin Li /* 300.0 MHz Configuration */
94*edbd5d32SLin Li static const struct alpha_pll_config video_cc_pll1_config = {
95*edbd5d32SLin Li 	.l = 0xf,
96*edbd5d32SLin Li 	.cal_l = 0x48,
97*edbd5d32SLin Li 	.alpha = 0xa000,
98*edbd5d32SLin Li 	.config_ctl_val = 0xa5c400e7,
99*edbd5d32SLin Li 	.config_ctl_hi_val = 0x0a8060e0,
100*edbd5d32SLin Li 	.config_ctl_hi1_val = 0xf51dea20,
101*edbd5d32SLin Li 	.user_ctl_val = 0x00000000,
102*edbd5d32SLin Li 	.user_ctl_hi_val = 0x00000002,
103*edbd5d32SLin Li };
104*edbd5d32SLin Li 
105*edbd5d32SLin Li static struct clk_alpha_pll video_cc_pll1 = {
106*edbd5d32SLin Li 	.offset = 0x1000,
107*edbd5d32SLin Li 	.config = &video_cc_pll1_config,
108*edbd5d32SLin Li 	.vco_table = taycan_eha_t_vco,
109*edbd5d32SLin Li 	.num_vco = ARRAY_SIZE(taycan_eha_t_vco),
110*edbd5d32SLin Li 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EHA_T],
111*edbd5d32SLin Li 	.clkr = {
112*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
113*edbd5d32SLin Li 			.name = "video_cc_pll1",
114*edbd5d32SLin Li 			.parent_data = &(const struct clk_parent_data) {
115*edbd5d32SLin Li 				.index = DT_BI_TCXO,
116*edbd5d32SLin Li 			},
117*edbd5d32SLin Li 			.num_parents = 1,
118*edbd5d32SLin Li 			.ops = &clk_alpha_pll_taycan_eha_t_ops,
119*edbd5d32SLin Li 		},
120*edbd5d32SLin Li 	},
121*edbd5d32SLin Li };
122*edbd5d32SLin Li 
123*edbd5d32SLin Li /* 300.0 MHz Configuration */
124*edbd5d32SLin Li static const struct alpha_pll_config video_cc_pll2_config = {
125*edbd5d32SLin Li 	.l = 0xf,
126*edbd5d32SLin Li 	.cal_l = 0x48,
127*edbd5d32SLin Li 	.alpha = 0xa000,
128*edbd5d32SLin Li 	.config_ctl_val = 0xa5c400e7,
129*edbd5d32SLin Li 	.config_ctl_hi_val = 0x0a8060e0,
130*edbd5d32SLin Li 	.config_ctl_hi1_val = 0xf51dea20,
131*edbd5d32SLin Li 	.user_ctl_val = 0x00000000,
132*edbd5d32SLin Li 	.user_ctl_hi_val = 0x00000002,
133*edbd5d32SLin Li };
134*edbd5d32SLin Li 
135*edbd5d32SLin Li static struct clk_alpha_pll video_cc_pll2 = {
136*edbd5d32SLin Li 	.offset = 0x2000,
137*edbd5d32SLin Li 	.config = &video_cc_pll2_config,
138*edbd5d32SLin Li 	.vco_table = taycan_eha_t_vco,
139*edbd5d32SLin Li 	.num_vco = ARRAY_SIZE(taycan_eha_t_vco),
140*edbd5d32SLin Li 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EHA_T],
141*edbd5d32SLin Li 	.clkr = {
142*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
143*edbd5d32SLin Li 			.name = "video_cc_pll2",
144*edbd5d32SLin Li 			.parent_data = &(const struct clk_parent_data) {
145*edbd5d32SLin Li 				.index = DT_BI_TCXO,
146*edbd5d32SLin Li 			},
147*edbd5d32SLin Li 			.num_parents = 1,
148*edbd5d32SLin Li 			.ops = &clk_alpha_pll_taycan_eha_t_ops,
149*edbd5d32SLin Li 		},
150*edbd5d32SLin Li 	},
151*edbd5d32SLin Li };
152*edbd5d32SLin Li 
153*edbd5d32SLin Li /* 300.0 MHz Configuration */
154*edbd5d32SLin Li static const struct alpha_pll_config video_cc_pll3_config = {
155*edbd5d32SLin Li 	.l = 0xf,
156*edbd5d32SLin Li 	.cal_l = 0x48,
157*edbd5d32SLin Li 	.alpha = 0xa000,
158*edbd5d32SLin Li 	.config_ctl_val = 0xa5c400e7,
159*edbd5d32SLin Li 	.config_ctl_hi_val = 0x0a8060e0,
160*edbd5d32SLin Li 	.config_ctl_hi1_val = 0xf51dea20,
161*edbd5d32SLin Li 	.user_ctl_val = 0x00000000,
162*edbd5d32SLin Li 	.user_ctl_hi_val = 0x00000002,
163*edbd5d32SLin Li };
164*edbd5d32SLin Li 
165*edbd5d32SLin Li static struct clk_alpha_pll video_cc_pll3 = {
166*edbd5d32SLin Li 	.offset = 0x3000,
167*edbd5d32SLin Li 	.config = &video_cc_pll3_config,
168*edbd5d32SLin Li 	.vco_table = taycan_eha_t_vco,
169*edbd5d32SLin Li 	.num_vco = ARRAY_SIZE(taycan_eha_t_vco),
170*edbd5d32SLin Li 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EHA_T],
171*edbd5d32SLin Li 	.clkr = {
172*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
173*edbd5d32SLin Li 			.name = "video_cc_pll3",
174*edbd5d32SLin Li 			.parent_data = &(const struct clk_parent_data) {
175*edbd5d32SLin Li 				.index = DT_BI_TCXO,
176*edbd5d32SLin Li 			},
177*edbd5d32SLin Li 			.num_parents = 1,
178*edbd5d32SLin Li 			.ops = &clk_alpha_pll_taycan_eha_t_ops,
179*edbd5d32SLin Li 		},
180*edbd5d32SLin Li 	},
181*edbd5d32SLin Li };
182*edbd5d32SLin Li 
183*edbd5d32SLin Li static const struct parent_map video_cc_parent_map_0[] = {
184*edbd5d32SLin Li 	{ P_BI_TCXO, 0 },
185*edbd5d32SLin Li };
186*edbd5d32SLin Li 
187*edbd5d32SLin Li static const struct clk_parent_data video_cc_parent_data_0[] = {
188*edbd5d32SLin Li 	{ .index = DT_BI_TCXO },
189*edbd5d32SLin Li };
190*edbd5d32SLin Li 
191*edbd5d32SLin Li static const struct parent_map video_cc_parent_map_1[] = {
192*edbd5d32SLin Li 	{ P_BI_TCXO, 0 },
193*edbd5d32SLin Li 	{ P_VIDEO_CC_PLL1_OUT_MAIN, 1 },
194*edbd5d32SLin Li };
195*edbd5d32SLin Li 
196*edbd5d32SLin Li static const struct clk_parent_data video_cc_parent_data_1[] = {
197*edbd5d32SLin Li 	{ .index = DT_BI_TCXO },
198*edbd5d32SLin Li 	{ .hw = &video_cc_pll1.clkr.hw },
199*edbd5d32SLin Li };
200*edbd5d32SLin Li 
201*edbd5d32SLin Li static const struct parent_map video_cc_parent_map_2[] = {
202*edbd5d32SLin Li 	{ P_BI_TCXO, 0 },
203*edbd5d32SLin Li 	{ P_VIDEO_CC_PLL3_OUT_MAIN, 1 },
204*edbd5d32SLin Li };
205*edbd5d32SLin Li 
206*edbd5d32SLin Li static const struct clk_parent_data video_cc_parent_data_2[] = {
207*edbd5d32SLin Li 	{ .index = DT_BI_TCXO },
208*edbd5d32SLin Li 	{ .hw = &video_cc_pll3.clkr.hw },
209*edbd5d32SLin Li };
210*edbd5d32SLin Li 
211*edbd5d32SLin Li static const struct parent_map video_cc_parent_map_3[] = {
212*edbd5d32SLin Li 	{ P_BI_TCXO, 0 },
213*edbd5d32SLin Li 	{ P_VIDEO_CC_PLL2_OUT_MAIN, 1 },
214*edbd5d32SLin Li };
215*edbd5d32SLin Li 
216*edbd5d32SLin Li static const struct clk_parent_data video_cc_parent_data_3[] = {
217*edbd5d32SLin Li 	{ .index = DT_BI_TCXO },
218*edbd5d32SLin Li 	{ .hw = &video_cc_pll2.clkr.hw },
219*edbd5d32SLin Li };
220*edbd5d32SLin Li 
221*edbd5d32SLin Li static const struct parent_map video_cc_parent_map_4[] = {
222*edbd5d32SLin Li 	{ P_BI_TCXO, 0 },
223*edbd5d32SLin Li 	{ P_VIDEO_CC_PLL0_OUT_MAIN, 1 },
224*edbd5d32SLin Li 	{ P_VIDEO_CC_PLL0_OUT_EVEN, 2 },
225*edbd5d32SLin Li };
226*edbd5d32SLin Li 
227*edbd5d32SLin Li static const struct clk_parent_data video_cc_parent_data_4[] = {
228*edbd5d32SLin Li 	{ .index = DT_BI_TCXO },
229*edbd5d32SLin Li 	{ .hw = &video_cc_pll0.clkr.hw },
230*edbd5d32SLin Li 	{ .hw = &video_cc_pll0_out_even.clkr.hw },
231*edbd5d32SLin Li };
232*edbd5d32SLin Li 
233*edbd5d32SLin Li static const struct freq_tbl ftbl_video_cc_ahb_clk_src[] = {
234*edbd5d32SLin Li 	F(19200000, P_BI_TCXO, 1, 0, 0),
235*edbd5d32SLin Li 	{ }
236*edbd5d32SLin Li };
237*edbd5d32SLin Li 
238*edbd5d32SLin Li static struct clk_rcg2 video_cc_ahb_clk_src = {
239*edbd5d32SLin Li 	.cmd_rcgr = 0x8060,
240*edbd5d32SLin Li 	.mnd_width = 0,
241*edbd5d32SLin Li 	.hid_width = 5,
242*edbd5d32SLin Li 	.parent_map = video_cc_parent_map_0,
243*edbd5d32SLin Li 	.freq_tbl = ftbl_video_cc_ahb_clk_src,
244*edbd5d32SLin Li 	.clkr.hw.init = &(const struct clk_init_data) {
245*edbd5d32SLin Li 		.name = "video_cc_ahb_clk_src",
246*edbd5d32SLin Li 		.parent_data = video_cc_parent_data_0,
247*edbd5d32SLin Li 		.num_parents = ARRAY_SIZE(video_cc_parent_data_0),
248*edbd5d32SLin Li 		.flags = CLK_SET_RATE_PARENT,
249*edbd5d32SLin Li 		.ops = &clk_rcg2_shared_ops,
250*edbd5d32SLin Li 	},
251*edbd5d32SLin Li };
252*edbd5d32SLin Li 
253*edbd5d32SLin Li static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = {
254*edbd5d32SLin Li 	F(150000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0),
255*edbd5d32SLin Li 	F(240000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0),
256*edbd5d32SLin Li 	F(285000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0),
257*edbd5d32SLin Li 	F(311000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0),
258*edbd5d32SLin Li 	F(420000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0),
259*edbd5d32SLin Li 	F(444000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0),
260*edbd5d32SLin Li 	F(533000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0),
261*edbd5d32SLin Li 	F(630000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0),
262*edbd5d32SLin Li 	F(714000000, P_VIDEO_CC_PLL1_OUT_MAIN, 2, 0, 0),
263*edbd5d32SLin Li 	{ }
264*edbd5d32SLin Li };
265*edbd5d32SLin Li 
266*edbd5d32SLin Li static struct clk_rcg2 video_cc_mvs0_clk_src = {
267*edbd5d32SLin Li 	.cmd_rcgr = 0x8030,
268*edbd5d32SLin Li 	.mnd_width = 0,
269*edbd5d32SLin Li 	.hid_width = 5,
270*edbd5d32SLin Li 	.parent_map = video_cc_parent_map_1,
271*edbd5d32SLin Li 	.freq_tbl = ftbl_video_cc_mvs0_clk_src,
272*edbd5d32SLin Li 	.hw_clk_ctrl = true,
273*edbd5d32SLin Li 	.clkr.hw.init = &(const struct clk_init_data) {
274*edbd5d32SLin Li 		.name = "video_cc_mvs0_clk_src",
275*edbd5d32SLin Li 		.parent_data = video_cc_parent_data_1,
276*edbd5d32SLin Li 		.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
277*edbd5d32SLin Li 		.flags = CLK_SET_RATE_PARENT,
278*edbd5d32SLin Li 		.ops = &clk_rcg2_shared_ops,
279*edbd5d32SLin Li 	},
280*edbd5d32SLin Li };
281*edbd5d32SLin Li 
282*edbd5d32SLin Li static const struct freq_tbl ftbl_video_cc_mvs0a_clk_src[] = {
283*edbd5d32SLin Li 	F(150000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0),
284*edbd5d32SLin Li 	F(240000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0),
285*edbd5d32SLin Li 	F(338000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0),
286*edbd5d32SLin Li 	F(420000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0),
287*edbd5d32SLin Li 	F(444000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0),
288*edbd5d32SLin Li 	F(533000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0),
289*edbd5d32SLin Li 	F(630000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0),
290*edbd5d32SLin Li 	F(710000000, P_VIDEO_CC_PLL3_OUT_MAIN, 2, 0, 0),
291*edbd5d32SLin Li 	{ }
292*edbd5d32SLin Li };
293*edbd5d32SLin Li 
294*edbd5d32SLin Li static struct clk_rcg2 video_cc_mvs0a_clk_src = {
295*edbd5d32SLin Li 	.cmd_rcgr = 0x8000,
296*edbd5d32SLin Li 	.mnd_width = 0,
297*edbd5d32SLin Li 	.hid_width = 5,
298*edbd5d32SLin Li 	.parent_map = video_cc_parent_map_2,
299*edbd5d32SLin Li 	.freq_tbl = ftbl_video_cc_mvs0a_clk_src,
300*edbd5d32SLin Li 	.hw_clk_ctrl = true,
301*edbd5d32SLin Li 	.clkr.hw.init = &(const struct clk_init_data) {
302*edbd5d32SLin Li 		.name = "video_cc_mvs0a_clk_src",
303*edbd5d32SLin Li 		.parent_data = video_cc_parent_data_2,
304*edbd5d32SLin Li 		.num_parents = ARRAY_SIZE(video_cc_parent_data_2),
305*edbd5d32SLin Li 		.flags = CLK_SET_RATE_PARENT,
306*edbd5d32SLin Li 		.ops = &clk_rcg2_shared_ops,
307*edbd5d32SLin Li 	},
308*edbd5d32SLin Li };
309*edbd5d32SLin Li 
310*edbd5d32SLin Li static const struct freq_tbl ftbl_video_cc_mvs0b_clk_src[] = {
311*edbd5d32SLin Li 	F(150000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0),
312*edbd5d32SLin Li 	F(240000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0),
313*edbd5d32SLin Li 	F(311000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0),
314*edbd5d32SLin Li 	F(420000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0),
315*edbd5d32SLin Li 	F(444000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0),
316*edbd5d32SLin Li 	F(533000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0),
317*edbd5d32SLin Li 	F(630000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0),
318*edbd5d32SLin Li 	F(667000000, P_VIDEO_CC_PLL2_OUT_MAIN, 2, 0, 0),
319*edbd5d32SLin Li 	{ }
320*edbd5d32SLin Li };
321*edbd5d32SLin Li 
322*edbd5d32SLin Li static struct clk_rcg2 video_cc_mvs0b_clk_src = {
323*edbd5d32SLin Li 	.cmd_rcgr = 0x8018,
324*edbd5d32SLin Li 	.mnd_width = 0,
325*edbd5d32SLin Li 	.hid_width = 5,
326*edbd5d32SLin Li 	.parent_map = video_cc_parent_map_3,
327*edbd5d32SLin Li 	.freq_tbl = ftbl_video_cc_mvs0b_clk_src,
328*edbd5d32SLin Li 	.hw_clk_ctrl = true,
329*edbd5d32SLin Li 	.clkr.hw.init = &(const struct clk_init_data) {
330*edbd5d32SLin Li 		.name = "video_cc_mvs0b_clk_src",
331*edbd5d32SLin Li 		.parent_data = video_cc_parent_data_3,
332*edbd5d32SLin Li 		.num_parents = ARRAY_SIZE(video_cc_parent_data_3),
333*edbd5d32SLin Li 		.flags = CLK_SET_RATE_PARENT,
334*edbd5d32SLin Li 		.ops = &clk_rcg2_shared_ops,
335*edbd5d32SLin Li 	},
336*edbd5d32SLin Li };
337*edbd5d32SLin Li 
338*edbd5d32SLin Li static const struct freq_tbl ftbl_video_cc_mvs0c_clk_src[] = {
339*edbd5d32SLin Li 	F(225000000, P_VIDEO_CC_PLL0_OUT_EVEN, 1, 0, 0),
340*edbd5d32SLin Li 	F(360000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
341*edbd5d32SLin Li 	F(430000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
342*edbd5d32SLin Li 	F(557000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
343*edbd5d32SLin Li 	F(634000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
344*edbd5d32SLin Li 	F(782000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
345*edbd5d32SLin Li 	F(928000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
346*edbd5d32SLin Li 	F(1060000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
347*edbd5d32SLin Li 	{ }
348*edbd5d32SLin Li };
349*edbd5d32SLin Li 
350*edbd5d32SLin Li static struct clk_rcg2 video_cc_mvs0c_clk_src = {
351*edbd5d32SLin Li 	.cmd_rcgr = 0x8048,
352*edbd5d32SLin Li 	.mnd_width = 0,
353*edbd5d32SLin Li 	.hid_width = 5,
354*edbd5d32SLin Li 	.parent_map = video_cc_parent_map_4,
355*edbd5d32SLin Li 	.freq_tbl = ftbl_video_cc_mvs0c_clk_src,
356*edbd5d32SLin Li 	.hw_clk_ctrl = true,
357*edbd5d32SLin Li 	.clkr.hw.init = &(const struct clk_init_data) {
358*edbd5d32SLin Li 		.name = "video_cc_mvs0c_clk_src",
359*edbd5d32SLin Li 		.parent_data = video_cc_parent_data_4,
360*edbd5d32SLin Li 		.num_parents = ARRAY_SIZE(video_cc_parent_data_4),
361*edbd5d32SLin Li 		.flags = CLK_SET_RATE_PARENT,
362*edbd5d32SLin Li 		.ops = &clk_rcg2_shared_ops,
363*edbd5d32SLin Li 	},
364*edbd5d32SLin Li };
365*edbd5d32SLin Li 
366*edbd5d32SLin Li static struct clk_rcg2 video_cc_xo_clk_src = {
367*edbd5d32SLin Li 	.cmd_rcgr = 0x8180,
368*edbd5d32SLin Li 	.mnd_width = 0,
369*edbd5d32SLin Li 	.hid_width = 5,
370*edbd5d32SLin Li 	.parent_map = video_cc_parent_map_0,
371*edbd5d32SLin Li 	.freq_tbl = ftbl_video_cc_ahb_clk_src,
372*edbd5d32SLin Li 	.hw_clk_ctrl = true,
373*edbd5d32SLin Li 	.clkr.hw.init = &(const struct clk_init_data) {
374*edbd5d32SLin Li 		.name = "video_cc_xo_clk_src",
375*edbd5d32SLin Li 		.parent_data = video_cc_parent_data_0,
376*edbd5d32SLin Li 		.num_parents = ARRAY_SIZE(video_cc_parent_data_0),
377*edbd5d32SLin Li 		.flags = CLK_SET_RATE_PARENT,
378*edbd5d32SLin Li 		.ops = &clk_rcg2_ops,
379*edbd5d32SLin Li 	},
380*edbd5d32SLin Li };
381*edbd5d32SLin Li 
382*edbd5d32SLin Li static struct clk_branch video_cc_cx_axi0_clk = {
383*edbd5d32SLin Li 	.halt_reg = 0x81e8,
384*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
385*edbd5d32SLin Li 	.hwcg_reg = 0x81e8,
386*edbd5d32SLin Li 	.hwcg_bit = 1,
387*edbd5d32SLin Li 	.clkr = {
388*edbd5d32SLin Li 		.enable_reg = 0x81e8,
389*edbd5d32SLin Li 		.enable_mask = BIT(0),
390*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
391*edbd5d32SLin Li 			.name = "video_cc_cx_axi0_clk",
392*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
393*edbd5d32SLin Li 		},
394*edbd5d32SLin Li 	},
395*edbd5d32SLin Li };
396*edbd5d32SLin Li 
397*edbd5d32SLin Li static struct clk_branch video_cc_mvs0_clk = {
398*edbd5d32SLin Li 	.halt_reg = 0x80cc,
399*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
400*edbd5d32SLin Li 	.hwcg_reg = 0x80cc,
401*edbd5d32SLin Li 	.hwcg_bit = 1,
402*edbd5d32SLin Li 	.clkr = {
403*edbd5d32SLin Li 		.enable_reg = 0x80cc,
404*edbd5d32SLin Li 		.enable_mask = BIT(0),
405*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
406*edbd5d32SLin Li 			.name = "video_cc_mvs0_clk",
407*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
408*edbd5d32SLin Li 				&video_cc_mvs0_clk_src.clkr.hw,
409*edbd5d32SLin Li 			},
410*edbd5d32SLin Li 			.num_parents = 1,
411*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
412*edbd5d32SLin Li 			.ops = &clk_branch2_aon_ops,
413*edbd5d32SLin Li 		},
414*edbd5d32SLin Li 	},
415*edbd5d32SLin Li };
416*edbd5d32SLin Li 
417*edbd5d32SLin Li static struct clk_branch video_cc_mvs0_shift_clk = {
418*edbd5d32SLin Li 	.halt_reg = 0x81a4,
419*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
420*edbd5d32SLin Li 	.hwcg_reg = 0x81a4,
421*edbd5d32SLin Li 	.hwcg_bit = 1,
422*edbd5d32SLin Li 	.clkr = {
423*edbd5d32SLin Li 		.enable_reg = 0x81a4,
424*edbd5d32SLin Li 		.enable_mask = BIT(0),
425*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
426*edbd5d32SLin Li 			.name = "video_cc_mvs0_shift_clk",
427*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
428*edbd5d32SLin Li 				&video_cc_xo_clk_src.clkr.hw,
429*edbd5d32SLin Li 			},
430*edbd5d32SLin Li 			.num_parents = 1,
431*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
432*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
433*edbd5d32SLin Li 		},
434*edbd5d32SLin Li 	},
435*edbd5d32SLin Li };
436*edbd5d32SLin Li 
437*edbd5d32SLin Li static struct clk_branch video_cc_mvs0_vpp0_clk = {
438*edbd5d32SLin Li 	.halt_reg = 0x811c,
439*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
440*edbd5d32SLin Li 	.hwcg_reg = 0x811c,
441*edbd5d32SLin Li 	.hwcg_bit = 1,
442*edbd5d32SLin Li 	.clkr = {
443*edbd5d32SLin Li 		.enable_reg = 0x811c,
444*edbd5d32SLin Li 		.enable_mask = BIT(0),
445*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
446*edbd5d32SLin Li 			.name = "video_cc_mvs0_vpp0_clk",
447*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
448*edbd5d32SLin Li 				&video_cc_mvs0_clk_src.clkr.hw,
449*edbd5d32SLin Li 			},
450*edbd5d32SLin Li 			.num_parents = 1,
451*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
452*edbd5d32SLin Li 			.ops = &clk_branch2_aon_ops,
453*edbd5d32SLin Li 		},
454*edbd5d32SLin Li 	},
455*edbd5d32SLin Li };
456*edbd5d32SLin Li 
457*edbd5d32SLin Li static struct clk_branch video_cc_mvs0_vpp0_vpp1_gating_clk = {
458*edbd5d32SLin Li 	.halt_reg = 0x80c8,
459*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
460*edbd5d32SLin Li 	.hwcg_reg = 0x80c8,
461*edbd5d32SLin Li 	.hwcg_bit = 1,
462*edbd5d32SLin Li 	.clkr = {
463*edbd5d32SLin Li 		.enable_reg = 0x80c8,
464*edbd5d32SLin Li 		.enable_mask = BIT(0),
465*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
466*edbd5d32SLin Li 			.name = "video_cc_mvs0_vpp0_vpp1_gating_clk",
467*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
468*edbd5d32SLin Li 				&video_cc_mvs0_clk_src.clkr.hw,
469*edbd5d32SLin Li 			},
470*edbd5d32SLin Li 			.num_parents = 1,
471*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
472*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
473*edbd5d32SLin Li 		},
474*edbd5d32SLin Li 	},
475*edbd5d32SLin Li };
476*edbd5d32SLin Li 
477*edbd5d32SLin Li static struct clk_branch video_cc_mvs0_vpp1_clk = {
478*edbd5d32SLin Li 	.halt_reg = 0x80f4,
479*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
480*edbd5d32SLin Li 	.hwcg_reg = 0x80f4,
481*edbd5d32SLin Li 	.hwcg_bit = 1,
482*edbd5d32SLin Li 	.clkr = {
483*edbd5d32SLin Li 		.enable_reg = 0x80f4,
484*edbd5d32SLin Li 		.enable_mask = BIT(0),
485*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
486*edbd5d32SLin Li 			.name = "video_cc_mvs0_vpp1_clk",
487*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
488*edbd5d32SLin Li 				&video_cc_mvs0_clk_src.clkr.hw,
489*edbd5d32SLin Li 			},
490*edbd5d32SLin Li 			.num_parents = 1,
491*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
492*edbd5d32SLin Li 			.ops = &clk_branch2_aon_ops,
493*edbd5d32SLin Li 		},
494*edbd5d32SLin Li 	},
495*edbd5d32SLin Li };
496*edbd5d32SLin Li 
497*edbd5d32SLin Li static struct clk_branch video_cc_mvs0a_clk = {
498*edbd5d32SLin Li 	.halt_reg = 0x8090,
499*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
500*edbd5d32SLin Li 	.hwcg_reg = 0x8090,
501*edbd5d32SLin Li 	.hwcg_bit = 1,
502*edbd5d32SLin Li 	.clkr = {
503*edbd5d32SLin Li 		.enable_reg = 0x8090,
504*edbd5d32SLin Li 		.enable_mask = BIT(0),
505*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
506*edbd5d32SLin Li 			.name = "video_cc_mvs0a_clk",
507*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
508*edbd5d32SLin Li 				&video_cc_mvs0a_clk_src.clkr.hw,
509*edbd5d32SLin Li 			},
510*edbd5d32SLin Li 			.num_parents = 1,
511*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
512*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
513*edbd5d32SLin Li 		},
514*edbd5d32SLin Li 	},
515*edbd5d32SLin Li };
516*edbd5d32SLin Li 
517*edbd5d32SLin Li static struct clk_branch video_cc_mvs0b_clk = {
518*edbd5d32SLin Li 	.halt_reg = 0x80b8,
519*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
520*edbd5d32SLin Li 	.hwcg_reg = 0x80b8,
521*edbd5d32SLin Li 	.hwcg_bit = 1,
522*edbd5d32SLin Li 	.clkr = {
523*edbd5d32SLin Li 		.enable_reg = 0x80b8,
524*edbd5d32SLin Li 		.enable_mask = BIT(0),
525*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
526*edbd5d32SLin Li 			.name = "video_cc_mvs0b_clk",
527*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
528*edbd5d32SLin Li 				&video_cc_mvs0b_clk_src.clkr.hw,
529*edbd5d32SLin Li 			},
530*edbd5d32SLin Li 			.num_parents = 1,
531*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
532*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
533*edbd5d32SLin Li 		},
534*edbd5d32SLin Li 	},
535*edbd5d32SLin Li };
536*edbd5d32SLin Li 
537*edbd5d32SLin Li static struct clk_branch video_cc_mvs0c_clk = {
538*edbd5d32SLin Li 	.halt_reg = 0x814c,
539*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
540*edbd5d32SLin Li 	.hwcg_reg = 0x814c,
541*edbd5d32SLin Li 	.hwcg_bit = 1,
542*edbd5d32SLin Li 	.clkr = {
543*edbd5d32SLin Li 		.enable_reg = 0x814c,
544*edbd5d32SLin Li 		.enable_mask = BIT(0),
545*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
546*edbd5d32SLin Li 			.name = "video_cc_mvs0c_clk",
547*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
548*edbd5d32SLin Li 				&video_cc_mvs0c_clk_src.clkr.hw,
549*edbd5d32SLin Li 			},
550*edbd5d32SLin Li 			.num_parents = 1,
551*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
552*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
553*edbd5d32SLin Li 		},
554*edbd5d32SLin Li 	},
555*edbd5d32SLin Li };
556*edbd5d32SLin Li 
557*edbd5d32SLin Li static struct clk_branch video_cc_mvs0c_ctl_freerun_clk = {
558*edbd5d32SLin Li 	.halt_reg = 0x8160,
559*edbd5d32SLin Li 	.halt_check = BRANCH_HALT,
560*edbd5d32SLin Li 	.clkr = {
561*edbd5d32SLin Li 		.enable_reg = 0x8160,
562*edbd5d32SLin Li 		.enable_mask = BIT(0),
563*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
564*edbd5d32SLin Li 			.name = "video_cc_mvs0c_ctl_freerun_clk",
565*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
566*edbd5d32SLin Li 				&video_cc_mvs0c_clk_src.clkr.hw,
567*edbd5d32SLin Li 			},
568*edbd5d32SLin Li 			.num_parents = 1,
569*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
570*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
571*edbd5d32SLin Li 		},
572*edbd5d32SLin Li 	},
573*edbd5d32SLin Li };
574*edbd5d32SLin Li 
575*edbd5d32SLin Li static struct clk_branch video_cc_mvs0c_debug_clk = {
576*edbd5d32SLin Li 	.halt_reg = 0x8148,
577*edbd5d32SLin Li 	.halt_check = BRANCH_HALT,
578*edbd5d32SLin Li 	.clkr = {
579*edbd5d32SLin Li 		.enable_reg = 0x8148,
580*edbd5d32SLin Li 		.enable_mask = BIT(0),
581*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
582*edbd5d32SLin Li 			.name = "video_cc_mvs0c_debug_clk",
583*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
584*edbd5d32SLin Li 				&video_cc_mvs0c_clk_src.clkr.hw,
585*edbd5d32SLin Li 			},
586*edbd5d32SLin Li 			.num_parents = 1,
587*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
588*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
589*edbd5d32SLin Li 		},
590*edbd5d32SLin Li 	},
591*edbd5d32SLin Li };
592*edbd5d32SLin Li 
593*edbd5d32SLin Li static struct clk_branch video_cc_mvs0c_freerun_clk = {
594*edbd5d32SLin Li 	.halt_reg = 0x815c,
595*edbd5d32SLin Li 	.halt_check = BRANCH_HALT,
596*edbd5d32SLin Li 	.clkr = {
597*edbd5d32SLin Li 		.enable_reg = 0x815c,
598*edbd5d32SLin Li 		.enable_mask = BIT(0),
599*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
600*edbd5d32SLin Li 			.name = "video_cc_mvs0c_freerun_clk",
601*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
602*edbd5d32SLin Li 				&video_cc_mvs0c_clk_src.clkr.hw,
603*edbd5d32SLin Li 			},
604*edbd5d32SLin Li 			.num_parents = 1,
605*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
606*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
607*edbd5d32SLin Li 		},
608*edbd5d32SLin Li 	},
609*edbd5d32SLin Li };
610*edbd5d32SLin Li 
611*edbd5d32SLin Li static struct clk_branch video_cc_mvs0c_shift_clk = {
612*edbd5d32SLin Li 	.halt_reg = 0x81a8,
613*edbd5d32SLin Li 	.halt_check = BRANCH_HALT_VOTED,
614*edbd5d32SLin Li 	.hwcg_reg = 0x81a8,
615*edbd5d32SLin Li 	.hwcg_bit = 1,
616*edbd5d32SLin Li 	.clkr = {
617*edbd5d32SLin Li 		.enable_reg = 0x81a8,
618*edbd5d32SLin Li 		.enable_mask = BIT(0),
619*edbd5d32SLin Li 		.hw.init = &(const struct clk_init_data) {
620*edbd5d32SLin Li 			.name = "video_cc_mvs0c_shift_clk",
621*edbd5d32SLin Li 			.parent_hws = (const struct clk_hw*[]) {
622*edbd5d32SLin Li 				&video_cc_xo_clk_src.clkr.hw,
623*edbd5d32SLin Li 			},
624*edbd5d32SLin Li 			.num_parents = 1,
625*edbd5d32SLin Li 			.flags = CLK_SET_RATE_PARENT,
626*edbd5d32SLin Li 			.ops = &clk_branch2_ops,
627*edbd5d32SLin Li 		},
628*edbd5d32SLin Li 	},
629*edbd5d32SLin Li };
630*edbd5d32SLin Li 
631*edbd5d32SLin Li static struct gdsc video_cc_mvs0c_gdsc = {
632*edbd5d32SLin Li 	.gdscr = 0x8130,
633*edbd5d32SLin Li 	.en_rest_wait_val = 0x2,
634*edbd5d32SLin Li 	.en_few_wait_val = 0x2,
635*edbd5d32SLin Li 	.clk_dis_wait_val = 0x6,
636*edbd5d32SLin Li 	.pd = {
637*edbd5d32SLin Li 		.name = "video_cc_mvs0c_gdsc",
638*edbd5d32SLin Li 	},
639*edbd5d32SLin Li 	.pwrsts = PWRSTS_OFF_ON,
640*edbd5d32SLin Li 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
641*edbd5d32SLin Li };
642*edbd5d32SLin Li 
643*edbd5d32SLin Li static struct gdsc video_cc_axi0_cx_int_gdsc = {
644*edbd5d32SLin Li 	.gdscr = 0x81cc,
645*edbd5d32SLin Li 	.en_rest_wait_val = 0x2,
646*edbd5d32SLin Li 	.en_few_wait_val = 0x2,
647*edbd5d32SLin Li 	.clk_dis_wait_val = 0xf,
648*edbd5d32SLin Li 	.pd = {
649*edbd5d32SLin Li 		.name = "video_cc_axi0_cx_int_gdsc",
650*edbd5d32SLin Li 	},
651*edbd5d32SLin Li 	.pwrsts = PWRSTS_OFF_ON,
652*edbd5d32SLin Li 	.parent = &video_cc_mvs0c_gdsc.pd,
653*edbd5d32SLin Li 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
654*edbd5d32SLin Li };
655*edbd5d32SLin Li 
656*edbd5d32SLin Li static struct gdsc video_cc_mm_int_gdsc = {
657*edbd5d32SLin Li 	.gdscr = 0x81b4,
658*edbd5d32SLin Li 	.en_rest_wait_val = 0x2,
659*edbd5d32SLin Li 	.en_few_wait_val = 0x2,
660*edbd5d32SLin Li 	.clk_dis_wait_val = 0x2,
661*edbd5d32SLin Li 	.pd = {
662*edbd5d32SLin Li 		.name = "video_cc_mm_int_gdsc",
663*edbd5d32SLin Li 	},
664*edbd5d32SLin Li 	.pwrsts = PWRSTS_OFF_ON,
665*edbd5d32SLin Li 	.parent = &video_cc_axi0_cx_int_gdsc.pd,
666*edbd5d32SLin Li 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
667*edbd5d32SLin Li };
668*edbd5d32SLin Li 
669*edbd5d32SLin Li static struct gdsc video_cc_mvs0_gdsc = {
670*edbd5d32SLin Li 	.gdscr = 0x80a4,
671*edbd5d32SLin Li 	.en_rest_wait_val = 0x2,
672*edbd5d32SLin Li 	.en_few_wait_val = 0x2,
673*edbd5d32SLin Li 	.clk_dis_wait_val = 0x6,
674*edbd5d32SLin Li 	.pd = {
675*edbd5d32SLin Li 		.name = "video_cc_mvs0_gdsc",
676*edbd5d32SLin Li 	},
677*edbd5d32SLin Li 	.pwrsts = PWRSTS_OFF_ON,
678*edbd5d32SLin Li 	.parent = &video_cc_mm_int_gdsc.pd,
679*edbd5d32SLin Li 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
680*edbd5d32SLin Li };
681*edbd5d32SLin Li 
682*edbd5d32SLin Li static struct gdsc video_cc_mvs0_vpp0_gdsc = {
683*edbd5d32SLin Li 	.gdscr = 0x8108,
684*edbd5d32SLin Li 	.en_rest_wait_val = 0x2,
685*edbd5d32SLin Li 	.en_few_wait_val = 0x2,
686*edbd5d32SLin Li 	.clk_dis_wait_val = 0xf,
687*edbd5d32SLin Li 	.pd = {
688*edbd5d32SLin Li 		.name = "video_cc_mvs0_vpp0_gdsc",
689*edbd5d32SLin Li 	},
690*edbd5d32SLin Li 	.pwrsts = PWRSTS_OFF_ON,
691*edbd5d32SLin Li 	.parent = &video_cc_mvs0_gdsc.pd,
692*edbd5d32SLin Li 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
693*edbd5d32SLin Li };
694*edbd5d32SLin Li 
695*edbd5d32SLin Li static struct gdsc video_cc_mvs0_vpp1_gdsc = {
696*edbd5d32SLin Li 	.gdscr = 0x80e0,
697*edbd5d32SLin Li 	.en_rest_wait_val = 0x2,
698*edbd5d32SLin Li 	.en_few_wait_val = 0x2,
699*edbd5d32SLin Li 	.clk_dis_wait_val = 0xf,
700*edbd5d32SLin Li 	.pd = {
701*edbd5d32SLin Li 		.name = "video_cc_mvs0_vpp1_gdsc",
702*edbd5d32SLin Li 	},
703*edbd5d32SLin Li 	.pwrsts = PWRSTS_OFF_ON,
704*edbd5d32SLin Li 	.parent = &video_cc_mvs0_gdsc.pd,
705*edbd5d32SLin Li 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
706*edbd5d32SLin Li };
707*edbd5d32SLin Li 
708*edbd5d32SLin Li static struct gdsc video_cc_mvs0a_gdsc = {
709*edbd5d32SLin Li 	.gdscr = 0x807c,
710*edbd5d32SLin Li 	.en_rest_wait_val = 0x2,
711*edbd5d32SLin Li 	.en_few_wait_val = 0x2,
712*edbd5d32SLin Li 	.clk_dis_wait_val = 0xf,
713*edbd5d32SLin Li 	.pd = {
714*edbd5d32SLin Li 		.name = "video_cc_mvs0a_gdsc",
715*edbd5d32SLin Li 	},
716*edbd5d32SLin Li 	.pwrsts = PWRSTS_OFF_ON,
717*edbd5d32SLin Li 	.parent = &video_cc_mm_int_gdsc.pd,
718*edbd5d32SLin Li 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
719*edbd5d32SLin Li };
720*edbd5d32SLin Li 
721*edbd5d32SLin Li static struct clk_regmap *video_cc_hawi_clocks[] = {
722*edbd5d32SLin Li 	[VIDEO_CC_AHB_CLK_SRC] = &video_cc_ahb_clk_src.clkr,
723*edbd5d32SLin Li 	[VIDEO_CC_CX_AXI0_CLK] = &video_cc_cx_axi0_clk.clkr,
724*edbd5d32SLin Li 	[VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr,
725*edbd5d32SLin Li 	[VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr,
726*edbd5d32SLin Li 	[VIDEO_CC_MVS0_SHIFT_CLK] = &video_cc_mvs0_shift_clk.clkr,
727*edbd5d32SLin Li 	[VIDEO_CC_MVS0_VPP0_CLK] = &video_cc_mvs0_vpp0_clk.clkr,
728*edbd5d32SLin Li 	[VIDEO_CC_MVS0_VPP0_VPP1_GATING_CLK] = &video_cc_mvs0_vpp0_vpp1_gating_clk.clkr,
729*edbd5d32SLin Li 	[VIDEO_CC_MVS0_VPP1_CLK] = &video_cc_mvs0_vpp1_clk.clkr,
730*edbd5d32SLin Li 	[VIDEO_CC_MVS0A_CLK] = &video_cc_mvs0a_clk.clkr,
731*edbd5d32SLin Li 	[VIDEO_CC_MVS0A_CLK_SRC] = &video_cc_mvs0a_clk_src.clkr,
732*edbd5d32SLin Li 	[VIDEO_CC_MVS0B_CLK] = &video_cc_mvs0b_clk.clkr,
733*edbd5d32SLin Li 	[VIDEO_CC_MVS0B_CLK_SRC] = &video_cc_mvs0b_clk_src.clkr,
734*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr,
735*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_CLK_SRC] = &video_cc_mvs0c_clk_src.clkr,
736*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_CTL_FREERUN_CLK] = &video_cc_mvs0c_ctl_freerun_clk.clkr,
737*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_DEBUG_CLK] = &video_cc_mvs0c_debug_clk.clkr,
738*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_FREERUN_CLK] = &video_cc_mvs0c_freerun_clk.clkr,
739*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_SHIFT_CLK] = &video_cc_mvs0c_shift_clk.clkr,
740*edbd5d32SLin Li 	[VIDEO_CC_PLL0] = &video_cc_pll0.clkr,
741*edbd5d32SLin Li 	[VIDEO_CC_PLL0_OUT_EVEN] = &video_cc_pll0_out_even.clkr,
742*edbd5d32SLin Li 	[VIDEO_CC_PLL1] = &video_cc_pll1.clkr,
743*edbd5d32SLin Li 	[VIDEO_CC_PLL2] = &video_cc_pll2.clkr,
744*edbd5d32SLin Li 	[VIDEO_CC_PLL3] = &video_cc_pll3.clkr,
745*edbd5d32SLin Li 	[VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr,
746*edbd5d32SLin Li };
747*edbd5d32SLin Li 
748*edbd5d32SLin Li static struct gdsc *video_cc_hawi_gdscs[] = {
749*edbd5d32SLin Li 	[VIDEO_CC_AXI0_CX_INT_GDSC] = &video_cc_axi0_cx_int_gdsc,
750*edbd5d32SLin Li 	[VIDEO_CC_MM_INT_GDSC] = &video_cc_mm_int_gdsc,
751*edbd5d32SLin Li 	[VIDEO_CC_MVS0_GDSC] = &video_cc_mvs0_gdsc,
752*edbd5d32SLin Li 	[VIDEO_CC_MVS0_VPP0_GDSC] = &video_cc_mvs0_vpp0_gdsc,
753*edbd5d32SLin Li 	[VIDEO_CC_MVS0_VPP1_GDSC] = &video_cc_mvs0_vpp1_gdsc,
754*edbd5d32SLin Li 	[VIDEO_CC_MVS0A_GDSC] = &video_cc_mvs0a_gdsc,
755*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_GDSC] = &video_cc_mvs0c_gdsc,
756*edbd5d32SLin Li };
757*edbd5d32SLin Li 
758*edbd5d32SLin Li static const struct qcom_reset_map video_cc_hawi_resets[] = {
759*edbd5d32SLin Li 	[VIDEO_CC_AXI0_CX_INT_BCR] = { 0x81c8 },
760*edbd5d32SLin Li 	[VIDEO_CC_INTERFACE_BCR] = { 0x8164 },
761*edbd5d32SLin Li 	[VIDEO_CC_MM_INT_BCR] = { 0x81b0 },
762*edbd5d32SLin Li 	[VIDEO_CC_MVS0_BCR] = { 0x80a0 },
763*edbd5d32SLin Li 	[VIDEO_CC_MVS0_VPP0_BCR] = { 0x8104 },
764*edbd5d32SLin Li 	[VIDEO_CC_MVS0_VPP1_BCR] = { 0x80dc },
765*edbd5d32SLin Li 	[VIDEO_CC_MVS0A_BCR] = { 0x8078 },
766*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_CLK_ARES] = { 0x814c, 2 },
767*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_BCR] = { 0x812c },
768*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_CTL_FREERUN_CLK_ARES] = { 0x8160, 2 },
769*edbd5d32SLin Li 	[VIDEO_CC_MVS0C_FREERUN_CLK_ARES] = { 0x815c, 2 },
770*edbd5d32SLin Li 	[VIDEO_CC_XO_CLK_ARES] = { 0x8198, 2 },
771*edbd5d32SLin Li };
772*edbd5d32SLin Li 
773*edbd5d32SLin Li static struct clk_alpha_pll *video_cc_hawi_plls[] = {
774*edbd5d32SLin Li 	&video_cc_pll0,
775*edbd5d32SLin Li 	&video_cc_pll1,
776*edbd5d32SLin Li 	&video_cc_pll2,
777*edbd5d32SLin Li 	&video_cc_pll3,
778*edbd5d32SLin Li };
779*edbd5d32SLin Li 
780*edbd5d32SLin Li static const u32 video_cc_hawi_critical_cbcrs[] = {
781*edbd5d32SLin Li 	0x8168, /* VIDEO_CC_AHB_CLK */
782*edbd5d32SLin Li 	0x81e4, /* VIDEO_CC_CX_DBGCH_XO_CLK */
783*edbd5d32SLin Li 	0x81e0, /* VIDEO_CC_CX_XO_CLK */
784*edbd5d32SLin Li 	0x81a0, /* VIDEO_CC_DBGCH_XO_CLK */
785*edbd5d32SLin Li 	0x81ac, /* VIDEO_CC_SLEEP_CLK */
786*edbd5d32SLin Li 	0x819c, /* VIDEO_CC_TS_XO_CLK */
787*edbd5d32SLin Li 	0x8198, /* VIDEO_CC_XO_CLK */
788*edbd5d32SLin Li };
789*edbd5d32SLin Li 
790*edbd5d32SLin Li static const struct regmap_config video_cc_hawi_regmap_config = {
791*edbd5d32SLin Li 	.reg_bits = 32,
792*edbd5d32SLin Li 	.reg_stride = 4,
793*edbd5d32SLin Li 	.val_bits = 32,
794*edbd5d32SLin Li 	.max_register = 0xa018,
795*edbd5d32SLin Li 	.fast_io = true,
796*edbd5d32SLin Li };
797*edbd5d32SLin Li 
798*edbd5d32SLin Li static struct qcom_cc_driver_data video_cc_hawi_driver_data = {
799*edbd5d32SLin Li 	.alpha_plls = video_cc_hawi_plls,
800*edbd5d32SLin Li 	.num_alpha_plls = ARRAY_SIZE(video_cc_hawi_plls),
801*edbd5d32SLin Li 	.clk_cbcrs = video_cc_hawi_critical_cbcrs,
802*edbd5d32SLin Li 	.num_clk_cbcrs = ARRAY_SIZE(video_cc_hawi_critical_cbcrs),
803*edbd5d32SLin Li };
804*edbd5d32SLin Li 
805*edbd5d32SLin Li static const struct qcom_cc_desc video_cc_hawi_desc = {
806*edbd5d32SLin Li 	.config = &video_cc_hawi_regmap_config,
807*edbd5d32SLin Li 	.clks = video_cc_hawi_clocks,
808*edbd5d32SLin Li 	.num_clks = ARRAY_SIZE(video_cc_hawi_clocks),
809*edbd5d32SLin Li 	.resets = video_cc_hawi_resets,
810*edbd5d32SLin Li 	.num_resets = ARRAY_SIZE(video_cc_hawi_resets),
811*edbd5d32SLin Li 	.gdscs = video_cc_hawi_gdscs,
812*edbd5d32SLin Li 	.num_gdscs = ARRAY_SIZE(video_cc_hawi_gdscs),
813*edbd5d32SLin Li 	.use_rpm = true,
814*edbd5d32SLin Li 	.driver_data = &video_cc_hawi_driver_data,
815*edbd5d32SLin Li };
816*edbd5d32SLin Li 
817*edbd5d32SLin Li static const struct of_device_id video_cc_hawi_match_table[] = {
818*edbd5d32SLin Li 	{ .compatible = "qcom,hawi-videocc" },
819*edbd5d32SLin Li 	{ }
820*edbd5d32SLin Li };
821*edbd5d32SLin Li MODULE_DEVICE_TABLE(of, video_cc_hawi_match_table);
822*edbd5d32SLin Li 
video_cc_hawi_probe(struct platform_device * pdev)823*edbd5d32SLin Li static int video_cc_hawi_probe(struct platform_device *pdev)
824*edbd5d32SLin Li {
825*edbd5d32SLin Li 	return qcom_cc_probe(pdev, &video_cc_hawi_desc);
826*edbd5d32SLin Li }
827*edbd5d32SLin Li 
828*edbd5d32SLin Li static struct platform_driver video_cc_hawi_driver = {
829*edbd5d32SLin Li 	.probe = video_cc_hawi_probe,
830*edbd5d32SLin Li 	.driver = {
831*edbd5d32SLin Li 		.name = "videocc-hawi",
832*edbd5d32SLin Li 		.of_match_table = video_cc_hawi_match_table,
833*edbd5d32SLin Li 	},
834*edbd5d32SLin Li };
835*edbd5d32SLin Li 
836*edbd5d32SLin Li module_platform_driver(video_cc_hawi_driver);
837*edbd5d32SLin Li 
838*edbd5d32SLin Li MODULE_DESCRIPTION("QTI VIDEOCC Hawi Driver");
839*edbd5d32SLin Li MODULE_LICENSE("GPL");
840