xref: /linux/drivers/clk/qcom/gpucc-kaanapali.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*685ec348STaniya Das // SPDX-License-Identifier: GPL-2.0-only
2*685ec348STaniya Das /*
3*685ec348STaniya Das  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4*685ec348STaniya Das  */
5*685ec348STaniya Das 
6*685ec348STaniya Das #include <linux/clk-provider.h>
7*685ec348STaniya Das #include <linux/mod_devicetable.h>
8*685ec348STaniya Das #include <linux/module.h>
9*685ec348STaniya Das #include <linux/of.h>
10*685ec348STaniya Das #include <linux/platform_device.h>
11*685ec348STaniya Das #include <linux/regmap.h>
12*685ec348STaniya Das 
13*685ec348STaniya Das #include <dt-bindings/clock/qcom,kaanapali-gpucc.h>
14*685ec348STaniya Das 
15*685ec348STaniya Das #include "clk-alpha-pll.h"
16*685ec348STaniya Das #include "clk-branch.h"
17*685ec348STaniya Das #include "clk-pll.h"
18*685ec348STaniya Das #include "clk-rcg.h"
19*685ec348STaniya Das #include "clk-regmap.h"
20*685ec348STaniya Das #include "clk-regmap-divider.h"
21*685ec348STaniya Das #include "clk-regmap-mux.h"
22*685ec348STaniya Das #include "common.h"
23*685ec348STaniya Das #include "gdsc.h"
24*685ec348STaniya Das #include "reset.h"
25*685ec348STaniya Das 
26*685ec348STaniya Das enum {
27*685ec348STaniya Das 	DT_BI_TCXO,
28*685ec348STaniya Das 	DT_GPLL0_OUT_MAIN,
29*685ec348STaniya Das 	DT_GPLL0_OUT_MAIN_DIV,
30*685ec348STaniya Das };
31*685ec348STaniya Das 
32*685ec348STaniya Das enum {
33*685ec348STaniya Das 	P_BI_TCXO,
34*685ec348STaniya Das 	P_GPLL0_OUT_MAIN,
35*685ec348STaniya Das 	P_GPLL0_OUT_MAIN_DIV,
36*685ec348STaniya Das 	P_GPU_CC_PLL0_OUT_EVEN,
37*685ec348STaniya Das 	P_GPU_CC_PLL0_OUT_MAIN,
38*685ec348STaniya Das 	P_GPU_CC_PLL0_OUT_ODD,
39*685ec348STaniya Das };
40*685ec348STaniya Das 
41*685ec348STaniya Das static const struct pll_vco taycan_eko_t_vco[] = {
42*685ec348STaniya Das 	{ 249600000, 2500000000, 0 },
43*685ec348STaniya Das };
44*685ec348STaniya Das 
45*685ec348STaniya Das /* 950.0 MHz Configuration */
46*685ec348STaniya Das static const struct alpha_pll_config gpu_cc_pll0_config = {
47*685ec348STaniya Das 	.l = 0x31,
48*685ec348STaniya Das 	.cal_l = 0x48,
49*685ec348STaniya Das 	.alpha = 0x7aaa,
50*685ec348STaniya Das 	.config_ctl_val = 0x25c400e7,
51*685ec348STaniya Das 	.config_ctl_hi_val = 0x0a8062e0,
52*685ec348STaniya Das 	.config_ctl_hi1_val = 0xf51dea20,
53*685ec348STaniya Das 	.user_ctl_val = 0x00000408,
54*685ec348STaniya Das 	.user_ctl_hi_val = 0x00000002,
55*685ec348STaniya Das };
56*685ec348STaniya Das 
57*685ec348STaniya Das static struct clk_alpha_pll gpu_cc_pll0 = {
58*685ec348STaniya Das 	.offset = 0x0,
59*685ec348STaniya Das 	.config = &gpu_cc_pll0_config,
60*685ec348STaniya Das 	.vco_table = taycan_eko_t_vco,
61*685ec348STaniya Das 	.num_vco = ARRAY_SIZE(taycan_eko_t_vco),
62*685ec348STaniya Das 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T],
63*685ec348STaniya Das 	.clkr = {
64*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
65*685ec348STaniya Das 			.name = "gpu_cc_pll0",
66*685ec348STaniya Das 			.parent_data = &(const struct clk_parent_data) {
67*685ec348STaniya Das 				.index = DT_BI_TCXO,
68*685ec348STaniya Das 			},
69*685ec348STaniya Das 			.num_parents = 1,
70*685ec348STaniya Das 			.ops = &clk_alpha_pll_taycan_eko_t_ops,
71*685ec348STaniya Das 		},
72*685ec348STaniya Das 	},
73*685ec348STaniya Das };
74*685ec348STaniya Das 
75*685ec348STaniya Das static const struct clk_div_table post_div_table_gpu_cc_pll0_out_even[] = {
76*685ec348STaniya Das 	{ 0x1, 2 },
77*685ec348STaniya Das 	{ }
78*685ec348STaniya Das };
79*685ec348STaniya Das 
80*685ec348STaniya Das static struct clk_alpha_pll_postdiv gpu_cc_pll0_out_even = {
81*685ec348STaniya Das 	.offset = 0x0,
82*685ec348STaniya Das 	.post_div_shift = 10,
83*685ec348STaniya Das 	.post_div_table = post_div_table_gpu_cc_pll0_out_even,
84*685ec348STaniya Das 	.num_post_div = ARRAY_SIZE(post_div_table_gpu_cc_pll0_out_even),
85*685ec348STaniya Das 	.width = 4,
86*685ec348STaniya Das 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T],
87*685ec348STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
88*685ec348STaniya Das 		.name = "gpu_cc_pll0_out_even",
89*685ec348STaniya Das 		.parent_hws = (const struct clk_hw*[]) {
90*685ec348STaniya Das 			&gpu_cc_pll0.clkr.hw,
91*685ec348STaniya Das 		},
92*685ec348STaniya Das 		.num_parents = 1,
93*685ec348STaniya Das 		.flags = CLK_SET_RATE_PARENT,
94*685ec348STaniya Das 		.ops = &clk_alpha_pll_postdiv_taycan_eko_t_ops,
95*685ec348STaniya Das 	},
96*685ec348STaniya Das };
97*685ec348STaniya Das 
98*685ec348STaniya Das static const struct parent_map gpu_cc_parent_map_0[] = {
99*685ec348STaniya Das 	{ P_BI_TCXO, 0 },
100*685ec348STaniya Das 	{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
101*685ec348STaniya Das 	{ P_GPU_CC_PLL0_OUT_EVEN, 2 },
102*685ec348STaniya Das 	{ P_GPU_CC_PLL0_OUT_ODD, 3 },
103*685ec348STaniya Das 	{ P_GPLL0_OUT_MAIN, 5 },
104*685ec348STaniya Das 	{ P_GPLL0_OUT_MAIN_DIV, 6 },
105*685ec348STaniya Das };
106*685ec348STaniya Das 
107*685ec348STaniya Das static const struct clk_parent_data gpu_cc_parent_data_0[] = {
108*685ec348STaniya Das 	{ .index = DT_BI_TCXO },
109*685ec348STaniya Das 	{ .hw = &gpu_cc_pll0.clkr.hw },
110*685ec348STaniya Das 	{ .hw = &gpu_cc_pll0_out_even.clkr.hw },
111*685ec348STaniya Das 	{ .hw = &gpu_cc_pll0.clkr.hw },
112*685ec348STaniya Das 	{ .index = DT_GPLL0_OUT_MAIN },
113*685ec348STaniya Das 	{ .index = DT_GPLL0_OUT_MAIN_DIV },
114*685ec348STaniya Das };
115*685ec348STaniya Das 
116*685ec348STaniya Das static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
117*685ec348STaniya Das 	F(19200000, P_BI_TCXO, 1, 0, 0),
118*685ec348STaniya Das 	F(475000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
119*685ec348STaniya Das 	F(575000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
120*685ec348STaniya Das 	F(700000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
121*685ec348STaniya Das 	F(725000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
122*685ec348STaniya Das 	F(750000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
123*685ec348STaniya Das 	{ }
124*685ec348STaniya Das };
125*685ec348STaniya Das 
126*685ec348STaniya Das static struct clk_rcg2 gpu_cc_gmu_clk_src = {
127*685ec348STaniya Das 	.cmd_rcgr = 0x9318,
128*685ec348STaniya Das 	.mnd_width = 0,
129*685ec348STaniya Das 	.hid_width = 5,
130*685ec348STaniya Das 	.parent_map = gpu_cc_parent_map_0,
131*685ec348STaniya Das 	.hw_clk_ctrl = true,
132*685ec348STaniya Das 	.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
133*685ec348STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
134*685ec348STaniya Das 		.name = "gpu_cc_gmu_clk_src",
135*685ec348STaniya Das 		.parent_data = gpu_cc_parent_data_0,
136*685ec348STaniya Das 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
137*685ec348STaniya Das 		.flags = CLK_SET_RATE_PARENT,
138*685ec348STaniya Das 		.ops = &clk_rcg2_shared_ops,
139*685ec348STaniya Das 	},
140*685ec348STaniya Das };
141*685ec348STaniya Das 
142*685ec348STaniya Das static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
143*685ec348STaniya Das 	F(150000000, P_GPLL0_OUT_MAIN_DIV, 2, 0, 0),
144*685ec348STaniya Das 	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
145*685ec348STaniya Das 	F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
146*685ec348STaniya Das 	F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0),
147*685ec348STaniya Das 	{ }
148*685ec348STaniya Das };
149*685ec348STaniya Das 
150*685ec348STaniya Das static struct clk_rcg2 gpu_cc_hub_clk_src = {
151*685ec348STaniya Das 	.cmd_rcgr = 0x93f0,
152*685ec348STaniya Das 	.mnd_width = 0,
153*685ec348STaniya Das 	.hid_width = 5,
154*685ec348STaniya Das 	.parent_map = gpu_cc_parent_map_0,
155*685ec348STaniya Das 	.hw_clk_ctrl = true,
156*685ec348STaniya Das 	.freq_tbl = ftbl_gpu_cc_hub_clk_src,
157*685ec348STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
158*685ec348STaniya Das 		.name = "gpu_cc_hub_clk_src",
159*685ec348STaniya Das 		.parent_data = gpu_cc_parent_data_0,
160*685ec348STaniya Das 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
161*685ec348STaniya Das 		.flags = CLK_SET_RATE_PARENT,
162*685ec348STaniya Das 		.ops = &clk_rcg2_shared_ops,
163*685ec348STaniya Das 	},
164*685ec348STaniya Das };
165*685ec348STaniya Das 
166*685ec348STaniya Das static struct clk_regmap_div gpu_cc_hub_div_clk_src = {
167*685ec348STaniya Das 	.reg = 0x9430,
168*685ec348STaniya Das 	.shift = 0,
169*685ec348STaniya Das 	.width = 4,
170*685ec348STaniya Das 	.clkr.hw.init = &(const struct clk_init_data) {
171*685ec348STaniya Das 		.name = "gpu_cc_hub_div_clk_src",
172*685ec348STaniya Das 		.parent_hws = (const struct clk_hw*[]) {
173*685ec348STaniya Das 			&gpu_cc_hub_clk_src.clkr.hw,
174*685ec348STaniya Das 		},
175*685ec348STaniya Das 		.num_parents = 1,
176*685ec348STaniya Das 		.flags = CLK_SET_RATE_PARENT,
177*685ec348STaniya Das 		.ops = &clk_regmap_div_ro_ops,
178*685ec348STaniya Das 	},
179*685ec348STaniya Das };
180*685ec348STaniya Das 
181*685ec348STaniya Das static struct clk_branch gpu_cc_ahb_clk = {
182*685ec348STaniya Das 	.halt_reg = 0x90bc,
183*685ec348STaniya Das 	.halt_check = BRANCH_HALT_DELAY,
184*685ec348STaniya Das 	.clkr = {
185*685ec348STaniya Das 		.enable_reg = 0x90bc,
186*685ec348STaniya Das 		.enable_mask = BIT(0),
187*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
188*685ec348STaniya Das 			.name = "gpu_cc_ahb_clk",
189*685ec348STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
190*685ec348STaniya Das 				&gpu_cc_hub_div_clk_src.clkr.hw,
191*685ec348STaniya Das 			},
192*685ec348STaniya Das 			.num_parents = 1,
193*685ec348STaniya Das 			.flags = CLK_SET_RATE_PARENT,
194*685ec348STaniya Das 			.ops = &clk_branch2_ops,
195*685ec348STaniya Das 		},
196*685ec348STaniya Das 	},
197*685ec348STaniya Das };
198*685ec348STaniya Das 
199*685ec348STaniya Das static struct clk_branch gpu_cc_cx_accu_shift_clk = {
200*685ec348STaniya Das 	.halt_reg = 0x9104,
201*685ec348STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
202*685ec348STaniya Das 	.clkr = {
203*685ec348STaniya Das 		.enable_reg = 0x9104,
204*685ec348STaniya Das 		.enable_mask = BIT(0),
205*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
206*685ec348STaniya Das 			.name = "gpu_cc_cx_accu_shift_clk",
207*685ec348STaniya Das 			.ops = &clk_branch2_ops,
208*685ec348STaniya Das 		},
209*685ec348STaniya Das 	},
210*685ec348STaniya Das };
211*685ec348STaniya Das 
212*685ec348STaniya Das static struct clk_branch gpu_cc_cx_gmu_clk = {
213*685ec348STaniya Das 	.halt_reg = 0x90d4,
214*685ec348STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
215*685ec348STaniya Das 	.clkr = {
216*685ec348STaniya Das 		.enable_reg = 0x90d4,
217*685ec348STaniya Das 		.enable_mask = BIT(0),
218*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
219*685ec348STaniya Das 			.name = "gpu_cc_cx_gmu_clk",
220*685ec348STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
221*685ec348STaniya Das 				&gpu_cc_gmu_clk_src.clkr.hw,
222*685ec348STaniya Das 			},
223*685ec348STaniya Das 			.num_parents = 1,
224*685ec348STaniya Das 			.flags = CLK_SET_RATE_PARENT,
225*685ec348STaniya Das 			.ops = &clk_branch2_aon_ops,
226*685ec348STaniya Das 		},
227*685ec348STaniya Das 	},
228*685ec348STaniya Das };
229*685ec348STaniya Das 
230*685ec348STaniya Das static struct clk_branch gpu_cc_cxo_clk = {
231*685ec348STaniya Das 	.halt_reg = 0x90e4,
232*685ec348STaniya Das 	.halt_check = BRANCH_HALT,
233*685ec348STaniya Das 	.clkr = {
234*685ec348STaniya Das 		.enable_reg = 0x90e4,
235*685ec348STaniya Das 		.enable_mask = BIT(0),
236*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
237*685ec348STaniya Das 			.name = "gpu_cc_cxo_clk",
238*685ec348STaniya Das 			.ops = &clk_branch2_aon_ops,
239*685ec348STaniya Das 		},
240*685ec348STaniya Das 	},
241*685ec348STaniya Das };
242*685ec348STaniya Das 
243*685ec348STaniya Das static struct clk_branch gpu_cc_demet_clk = {
244*685ec348STaniya Das 	.halt_reg = 0x9010,
245*685ec348STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
246*685ec348STaniya Das 	.clkr = {
247*685ec348STaniya Das 		.enable_reg = 0x9010,
248*685ec348STaniya Das 		.enable_mask = BIT(0),
249*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
250*685ec348STaniya Das 			.name = "gpu_cc_demet_clk",
251*685ec348STaniya Das 			.ops = &clk_branch2_ops,
252*685ec348STaniya Das 		},
253*685ec348STaniya Das 	},
254*685ec348STaniya Das };
255*685ec348STaniya Das 
256*685ec348STaniya Das static struct clk_branch gpu_cc_dpm_clk = {
257*685ec348STaniya Das 	.halt_reg = 0x9108,
258*685ec348STaniya Das 	.halt_check = BRANCH_HALT,
259*685ec348STaniya Das 	.clkr = {
260*685ec348STaniya Das 		.enable_reg = 0x9108,
261*685ec348STaniya Das 		.enable_mask = BIT(0),
262*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
263*685ec348STaniya Das 			.name = "gpu_cc_dpm_clk",
264*685ec348STaniya Das 			.ops = &clk_branch2_ops,
265*685ec348STaniya Das 		},
266*685ec348STaniya Das 	},
267*685ec348STaniya Das };
268*685ec348STaniya Das 
269*685ec348STaniya Das static struct clk_branch gpu_cc_freq_measure_clk = {
270*685ec348STaniya Das 	.halt_reg = 0x900c,
271*685ec348STaniya Das 	.halt_check = BRANCH_HALT,
272*685ec348STaniya Das 	.clkr = {
273*685ec348STaniya Das 		.enable_reg = 0x900c,
274*685ec348STaniya Das 		.enable_mask = BIT(0),
275*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
276*685ec348STaniya Das 			.name = "gpu_cc_freq_measure_clk",
277*685ec348STaniya Das 			.ops = &clk_branch2_ops,
278*685ec348STaniya Das 		},
279*685ec348STaniya Das 	},
280*685ec348STaniya Das };
281*685ec348STaniya Das 
282*685ec348STaniya Das static struct clk_branch gpu_cc_gpu_smmu_vote_clk = {
283*685ec348STaniya Das 	.halt_reg = 0x7000,
284*685ec348STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
285*685ec348STaniya Das 	.clkr = {
286*685ec348STaniya Das 		.enable_reg = 0x7000,
287*685ec348STaniya Das 		.enable_mask = BIT(0),
288*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
289*685ec348STaniya Das 			.name = "gpu_cc_gpu_smmu_vote_clk",
290*685ec348STaniya Das 			.ops = &clk_branch2_ops,
291*685ec348STaniya Das 		},
292*685ec348STaniya Das 	},
293*685ec348STaniya Das };
294*685ec348STaniya Das 
295*685ec348STaniya Das static struct clk_branch gpu_cc_gx_accu_shift_clk = {
296*685ec348STaniya Das 	.halt_reg = 0x9070,
297*685ec348STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
298*685ec348STaniya Das 	.clkr = {
299*685ec348STaniya Das 		.enable_reg = 0x9070,
300*685ec348STaniya Das 		.enable_mask = BIT(0),
301*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
302*685ec348STaniya Das 			.name = "gpu_cc_gx_accu_shift_clk",
303*685ec348STaniya Das 			.ops = &clk_branch2_ops,
304*685ec348STaniya Das 		},
305*685ec348STaniya Das 	},
306*685ec348STaniya Das };
307*685ec348STaniya Das 
308*685ec348STaniya Das static struct clk_branch gpu_cc_gx_gmu_clk = {
309*685ec348STaniya Das 	.halt_reg = 0x9060,
310*685ec348STaniya Das 	.halt_check = BRANCH_HALT,
311*685ec348STaniya Das 	.clkr = {
312*685ec348STaniya Das 		.enable_reg = 0x9060,
313*685ec348STaniya Das 		.enable_mask = BIT(0),
314*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
315*685ec348STaniya Das 			.name = "gpu_cc_gx_gmu_clk",
316*685ec348STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
317*685ec348STaniya Das 				&gpu_cc_gmu_clk_src.clkr.hw,
318*685ec348STaniya Das 			},
319*685ec348STaniya Das 			.num_parents = 1,
320*685ec348STaniya Das 			.flags = CLK_SET_RATE_PARENT,
321*685ec348STaniya Das 			.ops = &clk_branch2_ops,
322*685ec348STaniya Das 		},
323*685ec348STaniya Das 	},
324*685ec348STaniya Das };
325*685ec348STaniya Das 
326*685ec348STaniya Das static struct clk_branch gpu_cc_hub_aon_clk = {
327*685ec348STaniya Das 	.halt_reg = 0x93ec,
328*685ec348STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
329*685ec348STaniya Das 	.clkr = {
330*685ec348STaniya Das 		.enable_reg = 0x93ec,
331*685ec348STaniya Das 		.enable_mask = BIT(0),
332*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
333*685ec348STaniya Das 			.name = "gpu_cc_hub_aon_clk",
334*685ec348STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
335*685ec348STaniya Das 				&gpu_cc_hub_clk_src.clkr.hw,
336*685ec348STaniya Das 			},
337*685ec348STaniya Das 			.num_parents = 1,
338*685ec348STaniya Das 			.flags = CLK_SET_RATE_PARENT,
339*685ec348STaniya Das 			.ops = &clk_branch2_aon_ops,
340*685ec348STaniya Das 		},
341*685ec348STaniya Das 	},
342*685ec348STaniya Das };
343*685ec348STaniya Das 
344*685ec348STaniya Das static struct clk_branch gpu_cc_hub_cx_int_clk = {
345*685ec348STaniya Das 	.halt_reg = 0x90e8,
346*685ec348STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
347*685ec348STaniya Das 	.clkr = {
348*685ec348STaniya Das 		.enable_reg = 0x90e8,
349*685ec348STaniya Das 		.enable_mask = BIT(0),
350*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
351*685ec348STaniya Das 			.name = "gpu_cc_hub_cx_int_clk",
352*685ec348STaniya Das 			.parent_hws = (const struct clk_hw*[]) {
353*685ec348STaniya Das 				&gpu_cc_hub_clk_src.clkr.hw,
354*685ec348STaniya Das 			},
355*685ec348STaniya Das 			.num_parents = 1,
356*685ec348STaniya Das 			.flags = CLK_SET_RATE_PARENT,
357*685ec348STaniya Das 			.ops = &clk_branch2_aon_ops,
358*685ec348STaniya Das 		},
359*685ec348STaniya Das 	},
360*685ec348STaniya Das };
361*685ec348STaniya Das 
362*685ec348STaniya Das static struct clk_branch gpu_cc_memnoc_gfx_clk = {
363*685ec348STaniya Das 	.halt_reg = 0x90ec,
364*685ec348STaniya Das 	.halt_check = BRANCH_HALT_VOTED,
365*685ec348STaniya Das 	.clkr = {
366*685ec348STaniya Das 		.enable_reg = 0x90ec,
367*685ec348STaniya Das 		.enable_mask = BIT(0),
368*685ec348STaniya Das 		.hw.init = &(const struct clk_init_data) {
369*685ec348STaniya Das 			.name = "gpu_cc_memnoc_gfx_clk",
370*685ec348STaniya Das 			.ops = &clk_branch2_ops,
371*685ec348STaniya Das 		},
372*685ec348STaniya Das 	},
373*685ec348STaniya Das };
374*685ec348STaniya Das 
375*685ec348STaniya Das static struct gdsc gpu_cc_cx_gdsc = {
376*685ec348STaniya Das 	.gdscr = 0x9080,
377*685ec348STaniya Das 	.gds_hw_ctrl = 0x9094,
378*685ec348STaniya Das 	.en_rest_wait_val = 0x2,
379*685ec348STaniya Das 	.en_few_wait_val = 0x2,
380*685ec348STaniya Das 	.clk_dis_wait_val = 0x8,
381*685ec348STaniya Das 	.pd = {
382*685ec348STaniya Das 		.name = "gpu_cc_cx_gdsc",
383*685ec348STaniya Das 	},
384*685ec348STaniya Das 	.pwrsts = PWRSTS_OFF_ON,
385*685ec348STaniya Das 	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
386*685ec348STaniya Das };
387*685ec348STaniya Das 
388*685ec348STaniya Das static struct clk_regmap *gpu_cc_kaanapali_clocks[] = {
389*685ec348STaniya Das 	[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
390*685ec348STaniya Das 	[GPU_CC_CX_ACCU_SHIFT_CLK] = &gpu_cc_cx_accu_shift_clk.clkr,
391*685ec348STaniya Das 	[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
392*685ec348STaniya Das 	[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
393*685ec348STaniya Das 	[GPU_CC_DEMET_CLK] = &gpu_cc_demet_clk.clkr,
394*685ec348STaniya Das 	[GPU_CC_DPM_CLK] = &gpu_cc_dpm_clk.clkr,
395*685ec348STaniya Das 	[GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_clk.clkr,
396*685ec348STaniya Das 	[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
397*685ec348STaniya Das 	[GPU_CC_GPU_SMMU_VOTE_CLK] = &gpu_cc_gpu_smmu_vote_clk.clkr,
398*685ec348STaniya Das 	[GPU_CC_GX_ACCU_SHIFT_CLK] = &gpu_cc_gx_accu_shift_clk.clkr,
399*685ec348STaniya Das 	[GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr,
400*685ec348STaniya Das 	[GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
401*685ec348STaniya Das 	[GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
402*685ec348STaniya Das 	[GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
403*685ec348STaniya Das 	[GPU_CC_HUB_DIV_CLK_SRC] = &gpu_cc_hub_div_clk_src.clkr,
404*685ec348STaniya Das 	[GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr,
405*685ec348STaniya Das 	[GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
406*685ec348STaniya Das 	[GPU_CC_PLL0_OUT_EVEN] = &gpu_cc_pll0_out_even.clkr,
407*685ec348STaniya Das };
408*685ec348STaniya Das 
409*685ec348STaniya Das static struct gdsc *gpu_cc_kaanapali_gdscs[] = {
410*685ec348STaniya Das 	[GPU_CC_CX_GDSC] = &gpu_cc_cx_gdsc,
411*685ec348STaniya Das };
412*685ec348STaniya Das 
413*685ec348STaniya Das static const struct qcom_reset_map gpu_cc_kaanapali_resets[] = {
414*685ec348STaniya Das 	[GPU_CC_CB_BCR] = { 0x93a0 },
415*685ec348STaniya Das 	[GPU_CC_CX_BCR] = { 0x907c },
416*685ec348STaniya Das 	[GPU_CC_FAST_HUB_BCR] = { 0x93e4 },
417*685ec348STaniya Das 	[GPU_CC_FF_BCR] = { 0x9470 },
418*685ec348STaniya Das 	[GPU_CC_GMU_BCR] = { 0x9314 },
419*685ec348STaniya Das 	[GPU_CC_GX_BCR] = { 0x905c },
420*685ec348STaniya Das 	[GPU_CC_XO_BCR] = { 0x9000 },
421*685ec348STaniya Das };
422*685ec348STaniya Das 
423*685ec348STaniya Das static struct clk_alpha_pll *gpu_cc_kaanapali_plls[] = {
424*685ec348STaniya Das 	&gpu_cc_pll0,
425*685ec348STaniya Das };
426*685ec348STaniya Das 
427*685ec348STaniya Das static u32 gpu_cc_kaanapali_critical_cbcrs[] = {
428*685ec348STaniya Das 	0x9008, /* GPU_CC_CXO_AON_CLK */
429*685ec348STaniya Das 	0x93e8, /* GPU_CC_RSCC_HUB_AON_CLK */
430*685ec348STaniya Das 	0x9004, /* GPU_CC_RSCC_XO_AON_CLK */
431*685ec348STaniya Das };
432*685ec348STaniya Das 
433*685ec348STaniya Das static const struct regmap_config gpu_cc_kaanapali_regmap_config = {
434*685ec348STaniya Das 	.reg_bits = 32,
435*685ec348STaniya Das 	.reg_stride = 4,
436*685ec348STaniya Das 	.val_bits = 32,
437*685ec348STaniya Das 	.max_register = 0x95e8,
438*685ec348STaniya Das 	.fast_io = true,
439*685ec348STaniya Das };
440*685ec348STaniya Das 
441*685ec348STaniya Das static struct qcom_cc_driver_data gpu_cc_kaanapali_driver_data = {
442*685ec348STaniya Das 	.alpha_plls = gpu_cc_kaanapali_plls,
443*685ec348STaniya Das 	.num_alpha_plls = ARRAY_SIZE(gpu_cc_kaanapali_plls),
444*685ec348STaniya Das 	.clk_cbcrs = gpu_cc_kaanapali_critical_cbcrs,
445*685ec348STaniya Das 	.num_clk_cbcrs = ARRAY_SIZE(gpu_cc_kaanapali_critical_cbcrs),
446*685ec348STaniya Das };
447*685ec348STaniya Das 
448*685ec348STaniya Das static const struct qcom_cc_desc gpu_cc_kaanapali_desc = {
449*685ec348STaniya Das 	.config = &gpu_cc_kaanapali_regmap_config,
450*685ec348STaniya Das 	.clks = gpu_cc_kaanapali_clocks,
451*685ec348STaniya Das 	.num_clks = ARRAY_SIZE(gpu_cc_kaanapali_clocks),
452*685ec348STaniya Das 	.resets = gpu_cc_kaanapali_resets,
453*685ec348STaniya Das 	.num_resets = ARRAY_SIZE(gpu_cc_kaanapali_resets),
454*685ec348STaniya Das 	.gdscs = gpu_cc_kaanapali_gdscs,
455*685ec348STaniya Das 	.num_gdscs = ARRAY_SIZE(gpu_cc_kaanapali_gdscs),
456*685ec348STaniya Das 	.use_rpm = true,
457*685ec348STaniya Das 	.driver_data = &gpu_cc_kaanapali_driver_data,
458*685ec348STaniya Das };
459*685ec348STaniya Das 
460*685ec348STaniya Das static const struct of_device_id gpu_cc_kaanapali_match_table[] = {
461*685ec348STaniya Das 	{ .compatible = "qcom,kaanapali-gpucc" },
462*685ec348STaniya Das 	{ }
463*685ec348STaniya Das };
464*685ec348STaniya Das MODULE_DEVICE_TABLE(of, gpu_cc_kaanapali_match_table);
465*685ec348STaniya Das 
466*685ec348STaniya Das static int gpu_cc_kaanapali_probe(struct platform_device *pdev)
467*685ec348STaniya Das {
468*685ec348STaniya Das 	return qcom_cc_probe(pdev, &gpu_cc_kaanapali_desc);
469*685ec348STaniya Das }
470*685ec348STaniya Das 
471*685ec348STaniya Das static struct platform_driver gpu_cc_kaanapali_driver = {
472*685ec348STaniya Das 	.probe = gpu_cc_kaanapali_probe,
473*685ec348STaniya Das 	.driver = {
474*685ec348STaniya Das 		.name = "gpucc-kaanapali",
475*685ec348STaniya Das 		.of_match_table = gpu_cc_kaanapali_match_table,
476*685ec348STaniya Das 	},
477*685ec348STaniya Das };
478*685ec348STaniya Das 
479*685ec348STaniya Das module_platform_driver(gpu_cc_kaanapali_driver);
480*685ec348STaniya Das 
481*685ec348STaniya Das MODULE_DESCRIPTION("QTI GPUCC Kaanapali Driver");
482*685ec348STaniya Das MODULE_LICENSE("GPL");
483