xref: /linux/drivers/clk/qcom/videocc-glymur.c (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
1e2e0d2f3STaniya Das // SPDX-License-Identifier: GPL-2.0-only
2e2e0d2f3STaniya Das /*
3e2e0d2f3STaniya Das  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4e2e0d2f3STaniya Das  */
5e2e0d2f3STaniya Das 
6e2e0d2f3STaniya Das #include <linux/clk-provider.h>
7e2e0d2f3STaniya Das #include <linux/mod_devicetable.h>
8e2e0d2f3STaniya Das #include <linux/module.h>
9e2e0d2f3STaniya Das #include <linux/platform_device.h>
10e2e0d2f3STaniya Das #include <linux/regmap.h>
11e2e0d2f3STaniya Das 
12e2e0d2f3STaniya Das #include <dt-bindings/clock/qcom,glymur-videocc.h>
13e2e0d2f3STaniya Das 
14e2e0d2f3STaniya Das #include "clk-alpha-pll.h"
15e2e0d2f3STaniya Das #include "clk-branch.h"
16e2e0d2f3STaniya Das #include "clk-pll.h"
17e2e0d2f3STaniya Das #include "clk-rcg.h"
18e2e0d2f3STaniya Das #include "clk-regmap.h"
19e2e0d2f3STaniya Das #include "clk-regmap-divider.h"
20e2e0d2f3STaniya Das #include "clk-regmap-mux.h"
21e2e0d2f3STaniya Das #include "common.h"
22e2e0d2f3STaniya Das #include "gdsc.h"
23e2e0d2f3STaniya Das #include "reset.h"
24e2e0d2f3STaniya Das 
25e2e0d2f3STaniya Das enum {
26e2e0d2f3STaniya Das 	DT_BI_TCXO,
27e2e0d2f3STaniya Das 	DT_BI_TCXO_AO,
28e2e0d2f3STaniya Das 	DT_SLEEP_CLK,
29e2e0d2f3STaniya Das };
30e2e0d2f3STaniya Das 
31e2e0d2f3STaniya Das enum {
32e2e0d2f3STaniya Das 	P_BI_TCXO,
33e2e0d2f3STaniya Das 	P_SLEEP_CLK,
34e2e0d2f3STaniya Das 	P_VIDEO_CC_PLL0_OUT_MAIN,
35e2e0d2f3STaniya Das };
36e2e0d2f3STaniya Das 
37e2e0d2f3STaniya Das static const struct pll_vco taycan_eko_t_vco[] = {
38e2e0d2f3STaniya Das 	{ 249600000, 2500000000, 0 },
39e2e0d2f3STaniya Das };
40e2e0d2f3STaniya Das 
41e2e0d2f3STaniya Das /* 720.0 MHz Configuration */
42e2e0d2f3STaniya Das static const struct alpha_pll_config video_cc_pll0_config = {
43e2e0d2f3STaniya Das 	.l = 0x25,
44e2e0d2f3STaniya Das 	.alpha = 0x8000,
45e2e0d2f3STaniya Das 	.config_ctl_val = 0x25c400e7,
46e2e0d2f3STaniya Das 	.config_ctl_hi_val = 0x0a8060e0,
47e2e0d2f3STaniya Das 	.config_ctl_hi1_val = 0xf51dea20,
48e2e0d2f3STaniya Das 	.user_ctl_val = 0x00000008,
49e2e0d2f3STaniya Das 	.user_ctl_hi_val = 0x00000002,
50e2e0d2f3STaniya Das };
51e2e0d2f3STaniya Das 
52e2e0d2f3STaniya Das static struct clk_alpha_pll video_cc_pll0 = {
53e2e0d2f3STaniya Das 	.offset = 0x0,
54e2e0d2f3STaniya Das 	.config = &video_cc_pll0_config,
55e2e0d2f3STaniya Das 	.vco_table = taycan_eko_t_vco,
56e2e0d2f3STaniya Das 	.num_vco = ARRAY_SIZE(taycan_eko_t_vco),
57e2e0d2f3STaniya Das 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T],
58e2e0d2f3STaniya Das 	.clkr = {
59e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
60e2e0d2f3STaniya Das 			.name = "video_cc_pll0",
61e2e0d2f3STaniya Das 			.parent_data = &(const struct clk_parent_data) {
62e2e0d2f3STaniya Das 				.index = DT_BI_TCXO,
63e2e0d2f3STaniya Das 			},
64e2e0d2f3STaniya Das 			.num_parents = 1,
65e2e0d2f3STaniya Das 			.ops = &clk_alpha_pll_taycan_eko_t_ops,
66e2e0d2f3STaniya Das 		},
67e2e0d2f3STaniya Das 	},
68e2e0d2f3STaniya Das };
69e2e0d2f3STaniya Das 
70e2e0d2f3STaniya Das static const struct parent_map video_cc_parent_map_0[] = {
71e2e0d2f3STaniya Das 	{ P_BI_TCXO, 0 },
72e2e0d2f3STaniya Das };
73e2e0d2f3STaniya Das 
74e2e0d2f3STaniya Das static const struct clk_parent_data video_cc_parent_data_0[] = {
75e2e0d2f3STaniya Das 	{ .index = DT_BI_TCXO },
76e2e0d2f3STaniya Das };
77e2e0d2f3STaniya Das 
78e2e0d2f3STaniya Das static const struct parent_map video_cc_parent_map_1[] = {
79e2e0d2f3STaniya Das 	{ P_BI_TCXO, 0 },
80e2e0d2f3STaniya Das 	{ P_VIDEO_CC_PLL0_OUT_MAIN, 1 },
81e2e0d2f3STaniya Das };
82e2e0d2f3STaniya Das 
83e2e0d2f3STaniya Das static const struct clk_parent_data video_cc_parent_data_1[] = {
84e2e0d2f3STaniya Das 	{ .index = DT_BI_TCXO },
85e2e0d2f3STaniya Das 	{ .hw = &video_cc_pll0.clkr.hw },
86e2e0d2f3STaniya Das };
87e2e0d2f3STaniya Das 
88e2e0d2f3STaniya Das static const struct parent_map video_cc_parent_map_2[] = {
89e2e0d2f3STaniya Das 	{ P_SLEEP_CLK, 0 },
90e2e0d2f3STaniya Das };
91e2e0d2f3STaniya Das 
92e2e0d2f3STaniya Das static const struct clk_parent_data video_cc_parent_data_2[] = {
93e2e0d2f3STaniya Das 	{ .index = DT_SLEEP_CLK },
94e2e0d2f3STaniya Das };
95e2e0d2f3STaniya Das 
96e2e0d2f3STaniya Das static const struct freq_tbl ftbl_video_cc_ahb_clk_src[] = {
97e2e0d2f3STaniya Das 	F(19200000, P_BI_TCXO, 1, 0, 0),
98e2e0d2f3STaniya Das 	{ }
99e2e0d2f3STaniya Das };
100e2e0d2f3STaniya Das 
101e2e0d2f3STaniya Das static struct clk_rcg2 video_cc_ahb_clk_src = {
102e2e0d2f3STaniya Das 	.cmd_rcgr = 0x8018,
103e2e0d2f3STaniya Das 	.mnd_width = 0,
104e2e0d2f3STaniya Das 	.hid_width = 5,
105e2e0d2f3STaniya Das 	.parent_map = video_cc_parent_map_0,
106e2e0d2f3STaniya Das 	.freq_tbl = ftbl_video_cc_ahb_clk_src,
107e2e0d2f3STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
108e2e0d2f3STaniya Das 		.name = "video_cc_ahb_clk_src",
109e2e0d2f3STaniya Das 		.parent_data = video_cc_parent_data_0,
110e2e0d2f3STaniya Das 		.num_parents = ARRAY_SIZE(video_cc_parent_data_0),
111e2e0d2f3STaniya Das 		.flags = CLK_SET_RATE_PARENT,
112e2e0d2f3STaniya Das 		.ops = &clk_rcg2_shared_ops,
113e2e0d2f3STaniya Das 	},
114e2e0d2f3STaniya Das };
115e2e0d2f3STaniya Das 
116e2e0d2f3STaniya Das static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = {
117e2e0d2f3STaniya Das 	F(720000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
118e2e0d2f3STaniya Das 	F(1014000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
119e2e0d2f3STaniya Das 	F(1098000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
120e2e0d2f3STaniya Das 	F(1332000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
121e2e0d2f3STaniya Das 	F(1600000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
122e2e0d2f3STaniya Das 	F(1965000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
123e2e0d2f3STaniya Das 	{ }
124e2e0d2f3STaniya Das };
125e2e0d2f3STaniya Das 
126e2e0d2f3STaniya Das static struct clk_rcg2 video_cc_mvs0_clk_src = {
127e2e0d2f3STaniya Das 	.cmd_rcgr = 0x8000,
128e2e0d2f3STaniya Das 	.mnd_width = 0,
129e2e0d2f3STaniya Das 	.hid_width = 5,
130e2e0d2f3STaniya Das 	.parent_map = video_cc_parent_map_1,
131e2e0d2f3STaniya Das 	.freq_tbl = ftbl_video_cc_mvs0_clk_src,
132e2e0d2f3STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
133e2e0d2f3STaniya Das 		.name = "video_cc_mvs0_clk_src",
134e2e0d2f3STaniya Das 		.parent_data = video_cc_parent_data_1,
135e2e0d2f3STaniya Das 		.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
136e2e0d2f3STaniya Das 		.flags = CLK_SET_RATE_PARENT,
137e2e0d2f3STaniya Das 		.ops = &clk_rcg2_shared_ops,
138e2e0d2f3STaniya Das 	},
139e2e0d2f3STaniya Das };
140e2e0d2f3STaniya Das 
141e2e0d2f3STaniya Das static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = {
142e2e0d2f3STaniya Das 	F(32000, P_SLEEP_CLK, 1, 0, 0),
143e2e0d2f3STaniya Das 	{ }
144e2e0d2f3STaniya Das };
145e2e0d2f3STaniya Das 
146e2e0d2f3STaniya Das static struct clk_rcg2 video_cc_sleep_clk_src = {
147e2e0d2f3STaniya Das 	.cmd_rcgr = 0x8120,
148e2e0d2f3STaniya Das 	.mnd_width = 0,
149e2e0d2f3STaniya Das 	.hid_width = 5,
150e2e0d2f3STaniya Das 	.parent_map = video_cc_parent_map_2,
151e2e0d2f3STaniya Das 	.freq_tbl = ftbl_video_cc_sleep_clk_src,
152e2e0d2f3STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
153e2e0d2f3STaniya Das 		.name = "video_cc_sleep_clk_src",
154e2e0d2f3STaniya Das 		.parent_data = video_cc_parent_data_2,
155e2e0d2f3STaniya Das 		.num_parents = ARRAY_SIZE(video_cc_parent_data_2),
156e2e0d2f3STaniya Das 		.flags = CLK_SET_RATE_PARENT,
157e2e0d2f3STaniya Das 		.ops = &clk_rcg2_shared_ops,
158e2e0d2f3STaniya Das 	},
159e2e0d2f3STaniya Das };
160e2e0d2f3STaniya Das 
161e2e0d2f3STaniya Das static struct clk_rcg2 video_cc_xo_clk_src = {
162e2e0d2f3STaniya Das 	.cmd_rcgr = 0x80f8,
163e2e0d2f3STaniya Das 	.mnd_width = 0,
164e2e0d2f3STaniya Das 	.hid_width = 5,
165e2e0d2f3STaniya Das 	.parent_map = video_cc_parent_map_0,
166e2e0d2f3STaniya Das 	.freq_tbl = ftbl_video_cc_ahb_clk_src,
167e2e0d2f3STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
168e2e0d2f3STaniya Das 		.name = "video_cc_xo_clk_src",
169e2e0d2f3STaniya Das 		.parent_data = video_cc_parent_data_0,
170e2e0d2f3STaniya Das 		.num_parents = ARRAY_SIZE(video_cc_parent_data_0),
171e2e0d2f3STaniya Das 		.flags = CLK_SET_RATE_PARENT,
172e2e0d2f3STaniya Das 		.ops = &clk_rcg2_shared_ops,
173e2e0d2f3STaniya Das 	},
174e2e0d2f3STaniya Das };
175e2e0d2f3STaniya Das 
176e2e0d2f3STaniya Das static struct clk_regmap_div video_cc_mvs0_div_clk_src = {
177e2e0d2f3STaniya Das 	.reg = 0x809c,
178e2e0d2f3STaniya Das 	.shift = 0,
179e2e0d2f3STaniya Das 	.width = 4,
180e2e0d2f3STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
181e2e0d2f3STaniya Das 		.name = "video_cc_mvs0_div_clk_src",
182e2e0d2f3STaniya Das 		.parent_hws = (const struct clk_hw*[]) {
183e2e0d2f3STaniya Das 			&video_cc_mvs0_clk_src.clkr.hw,
184e2e0d2f3STaniya Das 		},
185e2e0d2f3STaniya Das 		.num_parents = 1,
186e2e0d2f3STaniya Das 		.flags = CLK_SET_RATE_PARENT,
187e2e0d2f3STaniya Das 		.ops = &clk_regmap_div_ro_ops,
188e2e0d2f3STaniya Das 	},
189e2e0d2f3STaniya Das };
190e2e0d2f3STaniya Das 
191e2e0d2f3STaniya Das static struct clk_regmap_div video_cc_mvs0c_div2_div_clk_src = {
192e2e0d2f3STaniya Das 	.reg = 0x8060,
193e2e0d2f3STaniya Das 	.shift = 0,
194e2e0d2f3STaniya Das 	.width = 4,
195e2e0d2f3STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
196e2e0d2f3STaniya Das 		.name = "video_cc_mvs0c_div2_div_clk_src",
197e2e0d2f3STaniya Das 		.parent_hws = (const struct clk_hw*[]) {
198e2e0d2f3STaniya Das 			&video_cc_mvs0_clk_src.clkr.hw,
199e2e0d2f3STaniya Das 		},
200e2e0d2f3STaniya Das 		.num_parents = 1,
201e2e0d2f3STaniya Das 		.flags = CLK_SET_RATE_PARENT,
202e2e0d2f3STaniya Das 		.ops = &clk_regmap_div_ro_ops,
203e2e0d2f3STaniya Das 	},
204e2e0d2f3STaniya Das };
205e2e0d2f3STaniya Das 
206e2e0d2f3STaniya Das static struct clk_regmap_div video_cc_mvs1_div_clk_src = {
207e2e0d2f3STaniya Das 	.reg = 0x80d8,
208e2e0d2f3STaniya Das 	.shift = 0,
209e2e0d2f3STaniya Das 	.width = 4,
210e2e0d2f3STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
211e2e0d2f3STaniya Das 		.name = "video_cc_mvs1_div_clk_src",
212e2e0d2f3STaniya Das 		.parent_hws = (const struct clk_hw*[]) {
213e2e0d2f3STaniya Das 			&video_cc_mvs0_clk_src.clkr.hw,
214e2e0d2f3STaniya Das 		},
215e2e0d2f3STaniya Das 		.num_parents = 1,
216e2e0d2f3STaniya Das 		.flags = CLK_SET_RATE_PARENT,
217e2e0d2f3STaniya Das 		.ops = &clk_regmap_div_ro_ops,
218e2e0d2f3STaniya Das 	},
219e2e0d2f3STaniya Das };
220e2e0d2f3STaniya Das 
221e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0_clk = {
222e2e0d2f3STaniya Das 	.halt_reg = 0x807c,
223e2e0d2f3STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
224e2e0d2f3STaniya Das 	.hwcg_reg = 0x807c,
225e2e0d2f3STaniya Das 	.hwcg_bit = 1,
226e2e0d2f3STaniya Das 	.clkr = {
227e2e0d2f3STaniya Das 		.enable_reg = 0x807c,
228e2e0d2f3STaniya Das 		.enable_mask = BIT(0),
229e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
230e2e0d2f3STaniya Das 			.name = "video_cc_mvs0_clk",
231e2e0d2f3STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
232e2e0d2f3STaniya Das 				&video_cc_mvs0_div_clk_src.clkr.hw,
233e2e0d2f3STaniya Das 			},
234e2e0d2f3STaniya Das 			.num_parents = 1,
235e2e0d2f3STaniya Das 			.flags = CLK_SET_RATE_PARENT,
236e2e0d2f3STaniya Das 			.ops = &clk_branch2_ops,
237e2e0d2f3STaniya Das 		},
238e2e0d2f3STaniya Das 	},
239e2e0d2f3STaniya Das };
240e2e0d2f3STaniya Das 
241e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0_freerun_clk = {
242e2e0d2f3STaniya Das 	.halt_reg = 0x808c,
243e2e0d2f3STaniya Das 	.halt_check = BRANCH_HALT,
244e2e0d2f3STaniya Das 	.clkr = {
245e2e0d2f3STaniya Das 		.enable_reg = 0x808c,
246e2e0d2f3STaniya Das 		.enable_mask = BIT(0),
247e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
248e2e0d2f3STaniya Das 			.name = "video_cc_mvs0_freerun_clk",
249e2e0d2f3STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
250e2e0d2f3STaniya Das 				&video_cc_mvs0_div_clk_src.clkr.hw,
251e2e0d2f3STaniya Das 			},
252e2e0d2f3STaniya Das 			.num_parents = 1,
253e2e0d2f3STaniya Das 			.flags = CLK_SET_RATE_PARENT,
254e2e0d2f3STaniya Das 			.ops = &clk_branch2_ops,
255e2e0d2f3STaniya Das 		},
256e2e0d2f3STaniya Das 	},
257e2e0d2f3STaniya Das };
258e2e0d2f3STaniya Das 
259e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0_shift_clk = {
260e2e0d2f3STaniya Das 	.halt_reg = 0x8114,
261e2e0d2f3STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
262e2e0d2f3STaniya Das 	.hwcg_reg = 0x8114,
263e2e0d2f3STaniya Das 	.hwcg_bit = 1,
264e2e0d2f3STaniya Das 	.clkr = {
265e2e0d2f3STaniya Das 		.enable_reg = 0x8114,
266e2e0d2f3STaniya Das 		.enable_mask = BIT(0),
267e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
268e2e0d2f3STaniya Das 			.name = "video_cc_mvs0_shift_clk",
269e2e0d2f3STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
270e2e0d2f3STaniya Das 				&video_cc_xo_clk_src.clkr.hw,
271e2e0d2f3STaniya Das 			},
272e2e0d2f3STaniya Das 			.num_parents = 1,
273e2e0d2f3STaniya Das 			.flags = CLK_SET_RATE_PARENT,
274e2e0d2f3STaniya Das 			.ops = &clk_branch2_ops,
275e2e0d2f3STaniya Das 		},
276e2e0d2f3STaniya Das 	},
277e2e0d2f3STaniya Das };
278e2e0d2f3STaniya Das 
279e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0c_clk = {
280e2e0d2f3STaniya Das 	.halt_reg = 0x804c,
281e2e0d2f3STaniya Das 	.halt_check = BRANCH_HALT,
282e2e0d2f3STaniya Das 	.clkr = {
283e2e0d2f3STaniya Das 		.enable_reg = 0x804c,
284e2e0d2f3STaniya Das 		.enable_mask = BIT(0),
285e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
286e2e0d2f3STaniya Das 			.name = "video_cc_mvs0c_clk",
287e2e0d2f3STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
288e2e0d2f3STaniya Das 				&video_cc_mvs0c_div2_div_clk_src.clkr.hw,
289e2e0d2f3STaniya Das 			},
290e2e0d2f3STaniya Das 			.num_parents = 1,
291e2e0d2f3STaniya Das 			.flags = CLK_SET_RATE_PARENT,
292e2e0d2f3STaniya Das 			.ops = &clk_branch2_ops,
293e2e0d2f3STaniya Das 		},
294e2e0d2f3STaniya Das 	},
295e2e0d2f3STaniya Das };
296e2e0d2f3STaniya Das 
297e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0c_freerun_clk = {
298e2e0d2f3STaniya Das 	.halt_reg = 0x805c,
299e2e0d2f3STaniya Das 	.halt_check = BRANCH_HALT,
300e2e0d2f3STaniya Das 	.clkr = {
301e2e0d2f3STaniya Das 		.enable_reg = 0x805c,
302e2e0d2f3STaniya Das 		.enable_mask = BIT(0),
303e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
304e2e0d2f3STaniya Das 			.name = "video_cc_mvs0c_freerun_clk",
305e2e0d2f3STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
306e2e0d2f3STaniya Das 				&video_cc_mvs0c_div2_div_clk_src.clkr.hw,
307e2e0d2f3STaniya Das 			},
308e2e0d2f3STaniya Das 			.num_parents = 1,
309e2e0d2f3STaniya Das 			.flags = CLK_SET_RATE_PARENT,
310e2e0d2f3STaniya Das 			.ops = &clk_branch2_ops,
311e2e0d2f3STaniya Das 		},
312e2e0d2f3STaniya Das 	},
313e2e0d2f3STaniya Das };
314e2e0d2f3STaniya Das 
315e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs0c_shift_clk = {
316e2e0d2f3STaniya Das 	.halt_reg = 0x811c,
317e2e0d2f3STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
318e2e0d2f3STaniya Das 	.hwcg_reg = 0x811c,
319e2e0d2f3STaniya Das 	.hwcg_bit = 1,
320e2e0d2f3STaniya Das 	.clkr = {
321e2e0d2f3STaniya Das 		.enable_reg = 0x811c,
322e2e0d2f3STaniya Das 		.enable_mask = BIT(0),
323e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
324e2e0d2f3STaniya Das 			.name = "video_cc_mvs0c_shift_clk",
325e2e0d2f3STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
326e2e0d2f3STaniya Das 				&video_cc_xo_clk_src.clkr.hw,
327e2e0d2f3STaniya Das 			},
328e2e0d2f3STaniya Das 			.num_parents = 1,
329e2e0d2f3STaniya Das 			.flags = CLK_SET_RATE_PARENT,
330e2e0d2f3STaniya Das 			.ops = &clk_branch2_ops,
331e2e0d2f3STaniya Das 		},
332e2e0d2f3STaniya Das 	},
333e2e0d2f3STaniya Das };
334e2e0d2f3STaniya Das 
335e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs1_clk = {
336e2e0d2f3STaniya Das 	.halt_reg = 0x80b8,
337e2e0d2f3STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
338e2e0d2f3STaniya Das 	.hwcg_reg = 0x80b8,
339e2e0d2f3STaniya Das 	.hwcg_bit = 1,
340e2e0d2f3STaniya Das 	.clkr = {
341e2e0d2f3STaniya Das 		.enable_reg = 0x80b8,
342e2e0d2f3STaniya Das 		.enable_mask = BIT(0),
343e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
344e2e0d2f3STaniya Das 			.name = "video_cc_mvs1_clk",
345e2e0d2f3STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
346e2e0d2f3STaniya Das 				&video_cc_mvs1_div_clk_src.clkr.hw,
347e2e0d2f3STaniya Das 			},
348e2e0d2f3STaniya Das 			.num_parents = 1,
349e2e0d2f3STaniya Das 			.flags = CLK_SET_RATE_PARENT,
350e2e0d2f3STaniya Das 			.ops = &clk_branch2_ops,
351e2e0d2f3STaniya Das 		},
352e2e0d2f3STaniya Das 	},
353e2e0d2f3STaniya Das };
354e2e0d2f3STaniya Das 
355e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs1_freerun_clk = {
356e2e0d2f3STaniya Das 	.halt_reg = 0x80c8,
357e2e0d2f3STaniya Das 	.halt_check = BRANCH_HALT,
358e2e0d2f3STaniya Das 	.clkr = {
359e2e0d2f3STaniya Das 		.enable_reg = 0x80c8,
360e2e0d2f3STaniya Das 		.enable_mask = BIT(0),
361e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
362e2e0d2f3STaniya Das 			.name = "video_cc_mvs1_freerun_clk",
363e2e0d2f3STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
364e2e0d2f3STaniya Das 				&video_cc_mvs1_div_clk_src.clkr.hw,
365e2e0d2f3STaniya Das 			},
366e2e0d2f3STaniya Das 			.num_parents = 1,
367e2e0d2f3STaniya Das 			.flags = CLK_SET_RATE_PARENT,
368e2e0d2f3STaniya Das 			.ops = &clk_branch2_ops,
369e2e0d2f3STaniya Das 		},
370e2e0d2f3STaniya Das 	},
371e2e0d2f3STaniya Das };
372e2e0d2f3STaniya Das 
373e2e0d2f3STaniya Das static struct clk_branch video_cc_mvs1_shift_clk = {
374e2e0d2f3STaniya Das 	.halt_reg = 0x8118,
375e2e0d2f3STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
376e2e0d2f3STaniya Das 	.hwcg_reg = 0x8118,
377e2e0d2f3STaniya Das 	.hwcg_bit = 1,
378e2e0d2f3STaniya Das 	.clkr = {
379e2e0d2f3STaniya Das 		.enable_reg = 0x8118,
380e2e0d2f3STaniya Das 		.enable_mask = BIT(0),
381e2e0d2f3STaniya Das 		.hw.init = &(const struct clk_init_data) {
382e2e0d2f3STaniya Das 			.name = "video_cc_mvs1_shift_clk",
383e2e0d2f3STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
384e2e0d2f3STaniya Das 				&video_cc_xo_clk_src.clkr.hw,
385e2e0d2f3STaniya Das 			},
386e2e0d2f3STaniya Das 			.num_parents = 1,
387e2e0d2f3STaniya Das 			.flags = CLK_SET_RATE_PARENT,
388e2e0d2f3STaniya Das 			.ops = &clk_branch2_ops,
389e2e0d2f3STaniya Das 		},
390e2e0d2f3STaniya Das 	},
391e2e0d2f3STaniya Das };
392e2e0d2f3STaniya Das 
393e2e0d2f3STaniya Das static struct gdsc video_cc_mvs0c_gdsc = {
394e2e0d2f3STaniya Das 	.gdscr = 0x8034,
395e2e0d2f3STaniya Das 	.en_rest_wait_val = 0x2,
396e2e0d2f3STaniya Das 	.en_few_wait_val = 0x2,
397e2e0d2f3STaniya Das 	.clk_dis_wait_val = 0x6,
398e2e0d2f3STaniya Das 	.pd = {
399e2e0d2f3STaniya Das 		.name = "video_cc_mvs0c_gdsc",
400e2e0d2f3STaniya Das 	},
401e2e0d2f3STaniya Das 	.pwrsts = PWRSTS_OFF_ON,
402e2e0d2f3STaniya Das 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
403e2e0d2f3STaniya Das };
404e2e0d2f3STaniya Das 
405e2e0d2f3STaniya Das static struct gdsc video_cc_mvs0_gdsc = {
406e2e0d2f3STaniya Das 	.gdscr = 0x8068,
407e2e0d2f3STaniya Das 	.en_rest_wait_val = 0x2,
408e2e0d2f3STaniya Das 	.en_few_wait_val = 0x2,
409e2e0d2f3STaniya Das 	.clk_dis_wait_val = 0x6,
410e2e0d2f3STaniya Das 	.pd = {
411e2e0d2f3STaniya Das 		.name = "video_cc_mvs0_gdsc",
412e2e0d2f3STaniya Das 	},
413e2e0d2f3STaniya Das 	.pwrsts = PWRSTS_OFF_ON,
414e2e0d2f3STaniya Das 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
415e2e0d2f3STaniya Das 	.parent = &video_cc_mvs0c_gdsc.pd,
416e2e0d2f3STaniya Das };
417e2e0d2f3STaniya Das 
418e2e0d2f3STaniya Das static struct gdsc video_cc_mvs1_gdsc = {
419e2e0d2f3STaniya Das 	.gdscr = 0x80a4,
420e2e0d2f3STaniya Das 	.en_rest_wait_val = 0x2,
421e2e0d2f3STaniya Das 	.en_few_wait_val = 0x2,
422e2e0d2f3STaniya Das 	.clk_dis_wait_val = 0x6,
423e2e0d2f3STaniya Das 	.pd = {
424e2e0d2f3STaniya Das 		.name = "video_cc_mvs1_gdsc",
425e2e0d2f3STaniya Das 	},
426e2e0d2f3STaniya Das 	.pwrsts = PWRSTS_OFF_ON,
427e2e0d2f3STaniya Das 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
428e2e0d2f3STaniya Das };
429e2e0d2f3STaniya Das 
430e2e0d2f3STaniya Das static struct clk_regmap *video_cc_glymur_clocks[] = {
431e2e0d2f3STaniya Das 	[VIDEO_CC_AHB_CLK_SRC] = &video_cc_ahb_clk_src.clkr,
432e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr,
433e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr,
434e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0_DIV_CLK_SRC] = &video_cc_mvs0_div_clk_src.clkr,
435e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0_FREERUN_CLK] = &video_cc_mvs0_freerun_clk.clkr,
436e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0_SHIFT_CLK] = &video_cc_mvs0_shift_clk.clkr,
437e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr,
438e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0C_DIV2_DIV_CLK_SRC] = &video_cc_mvs0c_div2_div_clk_src.clkr,
439e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0C_FREERUN_CLK] = &video_cc_mvs0c_freerun_clk.clkr,
440e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0C_SHIFT_CLK] = &video_cc_mvs0c_shift_clk.clkr,
441e2e0d2f3STaniya Das 	[VIDEO_CC_MVS1_CLK] = &video_cc_mvs1_clk.clkr,
442e2e0d2f3STaniya Das 	[VIDEO_CC_MVS1_DIV_CLK_SRC] = &video_cc_mvs1_div_clk_src.clkr,
443e2e0d2f3STaniya Das 	[VIDEO_CC_MVS1_FREERUN_CLK] = &video_cc_mvs1_freerun_clk.clkr,
444e2e0d2f3STaniya Das 	[VIDEO_CC_MVS1_SHIFT_CLK] = &video_cc_mvs1_shift_clk.clkr,
445e2e0d2f3STaniya Das 	[VIDEO_CC_PLL0] = &video_cc_pll0.clkr,
446e2e0d2f3STaniya Das 	[VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
447e2e0d2f3STaniya Das 	[VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr,
448e2e0d2f3STaniya Das };
449e2e0d2f3STaniya Das 
450e2e0d2f3STaniya Das static struct gdsc *video_cc_glymur_gdscs[] = {
451e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0_GDSC] = &video_cc_mvs0_gdsc,
452e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0C_GDSC] = &video_cc_mvs0c_gdsc,
453e2e0d2f3STaniya Das 	[VIDEO_CC_MVS1_GDSC] = &video_cc_mvs1_gdsc,
454e2e0d2f3STaniya Das };
455e2e0d2f3STaniya Das 
456e2e0d2f3STaniya Das static const struct qcom_reset_map video_cc_glymur_resets[] = {
457e2e0d2f3STaniya Das 	[VIDEO_CC_INTERFACE_BCR] = { 0x80dc },
458e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0_BCR] = { 0x8064 },
459e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0C_FREERUN_CLK_ARES] = { 0x805c, 2 },
460e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0C_BCR] = { 0x8030 },
461e2e0d2f3STaniya Das 	[VIDEO_CC_MVS0_FREERUN_CLK_ARES] = { 0x808c, 2 },
462e2e0d2f3STaniya Das 	[VIDEO_CC_MVS1_FREERUN_CLK_ARES] = { 0x80c8, 2 },
463e2e0d2f3STaniya Das 	[VIDEO_CC_MVS1_BCR] = { 0x80a0 },
464e2e0d2f3STaniya Das };
465e2e0d2f3STaniya Das 
466e2e0d2f3STaniya Das static struct clk_alpha_pll *video_cc_glymur_plls[] = {
467e2e0d2f3STaniya Das 	&video_cc_pll0,
468e2e0d2f3STaniya Das };
469e2e0d2f3STaniya Das 
470*87df31eaSKrzysztof Kozlowski static const u32 video_cc_glymur_critical_cbcrs[] = {
471e2e0d2f3STaniya Das 	0x80e0, /* VIDEO_CC_AHB_CLK */
472e2e0d2f3STaniya Das 	0x8138, /* VIDEO_CC_SLEEP_CLK */
473e2e0d2f3STaniya Das 	0x8110, /* VIDEO_CC_XO_CLK */
474e2e0d2f3STaniya Das };
475e2e0d2f3STaniya Das 
476e2e0d2f3STaniya Das static const struct regmap_config video_cc_glymur_regmap_config = {
477e2e0d2f3STaniya Das 	.reg_bits = 32,
478e2e0d2f3STaniya Das 	.reg_stride = 4,
479e2e0d2f3STaniya Das 	.val_bits = 32,
480e2e0d2f3STaniya Das 	.max_register = 0x9f54,
481e2e0d2f3STaniya Das 	.fast_io = true,
482e2e0d2f3STaniya Das };
483e2e0d2f3STaniya Das 
484e2e0d2f3STaniya Das static void clk_glymur_regs_configure(struct device *dev, struct regmap *regmap)
485e2e0d2f3STaniya Das {
486e2e0d2f3STaniya Das 	/* Update CTRL_IN register */
487e2e0d2f3STaniya Das 	regmap_update_bits(regmap, 0x9f24, BIT(0), BIT(0));
488e2e0d2f3STaniya Das }
489e2e0d2f3STaniya Das 
490573ddd0dSKrzysztof Kozlowski static const struct qcom_cc_driver_data video_cc_glymur_driver_data = {
491e2e0d2f3STaniya Das 	.alpha_plls = video_cc_glymur_plls,
492e2e0d2f3STaniya Das 	.num_alpha_plls = ARRAY_SIZE(video_cc_glymur_plls),
493e2e0d2f3STaniya Das 	.clk_cbcrs = video_cc_glymur_critical_cbcrs,
494e2e0d2f3STaniya Das 	.num_clk_cbcrs = ARRAY_SIZE(video_cc_glymur_critical_cbcrs),
495e2e0d2f3STaniya Das 	.clk_regs_configure = clk_glymur_regs_configure,
496e2e0d2f3STaniya Das };
497e2e0d2f3STaniya Das 
49803aa6ed7SKrzysztof Kozlowski static const struct qcom_cc_desc video_cc_glymur_desc = {
499e2e0d2f3STaniya Das 	.config = &video_cc_glymur_regmap_config,
500e2e0d2f3STaniya Das 	.clks = video_cc_glymur_clocks,
501e2e0d2f3STaniya Das 	.num_clks = ARRAY_SIZE(video_cc_glymur_clocks),
502e2e0d2f3STaniya Das 	.resets = video_cc_glymur_resets,
503e2e0d2f3STaniya Das 	.num_resets = ARRAY_SIZE(video_cc_glymur_resets),
504e2e0d2f3STaniya Das 	.gdscs = video_cc_glymur_gdscs,
505e2e0d2f3STaniya Das 	.num_gdscs = ARRAY_SIZE(video_cc_glymur_gdscs),
506e2e0d2f3STaniya Das 	.use_rpm = true,
507e2e0d2f3STaniya Das 	.driver_data = &video_cc_glymur_driver_data,
508e2e0d2f3STaniya Das };
509e2e0d2f3STaniya Das 
510e2e0d2f3STaniya Das static const struct of_device_id video_cc_glymur_match_table[] = {
511e2e0d2f3STaniya Das 	{ .compatible = "qcom,glymur-videocc" },
512e2e0d2f3STaniya Das 	{ }
513e2e0d2f3STaniya Das };
514e2e0d2f3STaniya Das MODULE_DEVICE_TABLE(of, video_cc_glymur_match_table);
515e2e0d2f3STaniya Das 
516e2e0d2f3STaniya Das static int video_cc_glymur_probe(struct platform_device *pdev)
517e2e0d2f3STaniya Das {
518e2e0d2f3STaniya Das 	return qcom_cc_probe(pdev, &video_cc_glymur_desc);
519e2e0d2f3STaniya Das }
520e2e0d2f3STaniya Das 
521e2e0d2f3STaniya Das static struct platform_driver video_cc_glymur_driver = {
522e2e0d2f3STaniya Das 	.probe = video_cc_glymur_probe,
523e2e0d2f3STaniya Das 	.driver = {
524e2e0d2f3STaniya Das 		.name = "videocc-glymur",
525e2e0d2f3STaniya Das 		.of_match_table = video_cc_glymur_match_table,
526e2e0d2f3STaniya Das 	},
527e2e0d2f3STaniya Das };
528e2e0d2f3STaniya Das 
529e2e0d2f3STaniya Das module_platform_driver(video_cc_glymur_driver);
530e2e0d2f3STaniya Das 
531e2e0d2f3STaniya Das MODULE_DESCRIPTION("QTI VIDEOCC Glymur Driver");
532e2e0d2f3STaniya Das MODULE_LICENSE("GPL");
533