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