xref: /openbmc/linux/drivers/clk/qcom/gpucc-sm6115.c (revision a96cbb14)
1092209f1SKonrad Dybcio // SPDX-License-Identifier: GPL-2.0-only
2092209f1SKonrad Dybcio /*
3092209f1SKonrad Dybcio  * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
4092209f1SKonrad Dybcio  * Copyright (c) 2023, Linaro Limited
5092209f1SKonrad Dybcio  */
6092209f1SKonrad Dybcio 
7092209f1SKonrad Dybcio #include <linux/clk-provider.h>
8*a96cbb14SRob Herring #include <linux/mod_devicetable.h>
9092209f1SKonrad Dybcio #include <linux/module.h>
10*a96cbb14SRob Herring #include <linux/platform_device.h>
11092209f1SKonrad Dybcio #include <linux/regmap.h>
12092209f1SKonrad Dybcio 
13092209f1SKonrad Dybcio #include <dt-bindings/clock/qcom,sm6115-gpucc.h>
14092209f1SKonrad Dybcio 
15092209f1SKonrad Dybcio #include "clk-alpha-pll.h"
16092209f1SKonrad Dybcio #include "clk-branch.h"
17092209f1SKonrad Dybcio #include "clk-rcg.h"
18092209f1SKonrad Dybcio #include "clk-regmap.h"
19092209f1SKonrad Dybcio #include "clk-regmap-divider.h"
20092209f1SKonrad Dybcio #include "clk-regmap-mux.h"
21092209f1SKonrad Dybcio #include "clk-regmap-phy-mux.h"
22092209f1SKonrad Dybcio #include "gdsc.h"
23092209f1SKonrad Dybcio #include "reset.h"
24092209f1SKonrad Dybcio 
25092209f1SKonrad Dybcio enum {
26092209f1SKonrad Dybcio 	DT_BI_TCXO,
27092209f1SKonrad Dybcio 	DT_GCC_GPU_GPLL0_CLK_SRC,
28092209f1SKonrad Dybcio 	DT_GCC_GPU_GPLL0_DIV_CLK_SRC,
29092209f1SKonrad Dybcio };
30092209f1SKonrad Dybcio 
31092209f1SKonrad Dybcio enum {
32092209f1SKonrad Dybcio 	P_BI_TCXO,
33092209f1SKonrad Dybcio 	P_GPLL0_OUT_MAIN,
34092209f1SKonrad Dybcio 	P_GPLL0_OUT_MAIN_DIV,
35092209f1SKonrad Dybcio 	P_GPU_CC_PLL0_OUT_AUX2,
36092209f1SKonrad Dybcio 	P_GPU_CC_PLL0_OUT_MAIN,
37092209f1SKonrad Dybcio 	P_GPU_CC_PLL1_OUT_AUX,
38092209f1SKonrad Dybcio 	P_GPU_CC_PLL1_OUT_MAIN,
39092209f1SKonrad Dybcio };
40092209f1SKonrad Dybcio 
41092209f1SKonrad Dybcio static struct pll_vco default_vco[] = {
42092209f1SKonrad Dybcio 	{ 1000000000, 2000000000, 0 },
43092209f1SKonrad Dybcio };
44092209f1SKonrad Dybcio 
45092209f1SKonrad Dybcio static struct pll_vco pll1_vco[] = {
46092209f1SKonrad Dybcio 	{ 500000000, 1000000000, 2 },
47092209f1SKonrad Dybcio };
48092209f1SKonrad Dybcio 
49092209f1SKonrad Dybcio static const struct alpha_pll_config gpu_cc_pll0_config = {
50092209f1SKonrad Dybcio 	.l = 0x3e,
51092209f1SKonrad Dybcio 	.alpha = 0,
52092209f1SKonrad Dybcio 	.alpha_hi = 0x80,
53092209f1SKonrad Dybcio 	.vco_val = 0x0 << 20,
54092209f1SKonrad Dybcio 	.vco_mask = GENMASK(21, 20),
55092209f1SKonrad Dybcio 	.alpha_en_mask = BIT(24),
56092209f1SKonrad Dybcio 	.main_output_mask = BIT(0),
57092209f1SKonrad Dybcio 	.aux_output_mask = BIT(1),
58092209f1SKonrad Dybcio 	.aux2_output_mask = BIT(2),
59092209f1SKonrad Dybcio 	.config_ctl_val = 0x4001055b,
60092209f1SKonrad Dybcio 	.test_ctl_hi1_val = 0x1,
61092209f1SKonrad Dybcio };
62092209f1SKonrad Dybcio 
63092209f1SKonrad Dybcio /* 1200MHz configuration */
64092209f1SKonrad Dybcio static struct clk_alpha_pll gpu_cc_pll0 = {
65092209f1SKonrad Dybcio 	.offset = 0x0,
66092209f1SKonrad Dybcio 	.vco_table = default_vco,
67092209f1SKonrad Dybcio 	.num_vco = ARRAY_SIZE(default_vco),
68092209f1SKonrad Dybcio 	.flags = SUPPORTS_DYNAMIC_UPDATE,
69092209f1SKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
70092209f1SKonrad Dybcio 	.clkr = {
71092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
72092209f1SKonrad Dybcio 			.name = "gpu_cc_pll0",
73092209f1SKonrad Dybcio 			.parent_data = &(const struct clk_parent_data){
74092209f1SKonrad Dybcio 				.index = DT_BI_TCXO,
75092209f1SKonrad Dybcio 			},
76092209f1SKonrad Dybcio 			.num_parents = 1,
77092209f1SKonrad Dybcio 			.ops = &clk_alpha_pll_ops,
78092209f1SKonrad Dybcio 		},
79092209f1SKonrad Dybcio 	},
80092209f1SKonrad Dybcio };
81092209f1SKonrad Dybcio 
82092209f1SKonrad Dybcio static const struct clk_div_table post_div_table_gpu_cc_pll0_out_aux2[] = {
83092209f1SKonrad Dybcio 	{ 0x0, 1 },
84092209f1SKonrad Dybcio 	{ }
85092209f1SKonrad Dybcio };
86092209f1SKonrad Dybcio 
87092209f1SKonrad Dybcio static struct clk_alpha_pll_postdiv gpu_cc_pll0_out_aux2 = {
88092209f1SKonrad Dybcio 	.offset = 0x0,
89092209f1SKonrad Dybcio 	.post_div_shift = 8,
90092209f1SKonrad Dybcio 	.post_div_table = post_div_table_gpu_cc_pll0_out_aux2,
91092209f1SKonrad Dybcio 	.num_post_div = ARRAY_SIZE(post_div_table_gpu_cc_pll0_out_aux2),
92092209f1SKonrad Dybcio 	.width = 4,
93092209f1SKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
94092209f1SKonrad Dybcio 	.clkr.hw.init = &(struct clk_init_data){
95092209f1SKonrad Dybcio 		.name = "gpu_cc_pll0_out_aux2",
96092209f1SKonrad Dybcio 		.parent_hws = (const struct clk_hw*[]) {
97092209f1SKonrad Dybcio 			&gpu_cc_pll0.clkr.hw,
98092209f1SKonrad Dybcio 		},
99092209f1SKonrad Dybcio 		.num_parents = 1,
100092209f1SKonrad Dybcio 		.flags = CLK_SET_RATE_PARENT,
101092209f1SKonrad Dybcio 		.ops = &clk_alpha_pll_postdiv_ops,
102092209f1SKonrad Dybcio 	},
103092209f1SKonrad Dybcio };
104092209f1SKonrad Dybcio 
105092209f1SKonrad Dybcio /* 640MHz configuration */
106092209f1SKonrad Dybcio static const struct alpha_pll_config gpu_cc_pll1_config = {
107092209f1SKonrad Dybcio 	.l = 0x21,
108092209f1SKonrad Dybcio 	.alpha = 0x55555555,
109092209f1SKonrad Dybcio 	.alpha_hi = 0x55,
110092209f1SKonrad Dybcio 	.alpha_en_mask = BIT(24),
111092209f1SKonrad Dybcio 	.vco_val = 0x2 << 20,
112092209f1SKonrad Dybcio 	.vco_mask = GENMASK(21, 20),
113092209f1SKonrad Dybcio 	.main_output_mask = BIT(0),
114092209f1SKonrad Dybcio 	.aux_output_mask = BIT(1),
115092209f1SKonrad Dybcio 	.config_ctl_val = 0x4001055b,
116092209f1SKonrad Dybcio 	.test_ctl_hi1_val = 0x1,
117092209f1SKonrad Dybcio };
118092209f1SKonrad Dybcio 
119092209f1SKonrad Dybcio static struct clk_alpha_pll gpu_cc_pll1 = {
120092209f1SKonrad Dybcio 	.offset = 0x100,
121092209f1SKonrad Dybcio 	.vco_table = pll1_vco,
122092209f1SKonrad Dybcio 	.num_vco = ARRAY_SIZE(pll1_vco),
123092209f1SKonrad Dybcio 	.flags = SUPPORTS_DYNAMIC_UPDATE,
124092209f1SKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
125092209f1SKonrad Dybcio 	.clkr = {
126092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
127092209f1SKonrad Dybcio 			.name = "gpu_cc_pll1",
128092209f1SKonrad Dybcio 			.parent_data = &(const struct clk_parent_data){
129092209f1SKonrad Dybcio 				.index = DT_BI_TCXO,
130092209f1SKonrad Dybcio 			},
131092209f1SKonrad Dybcio 			.num_parents = 1,
132092209f1SKonrad Dybcio 			.ops = &clk_alpha_pll_ops,
133092209f1SKonrad Dybcio 		},
134092209f1SKonrad Dybcio 	},
135092209f1SKonrad Dybcio };
136092209f1SKonrad Dybcio 
137092209f1SKonrad Dybcio static const struct clk_div_table post_div_table_gpu_cc_pll1_out_aux[] = {
138092209f1SKonrad Dybcio 	{ 0x0, 1 },
139092209f1SKonrad Dybcio 	{ }
140092209f1SKonrad Dybcio };
141092209f1SKonrad Dybcio 
142092209f1SKonrad Dybcio static struct clk_alpha_pll_postdiv gpu_cc_pll1_out_aux = {
143092209f1SKonrad Dybcio 	.offset = 0x100,
144092209f1SKonrad Dybcio 	.post_div_shift = 15,
145092209f1SKonrad Dybcio 	.post_div_table = post_div_table_gpu_cc_pll1_out_aux,
146092209f1SKonrad Dybcio 	.num_post_div = ARRAY_SIZE(post_div_table_gpu_cc_pll1_out_aux),
147092209f1SKonrad Dybcio 	.width = 3,
148092209f1SKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
149092209f1SKonrad Dybcio 	.clkr.hw.init = &(struct clk_init_data){
150092209f1SKonrad Dybcio 		.name = "gpu_cc_pll1_out_aux",
151092209f1SKonrad Dybcio 		.parent_hws = (const struct clk_hw*[]) {
152092209f1SKonrad Dybcio 			&gpu_cc_pll1.clkr.hw,
153092209f1SKonrad Dybcio 		},
154092209f1SKonrad Dybcio 		.num_parents = 1,
155092209f1SKonrad Dybcio 		.flags = CLK_SET_RATE_PARENT,
156092209f1SKonrad Dybcio 		.ops = &clk_alpha_pll_postdiv_ops,
157092209f1SKonrad Dybcio 	},
158092209f1SKonrad Dybcio };
159092209f1SKonrad Dybcio 
160092209f1SKonrad Dybcio static const struct parent_map gpu_cc_parent_map_0[] = {
161092209f1SKonrad Dybcio 	{ P_BI_TCXO, 0 },
162092209f1SKonrad Dybcio 	{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
163092209f1SKonrad Dybcio 	{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
164092209f1SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN, 5 },
165092209f1SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN_DIV, 6 },
166092209f1SKonrad Dybcio };
167092209f1SKonrad Dybcio 
168092209f1SKonrad Dybcio static const struct clk_parent_data gpu_cc_parent_data_0[] = {
169092209f1SKonrad Dybcio 	{ .index = P_BI_TCXO },
170092209f1SKonrad Dybcio 	{ .hw = &gpu_cc_pll0.clkr.hw },
171092209f1SKonrad Dybcio 	{ .hw = &gpu_cc_pll1.clkr.hw },
172092209f1SKonrad Dybcio 	{ .index = DT_GCC_GPU_GPLL0_CLK_SRC },
173092209f1SKonrad Dybcio 	{ .index = DT_GCC_GPU_GPLL0_DIV_CLK_SRC },
174092209f1SKonrad Dybcio };
175092209f1SKonrad Dybcio 
176092209f1SKonrad Dybcio static const struct parent_map gpu_cc_parent_map_1[] = {
177092209f1SKonrad Dybcio 	{ P_BI_TCXO, 0 },
178092209f1SKonrad Dybcio 	{ P_GPU_CC_PLL0_OUT_AUX2, 2 },
179092209f1SKonrad Dybcio 	{ P_GPU_CC_PLL1_OUT_AUX, 3 },
180092209f1SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN, 5 },
181092209f1SKonrad Dybcio };
182092209f1SKonrad Dybcio 
183092209f1SKonrad Dybcio static const struct clk_parent_data gpu_cc_parent_data_1[] = {
184092209f1SKonrad Dybcio 	{ .index = P_BI_TCXO },
185092209f1SKonrad Dybcio 	{ .hw = &gpu_cc_pll0_out_aux2.clkr.hw },
186092209f1SKonrad Dybcio 	{ .hw = &gpu_cc_pll1_out_aux.clkr.hw },
187092209f1SKonrad Dybcio 	{ .index = DT_GCC_GPU_GPLL0_CLK_SRC },
188092209f1SKonrad Dybcio };
189092209f1SKonrad Dybcio 
190092209f1SKonrad Dybcio static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
191092209f1SKonrad Dybcio 	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
192092209f1SKonrad Dybcio 	{ }
193092209f1SKonrad Dybcio };
194092209f1SKonrad Dybcio 
195092209f1SKonrad Dybcio static struct clk_rcg2 gpu_cc_gmu_clk_src = {
196092209f1SKonrad Dybcio 	.cmd_rcgr = 0x1120,
197092209f1SKonrad Dybcio 	.mnd_width = 0,
198092209f1SKonrad Dybcio 	.hid_width = 5,
199092209f1SKonrad Dybcio 	.parent_map = gpu_cc_parent_map_0,
200092209f1SKonrad Dybcio 	.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
201092209f1SKonrad Dybcio 	.clkr.hw.init = &(struct clk_init_data){
202092209f1SKonrad Dybcio 		.name = "gpu_cc_gmu_clk_src",
203092209f1SKonrad Dybcio 		.parent_data = gpu_cc_parent_data_0,
204092209f1SKonrad Dybcio 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
205092209f1SKonrad Dybcio 		.flags = CLK_SET_RATE_PARENT,
206092209f1SKonrad Dybcio 		.ops = &clk_rcg2_shared_ops,
207092209f1SKonrad Dybcio 	},
208092209f1SKonrad Dybcio };
209092209f1SKonrad Dybcio 
210092209f1SKonrad Dybcio static const struct freq_tbl ftbl_gpu_cc_gx_gfx3d_clk_src[] = {
211092209f1SKonrad Dybcio 	F(320000000, P_GPU_CC_PLL1_OUT_AUX, 2, 0, 0),
212092209f1SKonrad Dybcio 	F(465000000, P_GPU_CC_PLL1_OUT_AUX, 2, 0, 0),
213092209f1SKonrad Dybcio 	F(600000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
214092209f1SKonrad Dybcio 	F(745000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
215092209f1SKonrad Dybcio 	F(820000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
216092209f1SKonrad Dybcio 	F(900000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
217092209f1SKonrad Dybcio 	F(950000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
218092209f1SKonrad Dybcio 	F(980000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
219092209f1SKonrad Dybcio 	{ }
220092209f1SKonrad Dybcio };
221092209f1SKonrad Dybcio 
222092209f1SKonrad Dybcio static struct clk_rcg2 gpu_cc_gx_gfx3d_clk_src = {
223092209f1SKonrad Dybcio 	.cmd_rcgr = 0x101c,
224092209f1SKonrad Dybcio 	.mnd_width = 0,
225092209f1SKonrad Dybcio 	.hid_width = 5,
226092209f1SKonrad Dybcio 	.parent_map = gpu_cc_parent_map_1,
227092209f1SKonrad Dybcio 	.freq_tbl = ftbl_gpu_cc_gx_gfx3d_clk_src,
228092209f1SKonrad Dybcio 	.clkr.hw.init = &(struct clk_init_data){
229092209f1SKonrad Dybcio 		.name = "gpu_cc_gx_gfx3d_clk_src",
230092209f1SKonrad Dybcio 		.parent_data = gpu_cc_parent_data_1,
231092209f1SKonrad Dybcio 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
232092209f1SKonrad Dybcio 		.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
233092209f1SKonrad Dybcio 		.ops = &clk_rcg2_ops,
234092209f1SKonrad Dybcio 	},
235092209f1SKonrad Dybcio };
236092209f1SKonrad Dybcio 
237092209f1SKonrad Dybcio static struct clk_branch gpu_cc_ahb_clk = {
238092209f1SKonrad Dybcio 	.halt_reg = 0x1078,
239092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
240092209f1SKonrad Dybcio 	.clkr = {
241092209f1SKonrad Dybcio 		.enable_reg = 0x1078,
242092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
243092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
244092209f1SKonrad Dybcio 			.name = "gpu_cc_ahb_clk",
245092209f1SKonrad Dybcio 			.flags = CLK_IS_CRITICAL,
246092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
247092209f1SKonrad Dybcio 		},
248092209f1SKonrad Dybcio 	},
249092209f1SKonrad Dybcio };
250092209f1SKonrad Dybcio 
251092209f1SKonrad Dybcio static struct clk_branch gpu_cc_crc_ahb_clk = {
252092209f1SKonrad Dybcio 	.halt_reg = 0x107c,
253092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
254092209f1SKonrad Dybcio 	.clkr = {
255092209f1SKonrad Dybcio 		.enable_reg = 0x107c,
256092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
257092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
258092209f1SKonrad Dybcio 			.name = "gpu_cc_crc_ahb_clk",
259092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
260092209f1SKonrad Dybcio 		},
261092209f1SKonrad Dybcio 	},
262092209f1SKonrad Dybcio };
263092209f1SKonrad Dybcio 
264092209f1SKonrad Dybcio static struct clk_branch gpu_cc_cx_gfx3d_clk = {
265092209f1SKonrad Dybcio 	.halt_reg = 0x10a4,
266092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
267092209f1SKonrad Dybcio 	.clkr = {
268092209f1SKonrad Dybcio 		.enable_reg = 0x10a4,
269092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
270092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
271092209f1SKonrad Dybcio 			.name = "gpu_cc_cx_gfx3d_clk",
272092209f1SKonrad Dybcio 			.parent_data = &(const struct clk_parent_data){
273092209f1SKonrad Dybcio 				.hw = &gpu_cc_gx_gfx3d_clk_src.clkr.hw,
274092209f1SKonrad Dybcio 			},
275092209f1SKonrad Dybcio 			.num_parents = 1,
276092209f1SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
277092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
278092209f1SKonrad Dybcio 		},
279092209f1SKonrad Dybcio 	},
280092209f1SKonrad Dybcio };
281092209f1SKonrad Dybcio 
282092209f1SKonrad Dybcio static struct clk_branch gpu_cc_cx_gmu_clk = {
283092209f1SKonrad Dybcio 	.halt_reg = 0x1098,
284092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT,
285092209f1SKonrad Dybcio 	.clkr = {
286092209f1SKonrad Dybcio 		.enable_reg = 0x1098,
287092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
288092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
289092209f1SKonrad Dybcio 			.name = "gpu_cc_cx_gmu_clk",
290092209f1SKonrad Dybcio 			.parent_data = &(const struct clk_parent_data){
291092209f1SKonrad Dybcio 				.hw = &gpu_cc_gmu_clk_src.clkr.hw,
292092209f1SKonrad Dybcio 			},
293092209f1SKonrad Dybcio 			.num_parents = 1,
294092209f1SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
295092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
296092209f1SKonrad Dybcio 		},
297092209f1SKonrad Dybcio 	},
298092209f1SKonrad Dybcio };
299092209f1SKonrad Dybcio 
300092209f1SKonrad Dybcio static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
301092209f1SKonrad Dybcio 	.halt_reg = 0x108c,
302092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
303092209f1SKonrad Dybcio 	.clkr = {
304092209f1SKonrad Dybcio 		.enable_reg = 0x108c,
305092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
306092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
307092209f1SKonrad Dybcio 			.name = "gpu_cc_cx_snoc_dvm_clk",
308092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
309092209f1SKonrad Dybcio 		},
310092209f1SKonrad Dybcio 	},
311092209f1SKonrad Dybcio };
312092209f1SKonrad Dybcio 
313092209f1SKonrad Dybcio static struct clk_branch gpu_cc_cxo_aon_clk = {
314092209f1SKonrad Dybcio 	.halt_reg = 0x1004,
315092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
316092209f1SKonrad Dybcio 	.clkr = {
317092209f1SKonrad Dybcio 		.enable_reg = 0x1004,
318092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
319092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
320092209f1SKonrad Dybcio 			.name = "gpu_cc_cxo_aon_clk",
321092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
322092209f1SKonrad Dybcio 		},
323092209f1SKonrad Dybcio 	},
324092209f1SKonrad Dybcio };
325092209f1SKonrad Dybcio 
326092209f1SKonrad Dybcio static struct clk_branch gpu_cc_cxo_clk = {
327092209f1SKonrad Dybcio 	.halt_reg = 0x109c,
328092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT,
329092209f1SKonrad Dybcio 	.clkr = {
330092209f1SKonrad Dybcio 		.enable_reg = 0x109c,
331092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
332092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
333092209f1SKonrad Dybcio 			.name = "gpu_cc_cxo_clk",
334092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
335092209f1SKonrad Dybcio 		},
336092209f1SKonrad Dybcio 	},
337092209f1SKonrad Dybcio };
338092209f1SKonrad Dybcio 
339092209f1SKonrad Dybcio static struct clk_branch gpu_cc_gx_cxo_clk = {
340092209f1SKonrad Dybcio 	.halt_reg = 0x1060,
341092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
342092209f1SKonrad Dybcio 	.clkr = {
343092209f1SKonrad Dybcio 		.enable_reg = 0x1060,
344092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
345092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
346092209f1SKonrad Dybcio 			.name = "gpu_cc_gx_cxo_clk",
347092209f1SKonrad Dybcio 			.flags = CLK_IS_CRITICAL,
348092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
349092209f1SKonrad Dybcio 		},
350092209f1SKonrad Dybcio 	},
351092209f1SKonrad Dybcio };
352092209f1SKonrad Dybcio 
353092209f1SKonrad Dybcio static struct clk_branch gpu_cc_gx_gfx3d_clk = {
354092209f1SKonrad Dybcio 	.halt_reg = 0x1054,
355092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT_SKIP,
356092209f1SKonrad Dybcio 	.clkr = {
357092209f1SKonrad Dybcio 		.enable_reg = 0x1054,
358092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
359092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
360092209f1SKonrad Dybcio 			.name = "gpu_cc_gx_gfx3d_clk",
361092209f1SKonrad Dybcio 			.parent_data = &(const struct clk_parent_data){
362092209f1SKonrad Dybcio 				.hw = &gpu_cc_gx_gfx3d_clk_src.clkr.hw,
363092209f1SKonrad Dybcio 			},
364092209f1SKonrad Dybcio 			.num_parents = 1,
365092209f1SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
366092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
367092209f1SKonrad Dybcio 		},
368092209f1SKonrad Dybcio 	},
369092209f1SKonrad Dybcio };
370092209f1SKonrad Dybcio 
371092209f1SKonrad Dybcio static struct clk_branch gpu_cc_sleep_clk = {
372092209f1SKonrad Dybcio 	.halt_reg = 0x1090,
373092209f1SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
374092209f1SKonrad Dybcio 	.clkr = {
375092209f1SKonrad Dybcio 		.enable_reg = 0x1090,
376092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
377092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
378092209f1SKonrad Dybcio 			.name = "gpu_cc_sleep_clk",
379092209f1SKonrad Dybcio 			.ops = &clk_branch2_ops,
380092209f1SKonrad Dybcio 		},
381092209f1SKonrad Dybcio 	},
382092209f1SKonrad Dybcio };
383092209f1SKonrad Dybcio 
384092209f1SKonrad Dybcio static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
385092209f1SKonrad Dybcio 	.halt_reg = 0x5000,
386092209f1SKonrad Dybcio 	.halt_check = BRANCH_VOTED,
387092209f1SKonrad Dybcio 	.clkr = {
388092209f1SKonrad Dybcio 		.enable_reg = 0x5000,
389092209f1SKonrad Dybcio 		.enable_mask = BIT(0),
390092209f1SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
391092209f1SKonrad Dybcio 			 .name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
392092209f1SKonrad Dybcio 			 .ops = &clk_branch2_ops,
393092209f1SKonrad Dybcio 		},
394092209f1SKonrad Dybcio 	},
395092209f1SKonrad Dybcio };
396092209f1SKonrad Dybcio 
397092209f1SKonrad Dybcio static struct gdsc gpu_cx_gdsc = {
398092209f1SKonrad Dybcio 	.gdscr = 0x106c,
399092209f1SKonrad Dybcio 	.gds_hw_ctrl = 0x1540,
400092209f1SKonrad Dybcio 	.pd = {
401092209f1SKonrad Dybcio 		.name = "gpu_cx_gdsc",
402092209f1SKonrad Dybcio 	},
403092209f1SKonrad Dybcio 	.pwrsts = PWRSTS_OFF_ON,
404092209f1SKonrad Dybcio 	.flags = VOTABLE,
405092209f1SKonrad Dybcio };
406092209f1SKonrad Dybcio 
407092209f1SKonrad Dybcio static struct gdsc gpu_gx_gdsc = {
408092209f1SKonrad Dybcio 	.gdscr = 0x100c,
409092209f1SKonrad Dybcio 	.clamp_io_ctrl = 0x1508,
410092209f1SKonrad Dybcio 	.resets = (unsigned int []){ GPU_GX_BCR },
411092209f1SKonrad Dybcio 	.reset_count = 1,
412092209f1SKonrad Dybcio 	.pd = {
413092209f1SKonrad Dybcio 		.name = "gpu_gx_gdsc",
414092209f1SKonrad Dybcio 	},
415092209f1SKonrad Dybcio 	.parent = &gpu_cx_gdsc.pd,
416092209f1SKonrad Dybcio 	.pwrsts = PWRSTS_OFF_ON,
417092209f1SKonrad Dybcio 	.flags = CLAMP_IO | SW_RESET | VOTABLE,
418092209f1SKonrad Dybcio };
419092209f1SKonrad Dybcio 
420092209f1SKonrad Dybcio static struct clk_regmap *gpu_cc_sm6115_clocks[] = {
421092209f1SKonrad Dybcio 	[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
422092209f1SKonrad Dybcio 	[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
423092209f1SKonrad Dybcio 	[GPU_CC_CX_GFX3D_CLK] = &gpu_cc_cx_gfx3d_clk.clkr,
424092209f1SKonrad Dybcio 	[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
425092209f1SKonrad Dybcio 	[GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
426092209f1SKonrad Dybcio 	[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
427092209f1SKonrad Dybcio 	[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
428092209f1SKonrad Dybcio 	[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
429092209f1SKonrad Dybcio 	[GPU_CC_GX_CXO_CLK] = &gpu_cc_gx_cxo_clk.clkr,
430092209f1SKonrad Dybcio 	[GPU_CC_GX_GFX3D_CLK] = &gpu_cc_gx_gfx3d_clk.clkr,
431092209f1SKonrad Dybcio 	[GPU_CC_GX_GFX3D_CLK_SRC] = &gpu_cc_gx_gfx3d_clk_src.clkr,
432092209f1SKonrad Dybcio 	[GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
433092209f1SKonrad Dybcio 	[GPU_CC_PLL0_OUT_AUX2] = &gpu_cc_pll0_out_aux2.clkr,
434092209f1SKonrad Dybcio 	[GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
435092209f1SKonrad Dybcio 	[GPU_CC_PLL1_OUT_AUX] = &gpu_cc_pll1_out_aux.clkr,
436092209f1SKonrad Dybcio 	[GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
437092209f1SKonrad Dybcio 	[GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
438092209f1SKonrad Dybcio };
439092209f1SKonrad Dybcio 
440092209f1SKonrad Dybcio static const struct qcom_reset_map gpu_cc_sm6115_resets[] = {
441092209f1SKonrad Dybcio 	[GPU_GX_BCR] = { 0x1008 },
442092209f1SKonrad Dybcio };
443092209f1SKonrad Dybcio 
444092209f1SKonrad Dybcio static struct gdsc *gpu_cc_sm6115_gdscs[] = {
445092209f1SKonrad Dybcio 	[GPU_CX_GDSC] = &gpu_cx_gdsc,
446092209f1SKonrad Dybcio 	[GPU_GX_GDSC] = &gpu_gx_gdsc,
447092209f1SKonrad Dybcio };
448092209f1SKonrad Dybcio 
449092209f1SKonrad Dybcio static const struct regmap_config gpu_cc_sm6115_regmap_config = {
450092209f1SKonrad Dybcio 	.reg_bits = 32,
451092209f1SKonrad Dybcio 	.reg_stride = 4,
452092209f1SKonrad Dybcio 	.val_bits = 32,
453092209f1SKonrad Dybcio 	.max_register = 0x9000,
454092209f1SKonrad Dybcio 	.fast_io = true,
455092209f1SKonrad Dybcio };
456092209f1SKonrad Dybcio 
457092209f1SKonrad Dybcio static const struct qcom_cc_desc gpu_cc_sm6115_desc = {
458092209f1SKonrad Dybcio 	.config = &gpu_cc_sm6115_regmap_config,
459092209f1SKonrad Dybcio 	.clks = gpu_cc_sm6115_clocks,
460092209f1SKonrad Dybcio 	.num_clks = ARRAY_SIZE(gpu_cc_sm6115_clocks),
461092209f1SKonrad Dybcio 	.resets = gpu_cc_sm6115_resets,
462092209f1SKonrad Dybcio 	.num_resets = ARRAY_SIZE(gpu_cc_sm6115_resets),
463092209f1SKonrad Dybcio 	.gdscs = gpu_cc_sm6115_gdscs,
464092209f1SKonrad Dybcio 	.num_gdscs = ARRAY_SIZE(gpu_cc_sm6115_gdscs),
465092209f1SKonrad Dybcio };
466092209f1SKonrad Dybcio 
467092209f1SKonrad Dybcio static const struct of_device_id gpu_cc_sm6115_match_table[] = {
468092209f1SKonrad Dybcio 	{ .compatible = "qcom,sm6115-gpucc" },
469092209f1SKonrad Dybcio 	{ }
470092209f1SKonrad Dybcio };
471092209f1SKonrad Dybcio MODULE_DEVICE_TABLE(of, gpu_cc_sm6115_match_table);
472092209f1SKonrad Dybcio 
gpu_cc_sm6115_probe(struct platform_device * pdev)473092209f1SKonrad Dybcio static int gpu_cc_sm6115_probe(struct platform_device *pdev)
474092209f1SKonrad Dybcio {
475092209f1SKonrad Dybcio 	struct regmap *regmap;
476092209f1SKonrad Dybcio 
477092209f1SKonrad Dybcio 	regmap = qcom_cc_map(pdev, &gpu_cc_sm6115_desc);
478092209f1SKonrad Dybcio 	if (IS_ERR(regmap))
479092209f1SKonrad Dybcio 		return PTR_ERR(regmap);
480092209f1SKonrad Dybcio 
481092209f1SKonrad Dybcio 	clk_alpha_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
482092209f1SKonrad Dybcio 	clk_alpha_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
483092209f1SKonrad Dybcio 
484092209f1SKonrad Dybcio 	/* Set recommended WAKEUP/SLEEP settings for the gpu_cc_cx_gmu_clk */
485092209f1SKonrad Dybcio 	qcom_branch_set_wakeup(regmap, gpu_cc_cx_gmu_clk, 0xf);
486092209f1SKonrad Dybcio 	qcom_branch_set_sleep(regmap, gpu_cc_cx_gmu_clk, 0xf);
487092209f1SKonrad Dybcio 
488092209f1SKonrad Dybcio 	qcom_branch_set_force_mem_core(regmap, gpu_cc_gx_gfx3d_clk, true);
489092209f1SKonrad Dybcio 	qcom_branch_set_force_periph_on(regmap, gpu_cc_gx_gfx3d_clk, true);
490092209f1SKonrad Dybcio 
491092209f1SKonrad Dybcio 	return qcom_cc_really_probe(pdev, &gpu_cc_sm6115_desc, regmap);
492092209f1SKonrad Dybcio }
493092209f1SKonrad Dybcio 
494092209f1SKonrad Dybcio static struct platform_driver gpu_cc_sm6115_driver = {
495092209f1SKonrad Dybcio 	.probe = gpu_cc_sm6115_probe,
496092209f1SKonrad Dybcio 	.driver = {
497092209f1SKonrad Dybcio 		.name = "sm6115-gpucc",
498092209f1SKonrad Dybcio 		.of_match_table = gpu_cc_sm6115_match_table,
499092209f1SKonrad Dybcio 	},
500092209f1SKonrad Dybcio };
501092209f1SKonrad Dybcio module_platform_driver(gpu_cc_sm6115_driver);
502092209f1SKonrad Dybcio 
503092209f1SKonrad Dybcio MODULE_DESCRIPTION("QTI GPU_CC SM6115 Driver");
504092209f1SKonrad Dybcio MODULE_LICENSE("GPL");
505