xref: /linux/drivers/clk/qcom/evacc-glymur.c (revision 502d45774af09f1c681c754c4b7cdfb5d7f72fd9)
1*e291ec81STaniya Das // SPDX-License-Identifier: GPL-2.0-only
2*e291ec81STaniya Das /*
3*e291ec81STaniya Das  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4*e291ec81STaniya Das  */
5*e291ec81STaniya Das 
6*e291ec81STaniya Das #include <linux/clk-provider.h>
7*e291ec81STaniya Das #include <linux/module.h>
8*e291ec81STaniya Das #include <linux/of.h>
9*e291ec81STaniya Das #include <linux/platform_device.h>
10*e291ec81STaniya Das #include <linux/regmap.h>
11*e291ec81STaniya Das 
12*e291ec81STaniya Das #include <dt-bindings/clock/qcom,glymur-evacc.h>
13*e291ec81STaniya Das 
14*e291ec81STaniya Das #include "clk-alpha-pll.h"
15*e291ec81STaniya Das #include "clk-branch.h"
16*e291ec81STaniya Das #include "clk-pll.h"
17*e291ec81STaniya Das #include "clk-rcg.h"
18*e291ec81STaniya Das #include "clk-regmap.h"
19*e291ec81STaniya Das #include "clk-regmap-divider.h"
20*e291ec81STaniya Das #include "clk-regmap-mux.h"
21*e291ec81STaniya Das #include "common.h"
22*e291ec81STaniya Das #include "gdsc.h"
23*e291ec81STaniya Das #include "reset.h"
24*e291ec81STaniya Das 
25*e291ec81STaniya Das enum {
26*e291ec81STaniya Das 	DT_AHB_CLK,
27*e291ec81STaniya Das 	DT_BI_TCXO,
28*e291ec81STaniya Das 	DT_SLEEP_CLK,
29*e291ec81STaniya Das };
30*e291ec81STaniya Das 
31*e291ec81STaniya Das enum {
32*e291ec81STaniya Das 	P_BI_TCXO,
33*e291ec81STaniya Das 	P_EVA_CC_PLL0_OUT_MAIN,
34*e291ec81STaniya Das 	P_SLEEP_CLK,
35*e291ec81STaniya Das };
36*e291ec81STaniya Das 
37*e291ec81STaniya Das static const struct pll_vco taycan_eko_t_vco[] = {
38*e291ec81STaniya Das 	{ 249600000, 2500000000, 0 },
39*e291ec81STaniya Das };
40*e291ec81STaniya Das 
41*e291ec81STaniya Das /* 840.0 MHz Configuration */
42*e291ec81STaniya Das static const struct alpha_pll_config eva_cc_pll0_config = {
43*e291ec81STaniya Das 	.l = 0x2b,
44*e291ec81STaniya Das 	.alpha = 0xc000,
45*e291ec81STaniya Das 	.config_ctl_val = 0x25c400e7,
46*e291ec81STaniya Das 	.config_ctl_hi_val = 0x0a8060e0,
47*e291ec81STaniya Das 	.config_ctl_hi1_val = 0xf51dea20,
48*e291ec81STaniya Das 	.user_ctl_val = 0x00000008,
49*e291ec81STaniya Das 	.user_ctl_hi_val = 0x00000002,
50*e291ec81STaniya Das };
51*e291ec81STaniya Das 
52*e291ec81STaniya Das static struct clk_alpha_pll eva_cc_pll0 = {
53*e291ec81STaniya Das 	.offset = 0x0,
54*e291ec81STaniya Das 	.config = &eva_cc_pll0_config,
55*e291ec81STaniya Das 	.vco_table = taycan_eko_t_vco,
56*e291ec81STaniya Das 	.num_vco = ARRAY_SIZE(taycan_eko_t_vco),
57*e291ec81STaniya Das 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T],
58*e291ec81STaniya Das 	.clkr = {
59*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
60*e291ec81STaniya Das 			.name = "eva_cc_pll0",
61*e291ec81STaniya Das 			.parent_data = &(const struct clk_parent_data) {
62*e291ec81STaniya Das 				.index = DT_BI_TCXO,
63*e291ec81STaniya Das 			},
64*e291ec81STaniya Das 			.num_parents = 1,
65*e291ec81STaniya Das 			.ops = &clk_alpha_pll_taycan_eko_t_ops,
66*e291ec81STaniya Das 		},
67*e291ec81STaniya Das 	},
68*e291ec81STaniya Das };
69*e291ec81STaniya Das 
70*e291ec81STaniya Das static const struct parent_map eva_cc_parent_map_0[] = {
71*e291ec81STaniya Das 	{ P_BI_TCXO, 0 },
72*e291ec81STaniya Das };
73*e291ec81STaniya Das 
74*e291ec81STaniya Das static const struct clk_parent_data eva_cc_parent_data_0[] = {
75*e291ec81STaniya Das 	{ .index = DT_BI_TCXO },
76*e291ec81STaniya Das };
77*e291ec81STaniya Das 
78*e291ec81STaniya Das static const struct parent_map eva_cc_parent_map_1[] = {
79*e291ec81STaniya Das 	{ P_BI_TCXO, 0 },
80*e291ec81STaniya Das 	{ P_EVA_CC_PLL0_OUT_MAIN, 1 },
81*e291ec81STaniya Das };
82*e291ec81STaniya Das 
83*e291ec81STaniya Das static const struct clk_parent_data eva_cc_parent_data_1[] = {
84*e291ec81STaniya Das 	{ .index = DT_BI_TCXO },
85*e291ec81STaniya Das 	{ .hw = &eva_cc_pll0.clkr.hw },
86*e291ec81STaniya Das };
87*e291ec81STaniya Das 
88*e291ec81STaniya Das static const struct parent_map eva_cc_parent_map_2[] = {
89*e291ec81STaniya Das 	{ P_SLEEP_CLK, 0 },
90*e291ec81STaniya Das };
91*e291ec81STaniya Das 
92*e291ec81STaniya Das static const struct clk_parent_data eva_cc_parent_data_2[] = {
93*e291ec81STaniya Das 	{ .index = DT_SLEEP_CLK },
94*e291ec81STaniya Das };
95*e291ec81STaniya Das 
96*e291ec81STaniya Das static const struct freq_tbl ftbl_eva_cc_ahb_clk_src[] = {
97*e291ec81STaniya Das 	F(19200000, P_BI_TCXO, 1, 0, 0),
98*e291ec81STaniya Das 	{ }
99*e291ec81STaniya Das };
100*e291ec81STaniya Das 
101*e291ec81STaniya Das static struct clk_rcg2 eva_cc_ahb_clk_src = {
102*e291ec81STaniya Das 	.cmd_rcgr = 0x8018,
103*e291ec81STaniya Das 	.mnd_width = 0,
104*e291ec81STaniya Das 	.hid_width = 5,
105*e291ec81STaniya Das 	.parent_map = eva_cc_parent_map_0,
106*e291ec81STaniya Das 	.freq_tbl = ftbl_eva_cc_ahb_clk_src,
107*e291ec81STaniya Das 	.hw_clk_ctrl = true,
108*e291ec81STaniya Das 	.clkr = {
109*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
110*e291ec81STaniya Das 			.name = "eva_cc_ahb_clk_src",
111*e291ec81STaniya Das 			.parent_data = eva_cc_parent_data_0,
112*e291ec81STaniya Das 			.num_parents = ARRAY_SIZE(eva_cc_parent_data_0),
113*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
114*e291ec81STaniya Das 			.ops = &clk_rcg2_shared_ops,
115*e291ec81STaniya Das 		},
116*e291ec81STaniya Das 	},
117*e291ec81STaniya Das };
118*e291ec81STaniya Das 
119*e291ec81STaniya Das static const struct freq_tbl ftbl_eva_cc_mvs0_clk_src[] = {
120*e291ec81STaniya Das 	F(840000000, P_EVA_CC_PLL0_OUT_MAIN, 1, 0, 0),
121*e291ec81STaniya Das 	F(1050000000, P_EVA_CC_PLL0_OUT_MAIN, 1, 0, 0),
122*e291ec81STaniya Das 	F(1350000000, P_EVA_CC_PLL0_OUT_MAIN, 1, 0, 0),
123*e291ec81STaniya Das 	F(1500000000, P_EVA_CC_PLL0_OUT_MAIN, 1, 0, 0),
124*e291ec81STaniya Das 	F(1650000000, P_EVA_CC_PLL0_OUT_MAIN, 1, 0, 0),
125*e291ec81STaniya Das 	{ }
126*e291ec81STaniya Das };
127*e291ec81STaniya Das 
128*e291ec81STaniya Das static struct clk_rcg2 eva_cc_mvs0_clk_src = {
129*e291ec81STaniya Das 	.cmd_rcgr = 0x8000,
130*e291ec81STaniya Das 	.mnd_width = 0,
131*e291ec81STaniya Das 	.hid_width = 5,
132*e291ec81STaniya Das 	.parent_map = eva_cc_parent_map_1,
133*e291ec81STaniya Das 	.freq_tbl = ftbl_eva_cc_mvs0_clk_src,
134*e291ec81STaniya Das 	.hw_clk_ctrl = true,
135*e291ec81STaniya Das 	.clkr = {
136*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
137*e291ec81STaniya Das 			.name = "eva_cc_mvs0_clk_src",
138*e291ec81STaniya Das 			.parent_data = eva_cc_parent_data_1,
139*e291ec81STaniya Das 			.num_parents = ARRAY_SIZE(eva_cc_parent_data_1),
140*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
141*e291ec81STaniya Das 			.ops = &clk_rcg2_shared_ops,
142*e291ec81STaniya Das 		},
143*e291ec81STaniya Das 	},
144*e291ec81STaniya Das };
145*e291ec81STaniya Das 
146*e291ec81STaniya Das static const struct freq_tbl ftbl_eva_cc_sleep_clk_src[] = {
147*e291ec81STaniya Das 	F(32000, P_SLEEP_CLK, 1, 0, 0),
148*e291ec81STaniya Das 	{ }
149*e291ec81STaniya Das };
150*e291ec81STaniya Das 
151*e291ec81STaniya Das static struct clk_rcg2 eva_cc_sleep_clk_src = {
152*e291ec81STaniya Das 	.cmd_rcgr = 0x80e0,
153*e291ec81STaniya Das 	.mnd_width = 0,
154*e291ec81STaniya Das 	.hid_width = 5,
155*e291ec81STaniya Das 	.parent_map = eva_cc_parent_map_2,
156*e291ec81STaniya Das 	.freq_tbl = ftbl_eva_cc_sleep_clk_src,
157*e291ec81STaniya Das 	.hw_clk_ctrl = true,
158*e291ec81STaniya Das 	.clkr = {
159*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
160*e291ec81STaniya Das 			.name = "eva_cc_sleep_clk_src",
161*e291ec81STaniya Das 			.parent_data = eva_cc_parent_data_2,
162*e291ec81STaniya Das 			.num_parents = ARRAY_SIZE(eva_cc_parent_data_2),
163*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
164*e291ec81STaniya Das 			.ops = &clk_rcg2_shared_ops,
165*e291ec81STaniya Das 		},
166*e291ec81STaniya Das 	},
167*e291ec81STaniya Das };
168*e291ec81STaniya Das 
169*e291ec81STaniya Das static struct clk_rcg2 eva_cc_xo_clk_src = {
170*e291ec81STaniya Das 	.cmd_rcgr = 0x80bc,
171*e291ec81STaniya Das 	.mnd_width = 0,
172*e291ec81STaniya Das 	.hid_width = 5,
173*e291ec81STaniya Das 	.parent_map = eva_cc_parent_map_0,
174*e291ec81STaniya Das 	.freq_tbl = ftbl_eva_cc_ahb_clk_src,
175*e291ec81STaniya Das 	.hw_clk_ctrl = true,
176*e291ec81STaniya Das 	.clkr = {
177*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
178*e291ec81STaniya Das 			.name = "eva_cc_xo_clk_src",
179*e291ec81STaniya Das 			.parent_data = eva_cc_parent_data_0,
180*e291ec81STaniya Das 			.num_parents = ARRAY_SIZE(eva_cc_parent_data_0),
181*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
182*e291ec81STaniya Das 			.ops = &clk_rcg2_shared_ops,
183*e291ec81STaniya Das 		},
184*e291ec81STaniya Das 	},
185*e291ec81STaniya Das };
186*e291ec81STaniya Das 
187*e291ec81STaniya Das static struct clk_regmap_div eva_cc_mvs0_div_clk_src = {
188*e291ec81STaniya Das 	.reg = 0x809c,
189*e291ec81STaniya Das 	.shift = 0,
190*e291ec81STaniya Das 	.width = 4,
191*e291ec81STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
192*e291ec81STaniya Das 		.name = "eva_cc_mvs0_div_clk_src",
193*e291ec81STaniya Das 		.parent_hws = (const struct clk_hw*[]) {
194*e291ec81STaniya Das 			&eva_cc_mvs0_clk_src.clkr.hw,
195*e291ec81STaniya Das 		},
196*e291ec81STaniya Das 		.num_parents = 1,
197*e291ec81STaniya Das 		.flags = CLK_SET_RATE_PARENT,
198*e291ec81STaniya Das 		.ops = &clk_regmap_div_ro_ops,
199*e291ec81STaniya Das 	},
200*e291ec81STaniya Das };
201*e291ec81STaniya Das 
202*e291ec81STaniya Das static struct clk_regmap_div eva_cc_mvs0c_div2_div_clk_src = {
203*e291ec81STaniya Das 	.reg = 0x8060,
204*e291ec81STaniya Das 	.shift = 0,
205*e291ec81STaniya Das 	.width = 4,
206*e291ec81STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
207*e291ec81STaniya Das 		.name = "eva_cc_mvs0c_div2_div_clk_src",
208*e291ec81STaniya Das 		.parent_hws = (const struct clk_hw*[]) {
209*e291ec81STaniya Das 			&eva_cc_mvs0_clk_src.clkr.hw,
210*e291ec81STaniya Das 		},
211*e291ec81STaniya Das 		.num_parents = 1,
212*e291ec81STaniya Das 		.flags = CLK_SET_RATE_PARENT,
213*e291ec81STaniya Das 		.ops = &clk_regmap_div_ro_ops,
214*e291ec81STaniya Das 	},
215*e291ec81STaniya Das };
216*e291ec81STaniya Das 
217*e291ec81STaniya Das static struct clk_branch eva_cc_mvs0_clk = {
218*e291ec81STaniya Das 	.halt_reg = 0x807c,
219*e291ec81STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
220*e291ec81STaniya Das 	.hwcg_reg = 0x807c,
221*e291ec81STaniya Das 	.hwcg_bit = 1,
222*e291ec81STaniya Das 	.clkr = {
223*e291ec81STaniya Das 		.enable_reg = 0x807c,
224*e291ec81STaniya Das 		.enable_mask = BIT(0),
225*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
226*e291ec81STaniya Das 			.name = "eva_cc_mvs0_clk",
227*e291ec81STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
228*e291ec81STaniya Das 				&eva_cc_mvs0_div_clk_src.clkr.hw,
229*e291ec81STaniya Das 			},
230*e291ec81STaniya Das 			.num_parents = 1,
231*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
232*e291ec81STaniya Das 			.ops = &clk_branch2_ops,
233*e291ec81STaniya Das 		},
234*e291ec81STaniya Das 	},
235*e291ec81STaniya Das };
236*e291ec81STaniya Das 
237*e291ec81STaniya Das static struct clk_branch eva_cc_mvs0_freerun_clk = {
238*e291ec81STaniya Das 	.halt_reg = 0x808c,
239*e291ec81STaniya Das 	.halt_check = BRANCH_HALT,
240*e291ec81STaniya Das 	.clkr = {
241*e291ec81STaniya Das 		.enable_reg = 0x808c,
242*e291ec81STaniya Das 		.enable_mask = BIT(0),
243*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
244*e291ec81STaniya Das 			.name = "eva_cc_mvs0_freerun_clk",
245*e291ec81STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
246*e291ec81STaniya Das 				&eva_cc_mvs0_div_clk_src.clkr.hw,
247*e291ec81STaniya Das 			},
248*e291ec81STaniya Das 			.num_parents = 1,
249*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
250*e291ec81STaniya Das 			.ops = &clk_branch2_ops,
251*e291ec81STaniya Das 		},
252*e291ec81STaniya Das 	},
253*e291ec81STaniya Das };
254*e291ec81STaniya Das 
255*e291ec81STaniya Das static struct clk_branch eva_cc_mvs0_shift_clk = {
256*e291ec81STaniya Das 	.halt_reg = 0x80d8,
257*e291ec81STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
258*e291ec81STaniya Das 	.hwcg_reg = 0x80d8,
259*e291ec81STaniya Das 	.hwcg_bit = 1,
260*e291ec81STaniya Das 	.clkr = {
261*e291ec81STaniya Das 		.enable_reg = 0x80d8,
262*e291ec81STaniya Das 		.enable_mask = BIT(0),
263*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
264*e291ec81STaniya Das 			.name = "eva_cc_mvs0_shift_clk",
265*e291ec81STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
266*e291ec81STaniya Das 				&eva_cc_xo_clk_src.clkr.hw,
267*e291ec81STaniya Das 			},
268*e291ec81STaniya Das 			.num_parents = 1,
269*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
270*e291ec81STaniya Das 			.ops = &clk_branch2_ops,
271*e291ec81STaniya Das 		},
272*e291ec81STaniya Das 	},
273*e291ec81STaniya Das };
274*e291ec81STaniya Das 
275*e291ec81STaniya Das static struct clk_branch eva_cc_mvs0c_clk = {
276*e291ec81STaniya Das 	.halt_reg = 0x804c,
277*e291ec81STaniya Das 	.halt_check = BRANCH_HALT,
278*e291ec81STaniya Das 	.clkr = {
279*e291ec81STaniya Das 		.enable_reg = 0x804c,
280*e291ec81STaniya Das 		.enable_mask = BIT(0),
281*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
282*e291ec81STaniya Das 			.name = "eva_cc_mvs0c_clk",
283*e291ec81STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
284*e291ec81STaniya Das 				&eva_cc_mvs0c_div2_div_clk_src.clkr.hw,
285*e291ec81STaniya Das 			},
286*e291ec81STaniya Das 			.num_parents = 1,
287*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
288*e291ec81STaniya Das 			.ops = &clk_branch2_ops,
289*e291ec81STaniya Das 		},
290*e291ec81STaniya Das 	},
291*e291ec81STaniya Das };
292*e291ec81STaniya Das 
293*e291ec81STaniya Das static struct clk_branch eva_cc_mvs0c_freerun_clk = {
294*e291ec81STaniya Das 	.halt_reg = 0x805c,
295*e291ec81STaniya Das 	.halt_check = BRANCH_HALT,
296*e291ec81STaniya Das 	.clkr = {
297*e291ec81STaniya Das 		.enable_reg = 0x805c,
298*e291ec81STaniya Das 		.enable_mask = BIT(0),
299*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
300*e291ec81STaniya Das 			.name = "eva_cc_mvs0c_freerun_clk",
301*e291ec81STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
302*e291ec81STaniya Das 				&eva_cc_mvs0c_div2_div_clk_src.clkr.hw,
303*e291ec81STaniya Das 			},
304*e291ec81STaniya Das 			.num_parents = 1,
305*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
306*e291ec81STaniya Das 			.ops = &clk_branch2_ops,
307*e291ec81STaniya Das 		},
308*e291ec81STaniya Das 	},
309*e291ec81STaniya Das };
310*e291ec81STaniya Das 
311*e291ec81STaniya Das static struct clk_branch eva_cc_mvs0c_shift_clk = {
312*e291ec81STaniya Das 	.halt_reg = 0x80dc,
313*e291ec81STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
314*e291ec81STaniya Das 	.hwcg_reg = 0x80dc,
315*e291ec81STaniya Das 	.hwcg_bit = 1,
316*e291ec81STaniya Das 	.clkr = {
317*e291ec81STaniya Das 		.enable_reg = 0x80dc,
318*e291ec81STaniya Das 		.enable_mask = BIT(0),
319*e291ec81STaniya Das 		.hw.init = &(const struct clk_init_data) {
320*e291ec81STaniya Das 			.name = "eva_cc_mvs0c_shift_clk",
321*e291ec81STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
322*e291ec81STaniya Das 				&eva_cc_xo_clk_src.clkr.hw,
323*e291ec81STaniya Das 			},
324*e291ec81STaniya Das 			.num_parents = 1,
325*e291ec81STaniya Das 			.flags = CLK_SET_RATE_PARENT,
326*e291ec81STaniya Das 			.ops = &clk_branch2_ops,
327*e291ec81STaniya Das 		},
328*e291ec81STaniya Das 	},
329*e291ec81STaniya Das };
330*e291ec81STaniya Das 
331*e291ec81STaniya Das static struct gdsc eva_cc_mvs0c_gdsc = {
332*e291ec81STaniya Das 	.gdscr = 0x8034,
333*e291ec81STaniya Das 	.en_rest_wait_val = 0x2,
334*e291ec81STaniya Das 	.en_few_wait_val = 0x2,
335*e291ec81STaniya Das 	.clk_dis_wait_val = 0x6,
336*e291ec81STaniya Das 	.pd = {
337*e291ec81STaniya Das 		.name = "eva_cc_mvs0c_gdsc",
338*e291ec81STaniya Das 	},
339*e291ec81STaniya Das 	.pwrsts = PWRSTS_OFF_ON,
340*e291ec81STaniya Das 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
341*e291ec81STaniya Das };
342*e291ec81STaniya Das 
343*e291ec81STaniya Das static struct gdsc eva_cc_mvs0_gdsc = {
344*e291ec81STaniya Das 	.gdscr = 0x8068,
345*e291ec81STaniya Das 	.en_rest_wait_val = 0x2,
346*e291ec81STaniya Das 	.en_few_wait_val = 0x2,
347*e291ec81STaniya Das 	.clk_dis_wait_val = 0x6,
348*e291ec81STaniya Das 	.pd = {
349*e291ec81STaniya Das 		.name = "eva_cc_mvs0_gdsc",
350*e291ec81STaniya Das 	},
351*e291ec81STaniya Das 	.pwrsts = PWRSTS_OFF_ON,
352*e291ec81STaniya Das 	.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
353*e291ec81STaniya Das 	.parent = &eva_cc_mvs0c_gdsc.pd,
354*e291ec81STaniya Das };
355*e291ec81STaniya Das 
356*e291ec81STaniya Das static struct clk_regmap *eva_cc_glymur_clocks[] = {
357*e291ec81STaniya Das 	[EVA_CC_AHB_CLK_SRC] = &eva_cc_ahb_clk_src.clkr,
358*e291ec81STaniya Das 	[EVA_CC_MVS0_CLK] = &eva_cc_mvs0_clk.clkr,
359*e291ec81STaniya Das 	[EVA_CC_MVS0_CLK_SRC] = &eva_cc_mvs0_clk_src.clkr,
360*e291ec81STaniya Das 	[EVA_CC_MVS0_DIV_CLK_SRC] = &eva_cc_mvs0_div_clk_src.clkr,
361*e291ec81STaniya Das 	[EVA_CC_MVS0_FREERUN_CLK] = &eva_cc_mvs0_freerun_clk.clkr,
362*e291ec81STaniya Das 	[EVA_CC_MVS0_SHIFT_CLK] = &eva_cc_mvs0_shift_clk.clkr,
363*e291ec81STaniya Das 	[EVA_CC_MVS0C_CLK] = &eva_cc_mvs0c_clk.clkr,
364*e291ec81STaniya Das 	[EVA_CC_MVS0C_DIV2_DIV_CLK_SRC] = &eva_cc_mvs0c_div2_div_clk_src.clkr,
365*e291ec81STaniya Das 	[EVA_CC_MVS0C_FREERUN_CLK] = &eva_cc_mvs0c_freerun_clk.clkr,
366*e291ec81STaniya Das 	[EVA_CC_MVS0C_SHIFT_CLK] = &eva_cc_mvs0c_shift_clk.clkr,
367*e291ec81STaniya Das 	[EVA_CC_PLL0] = &eva_cc_pll0.clkr,
368*e291ec81STaniya Das 	[EVA_CC_SLEEP_CLK_SRC] = &eva_cc_sleep_clk_src.clkr,
369*e291ec81STaniya Das 	[EVA_CC_XO_CLK_SRC] = &eva_cc_xo_clk_src.clkr,
370*e291ec81STaniya Das };
371*e291ec81STaniya Das 
372*e291ec81STaniya Das static struct gdsc *eva_cc_glymur_gdscs[] = {
373*e291ec81STaniya Das 	[EVA_CC_MVS0_GDSC] = &eva_cc_mvs0_gdsc,
374*e291ec81STaniya Das 	[EVA_CC_MVS0C_GDSC] = &eva_cc_mvs0c_gdsc,
375*e291ec81STaniya Das };
376*e291ec81STaniya Das 
377*e291ec81STaniya Das static const struct qcom_reset_map eva_cc_glymur_resets[] = {
378*e291ec81STaniya Das 	[EVA_CC_INTERFACE_BCR] = { 0x80a0 },
379*e291ec81STaniya Das 	[EVA_CC_MVS0_BCR] = { 0x8064 },
380*e291ec81STaniya Das 	[EVA_CC_MVS0C_CLK_ARES] = { 0x804c, 2 },
381*e291ec81STaniya Das 	[EVA_CC_MVS0C_BCR] = { 0x8030 },
382*e291ec81STaniya Das 	[EVA_CC_MVS0C_FREERUN_CLK_ARES] = { 0x805c, 2 },
383*e291ec81STaniya Das };
384*e291ec81STaniya Das 
385*e291ec81STaniya Das static struct clk_alpha_pll *eva_cc_glymur_plls[] = {
386*e291ec81STaniya Das 	&eva_cc_pll0,
387*e291ec81STaniya Das };
388*e291ec81STaniya Das 
389*e291ec81STaniya Das static const u32 eva_cc_glymur_critical_cbcrs[] = {
390*e291ec81STaniya Das 	0x80a4, /* EVA_CC_AHB_CLK */
391*e291ec81STaniya Das 	0x80f8, /* EVA_CC_SLEEP_CLK */
392*e291ec81STaniya Das 	0x80d4, /* EVA_CC_XO_CLK */
393*e291ec81STaniya Das };
394*e291ec81STaniya Das 
395*e291ec81STaniya Das static const struct regmap_config eva_cc_glymur_regmap_config = {
396*e291ec81STaniya Das 	.reg_bits = 32,
397*e291ec81STaniya Das 	.reg_stride = 4,
398*e291ec81STaniya Das 	.val_bits = 32,
399*e291ec81STaniya Das 	.max_register = 0x9f50,
400*e291ec81STaniya Das 	.fast_io = true,
401*e291ec81STaniya Das };
402*e291ec81STaniya Das 
clk_glymur_regs_configure(struct device * dev,struct regmap * regmap)403*e291ec81STaniya Das static void clk_glymur_regs_configure(struct device *dev, struct regmap *regmap)
404*e291ec81STaniya Das {
405*e291ec81STaniya Das 	/*
406*e291ec81STaniya Das 	 * Update CTRL_IN register as per HW recommendation to ensure clocks
407*e291ec81STaniya Das 	 * stay cycle‑aligned when the EVA core is ON.
408*e291ec81STaniya Das 	 */
409*e291ec81STaniya Das 	regmap_set_bits(regmap, 0x9f24, BIT(0));
410*e291ec81STaniya Das }
411*e291ec81STaniya Das 
412*e291ec81STaniya Das static const struct qcom_cc_driver_data eva_cc_glymur_driver_data = {
413*e291ec81STaniya Das 	.alpha_plls = eva_cc_glymur_plls,
414*e291ec81STaniya Das 	.num_alpha_plls = ARRAY_SIZE(eva_cc_glymur_plls),
415*e291ec81STaniya Das 	.clk_cbcrs = eva_cc_glymur_critical_cbcrs,
416*e291ec81STaniya Das 	.num_clk_cbcrs = ARRAY_SIZE(eva_cc_glymur_critical_cbcrs),
417*e291ec81STaniya Das 	.clk_regs_configure = clk_glymur_regs_configure,
418*e291ec81STaniya Das };
419*e291ec81STaniya Das 
420*e291ec81STaniya Das static const struct qcom_cc_desc eva_cc_glymur_desc = {
421*e291ec81STaniya Das 	.config = &eva_cc_glymur_regmap_config,
422*e291ec81STaniya Das 	.clks = eva_cc_glymur_clocks,
423*e291ec81STaniya Das 	.num_clks = ARRAY_SIZE(eva_cc_glymur_clocks),
424*e291ec81STaniya Das 	.resets = eva_cc_glymur_resets,
425*e291ec81STaniya Das 	.num_resets = ARRAY_SIZE(eva_cc_glymur_resets),
426*e291ec81STaniya Das 	.gdscs = eva_cc_glymur_gdscs,
427*e291ec81STaniya Das 	.num_gdscs = ARRAY_SIZE(eva_cc_glymur_gdscs),
428*e291ec81STaniya Das 	.use_rpm = true,
429*e291ec81STaniya Das 	.driver_data = &eva_cc_glymur_driver_data,
430*e291ec81STaniya Das };
431*e291ec81STaniya Das 
432*e291ec81STaniya Das static const struct of_device_id eva_cc_glymur_match_table[] = {
433*e291ec81STaniya Das 	{ .compatible = "qcom,glymur-evacc" },
434*e291ec81STaniya Das 	{ }
435*e291ec81STaniya Das };
436*e291ec81STaniya Das MODULE_DEVICE_TABLE(of, eva_cc_glymur_match_table);
437*e291ec81STaniya Das 
eva_cc_glymur_probe(struct platform_device * pdev)438*e291ec81STaniya Das static int eva_cc_glymur_probe(struct platform_device *pdev)
439*e291ec81STaniya Das {
440*e291ec81STaniya Das 	return qcom_cc_probe(pdev, &eva_cc_glymur_desc);
441*e291ec81STaniya Das }
442*e291ec81STaniya Das 
443*e291ec81STaniya Das static struct platform_driver eva_cc_glymur_driver = {
444*e291ec81STaniya Das 	.probe = eva_cc_glymur_probe,
445*e291ec81STaniya Das 	.driver = {
446*e291ec81STaniya Das 		.name = "evacc-glymur",
447*e291ec81STaniya Das 		.of_match_table = eva_cc_glymur_match_table,
448*e291ec81STaniya Das 	},
449*e291ec81STaniya Das };
450*e291ec81STaniya Das 
451*e291ec81STaniya Das module_platform_driver(eva_cc_glymur_driver);
452*e291ec81STaniya Das 
453*e291ec81STaniya Das MODULE_DESCRIPTION("QTI EVACC Glymur Driver");
454*e291ec81STaniya Das MODULE_LICENSE("GPL");
455