xref: /linux/drivers/clk/qcom/gpu2cc-nord.c (revision 502d45774af09f1c681c754c4b7cdfb5d7f72fd9)
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