1*47f2e6e1STaniya Das // SPDX-License-Identifier: GPL-2.0-only
2*47f2e6e1STaniya Das /*
3*47f2e6e1STaniya Das * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4*47f2e6e1STaniya Das */
5*47f2e6e1STaniya Das
6*47f2e6e1STaniya Das #include <linux/clk-provider.h>
7*47f2e6e1STaniya Das #include <linux/module.h>
8*47f2e6e1STaniya Das #include <linux/platform_device.h>
9*47f2e6e1STaniya Das #include <linux/regmap.h>
10*47f2e6e1STaniya Das
11*47f2e6e1STaniya Das #include <dt-bindings/clock/qcom,nord-gpucc.h>
12*47f2e6e1STaniya Das
13*47f2e6e1STaniya Das #include "clk-alpha-pll.h"
14*47f2e6e1STaniya Das #include "clk-branch.h"
15*47f2e6e1STaniya Das #include "clk-pll.h"
16*47f2e6e1STaniya Das #include "clk-rcg.h"
17*47f2e6e1STaniya Das #include "clk-regmap.h"
18*47f2e6e1STaniya Das #include "clk-regmap-divider.h"
19*47f2e6e1STaniya Das #include "clk-regmap-mux.h"
20*47f2e6e1STaniya Das #include "common.h"
21*47f2e6e1STaniya Das #include "gdsc.h"
22*47f2e6e1STaniya Das #include "reset.h"
23*47f2e6e1STaniya Das
24*47f2e6e1STaniya Das enum {
25*47f2e6e1STaniya Das DT_BI_TCXO,
26*47f2e6e1STaniya Das DT_GPLL0_OUT_MAIN,
27*47f2e6e1STaniya Das DT_GPLL0_OUT_MAIN_DIV,
28*47f2e6e1STaniya Das };
29*47f2e6e1STaniya Das
30*47f2e6e1STaniya Das enum {
31*47f2e6e1STaniya Das P_BI_TCXO,
32*47f2e6e1STaniya Das P_GPLL0_OUT_MAIN,
33*47f2e6e1STaniya Das P_GPLL0_OUT_MAIN_DIV,
34*47f2e6e1STaniya Das P_GPU_CC_PLL0_OUT_MAIN,
35*47f2e6e1STaniya Das P_GPU_CC_PLL1_OUT_MAIN,
36*47f2e6e1STaniya Das };
37*47f2e6e1STaniya Das
38*47f2e6e1STaniya Das static const struct pll_vco lucid_ole_vco[] = {
39*47f2e6e1STaniya Das { 249600000, 2300000000, 0 },
40*47f2e6e1STaniya Das };
41*47f2e6e1STaniya Das
42*47f2e6e1STaniya Das /* 936.0 MHz Configuration */
43*47f2e6e1STaniya Das static const struct alpha_pll_config gpu_cc_pll0_config = {
44*47f2e6e1STaniya Das .l = 0x30,
45*47f2e6e1STaniya Das .alpha = 0xc000,
46*47f2e6e1STaniya Das .config_ctl_val = 0x20485699,
47*47f2e6e1STaniya Das .config_ctl_hi_val = 0x00182261,
48*47f2e6e1STaniya Das .config_ctl_hi1_val = 0x82aa299c,
49*47f2e6e1STaniya Das .test_ctl_val = 0x00000000,
50*47f2e6e1STaniya Das .test_ctl_hi_val = 0x00000003,
51*47f2e6e1STaniya Das .test_ctl_hi1_val = 0x00009000,
52*47f2e6e1STaniya Das .test_ctl_hi2_val = 0x00000034,
53*47f2e6e1STaniya Das .user_ctl_val = 0x00000000,
54*47f2e6e1STaniya Das .user_ctl_hi_val = 0x00400005,
55*47f2e6e1STaniya Das };
56*47f2e6e1STaniya Das
57*47f2e6e1STaniya Das static struct clk_alpha_pll gpu_cc_pll0 = {
58*47f2e6e1STaniya Das .offset = 0x0,
59*47f2e6e1STaniya Das .config = &gpu_cc_pll0_config,
60*47f2e6e1STaniya Das .vco_table = lucid_ole_vco,
61*47f2e6e1STaniya Das .num_vco = ARRAY_SIZE(lucid_ole_vco),
62*47f2e6e1STaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
63*47f2e6e1STaniya Das .clkr = {
64*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
65*47f2e6e1STaniya Das .name = "gpu_cc_pll0",
66*47f2e6e1STaniya Das .parent_data = &(const struct clk_parent_data) {
67*47f2e6e1STaniya Das .index = DT_BI_TCXO,
68*47f2e6e1STaniya Das },
69*47f2e6e1STaniya Das .num_parents = 1,
70*47f2e6e1STaniya Das .ops = &clk_alpha_pll_lucid_evo_ops,
71*47f2e6e1STaniya Das },
72*47f2e6e1STaniya Das },
73*47f2e6e1STaniya Das };
74*47f2e6e1STaniya Das
75*47f2e6e1STaniya Das /* 1250.0 MHz Configuration */
76*47f2e6e1STaniya Das static const struct alpha_pll_config gpu_cc_pll1_config = {
77*47f2e6e1STaniya Das .l = 0x41,
78*47f2e6e1STaniya Das .alpha = 0x1aaa,
79*47f2e6e1STaniya Das .config_ctl_val = 0x20485699,
80*47f2e6e1STaniya Das .config_ctl_hi_val = 0x00182261,
81*47f2e6e1STaniya Das .config_ctl_hi1_val = 0x82aa299c,
82*47f2e6e1STaniya Das .test_ctl_val = 0x00000000,
83*47f2e6e1STaniya Das .test_ctl_hi_val = 0x00000003,
84*47f2e6e1STaniya Das .test_ctl_hi1_val = 0x00009000,
85*47f2e6e1STaniya Das .test_ctl_hi2_val = 0x00000034,
86*47f2e6e1STaniya Das .user_ctl_val = 0x00000000,
87*47f2e6e1STaniya Das .user_ctl_hi_val = 0x00400005,
88*47f2e6e1STaniya Das };
89*47f2e6e1STaniya Das
90*47f2e6e1STaniya Das static struct clk_alpha_pll gpu_cc_pll1 = {
91*47f2e6e1STaniya Das .offset = 0x1000,
92*47f2e6e1STaniya Das .config = &gpu_cc_pll1_config,
93*47f2e6e1STaniya Das .vco_table = lucid_ole_vco,
94*47f2e6e1STaniya Das .num_vco = ARRAY_SIZE(lucid_ole_vco),
95*47f2e6e1STaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
96*47f2e6e1STaniya Das .clkr = {
97*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
98*47f2e6e1STaniya Das .name = "gpu_cc_pll1",
99*47f2e6e1STaniya Das .parent_data = &(const struct clk_parent_data) {
100*47f2e6e1STaniya Das .index = DT_BI_TCXO,
101*47f2e6e1STaniya Das },
102*47f2e6e1STaniya Das .num_parents = 1,
103*47f2e6e1STaniya Das .ops = &clk_alpha_pll_lucid_evo_ops,
104*47f2e6e1STaniya Das },
105*47f2e6e1STaniya Das },
106*47f2e6e1STaniya Das };
107*47f2e6e1STaniya Das
108*47f2e6e1STaniya Das static const struct parent_map gpu_cc_parent_map_0[] = {
109*47f2e6e1STaniya Das { P_BI_TCXO, 0 },
110*47f2e6e1STaniya Das { P_GPLL0_OUT_MAIN, 5 },
111*47f2e6e1STaniya Das { P_GPLL0_OUT_MAIN_DIV, 6 },
112*47f2e6e1STaniya Das };
113*47f2e6e1STaniya Das
114*47f2e6e1STaniya Das static const struct clk_parent_data gpu_cc_parent_data_0[] = {
115*47f2e6e1STaniya Das { .index = DT_BI_TCXO },
116*47f2e6e1STaniya Das { .index = DT_GPLL0_OUT_MAIN },
117*47f2e6e1STaniya Das { .index = DT_GPLL0_OUT_MAIN_DIV },
118*47f2e6e1STaniya Das };
119*47f2e6e1STaniya Das
120*47f2e6e1STaniya Das static const struct parent_map gpu_cc_parent_map_1[] = {
121*47f2e6e1STaniya Das { P_BI_TCXO, 0 },
122*47f2e6e1STaniya Das { P_GPU_CC_PLL0_OUT_MAIN, 1 },
123*47f2e6e1STaniya Das { P_GPU_CC_PLL1_OUT_MAIN, 3 },
124*47f2e6e1STaniya Das { P_GPLL0_OUT_MAIN, 5 },
125*47f2e6e1STaniya Das { P_GPLL0_OUT_MAIN_DIV, 6 },
126*47f2e6e1STaniya Das };
127*47f2e6e1STaniya Das
128*47f2e6e1STaniya Das static const struct clk_parent_data gpu_cc_parent_data_1[] = {
129*47f2e6e1STaniya Das { .index = DT_BI_TCXO },
130*47f2e6e1STaniya Das { .hw = &gpu_cc_pll0.clkr.hw },
131*47f2e6e1STaniya Das { .hw = &gpu_cc_pll1.clkr.hw },
132*47f2e6e1STaniya Das { .index = DT_GPLL0_OUT_MAIN },
133*47f2e6e1STaniya Das { .index = DT_GPLL0_OUT_MAIN_DIV },
134*47f2e6e1STaniya Das };
135*47f2e6e1STaniya Das
136*47f2e6e1STaniya Das static const struct parent_map gpu_cc_parent_map_2[] = {
137*47f2e6e1STaniya Das { P_BI_TCXO, 0 },
138*47f2e6e1STaniya Das { P_GPU_CC_PLL1_OUT_MAIN, 3 },
139*47f2e6e1STaniya Das { P_GPLL0_OUT_MAIN, 5 },
140*47f2e6e1STaniya Das { P_GPLL0_OUT_MAIN_DIV, 6 },
141*47f2e6e1STaniya Das };
142*47f2e6e1STaniya Das
143*47f2e6e1STaniya Das static const struct clk_parent_data gpu_cc_parent_data_2[] = {
144*47f2e6e1STaniya Das { .index = DT_BI_TCXO },
145*47f2e6e1STaniya Das { .hw = &gpu_cc_pll1.clkr.hw },
146*47f2e6e1STaniya Das { .index = DT_GPLL0_OUT_MAIN },
147*47f2e6e1STaniya Das { .index = DT_GPLL0_OUT_MAIN_DIV },
148*47f2e6e1STaniya Das };
149*47f2e6e1STaniya Das
150*47f2e6e1STaniya Das static const struct freq_tbl ftbl_gpu_cc_ff_clk_src[] = {
151*47f2e6e1STaniya Das F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
152*47f2e6e1STaniya Das { }
153*47f2e6e1STaniya Das };
154*47f2e6e1STaniya Das
155*47f2e6e1STaniya Das static struct clk_rcg2 gpu_cc_ff_clk_src = {
156*47f2e6e1STaniya Das .cmd_rcgr = 0x93d4,
157*47f2e6e1STaniya Das .mnd_width = 0,
158*47f2e6e1STaniya Das .hid_width = 5,
159*47f2e6e1STaniya Das .parent_map = gpu_cc_parent_map_0,
160*47f2e6e1STaniya Das .freq_tbl = ftbl_gpu_cc_ff_clk_src,
161*47f2e6e1STaniya Das .hw_clk_ctrl = true,
162*47f2e6e1STaniya Das .clkr.hw.init = &(const struct clk_init_data) {
163*47f2e6e1STaniya Das .name = "gpu_cc_ff_clk_src",
164*47f2e6e1STaniya Das .parent_data = gpu_cc_parent_data_0,
165*47f2e6e1STaniya Das .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
166*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
167*47f2e6e1STaniya Das .ops = &clk_rcg2_shared_ops,
168*47f2e6e1STaniya Das },
169*47f2e6e1STaniya Das };
170*47f2e6e1STaniya Das
171*47f2e6e1STaniya Das static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
172*47f2e6e1STaniya Das F(416666667, P_GPU_CC_PLL1_OUT_MAIN, 3, 0, 0),
173*47f2e6e1STaniya Das F(625000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
174*47f2e6e1STaniya Das { }
175*47f2e6e1STaniya Das };
176*47f2e6e1STaniya Das
177*47f2e6e1STaniya Das static struct clk_rcg2 gpu_cc_gmu_clk_src = {
178*47f2e6e1STaniya Das .cmd_rcgr = 0x92b8,
179*47f2e6e1STaniya Das .mnd_width = 0,
180*47f2e6e1STaniya Das .hid_width = 5,
181*47f2e6e1STaniya Das .parent_map = gpu_cc_parent_map_1,
182*47f2e6e1STaniya Das .freq_tbl = ftbl_gpu_cc_gmu_clk_src,
183*47f2e6e1STaniya Das .hw_clk_ctrl = true,
184*47f2e6e1STaniya Das .clkr.hw.init = &(const struct clk_init_data) {
185*47f2e6e1STaniya Das .name = "gpu_cc_gmu_clk_src",
186*47f2e6e1STaniya Das .parent_data = gpu_cc_parent_data_1,
187*47f2e6e1STaniya Das .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
188*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
189*47f2e6e1STaniya Das .ops = &clk_rcg2_shared_ops,
190*47f2e6e1STaniya Das },
191*47f2e6e1STaniya Das };
192*47f2e6e1STaniya Das
193*47f2e6e1STaniya Das static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
194*47f2e6e1STaniya Das F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
195*47f2e6e1STaniya Das { }
196*47f2e6e1STaniya Das };
197*47f2e6e1STaniya Das
198*47f2e6e1STaniya Das static struct clk_rcg2 gpu_cc_hub_clk_src = {
199*47f2e6e1STaniya Das .cmd_rcgr = 0x938c,
200*47f2e6e1STaniya Das .mnd_width = 0,
201*47f2e6e1STaniya Das .hid_width = 5,
202*47f2e6e1STaniya Das .parent_map = gpu_cc_parent_map_2,
203*47f2e6e1STaniya Das .freq_tbl = ftbl_gpu_cc_hub_clk_src,
204*47f2e6e1STaniya Das .hw_clk_ctrl = true,
205*47f2e6e1STaniya Das .clkr.hw.init = &(const struct clk_init_data) {
206*47f2e6e1STaniya Das .name = "gpu_cc_hub_clk_src",
207*47f2e6e1STaniya Das .parent_data = gpu_cc_parent_data_2,
208*47f2e6e1STaniya Das .num_parents = ARRAY_SIZE(gpu_cc_parent_data_2),
209*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
210*47f2e6e1STaniya Das .ops = &clk_rcg2_shared_ops,
211*47f2e6e1STaniya Das },
212*47f2e6e1STaniya Das };
213*47f2e6e1STaniya Das
214*47f2e6e1STaniya Das static struct clk_regmap_div gpu_cc_hub_div_clk_src = {
215*47f2e6e1STaniya Das .reg = 0x93cc,
216*47f2e6e1STaniya Das .shift = 0,
217*47f2e6e1STaniya Das .width = 4,
218*47f2e6e1STaniya Das .clkr.hw.init = &(const struct clk_init_data) {
219*47f2e6e1STaniya Das .name = "gpu_cc_hub_div_clk_src",
220*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
221*47f2e6e1STaniya Das &gpu_cc_hub_clk_src.clkr.hw,
222*47f2e6e1STaniya Das },
223*47f2e6e1STaniya Das .num_parents = 1,
224*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
225*47f2e6e1STaniya Das .ops = &clk_regmap_div_ro_ops,
226*47f2e6e1STaniya Das },
227*47f2e6e1STaniya Das };
228*47f2e6e1STaniya Das
229*47f2e6e1STaniya Das static struct clk_branch gpu_cc_acd_gfx3d_clk = {
230*47f2e6e1STaniya Das .halt_reg = 0x92a8,
231*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
232*47f2e6e1STaniya Das .clkr = {
233*47f2e6e1STaniya Das .enable_reg = 0x92a8,
234*47f2e6e1STaniya Das .enable_mask = BIT(0),
235*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
236*47f2e6e1STaniya Das .name = "gpu_cc_acd_gfx3d_clk",
237*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
238*47f2e6e1STaniya Das },
239*47f2e6e1STaniya Das },
240*47f2e6e1STaniya Das };
241*47f2e6e1STaniya Das
242*47f2e6e1STaniya Das static struct clk_branch gpu_cc_acmu_clk = {
243*47f2e6e1STaniya Das .halt_reg = 0x9294,
244*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
245*47f2e6e1STaniya Das .clkr = {
246*47f2e6e1STaniya Das .enable_reg = 0x9294,
247*47f2e6e1STaniya Das .enable_mask = BIT(0),
248*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
249*47f2e6e1STaniya Das .name = "gpu_cc_acmu_clk",
250*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
251*47f2e6e1STaniya Das },
252*47f2e6e1STaniya Das },
253*47f2e6e1STaniya Das };
254*47f2e6e1STaniya Das
255*47f2e6e1STaniya Das static struct clk_branch gpu_cc_ahb_clk = {
256*47f2e6e1STaniya Das .halt_reg = 0x9150,
257*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_DELAY,
258*47f2e6e1STaniya Das .clkr = {
259*47f2e6e1STaniya Das .enable_reg = 0x9150,
260*47f2e6e1STaniya Das .enable_mask = BIT(0),
261*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
262*47f2e6e1STaniya Das .name = "gpu_cc_ahb_clk",
263*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
264*47f2e6e1STaniya Das &gpu_cc_hub_div_clk_src.clkr.hw,
265*47f2e6e1STaniya Das },
266*47f2e6e1STaniya Das .num_parents = 1,
267*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
268*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
269*47f2e6e1STaniya Das },
270*47f2e6e1STaniya Das },
271*47f2e6e1STaniya Das };
272*47f2e6e1STaniya Das
273*47f2e6e1STaniya Das static struct clk_branch gpu_cc_crc_ahb_clk = {
274*47f2e6e1STaniya Das .halt_reg = 0x9154,
275*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
276*47f2e6e1STaniya Das .clkr = {
277*47f2e6e1STaniya Das .enable_reg = 0x9154,
278*47f2e6e1STaniya Das .enable_mask = BIT(0),
279*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
280*47f2e6e1STaniya Das .name = "gpu_cc_crc_ahb_clk",
281*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
282*47f2e6e1STaniya Das &gpu_cc_hub_div_clk_src.clkr.hw,
283*47f2e6e1STaniya Das },
284*47f2e6e1STaniya Das .num_parents = 1,
285*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
286*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
287*47f2e6e1STaniya Das },
288*47f2e6e1STaniya Das },
289*47f2e6e1STaniya Das };
290*47f2e6e1STaniya Das
291*47f2e6e1STaniya Das static struct clk_branch gpu_cc_cx_accu_shift_clk = {
292*47f2e6e1STaniya Das .halt_reg = 0x91a4,
293*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
294*47f2e6e1STaniya Das .clkr = {
295*47f2e6e1STaniya Das .enable_reg = 0x91a4,
296*47f2e6e1STaniya Das .enable_mask = BIT(0),
297*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
298*47f2e6e1STaniya Das .name = "gpu_cc_cx_accu_shift_clk",
299*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
300*47f2e6e1STaniya Das },
301*47f2e6e1STaniya Das },
302*47f2e6e1STaniya Das };
303*47f2e6e1STaniya Das
304*47f2e6e1STaniya Das static struct clk_branch gpu_cc_cx_ff_clk = {
305*47f2e6e1STaniya Das .halt_reg = 0x9184,
306*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
307*47f2e6e1STaniya Das .clkr = {
308*47f2e6e1STaniya Das .enable_reg = 0x9184,
309*47f2e6e1STaniya Das .enable_mask = BIT(0),
310*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
311*47f2e6e1STaniya Das .name = "gpu_cc_cx_ff_clk",
312*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
313*47f2e6e1STaniya Das &gpu_cc_ff_clk_src.clkr.hw,
314*47f2e6e1STaniya Das },
315*47f2e6e1STaniya Das .num_parents = 1,
316*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
317*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
318*47f2e6e1STaniya Das },
319*47f2e6e1STaniya Das },
320*47f2e6e1STaniya Das };
321*47f2e6e1STaniya Das
322*47f2e6e1STaniya Das static struct clk_branch gpu_cc_cx_gmu_clk = {
323*47f2e6e1STaniya Das .halt_reg = 0x916c,
324*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
325*47f2e6e1STaniya Das .clkr = {
326*47f2e6e1STaniya Das .enable_reg = 0x916c,
327*47f2e6e1STaniya Das .enable_mask = BIT(0),
328*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
329*47f2e6e1STaniya Das .name = "gpu_cc_cx_gmu_clk",
330*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
331*47f2e6e1STaniya Das &gpu_cc_gmu_clk_src.clkr.hw,
332*47f2e6e1STaniya Das },
333*47f2e6e1STaniya Das .num_parents = 1,
334*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
335*47f2e6e1STaniya Das .ops = &clk_branch2_aon_ops,
336*47f2e6e1STaniya Das },
337*47f2e6e1STaniya Das },
338*47f2e6e1STaniya Das };
339*47f2e6e1STaniya Das
340*47f2e6e1STaniya Das static struct clk_branch gpu_cc_cxo_clk = {
341*47f2e6e1STaniya Das .halt_reg = 0x917c,
342*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
343*47f2e6e1STaniya Das .clkr = {
344*47f2e6e1STaniya Das .enable_reg = 0x917c,
345*47f2e6e1STaniya Das .enable_mask = BIT(0),
346*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
347*47f2e6e1STaniya Das .name = "gpu_cc_cxo_clk",
348*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
349*47f2e6e1STaniya Das },
350*47f2e6e1STaniya Das },
351*47f2e6e1STaniya Das };
352*47f2e6e1STaniya Das
353*47f2e6e1STaniya Das static struct clk_branch gpu_cc_dpm_clk = {
354*47f2e6e1STaniya Das .halt_reg = 0x91a8,
355*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
356*47f2e6e1STaniya Das .clkr = {
357*47f2e6e1STaniya Das .enable_reg = 0x91a8,
358*47f2e6e1STaniya Das .enable_mask = BIT(0),
359*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
360*47f2e6e1STaniya Das .name = "gpu_cc_dpm_clk",
361*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
362*47f2e6e1STaniya Das },
363*47f2e6e1STaniya Das },
364*47f2e6e1STaniya Das };
365*47f2e6e1STaniya Das
366*47f2e6e1STaniya Das static struct clk_branch gpu_cc_freq_measure_clk = {
367*47f2e6e1STaniya Das .halt_reg = 0x9008,
368*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
369*47f2e6e1STaniya Das .clkr = {
370*47f2e6e1STaniya Das .enable_reg = 0x9008,
371*47f2e6e1STaniya Das .enable_mask = BIT(0),
372*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
373*47f2e6e1STaniya Das .name = "gpu_cc_freq_measure_clk",
374*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
375*47f2e6e1STaniya Das },
376*47f2e6e1STaniya Das },
377*47f2e6e1STaniya Das };
378*47f2e6e1STaniya Das
379*47f2e6e1STaniya Das static struct clk_branch gpu_cc_gpu_smmu_vote_clk = {
380*47f2e6e1STaniya Das .halt_reg = 0x7000,
381*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
382*47f2e6e1STaniya Das .clkr = {
383*47f2e6e1STaniya Das .enable_reg = 0x7000,
384*47f2e6e1STaniya Das .enable_mask = BIT(0),
385*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
386*47f2e6e1STaniya Das .name = "gpu_cc_gpu_smmu_vote_clk",
387*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
388*47f2e6e1STaniya Das },
389*47f2e6e1STaniya Das },
390*47f2e6e1STaniya Das };
391*47f2e6e1STaniya Das
392*47f2e6e1STaniya Das static struct clk_branch gpu_cc_hub_aon_clk = {
393*47f2e6e1STaniya Das .halt_reg = 0x9388,
394*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
395*47f2e6e1STaniya Das .clkr = {
396*47f2e6e1STaniya Das .enable_reg = 0x9388,
397*47f2e6e1STaniya Das .enable_mask = BIT(0),
398*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
399*47f2e6e1STaniya Das .name = "gpu_cc_hub_aon_clk",
400*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
401*47f2e6e1STaniya Das &gpu_cc_hub_clk_src.clkr.hw,
402*47f2e6e1STaniya Das },
403*47f2e6e1STaniya Das .num_parents = 1,
404*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
405*47f2e6e1STaniya Das .ops = &clk_branch2_aon_ops,
406*47f2e6e1STaniya Das },
407*47f2e6e1STaniya Das },
408*47f2e6e1STaniya Das };
409*47f2e6e1STaniya Das
410*47f2e6e1STaniya Das static struct clk_branch gpu_cc_hub_cx_int_clk = {
411*47f2e6e1STaniya Das .halt_reg = 0x9180,
412*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
413*47f2e6e1STaniya Das .clkr = {
414*47f2e6e1STaniya Das .enable_reg = 0x9180,
415*47f2e6e1STaniya Das .enable_mask = BIT(0),
416*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
417*47f2e6e1STaniya Das .name = "gpu_cc_hub_cx_int_clk",
418*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
419*47f2e6e1STaniya Das &gpu_cc_hub_clk_src.clkr.hw,
420*47f2e6e1STaniya Das },
421*47f2e6e1STaniya Das .num_parents = 1,
422*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
423*47f2e6e1STaniya Das .ops = &clk_branch2_aon_ops,
424*47f2e6e1STaniya Das },
425*47f2e6e1STaniya Das },
426*47f2e6e1STaniya Das };
427*47f2e6e1STaniya Das
428*47f2e6e1STaniya Das static struct clk_branch gpu_cc_memnoc_gfx_clk = {
429*47f2e6e1STaniya Das .halt_reg = 0x9188,
430*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
431*47f2e6e1STaniya Das .clkr = {
432*47f2e6e1STaniya Das .enable_reg = 0x9188,
433*47f2e6e1STaniya Das .enable_mask = BIT(0),
434*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
435*47f2e6e1STaniya Das .name = "gpu_cc_memnoc_gfx_clk",
436*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
437*47f2e6e1STaniya Das },
438*47f2e6e1STaniya Das },
439*47f2e6e1STaniya Das };
440*47f2e6e1STaniya Das
441*47f2e6e1STaniya Das static struct clk_branch gpu_cc_mnd1x_gfx3d_clk = {
442*47f2e6e1STaniya Das .halt_reg = 0x92ac,
443*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
444*47f2e6e1STaniya Das .clkr = {
445*47f2e6e1STaniya Das .enable_reg = 0x92ac,
446*47f2e6e1STaniya Das .enable_mask = BIT(0),
447*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
448*47f2e6e1STaniya Das .name = "gpu_cc_mnd1x_gfx3d_clk",
449*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
450*47f2e6e1STaniya Das },
451*47f2e6e1STaniya Das },
452*47f2e6e1STaniya Das };
453*47f2e6e1STaniya Das
454*47f2e6e1STaniya Das static struct clk_branch gpu_cc_sleep_clk = {
455*47f2e6e1STaniya Das .halt_reg = 0x9164,
456*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
457*47f2e6e1STaniya Das .clkr = {
458*47f2e6e1STaniya Das .enable_reg = 0x9164,
459*47f2e6e1STaniya Das .enable_mask = BIT(0),
460*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
461*47f2e6e1STaniya Das .name = "gpu_cc_sleep_clk",
462*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
463*47f2e6e1STaniya Das },
464*47f2e6e1STaniya Das },
465*47f2e6e1STaniya Das };
466*47f2e6e1STaniya Das
467*47f2e6e1STaniya Das static struct gdsc gpu_cc_cx_gdsc = {
468*47f2e6e1STaniya Das .gdscr = 0x90e8,
469*47f2e6e1STaniya Das .gds_hw_ctrl = 0x9128,
470*47f2e6e1STaniya Das .en_rest_wait_val = 0x2,
471*47f2e6e1STaniya Das .en_few_wait_val = 0x2,
472*47f2e6e1STaniya Das .clk_dis_wait_val = 0xf,
473*47f2e6e1STaniya Das .pd = {
474*47f2e6e1STaniya Das .name = "gpu_cc_cx_gdsc",
475*47f2e6e1STaniya Das },
476*47f2e6e1STaniya Das .pwrsts = PWRSTS_OFF_ON,
477*47f2e6e1STaniya Das .flags = VOTABLE | RETAIN_FF_ENABLE,
478*47f2e6e1STaniya Das };
479*47f2e6e1STaniya Das
480*47f2e6e1STaniya Das static struct gdsc gpu_cc_gx_gdsc = {
481*47f2e6e1STaniya Das .gdscr = 0x905c,
482*47f2e6e1STaniya Das .clamp_io_ctrl = 0x9504,
483*47f2e6e1STaniya Das .en_rest_wait_val = 0x2,
484*47f2e6e1STaniya Das .en_few_wait_val = 0x2,
485*47f2e6e1STaniya Das .clk_dis_wait_val = 0xf,
486*47f2e6e1STaniya Das .pd = {
487*47f2e6e1STaniya Das .name = "gpu_cc_gx_gdsc",
488*47f2e6e1STaniya Das .power_on = gdsc_gx_do_nothing_enable,
489*47f2e6e1STaniya Das },
490*47f2e6e1STaniya Das .pwrsts = PWRSTS_OFF_ON,
491*47f2e6e1STaniya Das .flags = CLAMP_IO | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
492*47f2e6e1STaniya Das };
493*47f2e6e1STaniya Das
494*47f2e6e1STaniya Das static struct clk_regmap *gpu_cc_nord_clocks[] = {
495*47f2e6e1STaniya Das [GPU_CC_ACD_GFX3D_CLK] = &gpu_cc_acd_gfx3d_clk.clkr,
496*47f2e6e1STaniya Das [GPU_CC_ACMU_CLK] = &gpu_cc_acmu_clk.clkr,
497*47f2e6e1STaniya Das [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
498*47f2e6e1STaniya Das [GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
499*47f2e6e1STaniya Das [GPU_CC_CX_ACCU_SHIFT_CLK] = &gpu_cc_cx_accu_shift_clk.clkr,
500*47f2e6e1STaniya Das [GPU_CC_CX_FF_CLK] = &gpu_cc_cx_ff_clk.clkr,
501*47f2e6e1STaniya Das [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
502*47f2e6e1STaniya Das [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
503*47f2e6e1STaniya Das [GPU_CC_DPM_CLK] = &gpu_cc_dpm_clk.clkr,
504*47f2e6e1STaniya Das [GPU_CC_FF_CLK_SRC] = &gpu_cc_ff_clk_src.clkr,
505*47f2e6e1STaniya Das [GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_clk.clkr,
506*47f2e6e1STaniya Das [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
507*47f2e6e1STaniya Das [GPU_CC_GPU_SMMU_VOTE_CLK] = &gpu_cc_gpu_smmu_vote_clk.clkr,
508*47f2e6e1STaniya Das [GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
509*47f2e6e1STaniya Das [GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
510*47f2e6e1STaniya Das [GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
511*47f2e6e1STaniya Das [GPU_CC_HUB_DIV_CLK_SRC] = &gpu_cc_hub_div_clk_src.clkr,
512*47f2e6e1STaniya Das [GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr,
513*47f2e6e1STaniya Das [GPU_CC_MND1X_GFX3D_CLK] = &gpu_cc_mnd1x_gfx3d_clk.clkr,
514*47f2e6e1STaniya Das [GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
515*47f2e6e1STaniya Das [GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
516*47f2e6e1STaniya Das [GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
517*47f2e6e1STaniya Das };
518*47f2e6e1STaniya Das
519*47f2e6e1STaniya Das static struct gdsc *gpu_cc_nord_gdscs[] = {
520*47f2e6e1STaniya Das [GPU_CC_CX_GDSC] = &gpu_cc_cx_gdsc,
521*47f2e6e1STaniya Das [GPU_CC_GX_GDSC] = &gpu_cc_gx_gdsc,
522*47f2e6e1STaniya Das };
523*47f2e6e1STaniya Das
524*47f2e6e1STaniya Das static const struct qcom_reset_map gpu_cc_nord_resets[] = {
525*47f2e6e1STaniya Das [GPU_CC_ACD_BCR] = { 0x92f8 },
526*47f2e6e1STaniya Das [GPU_CC_CB_BCR] = { 0x9340 },
527*47f2e6e1STaniya Das [GPU_CC_CX_BCR] = { 0x90e4 },
528*47f2e6e1STaniya Das [GPU_CC_FAST_HUB_BCR] = { 0x9384 },
529*47f2e6e1STaniya Das [GPU_CC_GFX3D_AON_BCR] = { 0x91ac },
530*47f2e6e1STaniya Das [GPU_CC_GX_BCR] = { 0x9058 },
531*47f2e6e1STaniya Das [GPU_CC_XO_BCR] = { 0x9000 },
532*47f2e6e1STaniya Das };
533*47f2e6e1STaniya Das
534*47f2e6e1STaniya Das static struct clk_alpha_pll *gpu_cc_nord_plls[] = {
535*47f2e6e1STaniya Das &gpu_cc_pll0,
536*47f2e6e1STaniya Das &gpu_cc_pll1,
537*47f2e6e1STaniya Das };
538*47f2e6e1STaniya Das
539*47f2e6e1STaniya Das static const u32 gpu_cc_nord_critical_cbcrs[] = {
540*47f2e6e1STaniya Das 0x9004, /* GPU_CC_CXO_AON_CLK */
541*47f2e6e1STaniya Das 0x900c, /* GPU_CC_DEMET_CLK */
542*47f2e6e1STaniya Das };
543*47f2e6e1STaniya Das
544*47f2e6e1STaniya Das static const struct regmap_config gpu_cc_nord_regmap_config = {
545*47f2e6e1STaniya Das .reg_bits = 32,
546*47f2e6e1STaniya Das .reg_stride = 4,
547*47f2e6e1STaniya Das .val_bits = 32,
548*47f2e6e1STaniya Das .max_register = 0x9660,
549*47f2e6e1STaniya Das .fast_io = true,
550*47f2e6e1STaniya Das };
551*47f2e6e1STaniya Das
552*47f2e6e1STaniya Das static const struct qcom_cc_driver_data gpu_cc_nord_driver_data = {
553*47f2e6e1STaniya Das .alpha_plls = gpu_cc_nord_plls,
554*47f2e6e1STaniya Das .num_alpha_plls = ARRAY_SIZE(gpu_cc_nord_plls),
555*47f2e6e1STaniya Das .clk_cbcrs = gpu_cc_nord_critical_cbcrs,
556*47f2e6e1STaniya Das .num_clk_cbcrs = ARRAY_SIZE(gpu_cc_nord_critical_cbcrs),
557*47f2e6e1STaniya Das };
558*47f2e6e1STaniya Das
559*47f2e6e1STaniya Das static const struct qcom_cc_desc gpu_cc_nord_desc = {
560*47f2e6e1STaniya Das .config = &gpu_cc_nord_regmap_config,
561*47f2e6e1STaniya Das .clks = gpu_cc_nord_clocks,
562*47f2e6e1STaniya Das .num_clks = ARRAY_SIZE(gpu_cc_nord_clocks),
563*47f2e6e1STaniya Das .resets = gpu_cc_nord_resets,
564*47f2e6e1STaniya Das .num_resets = ARRAY_SIZE(gpu_cc_nord_resets),
565*47f2e6e1STaniya Das .gdscs = gpu_cc_nord_gdscs,
566*47f2e6e1STaniya Das .num_gdscs = ARRAY_SIZE(gpu_cc_nord_gdscs),
567*47f2e6e1STaniya Das .use_rpm = true,
568*47f2e6e1STaniya Das .driver_data = &gpu_cc_nord_driver_data,
569*47f2e6e1STaniya Das };
570*47f2e6e1STaniya Das
571*47f2e6e1STaniya Das static const struct of_device_id gpu_cc_nord_match_table[] = {
572*47f2e6e1STaniya Das { .compatible = "qcom,nord-gpucc" },
573*47f2e6e1STaniya Das { }
574*47f2e6e1STaniya Das };
575*47f2e6e1STaniya Das MODULE_DEVICE_TABLE(of, gpu_cc_nord_match_table);
576*47f2e6e1STaniya Das
gpu_cc_nord_probe(struct platform_device * pdev)577*47f2e6e1STaniya Das static int gpu_cc_nord_probe(struct platform_device *pdev)
578*47f2e6e1STaniya Das {
579*47f2e6e1STaniya Das return qcom_cc_probe(pdev, &gpu_cc_nord_desc);
580*47f2e6e1STaniya Das }
581*47f2e6e1STaniya Das
582*47f2e6e1STaniya Das static struct platform_driver gpu_cc_nord_driver = {
583*47f2e6e1STaniya Das .probe = gpu_cc_nord_probe,
584*47f2e6e1STaniya Das .driver = {
585*47f2e6e1STaniya Das .name = "gpucc-nord",
586*47f2e6e1STaniya Das .of_match_table = gpu_cc_nord_match_table,
587*47f2e6e1STaniya Das },
588*47f2e6e1STaniya Das };
589*47f2e6e1STaniya Das
590*47f2e6e1STaniya Das module_platform_driver(gpu_cc_nord_driver);
591*47f2e6e1STaniya Das
592*47f2e6e1STaniya Das MODULE_DESCRIPTION("QTI GPUCC Nord Driver");
593*47f2e6e1STaniya Das MODULE_LICENSE("GPL");
594