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