xref: /openbmc/linux/drivers/clk/qcom/gpucc-sm6125.c (revision a96cbb14)
1a6b18286SKonrad Dybcio // SPDX-License-Identifier: GPL-2.0-only
2a6b18286SKonrad Dybcio /*
3a6b18286SKonrad Dybcio  * Copyright (c) 2019, The Linux Foundation. All rights reserved.
4a6b18286SKonrad Dybcio  * Copyright (c) 2023, Linaro Limited
5a6b18286SKonrad Dybcio  */
6a6b18286SKonrad Dybcio 
7a6b18286SKonrad Dybcio #include <linux/clk-provider.h>
8*a96cbb14SRob Herring #include <linux/mod_devicetable.h>
9a6b18286SKonrad Dybcio #include <linux/module.h>
10*a96cbb14SRob Herring #include <linux/platform_device.h>
11a6b18286SKonrad Dybcio #include <linux/regmap.h>
12a6b18286SKonrad Dybcio 
13a6b18286SKonrad Dybcio #include <dt-bindings/clock/qcom,sm6125-gpucc.h>
14a6b18286SKonrad Dybcio 
15a6b18286SKonrad Dybcio #include "clk-alpha-pll.h"
16a6b18286SKonrad Dybcio #include "clk-branch.h"
17a6b18286SKonrad Dybcio #include "clk-rcg.h"
18a6b18286SKonrad Dybcio #include "clk-regmap.h"
19a6b18286SKonrad Dybcio #include "clk-regmap-divider.h"
20a6b18286SKonrad Dybcio #include "clk-regmap-mux.h"
21a6b18286SKonrad Dybcio #include "clk-regmap-phy-mux.h"
22a6b18286SKonrad Dybcio #include "gdsc.h"
23a6b18286SKonrad Dybcio #include "reset.h"
24a6b18286SKonrad Dybcio 
25a6b18286SKonrad Dybcio enum {
26a6b18286SKonrad Dybcio 	DT_BI_TCXO,
27a6b18286SKonrad Dybcio 	DT_GCC_GPU_GPLL0_CLK_SRC,
28a6b18286SKonrad Dybcio };
29a6b18286SKonrad Dybcio 
30a6b18286SKonrad Dybcio enum {
31a6b18286SKonrad Dybcio 	P_BI_TCXO,
32a6b18286SKonrad Dybcio 	P_GPLL0_OUT_MAIN,
33a6b18286SKonrad Dybcio 	P_GPU_CC_PLL0_2X_CLK,
34a6b18286SKonrad Dybcio 	P_GPU_CC_PLL0_OUT_AUX2,
35a6b18286SKonrad Dybcio 	P_GPU_CC_PLL1_OUT_AUX,
36a6b18286SKonrad Dybcio 	P_GPU_CC_PLL1_OUT_AUX2,
37a6b18286SKonrad Dybcio };
38a6b18286SKonrad Dybcio 
39a6b18286SKonrad Dybcio static struct pll_vco gpu_cc_pll_vco[] = {
40a6b18286SKonrad Dybcio 	{ 1000000000, 2000000000, 0 },
41a6b18286SKonrad Dybcio 	{ 500000000,  1000000000, 2 },
42a6b18286SKonrad Dybcio };
43a6b18286SKonrad Dybcio 
44a6b18286SKonrad Dybcio /* 1020MHz configuration */
45a6b18286SKonrad Dybcio static const struct alpha_pll_config gpu_pll0_config = {
46a6b18286SKonrad Dybcio 	.l = 0x35,
47a6b18286SKonrad Dybcio 	.config_ctl_val = 0x4001055b,
48a6b18286SKonrad Dybcio 	.alpha_hi = 0x20,
49a6b18286SKonrad Dybcio 	.alpha = 0x00,
50a6b18286SKonrad Dybcio 	.alpha_en_mask = BIT(24),
51a6b18286SKonrad Dybcio 	.vco_val = 0x0 << 20,
52a6b18286SKonrad Dybcio 	.vco_mask = 0x3 << 20,
53a6b18286SKonrad Dybcio 	.aux2_output_mask = BIT(2),
54a6b18286SKonrad Dybcio };
55a6b18286SKonrad Dybcio 
56a6b18286SKonrad Dybcio /* 930MHz configuration */
57a6b18286SKonrad Dybcio static const struct alpha_pll_config gpu_pll1_config = {
58a6b18286SKonrad Dybcio 	.l = 0x30,
59a6b18286SKonrad Dybcio 	.config_ctl_val = 0x4001055b,
60a6b18286SKonrad Dybcio 	.alpha_hi = 0x70,
61a6b18286SKonrad Dybcio 	.alpha = 0x00,
62a6b18286SKonrad Dybcio 	.alpha_en_mask = BIT(24),
63a6b18286SKonrad Dybcio 	.vco_val = 0x2 << 20,
64a6b18286SKonrad Dybcio 	.vco_mask = 0x3 << 20,
65a6b18286SKonrad Dybcio 	.aux2_output_mask = BIT(2),
66a6b18286SKonrad Dybcio };
67a6b18286SKonrad Dybcio 
68a6b18286SKonrad Dybcio static struct clk_alpha_pll gpu_cc_pll0_out_aux2 = {
69a6b18286SKonrad Dybcio 	.offset = 0x0,
70a6b18286SKonrad Dybcio 	.vco_table = gpu_cc_pll_vco,
71a6b18286SKonrad Dybcio 	.num_vco = ARRAY_SIZE(gpu_cc_pll_vco),
72a6b18286SKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
73a6b18286SKonrad Dybcio 	.flags = SUPPORTS_DYNAMIC_UPDATE,
74a6b18286SKonrad Dybcio 	.clkr = {
75a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
76a6b18286SKonrad Dybcio 			.name = "gpu_cc_pll0_out_aux2",
77a6b18286SKonrad Dybcio 			.parent_data = &(const struct clk_parent_data) {
78a6b18286SKonrad Dybcio 				.index = DT_BI_TCXO,
79a6b18286SKonrad Dybcio 			},
80a6b18286SKonrad Dybcio 			.num_parents = 1,
81a6b18286SKonrad Dybcio 			.ops = &clk_alpha_pll_ops,
82a6b18286SKonrad Dybcio 		},
83a6b18286SKonrad Dybcio 	},
84a6b18286SKonrad Dybcio };
85a6b18286SKonrad Dybcio 
86a6b18286SKonrad Dybcio static struct clk_alpha_pll gpu_cc_pll1_out_aux2 = {
87a6b18286SKonrad Dybcio 	.offset = 0x100,
88a6b18286SKonrad Dybcio 	.vco_table = gpu_cc_pll_vco,
89a6b18286SKonrad Dybcio 	.num_vco = ARRAY_SIZE(gpu_cc_pll_vco),
90a6b18286SKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
91a6b18286SKonrad Dybcio 	.flags = SUPPORTS_DYNAMIC_UPDATE,
92a6b18286SKonrad Dybcio 	.clkr = {
93a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
94a6b18286SKonrad Dybcio 			.name = "gpu_cc_pll1_out_aux2",
95a6b18286SKonrad Dybcio 			.parent_data = &(const struct clk_parent_data) {
96a6b18286SKonrad Dybcio 				.index = DT_BI_TCXO,
97a6b18286SKonrad Dybcio 			},
98a6b18286SKonrad Dybcio 			.num_parents = 1,
99a6b18286SKonrad Dybcio 			.ops = &clk_alpha_pll_ops,
100a6b18286SKonrad Dybcio 		},
101a6b18286SKonrad Dybcio 	},
102a6b18286SKonrad Dybcio };
103a6b18286SKonrad Dybcio 
104a6b18286SKonrad Dybcio static const struct parent_map gpu_cc_parent_map_0[] = {
105a6b18286SKonrad Dybcio 	{ P_BI_TCXO, 0 },
106a6b18286SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN, 5 },
107a6b18286SKonrad Dybcio };
108a6b18286SKonrad Dybcio 
109a6b18286SKonrad Dybcio static const struct clk_parent_data gpu_cc_parent_data_0[] = {
110a6b18286SKonrad Dybcio 	{ .index = DT_BI_TCXO },
111a6b18286SKonrad Dybcio 	{ .index = DT_GCC_GPU_GPLL0_CLK_SRC },
112a6b18286SKonrad Dybcio };
113a6b18286SKonrad Dybcio 
114a6b18286SKonrad Dybcio static const struct parent_map gpu_cc_parent_map_1[] = {
115a6b18286SKonrad Dybcio 	{ P_BI_TCXO, 0 },
116a6b18286SKonrad Dybcio 	{ P_GPU_CC_PLL0_OUT_AUX2, 2 },
117a6b18286SKonrad Dybcio 	{ P_GPU_CC_PLL1_OUT_AUX2, 4 },
118a6b18286SKonrad Dybcio };
119a6b18286SKonrad Dybcio 
120a6b18286SKonrad Dybcio static const struct clk_parent_data gpu_cc_parent_data_1[] = {
121a6b18286SKonrad Dybcio 	{ .index = DT_BI_TCXO },
122a6b18286SKonrad Dybcio 	{ .hw = &gpu_cc_pll0_out_aux2.clkr.hw },
123a6b18286SKonrad Dybcio 	{ .hw = &gpu_cc_pll1_out_aux2.clkr.hw },
124a6b18286SKonrad Dybcio };
125a6b18286SKonrad Dybcio 
126a6b18286SKonrad Dybcio static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
127a6b18286SKonrad Dybcio 	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
128a6b18286SKonrad Dybcio 	{ }
129a6b18286SKonrad Dybcio };
130a6b18286SKonrad Dybcio 
131a6b18286SKonrad Dybcio static struct clk_rcg2 gpu_cc_gmu_clk_src = {
132a6b18286SKonrad Dybcio 	.cmd_rcgr = 0x1120,
133a6b18286SKonrad Dybcio 	.mnd_width = 0,
134a6b18286SKonrad Dybcio 	.hid_width = 5,
135a6b18286SKonrad Dybcio 	.parent_map = gpu_cc_parent_map_0,
136a6b18286SKonrad Dybcio 	.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
137a6b18286SKonrad Dybcio 	.clkr.hw.init = &(struct clk_init_data){
138a6b18286SKonrad Dybcio 		.name = "gpu_cc_gmu_clk_src",
139a6b18286SKonrad Dybcio 		.parent_data = gpu_cc_parent_data_0,
140a6b18286SKonrad Dybcio 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
141a6b18286SKonrad Dybcio 		.ops = &clk_rcg2_shared_ops,
142a6b18286SKonrad Dybcio 	},
143a6b18286SKonrad Dybcio };
144a6b18286SKonrad Dybcio 
145a6b18286SKonrad Dybcio static const struct freq_tbl ftbl_gpu_cc_gx_gfx3d_clk_src[] = {
146a6b18286SKonrad Dybcio 	F(320000000, P_GPU_CC_PLL1_OUT_AUX2, 2, 0, 0),
147a6b18286SKonrad Dybcio 	F(465000000, P_GPU_CC_PLL1_OUT_AUX2, 2, 0, 0),
148a6b18286SKonrad Dybcio 	F(600000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
149a6b18286SKonrad Dybcio 	F(745000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
150a6b18286SKonrad Dybcio 	F(820000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
151a6b18286SKonrad Dybcio 	F(900000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
152a6b18286SKonrad Dybcio 	F(950000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
153a6b18286SKonrad Dybcio 	{ }
154a6b18286SKonrad Dybcio };
155a6b18286SKonrad Dybcio 
156a6b18286SKonrad Dybcio static struct clk_rcg2 gpu_cc_gx_gfx3d_clk_src = {
157a6b18286SKonrad Dybcio 	.cmd_rcgr = 0x101c,
158a6b18286SKonrad Dybcio 	.mnd_width = 0,
159a6b18286SKonrad Dybcio 	.hid_width = 5,
160a6b18286SKonrad Dybcio 	.parent_map = gpu_cc_parent_map_1,
161a6b18286SKonrad Dybcio 	.freq_tbl = ftbl_gpu_cc_gx_gfx3d_clk_src,
162a6b18286SKonrad Dybcio 	.clkr.hw.init = &(struct clk_init_data){
163a6b18286SKonrad Dybcio 		.name = "gpu_cc_gx_gfx3d_clk_src",
164a6b18286SKonrad Dybcio 		.parent_data = gpu_cc_parent_data_1,
165a6b18286SKonrad Dybcio 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
166a6b18286SKonrad Dybcio 		.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
167a6b18286SKonrad Dybcio 		.ops = &clk_rcg2_ops,
168a6b18286SKonrad Dybcio 	},
169a6b18286SKonrad Dybcio };
170a6b18286SKonrad Dybcio 
171a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_crc_ahb_clk = {
172a6b18286SKonrad Dybcio 	.halt_reg = 0x107c,
173a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
174a6b18286SKonrad Dybcio 	.clkr = {
175a6b18286SKonrad Dybcio 		.enable_reg = 0x107c,
176a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
177a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
178a6b18286SKonrad Dybcio 			.name = "gpu_cc_crc_ahb_clk",
179a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
180a6b18286SKonrad Dybcio 		},
181a6b18286SKonrad Dybcio 	},
182a6b18286SKonrad Dybcio };
183a6b18286SKonrad Dybcio 
184a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_cx_apb_clk = {
185a6b18286SKonrad Dybcio 	.halt_reg = 0x1088,
186a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
187a6b18286SKonrad Dybcio 	.clkr = {
188a6b18286SKonrad Dybcio 		.enable_reg = 0x1088,
189a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
190a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
191a6b18286SKonrad Dybcio 			.name = "gpu_cc_cx_apb_clk",
192a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
193a6b18286SKonrad Dybcio 		},
194a6b18286SKonrad Dybcio 	},
195a6b18286SKonrad Dybcio };
196a6b18286SKonrad Dybcio 
197a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_gx_gfx3d_clk = {
198a6b18286SKonrad Dybcio 	.halt_reg = 0x1054,
199a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT_SKIP,
200a6b18286SKonrad Dybcio 	.clkr = {
201a6b18286SKonrad Dybcio 		.enable_reg = 0x1054,
202a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
203a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
204a6b18286SKonrad Dybcio 			.name = "gpu_cc_gx_gfx3d_clk",
205a6b18286SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
206a6b18286SKonrad Dybcio 				&gpu_cc_gx_gfx3d_clk_src.clkr.hw,
207a6b18286SKonrad Dybcio 			},
208a6b18286SKonrad Dybcio 			.num_parents = 1,
209a6b18286SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
210a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
211a6b18286SKonrad Dybcio 		},
212a6b18286SKonrad Dybcio 	},
213a6b18286SKonrad Dybcio };
214a6b18286SKonrad Dybcio 
215a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_cx_gfx3d_clk = {
216a6b18286SKonrad Dybcio 	.halt_reg = 0x10a4,
217a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
218a6b18286SKonrad Dybcio 	.clkr = {
219a6b18286SKonrad Dybcio 		.enable_reg = 0x10a4,
220a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
221a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
222a6b18286SKonrad Dybcio 			.name = "gpu_cc_cx_gfx3d_clk",
223a6b18286SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
224a6b18286SKonrad Dybcio 				&gpu_cc_gx_gfx3d_clk.clkr.hw,
225a6b18286SKonrad Dybcio 			},
226a6b18286SKonrad Dybcio 			.num_parents = 1,
227a6b18286SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
228a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
229a6b18286SKonrad Dybcio 		},
230a6b18286SKonrad Dybcio 	},
231a6b18286SKonrad Dybcio };
232a6b18286SKonrad Dybcio 
233a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_cx_gmu_clk = {
234a6b18286SKonrad Dybcio 	.halt_reg = 0x1098,
235a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT,
236a6b18286SKonrad Dybcio 	.clkr = {
237a6b18286SKonrad Dybcio 		.enable_reg = 0x1098,
238a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
239a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
240a6b18286SKonrad Dybcio 			.name = "gpu_cc_cx_gmu_clk",
241a6b18286SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
242a6b18286SKonrad Dybcio 				&gpu_cc_gmu_clk_src.clkr.hw,
243a6b18286SKonrad Dybcio 			},
244a6b18286SKonrad Dybcio 			.num_parents = 1,
245a6b18286SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
246a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
247a6b18286SKonrad Dybcio 		},
248a6b18286SKonrad Dybcio 	},
249a6b18286SKonrad Dybcio };
250a6b18286SKonrad Dybcio 
251a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
252a6b18286SKonrad Dybcio 	.halt_reg = 0x108c,
253a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
254a6b18286SKonrad Dybcio 	.clkr = {
255a6b18286SKonrad Dybcio 		.enable_reg = 0x108c,
256a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
257a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
258a6b18286SKonrad Dybcio 			.name = "gpu_cc_cx_snoc_dvm_clk",
259a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
260a6b18286SKonrad Dybcio 		},
261a6b18286SKonrad Dybcio 	},
262a6b18286SKonrad Dybcio };
263a6b18286SKonrad Dybcio 
264a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_cxo_aon_clk = {
265a6b18286SKonrad Dybcio 	.halt_reg = 0x1004,
266a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
267a6b18286SKonrad Dybcio 	.clkr = {
268a6b18286SKonrad Dybcio 		.enable_reg = 0x1004,
269a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
270a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
271a6b18286SKonrad Dybcio 			.name = "gpu_cc_cxo_aon_clk",
272a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
273a6b18286SKonrad Dybcio 		},
274a6b18286SKonrad Dybcio 	},
275a6b18286SKonrad Dybcio };
276a6b18286SKonrad Dybcio 
277a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_cxo_clk = {
278a6b18286SKonrad Dybcio 	.halt_reg = 0x109c,
279a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT,
280a6b18286SKonrad Dybcio 	.clkr = {
281a6b18286SKonrad Dybcio 		.enable_reg = 0x109c,
282a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
283a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
284a6b18286SKonrad Dybcio 			.name = "gpu_cc_cxo_clk",
285a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
286a6b18286SKonrad Dybcio 		},
287a6b18286SKonrad Dybcio 	},
288a6b18286SKonrad Dybcio };
289a6b18286SKonrad Dybcio 
290a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_sleep_clk = {
291a6b18286SKonrad Dybcio 	.halt_reg = 0x1090,
292a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
293a6b18286SKonrad Dybcio 	.clkr = {
294a6b18286SKonrad Dybcio 		.enable_reg = 0x1090,
295a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
296a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
297a6b18286SKonrad Dybcio 			.name = "gpu_cc_sleep_clk",
298a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
299a6b18286SKonrad Dybcio 		},
300a6b18286SKonrad Dybcio 	},
301a6b18286SKonrad Dybcio };
302a6b18286SKonrad Dybcio 
303a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_ahb_clk = {
304a6b18286SKonrad Dybcio 	.halt_reg = 0x1078,
305a6b18286SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
306a6b18286SKonrad Dybcio 	.clkr = {
307a6b18286SKonrad Dybcio 		.enable_reg = 0x1078,
308a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
309a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
310a6b18286SKonrad Dybcio 			.name = "gpu_cc_ahb_clk",
311a6b18286SKonrad Dybcio 			.flags = CLK_IS_CRITICAL,
312a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
313a6b18286SKonrad Dybcio 		},
314a6b18286SKonrad Dybcio 	},
315a6b18286SKonrad Dybcio };
316a6b18286SKonrad Dybcio 
317a6b18286SKonrad Dybcio static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
318a6b18286SKonrad Dybcio 	.halt_reg = 0x5000,
319a6b18286SKonrad Dybcio 	.halt_check = BRANCH_VOTED,
320a6b18286SKonrad Dybcio 	.clkr = {
321a6b18286SKonrad Dybcio 		.enable_reg = 0x5000,
322a6b18286SKonrad Dybcio 		.enable_mask = BIT(0),
323a6b18286SKonrad Dybcio 		.hw.init = &(struct clk_init_data){
324a6b18286SKonrad Dybcio 			.name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
325a6b18286SKonrad Dybcio 			.ops = &clk_branch2_ops,
326a6b18286SKonrad Dybcio 		},
327a6b18286SKonrad Dybcio 	},
328a6b18286SKonrad Dybcio };
329a6b18286SKonrad Dybcio 
330a6b18286SKonrad Dybcio static struct gdsc gpu_cx_gdsc = {
331a6b18286SKonrad Dybcio 	.gdscr = 0x106c,
332a6b18286SKonrad Dybcio 	.gds_hw_ctrl = 0x1540,
333a6b18286SKonrad Dybcio 	.pd = {
334a6b18286SKonrad Dybcio 		.name = "gpu_cx_gdsc",
335a6b18286SKonrad Dybcio 	},
336a6b18286SKonrad Dybcio 	.pwrsts = PWRSTS_OFF_ON,
337a6b18286SKonrad Dybcio 	.flags = VOTABLE,
338a6b18286SKonrad Dybcio };
339a6b18286SKonrad Dybcio 
340a6b18286SKonrad Dybcio static struct gdsc gpu_gx_gdsc = {
341a6b18286SKonrad Dybcio 	.gdscr = 0x100c,
342a6b18286SKonrad Dybcio 	.pd = {
343a6b18286SKonrad Dybcio 		.name = "gpu_gx_gdsc",
344a6b18286SKonrad Dybcio 	},
345a6b18286SKonrad Dybcio 	.pwrsts = PWRSTS_OFF_ON,
346a6b18286SKonrad Dybcio 	.flags = VOTABLE,
347a6b18286SKonrad Dybcio };
348a6b18286SKonrad Dybcio 
349a6b18286SKonrad Dybcio static struct clk_regmap *gpu_cc_sm6125_clocks[] = {
350a6b18286SKonrad Dybcio 	[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
351a6b18286SKonrad Dybcio 	[GPU_CC_CX_APB_CLK] = &gpu_cc_cx_apb_clk.clkr,
352a6b18286SKonrad Dybcio 	[GPU_CC_CX_GFX3D_CLK] = &gpu_cc_cx_gfx3d_clk.clkr,
353a6b18286SKonrad Dybcio 	[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
354a6b18286SKonrad Dybcio 	[GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
355a6b18286SKonrad Dybcio 	[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
356a6b18286SKonrad Dybcio 	[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
357a6b18286SKonrad Dybcio 	[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
358a6b18286SKonrad Dybcio 	[GPU_CC_PLL0_OUT_AUX2] = &gpu_cc_pll0_out_aux2.clkr,
359a6b18286SKonrad Dybcio 	[GPU_CC_PLL1_OUT_AUX2] = &gpu_cc_pll1_out_aux2.clkr,
360a6b18286SKonrad Dybcio 	[GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
361a6b18286SKonrad Dybcio 	[GPU_CC_GX_GFX3D_CLK] = &gpu_cc_gx_gfx3d_clk.clkr,
362a6b18286SKonrad Dybcio 	[GPU_CC_GX_GFX3D_CLK_SRC] = &gpu_cc_gx_gfx3d_clk_src.clkr,
363a6b18286SKonrad Dybcio 	[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
364a6b18286SKonrad Dybcio 	[GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
365a6b18286SKonrad Dybcio };
366a6b18286SKonrad Dybcio 
367a6b18286SKonrad Dybcio static struct gdsc *gpucc_sm6125_gdscs[] = {
368a6b18286SKonrad Dybcio 	[GPU_CX_GDSC] = &gpu_cx_gdsc,
369a6b18286SKonrad Dybcio 	[GPU_GX_GDSC] = &gpu_gx_gdsc,
370a6b18286SKonrad Dybcio };
371a6b18286SKonrad Dybcio 
372a6b18286SKonrad Dybcio static const struct regmap_config gpu_cc_sm6125_regmap_config = {
373a6b18286SKonrad Dybcio 	.reg_bits = 32,
374a6b18286SKonrad Dybcio 	.reg_stride = 4,
375a6b18286SKonrad Dybcio 	.val_bits = 32,
376a6b18286SKonrad Dybcio 	.max_register = 0x9000,
377a6b18286SKonrad Dybcio 	.fast_io = true,
378a6b18286SKonrad Dybcio };
379a6b18286SKonrad Dybcio 
380a6b18286SKonrad Dybcio static const struct qcom_cc_desc gpu_cc_sm6125_desc = {
381a6b18286SKonrad Dybcio 	.config = &gpu_cc_sm6125_regmap_config,
382a6b18286SKonrad Dybcio 	.clks = gpu_cc_sm6125_clocks,
383a6b18286SKonrad Dybcio 	.num_clks = ARRAY_SIZE(gpu_cc_sm6125_clocks),
384a6b18286SKonrad Dybcio 	.gdscs = gpucc_sm6125_gdscs,
385a6b18286SKonrad Dybcio 	.num_gdscs = ARRAY_SIZE(gpucc_sm6125_gdscs),
386a6b18286SKonrad Dybcio };
387a6b18286SKonrad Dybcio 
388a6b18286SKonrad Dybcio static const struct of_device_id gpu_cc_sm6125_match_table[] = {
389a6b18286SKonrad Dybcio 	{ .compatible = "qcom,sm6125-gpucc" },
390a6b18286SKonrad Dybcio 	{ }
391a6b18286SKonrad Dybcio };
392a6b18286SKonrad Dybcio MODULE_DEVICE_TABLE(of, gpu_cc_sm6125_match_table);
393a6b18286SKonrad Dybcio 
gpu_cc_sm6125_probe(struct platform_device * pdev)394a6b18286SKonrad Dybcio static int gpu_cc_sm6125_probe(struct platform_device *pdev)
395a6b18286SKonrad Dybcio {
396a6b18286SKonrad Dybcio 	struct regmap *regmap;
397a6b18286SKonrad Dybcio 
398a6b18286SKonrad Dybcio 	regmap = qcom_cc_map(pdev, &gpu_cc_sm6125_desc);
399a6b18286SKonrad Dybcio 	if (IS_ERR(regmap))
400a6b18286SKonrad Dybcio 		return PTR_ERR(regmap);
401a6b18286SKonrad Dybcio 
402a6b18286SKonrad Dybcio 	clk_alpha_pll_configure(&gpu_cc_pll0_out_aux2, regmap, &gpu_pll0_config);
403a6b18286SKonrad Dybcio 	clk_alpha_pll_configure(&gpu_cc_pll1_out_aux2, regmap, &gpu_pll1_config);
404a6b18286SKonrad Dybcio 
405a6b18286SKonrad Dybcio 	/* Set recommended WAKEUP/SLEEP settings for the gpu_cc_cx_gmu_clk */
406a6b18286SKonrad Dybcio 	qcom_branch_set_wakeup(regmap, gpu_cc_cx_gmu_clk, 0xf);
407a6b18286SKonrad Dybcio 	qcom_branch_set_sleep(regmap, gpu_cc_cx_gmu_clk, 0xf);
408a6b18286SKonrad Dybcio 
409a6b18286SKonrad Dybcio 	qcom_branch_set_force_mem_core(regmap, gpu_cc_gx_gfx3d_clk, true);
410a6b18286SKonrad Dybcio 	qcom_branch_set_force_periph_on(regmap, gpu_cc_gx_gfx3d_clk, true);
411a6b18286SKonrad Dybcio 
412a6b18286SKonrad Dybcio 	return qcom_cc_really_probe(pdev, &gpu_cc_sm6125_desc, regmap);
413a6b18286SKonrad Dybcio }
414a6b18286SKonrad Dybcio 
415a6b18286SKonrad Dybcio static struct platform_driver gpu_cc_sm6125_driver = {
416a6b18286SKonrad Dybcio 	.probe = gpu_cc_sm6125_probe,
417a6b18286SKonrad Dybcio 	.driver = {
418a6b18286SKonrad Dybcio 		.name = "gpucc-sm6125",
419a6b18286SKonrad Dybcio 		.of_match_table = gpu_cc_sm6125_match_table,
420a6b18286SKonrad Dybcio 	},
421a6b18286SKonrad Dybcio };
422a6b18286SKonrad Dybcio module_platform_driver(gpu_cc_sm6125_driver);
423a6b18286SKonrad Dybcio 
424a6b18286SKonrad Dybcio MODULE_DESCRIPTION("QTI GPUCC SM6125 Driver");
425a6b18286SKonrad Dybcio MODULE_LICENSE("GPL");
426