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-gpu2cc.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_2_CC_PLL0_OUT_MAIN,
35*47f2e6e1STaniya Das P_GPU_2_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 /* 934.0 MHz Configuration */
43*47f2e6e1STaniya Das static const struct alpha_pll_config gpu_2_cc_pll0_config = {
44*47f2e6e1STaniya Das .l = 0x30,
45*47f2e6e1STaniya Das .alpha = 0xa555,
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_2_cc_pll0 = {
58*47f2e6e1STaniya Das .offset = 0x0,
59*47f2e6e1STaniya Das .config = &gpu_2_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_2_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 /* 1100.0 MHz Configuration */
76*47f2e6e1STaniya Das static const struct alpha_pll_config gpu_2_cc_pll1_config = {
77*47f2e6e1STaniya Das .l = 0x39,
78*47f2e6e1STaniya Das .alpha = 0x4aaa,
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_2_cc_pll1 = {
91*47f2e6e1STaniya Das .offset = 0x1000,
92*47f2e6e1STaniya Das .config = &gpu_2_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_2_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_2_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_2_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_2_cc_parent_map_1[] = {
121*47f2e6e1STaniya Das { P_BI_TCXO, 0 },
122*47f2e6e1STaniya Das { P_GPU_2_CC_PLL0_OUT_MAIN, 1 },
123*47f2e6e1STaniya Das { P_GPU_2_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_2_cc_parent_data_1[] = {
129*47f2e6e1STaniya Das { .index = DT_BI_TCXO },
130*47f2e6e1STaniya Das { .hw = &gpu_2_cc_pll0.clkr.hw },
131*47f2e6e1STaniya Das { .hw = &gpu_2_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_2_cc_parent_map_2[] = {
137*47f2e6e1STaniya Das { P_BI_TCXO, 0 },
138*47f2e6e1STaniya Das { P_GPU_2_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_2_cc_parent_data_2[] = {
144*47f2e6e1STaniya Das { .index = DT_BI_TCXO },
145*47f2e6e1STaniya Das { .hw = &gpu_2_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_2_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_2_cc_ff_clk_src = {
156*47f2e6e1STaniya Das .cmd_rcgr = 0x91c4,
157*47f2e6e1STaniya Das .mnd_width = 0,
158*47f2e6e1STaniya Das .hid_width = 5,
159*47f2e6e1STaniya Das .parent_map = gpu_2_cc_parent_map_0,
160*47f2e6e1STaniya Das .freq_tbl = ftbl_gpu_2_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_2_cc_ff_clk_src",
164*47f2e6e1STaniya Das .parent_data = gpu_2_cc_parent_data_0,
165*47f2e6e1STaniya Das .num_parents = ARRAY_SIZE(gpu_2_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_2_cc_gmu_clk_src[] = {
172*47f2e6e1STaniya Das F(550000000, P_GPU_2_CC_PLL1_OUT_MAIN, 2, 0, 0),
173*47f2e6e1STaniya Das { }
174*47f2e6e1STaniya Das };
175*47f2e6e1STaniya Das
176*47f2e6e1STaniya Das static struct clk_rcg2 gpu_2_cc_gmu_clk_src = {
177*47f2e6e1STaniya Das .cmd_rcgr = 0x9174,
178*47f2e6e1STaniya Das .mnd_width = 0,
179*47f2e6e1STaniya Das .hid_width = 5,
180*47f2e6e1STaniya Das .parent_map = gpu_2_cc_parent_map_1,
181*47f2e6e1STaniya Das .freq_tbl = ftbl_gpu_2_cc_gmu_clk_src,
182*47f2e6e1STaniya Das .hw_clk_ctrl = true,
183*47f2e6e1STaniya Das .clkr.hw.init = &(const struct clk_init_data) {
184*47f2e6e1STaniya Das .name = "gpu_2_cc_gmu_clk_src",
185*47f2e6e1STaniya Das .parent_data = gpu_2_cc_parent_data_1,
186*47f2e6e1STaniya Das .num_parents = ARRAY_SIZE(gpu_2_cc_parent_data_1),
187*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
188*47f2e6e1STaniya Das .ops = &clk_rcg2_shared_ops,
189*47f2e6e1STaniya Das },
190*47f2e6e1STaniya Das };
191*47f2e6e1STaniya Das
192*47f2e6e1STaniya Das static struct clk_rcg2 gpu_2_cc_hub_clk_src = {
193*47f2e6e1STaniya Das .cmd_rcgr = 0x91a8,
194*47f2e6e1STaniya Das .mnd_width = 0,
195*47f2e6e1STaniya Das .hid_width = 5,
196*47f2e6e1STaniya Das .parent_map = gpu_2_cc_parent_map_2,
197*47f2e6e1STaniya Das .freq_tbl = ftbl_gpu_2_cc_ff_clk_src,
198*47f2e6e1STaniya Das .hw_clk_ctrl = true,
199*47f2e6e1STaniya Das .clkr.hw.init = &(const struct clk_init_data) {
200*47f2e6e1STaniya Das .name = "gpu_2_cc_hub_clk_src",
201*47f2e6e1STaniya Das .parent_data = gpu_2_cc_parent_data_2,
202*47f2e6e1STaniya Das .num_parents = ARRAY_SIZE(gpu_2_cc_parent_data_2),
203*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
204*47f2e6e1STaniya Das .ops = &clk_rcg2_shared_ops,
205*47f2e6e1STaniya Das },
206*47f2e6e1STaniya Das };
207*47f2e6e1STaniya Das
208*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_ahb_clk = {
209*47f2e6e1STaniya Das .halt_reg = 0x90cc,
210*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
211*47f2e6e1STaniya Das .clkr = {
212*47f2e6e1STaniya Das .enable_reg = 0x90cc,
213*47f2e6e1STaniya Das .enable_mask = BIT(0),
214*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
215*47f2e6e1STaniya Das .name = "gpu_2_cc_ahb_clk",
216*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
217*47f2e6e1STaniya Das &gpu_2_cc_hub_clk_src.clkr.hw,
218*47f2e6e1STaniya Das },
219*47f2e6e1STaniya Das .num_parents = 1,
220*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
221*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
222*47f2e6e1STaniya Das },
223*47f2e6e1STaniya Das },
224*47f2e6e1STaniya Das };
225*47f2e6e1STaniya Das
226*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_crc_ahb_clk = {
227*47f2e6e1STaniya Das .halt_reg = 0x90d0,
228*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
229*47f2e6e1STaniya Das .clkr = {
230*47f2e6e1STaniya Das .enable_reg = 0x90d0,
231*47f2e6e1STaniya Das .enable_mask = BIT(0),
232*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
233*47f2e6e1STaniya Das .name = "gpu_2_cc_crc_ahb_clk",
234*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
235*47f2e6e1STaniya Das &gpu_2_cc_hub_clk_src.clkr.hw,
236*47f2e6e1STaniya Das },
237*47f2e6e1STaniya Das .num_parents = 1,
238*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
239*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
240*47f2e6e1STaniya Das },
241*47f2e6e1STaniya Das },
242*47f2e6e1STaniya Das };
243*47f2e6e1STaniya Das
244*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_cx_accu_shift_clk = {
245*47f2e6e1STaniya Das .halt_reg = 0x9114,
246*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
247*47f2e6e1STaniya Das .clkr = {
248*47f2e6e1STaniya Das .enable_reg = 0x9114,
249*47f2e6e1STaniya Das .enable_mask = BIT(0),
250*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
251*47f2e6e1STaniya Das .name = "gpu_2_cc_cx_accu_shift_clk",
252*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
253*47f2e6e1STaniya Das },
254*47f2e6e1STaniya Das },
255*47f2e6e1STaniya Das };
256*47f2e6e1STaniya Das
257*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_cx_ff_clk = {
258*47f2e6e1STaniya Das .halt_reg = 0x9100,
259*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
260*47f2e6e1STaniya Das .clkr = {
261*47f2e6e1STaniya Das .enable_reg = 0x9100,
262*47f2e6e1STaniya Das .enable_mask = BIT(0),
263*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
264*47f2e6e1STaniya Das .name = "gpu_2_cc_cx_ff_clk",
265*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
266*47f2e6e1STaniya Das &gpu_2_cc_ff_clk_src.clkr.hw,
267*47f2e6e1STaniya Das },
268*47f2e6e1STaniya Das .num_parents = 1,
269*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
270*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
271*47f2e6e1STaniya Das },
272*47f2e6e1STaniya Das },
273*47f2e6e1STaniya Das };
274*47f2e6e1STaniya Das
275*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_cx_gmu_clk = {
276*47f2e6e1STaniya Das .halt_reg = 0x90e8,
277*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
278*47f2e6e1STaniya Das .clkr = {
279*47f2e6e1STaniya Das .enable_reg = 0x90e8,
280*47f2e6e1STaniya Das .enable_mask = BIT(0),
281*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
282*47f2e6e1STaniya Das .name = "gpu_2_cc_cx_gmu_clk",
283*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
284*47f2e6e1STaniya Das &gpu_2_cc_gmu_clk_src.clkr.hw,
285*47f2e6e1STaniya Das },
286*47f2e6e1STaniya Das .num_parents = 1,
287*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
288*47f2e6e1STaniya Das .ops = &clk_branch2_aon_ops,
289*47f2e6e1STaniya Das },
290*47f2e6e1STaniya Das },
291*47f2e6e1STaniya Das };
292*47f2e6e1STaniya Das
293*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_cxo_clk = {
294*47f2e6e1STaniya Das .halt_reg = 0x90f8,
295*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
296*47f2e6e1STaniya Das .clkr = {
297*47f2e6e1STaniya Das .enable_reg = 0x90f8,
298*47f2e6e1STaniya Das .enable_mask = BIT(0),
299*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
300*47f2e6e1STaniya Das .name = "gpu_2_cc_cxo_clk",
301*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
302*47f2e6e1STaniya Das },
303*47f2e6e1STaniya Das },
304*47f2e6e1STaniya Das };
305*47f2e6e1STaniya Das
306*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_freq_measure_clk = {
307*47f2e6e1STaniya Das .halt_reg = 0x9008,
308*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
309*47f2e6e1STaniya Das .clkr = {
310*47f2e6e1STaniya Das .enable_reg = 0x9008,
311*47f2e6e1STaniya Das .enable_mask = BIT(0),
312*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
313*47f2e6e1STaniya Das .name = "gpu_2_cc_freq_measure_clk",
314*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
315*47f2e6e1STaniya Das },
316*47f2e6e1STaniya Das },
317*47f2e6e1STaniya Das };
318*47f2e6e1STaniya Das
319*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_gpu_smmu_vote_clk = {
320*47f2e6e1STaniya Das .halt_reg = 0x7000,
321*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
322*47f2e6e1STaniya Das .clkr = {
323*47f2e6e1STaniya Das .enable_reg = 0x7000,
324*47f2e6e1STaniya Das .enable_mask = BIT(0),
325*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
326*47f2e6e1STaniya Das .name = "gpu_2_cc_gpu_smmu_vote_clk",
327*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
328*47f2e6e1STaniya Das },
329*47f2e6e1STaniya Das },
330*47f2e6e1STaniya Das };
331*47f2e6e1STaniya Das
332*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_hub_aon_clk = {
333*47f2e6e1STaniya Das .halt_reg = 0x91a4,
334*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
335*47f2e6e1STaniya Das .clkr = {
336*47f2e6e1STaniya Das .enable_reg = 0x91a4,
337*47f2e6e1STaniya Das .enable_mask = BIT(0),
338*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
339*47f2e6e1STaniya Das .name = "gpu_2_cc_hub_aon_clk",
340*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
341*47f2e6e1STaniya Das &gpu_2_cc_hub_clk_src.clkr.hw,
342*47f2e6e1STaniya Das },
343*47f2e6e1STaniya Das .num_parents = 1,
344*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
345*47f2e6e1STaniya Das .ops = &clk_branch2_aon_ops,
346*47f2e6e1STaniya Das },
347*47f2e6e1STaniya Das },
348*47f2e6e1STaniya Das };
349*47f2e6e1STaniya Das
350*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_hub_cx_int_clk = {
351*47f2e6e1STaniya Das .halt_reg = 0x90fc,
352*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
353*47f2e6e1STaniya Das .clkr = {
354*47f2e6e1STaniya Das .enable_reg = 0x90fc,
355*47f2e6e1STaniya Das .enable_mask = BIT(0),
356*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
357*47f2e6e1STaniya Das .name = "gpu_2_cc_hub_cx_int_clk",
358*47f2e6e1STaniya Das .parent_hws = (const struct clk_hw*[]) {
359*47f2e6e1STaniya Das &gpu_2_cc_hub_clk_src.clkr.hw,
360*47f2e6e1STaniya Das },
361*47f2e6e1STaniya Das .num_parents = 1,
362*47f2e6e1STaniya Das .flags = CLK_SET_RATE_PARENT,
363*47f2e6e1STaniya Das .ops = &clk_branch2_aon_ops,
364*47f2e6e1STaniya Das },
365*47f2e6e1STaniya Das },
366*47f2e6e1STaniya Das };
367*47f2e6e1STaniya Das
368*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_memnoc_gfx_clk = {
369*47f2e6e1STaniya Das .halt_reg = 0x9104,
370*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_VOTED,
371*47f2e6e1STaniya Das .clkr = {
372*47f2e6e1STaniya Das .enable_reg = 0x9104,
373*47f2e6e1STaniya Das .enable_mask = BIT(0),
374*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
375*47f2e6e1STaniya Das .name = "gpu_2_cc_memnoc_gfx_clk",
376*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
377*47f2e6e1STaniya Das },
378*47f2e6e1STaniya Das },
379*47f2e6e1STaniya Das };
380*47f2e6e1STaniya Das
381*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_mnd1x_0_gfx3d_clk = {
382*47f2e6e1STaniya Das .halt_reg = 0x9164,
383*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
384*47f2e6e1STaniya Das .clkr = {
385*47f2e6e1STaniya Das .enable_reg = 0x9164,
386*47f2e6e1STaniya Das .enable_mask = BIT(0),
387*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
388*47f2e6e1STaniya Das .name = "gpu_2_cc_mnd1x_0_gfx3d_clk",
389*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
390*47f2e6e1STaniya Das },
391*47f2e6e1STaniya Das },
392*47f2e6e1STaniya Das };
393*47f2e6e1STaniya Das
394*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_mnd1x_1_gfx3d_clk = {
395*47f2e6e1STaniya Das .halt_reg = 0x9168,
396*47f2e6e1STaniya Das .halt_check = BRANCH_HALT,
397*47f2e6e1STaniya Das .clkr = {
398*47f2e6e1STaniya Das .enable_reg = 0x9168,
399*47f2e6e1STaniya Das .enable_mask = BIT(0),
400*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
401*47f2e6e1STaniya Das .name = "gpu_2_cc_mnd1x_1_gfx3d_clk",
402*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
403*47f2e6e1STaniya Das },
404*47f2e6e1STaniya Das },
405*47f2e6e1STaniya Das };
406*47f2e6e1STaniya Das
407*47f2e6e1STaniya Das static struct clk_branch gpu_2_cc_sleep_clk = {
408*47f2e6e1STaniya Das .halt_reg = 0x90e0,
409*47f2e6e1STaniya Das .halt_check = BRANCH_HALT_SKIP,
410*47f2e6e1STaniya Das .clkr = {
411*47f2e6e1STaniya Das .enable_reg = 0x90e0,
412*47f2e6e1STaniya Das .enable_mask = BIT(0),
413*47f2e6e1STaniya Das .hw.init = &(const struct clk_init_data) {
414*47f2e6e1STaniya Das .name = "gpu_2_cc_sleep_clk",
415*47f2e6e1STaniya Das .ops = &clk_branch2_ops,
416*47f2e6e1STaniya Das },
417*47f2e6e1STaniya Das },
418*47f2e6e1STaniya Das };
419*47f2e6e1STaniya Das
420*47f2e6e1STaniya Das static struct gdsc gpu_2_cc_cx_gdsc = {
421*47f2e6e1STaniya Das .gdscr = 0x9090,
422*47f2e6e1STaniya Das .gds_hw_ctrl = 0x90a4,
423*47f2e6e1STaniya Das .en_rest_wait_val = 0x2,
424*47f2e6e1STaniya Das .en_few_wait_val = 0x2,
425*47f2e6e1STaniya Das .clk_dis_wait_val = 0xf,
426*47f2e6e1STaniya Das .pd = {
427*47f2e6e1STaniya Das .name = "gpu_2_cc_cx_gdsc",
428*47f2e6e1STaniya Das },
429*47f2e6e1STaniya Das .pwrsts = PWRSTS_OFF_ON,
430*47f2e6e1STaniya Das .flags = VOTABLE | RETAIN_FF_ENABLE,
431*47f2e6e1STaniya Das };
432*47f2e6e1STaniya Das
433*47f2e6e1STaniya Das static struct gdsc gpu_2_cc_gx_gdsc = {
434*47f2e6e1STaniya Das .gdscr = 0x9034,
435*47f2e6e1STaniya Das .clamp_io_ctrl = 0x9504,
436*47f2e6e1STaniya Das .en_rest_wait_val = 0x2,
437*47f2e6e1STaniya Das .en_few_wait_val = 0x2,
438*47f2e6e1STaniya Das .clk_dis_wait_val = 0xf,
439*47f2e6e1STaniya Das .pd = {
440*47f2e6e1STaniya Das .name = "gpu_2_cc_gx_gdsc",
441*47f2e6e1STaniya Das .power_on = gdsc_gx_do_nothing_enable,
442*47f2e6e1STaniya Das },
443*47f2e6e1STaniya Das .pwrsts = PWRSTS_OFF_ON,
444*47f2e6e1STaniya Das .flags = CLAMP_IO | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
445*47f2e6e1STaniya Das };
446*47f2e6e1STaniya Das
447*47f2e6e1STaniya Das static struct clk_regmap *gpu_2_cc_nord_clocks[] = {
448*47f2e6e1STaniya Das [GPU_2_CC_AHB_CLK] = &gpu_2_cc_ahb_clk.clkr,
449*47f2e6e1STaniya Das [GPU_2_CC_CRC_AHB_CLK] = &gpu_2_cc_crc_ahb_clk.clkr,
450*47f2e6e1STaniya Das [GPU_2_CC_CX_ACCU_SHIFT_CLK] = &gpu_2_cc_cx_accu_shift_clk.clkr,
451*47f2e6e1STaniya Das [GPU_2_CC_CX_FF_CLK] = &gpu_2_cc_cx_ff_clk.clkr,
452*47f2e6e1STaniya Das [GPU_2_CC_CX_GMU_CLK] = &gpu_2_cc_cx_gmu_clk.clkr,
453*47f2e6e1STaniya Das [GPU_2_CC_CXO_CLK] = &gpu_2_cc_cxo_clk.clkr,
454*47f2e6e1STaniya Das [GPU_2_CC_FF_CLK_SRC] = &gpu_2_cc_ff_clk_src.clkr,
455*47f2e6e1STaniya Das [GPU_2_CC_FREQ_MEASURE_CLK] = &gpu_2_cc_freq_measure_clk.clkr,
456*47f2e6e1STaniya Das [GPU_2_CC_GMU_CLK_SRC] = &gpu_2_cc_gmu_clk_src.clkr,
457*47f2e6e1STaniya Das [GPU_2_CC_GPU_SMMU_VOTE_CLK] = &gpu_2_cc_gpu_smmu_vote_clk.clkr,
458*47f2e6e1STaniya Das [GPU_2_CC_HUB_AON_CLK] = &gpu_2_cc_hub_aon_clk.clkr,
459*47f2e6e1STaniya Das [GPU_2_CC_HUB_CLK_SRC] = &gpu_2_cc_hub_clk_src.clkr,
460*47f2e6e1STaniya Das [GPU_2_CC_HUB_CX_INT_CLK] = &gpu_2_cc_hub_cx_int_clk.clkr,
461*47f2e6e1STaniya Das [GPU_2_CC_MEMNOC_GFX_CLK] = &gpu_2_cc_memnoc_gfx_clk.clkr,
462*47f2e6e1STaniya Das [GPU_2_CC_MND1X_0_GFX3D_CLK] = &gpu_2_cc_mnd1x_0_gfx3d_clk.clkr,
463*47f2e6e1STaniya Das [GPU_2_CC_MND1X_1_GFX3D_CLK] = &gpu_2_cc_mnd1x_1_gfx3d_clk.clkr,
464*47f2e6e1STaniya Das [GPU_2_CC_PLL0] = &gpu_2_cc_pll0.clkr,
465*47f2e6e1STaniya Das [GPU_2_CC_PLL1] = &gpu_2_cc_pll1.clkr,
466*47f2e6e1STaniya Das [GPU_2_CC_SLEEP_CLK] = &gpu_2_cc_sleep_clk.clkr,
467*47f2e6e1STaniya Das };
468*47f2e6e1STaniya Das
469*47f2e6e1STaniya Das static struct gdsc *gpu_2_cc_nord_gdscs[] = {
470*47f2e6e1STaniya Das [GPU_2_CC_CX_GDSC] = &gpu_2_cc_cx_gdsc,
471*47f2e6e1STaniya Das [GPU_2_CC_GX_GDSC] = &gpu_2_cc_gx_gdsc,
472*47f2e6e1STaniya Das };
473*47f2e6e1STaniya Das
474*47f2e6e1STaniya Das static const struct qcom_reset_map gpu_2_cc_nord_resets[] = {
475*47f2e6e1STaniya Das [GPU_2_CC_ACD_BCR] = { 0x918c },
476*47f2e6e1STaniya Das [GPU_2_CC_CB_BCR] = { 0x9198 },
477*47f2e6e1STaniya Das [GPU_2_CC_CX_BCR] = { 0x908c },
478*47f2e6e1STaniya Das [GPU_2_CC_FAST_HUB_BCR] = { 0x91a0 },
479*47f2e6e1STaniya Das [GPU_2_CC_FF_BCR] = { 0x91c0 },
480*47f2e6e1STaniya Das [GPU_2_CC_GFX3D_AON_BCR] = { 0x9118 },
481*47f2e6e1STaniya Das [GPU_2_CC_GMU_BCR] = { 0x9170 },
482*47f2e6e1STaniya Das [GPU_2_CC_GX_BCR] = { 0x9030 },
483*47f2e6e1STaniya Das [GPU_2_CC_XO_BCR] = { 0x9000 },
484*47f2e6e1STaniya Das };
485*47f2e6e1STaniya Das
486*47f2e6e1STaniya Das static struct clk_alpha_pll *gpu_2_cc_nord_plls[] = {
487*47f2e6e1STaniya Das &gpu_2_cc_pll0,
488*47f2e6e1STaniya Das &gpu_2_cc_pll1,
489*47f2e6e1STaniya Das };
490*47f2e6e1STaniya Das
491*47f2e6e1STaniya Das static const u32 gpu_2_cc_nord_critical_cbcrs[] = {
492*47f2e6e1STaniya Das 0x9004, /* GPU_2_CC_CXO_AON_CLK */
493*47f2e6e1STaniya Das 0x900c, /* GPU_2_CC_DEMET_CLK */
494*47f2e6e1STaniya Das };
495*47f2e6e1STaniya Das
496*47f2e6e1STaniya Das static const struct regmap_config gpu_2_cc_nord_regmap_config = {
497*47f2e6e1STaniya Das .reg_bits = 32,
498*47f2e6e1STaniya Das .reg_stride = 4,
499*47f2e6e1STaniya Das .val_bits = 32,
500*47f2e6e1STaniya Das .max_register = 0x9ff0,
501*47f2e6e1STaniya Das .fast_io = true,
502*47f2e6e1STaniya Das };
503*47f2e6e1STaniya Das
504*47f2e6e1STaniya Das static const struct qcom_cc_driver_data gpu_2_cc_nord_driver_data = {
505*47f2e6e1STaniya Das .alpha_plls = gpu_2_cc_nord_plls,
506*47f2e6e1STaniya Das .num_alpha_plls = ARRAY_SIZE(gpu_2_cc_nord_plls),
507*47f2e6e1STaniya Das .clk_cbcrs = gpu_2_cc_nord_critical_cbcrs,
508*47f2e6e1STaniya Das .num_clk_cbcrs = ARRAY_SIZE(gpu_2_cc_nord_critical_cbcrs),
509*47f2e6e1STaniya Das };
510*47f2e6e1STaniya Das
511*47f2e6e1STaniya Das static const struct qcom_cc_desc gpu_2_cc_nord_desc = {
512*47f2e6e1STaniya Das .config = &gpu_2_cc_nord_regmap_config,
513*47f2e6e1STaniya Das .clks = gpu_2_cc_nord_clocks,
514*47f2e6e1STaniya Das .num_clks = ARRAY_SIZE(gpu_2_cc_nord_clocks),
515*47f2e6e1STaniya Das .resets = gpu_2_cc_nord_resets,
516*47f2e6e1STaniya Das .num_resets = ARRAY_SIZE(gpu_2_cc_nord_resets),
517*47f2e6e1STaniya Das .gdscs = gpu_2_cc_nord_gdscs,
518*47f2e6e1STaniya Das .num_gdscs = ARRAY_SIZE(gpu_2_cc_nord_gdscs),
519*47f2e6e1STaniya Das .use_rpm = true,
520*47f2e6e1STaniya Das .driver_data = &gpu_2_cc_nord_driver_data,
521*47f2e6e1STaniya Das };
522*47f2e6e1STaniya Das
523*47f2e6e1STaniya Das static const struct of_device_id gpu_2_cc_nord_match_table[] = {
524*47f2e6e1STaniya Das { .compatible = "qcom,nord-gpu2cc" },
525*47f2e6e1STaniya Das { }
526*47f2e6e1STaniya Das };
527*47f2e6e1STaniya Das MODULE_DEVICE_TABLE(of, gpu_2_cc_nord_match_table);
528*47f2e6e1STaniya Das
gpu_2_cc_nord_probe(struct platform_device * pdev)529*47f2e6e1STaniya Das static int gpu_2_cc_nord_probe(struct platform_device *pdev)
530*47f2e6e1STaniya Das {
531*47f2e6e1STaniya Das return qcom_cc_probe(pdev, &gpu_2_cc_nord_desc);
532*47f2e6e1STaniya Das }
533*47f2e6e1STaniya Das
534*47f2e6e1STaniya Das static struct platform_driver gpu_2_cc_nord_driver = {
535*47f2e6e1STaniya Das .probe = gpu_2_cc_nord_probe,
536*47f2e6e1STaniya Das .driver = {
537*47f2e6e1STaniya Das .name = "gpu2cc-nord",
538*47f2e6e1STaniya Das .of_match_table = gpu_2_cc_nord_match_table,
539*47f2e6e1STaniya Das },
540*47f2e6e1STaniya Das };
541*47f2e6e1STaniya Das
542*47f2e6e1STaniya Das module_platform_driver(gpu_2_cc_nord_driver);
543*47f2e6e1STaniya Das
544*47f2e6e1STaniya Das MODULE_DESCRIPTION("QTI GPU2CC Nord Driver");
545*47f2e6e1STaniya Das MODULE_LICENSE("GPL");
546