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