xref: /linux/drivers/clk/qcom/gpucc-sar2130p.c (revision 9f3a2ba62c7226a6604b8aaeb92b5ff906fa4e6b)
1*30eb0e76SKonrad Dybcio // SPDX-License-Identifier: GPL-2.0-only
2*30eb0e76SKonrad Dybcio /*
3*30eb0e76SKonrad Dybcio  * Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
4*30eb0e76SKonrad Dybcio  * Copyright (c) 2024, Linaro Limited
5*30eb0e76SKonrad Dybcio  */
6*30eb0e76SKonrad Dybcio 
7*30eb0e76SKonrad Dybcio #include <linux/clk-provider.h>
8*30eb0e76SKonrad Dybcio #include <linux/kernel.h>
9*30eb0e76SKonrad Dybcio #include <linux/module.h>
10*30eb0e76SKonrad Dybcio #include <linux/platform_device.h>
11*30eb0e76SKonrad Dybcio #include <linux/regmap.h>
12*30eb0e76SKonrad Dybcio 
13*30eb0e76SKonrad Dybcio #include <dt-bindings/clock/qcom,sar2130p-gpucc.h>
14*30eb0e76SKonrad Dybcio #include <dt-bindings/reset/qcom,sar2130p-gpucc.h>
15*30eb0e76SKonrad Dybcio 
16*30eb0e76SKonrad Dybcio #include "clk-alpha-pll.h"
17*30eb0e76SKonrad Dybcio #include "clk-branch.h"
18*30eb0e76SKonrad Dybcio #include "clk-rcg.h"
19*30eb0e76SKonrad Dybcio #include "common.h"
20*30eb0e76SKonrad Dybcio #include "gdsc.h"
21*30eb0e76SKonrad Dybcio #include "reset.h"
22*30eb0e76SKonrad Dybcio 
23*30eb0e76SKonrad Dybcio enum {
24*30eb0e76SKonrad Dybcio 	DT_BI_TCXO,
25*30eb0e76SKonrad Dybcio 	DT_GPLL0_OUT_MAIN,
26*30eb0e76SKonrad Dybcio 	DT_GPLL0_OUT_MAIN_DIV,
27*30eb0e76SKonrad Dybcio };
28*30eb0e76SKonrad Dybcio 
29*30eb0e76SKonrad Dybcio enum {
30*30eb0e76SKonrad Dybcio 	P_BI_TCXO,
31*30eb0e76SKonrad Dybcio 	P_GPLL0_OUT_MAIN,
32*30eb0e76SKonrad Dybcio 	P_GPLL0_OUT_MAIN_DIV,
33*30eb0e76SKonrad Dybcio 	P_GPU_CC_PLL0_OUT_MAIN,
34*30eb0e76SKonrad Dybcio 	P_GPU_CC_PLL1_OUT_MAIN,
35*30eb0e76SKonrad Dybcio };
36*30eb0e76SKonrad Dybcio 
37*30eb0e76SKonrad Dybcio static const struct pll_vco lucid_ole_vco[] = {
38*30eb0e76SKonrad Dybcio 	{ 249600000, 2000000000, 0 },
39*30eb0e76SKonrad Dybcio };
40*30eb0e76SKonrad Dybcio 
41*30eb0e76SKonrad Dybcio /* 470MHz Configuration */
42*30eb0e76SKonrad Dybcio static const struct alpha_pll_config gpu_cc_pll0_config = {
43*30eb0e76SKonrad Dybcio 	.l = 0x18,
44*30eb0e76SKonrad Dybcio 	.alpha = 0x7aaa,
45*30eb0e76SKonrad Dybcio 	.config_ctl_val = 0x20485699,
46*30eb0e76SKonrad Dybcio 	.config_ctl_hi_val = 0x00182261,
47*30eb0e76SKonrad Dybcio 	.config_ctl_hi1_val = 0x82aa299c,
48*30eb0e76SKonrad Dybcio 	.test_ctl_val = 0x00000000,
49*30eb0e76SKonrad Dybcio 	.test_ctl_hi_val = 0x00000003,
50*30eb0e76SKonrad Dybcio 	.test_ctl_hi1_val = 0x00009000,
51*30eb0e76SKonrad Dybcio 	.test_ctl_hi2_val = 0x00000034,
52*30eb0e76SKonrad Dybcio 	.user_ctl_val = 0x00000000,
53*30eb0e76SKonrad Dybcio 	.user_ctl_hi_val = 0x00000005,
54*30eb0e76SKonrad Dybcio };
55*30eb0e76SKonrad Dybcio 
56*30eb0e76SKonrad Dybcio static struct clk_alpha_pll gpu_cc_pll0 = {
57*30eb0e76SKonrad Dybcio 	.offset = 0x0,
58*30eb0e76SKonrad Dybcio 	.vco_table = lucid_ole_vco,
59*30eb0e76SKonrad Dybcio 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
60*30eb0e76SKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
61*30eb0e76SKonrad Dybcio 	.clkr = {
62*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
63*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_pll0",
64*30eb0e76SKonrad Dybcio 			.parent_data = &(const struct clk_parent_data) {
65*30eb0e76SKonrad Dybcio 				.index = DT_BI_TCXO,
66*30eb0e76SKonrad Dybcio 			},
67*30eb0e76SKonrad Dybcio 			.num_parents = 1,
68*30eb0e76SKonrad Dybcio 			.ops = &clk_alpha_pll_lucid_evo_ops,
69*30eb0e76SKonrad Dybcio 		},
70*30eb0e76SKonrad Dybcio 	},
71*30eb0e76SKonrad Dybcio };
72*30eb0e76SKonrad Dybcio 
73*30eb0e76SKonrad Dybcio /* 440MHz Configuration */
74*30eb0e76SKonrad Dybcio static const struct alpha_pll_config gpu_cc_pll1_config = {
75*30eb0e76SKonrad Dybcio 	.l = 0x16,
76*30eb0e76SKonrad Dybcio 	.alpha = 0xeaaa,
77*30eb0e76SKonrad Dybcio 	.config_ctl_val = 0x20485699,
78*30eb0e76SKonrad Dybcio 	.config_ctl_hi_val = 0x00182261,
79*30eb0e76SKonrad Dybcio 	.config_ctl_hi1_val = 0x82aa299c,
80*30eb0e76SKonrad Dybcio 	.test_ctl_val = 0x00000000,
81*30eb0e76SKonrad Dybcio 	.test_ctl_hi_val = 0x00000003,
82*30eb0e76SKonrad Dybcio 	.test_ctl_hi1_val = 0x00009000,
83*30eb0e76SKonrad Dybcio 	.test_ctl_hi2_val = 0x00000034,
84*30eb0e76SKonrad Dybcio 	.user_ctl_val = 0x00000000,
85*30eb0e76SKonrad Dybcio 	.user_ctl_hi_val = 0x00000005,
86*30eb0e76SKonrad Dybcio };
87*30eb0e76SKonrad Dybcio 
88*30eb0e76SKonrad Dybcio static struct clk_alpha_pll gpu_cc_pll1 = {
89*30eb0e76SKonrad Dybcio 	.offset = 0x1000,
90*30eb0e76SKonrad Dybcio 	.vco_table = lucid_ole_vco,
91*30eb0e76SKonrad Dybcio 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
92*30eb0e76SKonrad Dybcio 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
93*30eb0e76SKonrad Dybcio 	.clkr = {
94*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
95*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_pll1",
96*30eb0e76SKonrad Dybcio 			.parent_data = &(const struct clk_parent_data) {
97*30eb0e76SKonrad Dybcio 				.index = DT_BI_TCXO,
98*30eb0e76SKonrad Dybcio 			},
99*30eb0e76SKonrad Dybcio 			.num_parents = 1,
100*30eb0e76SKonrad Dybcio 			.ops = &clk_alpha_pll_lucid_evo_ops,
101*30eb0e76SKonrad Dybcio 		},
102*30eb0e76SKonrad Dybcio 	},
103*30eb0e76SKonrad Dybcio };
104*30eb0e76SKonrad Dybcio 
105*30eb0e76SKonrad Dybcio static const struct parent_map gpu_cc_parent_map_0[] = {
106*30eb0e76SKonrad Dybcio 	{ P_BI_TCXO, 0 },
107*30eb0e76SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN, 5 },
108*30eb0e76SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN_DIV, 6 },
109*30eb0e76SKonrad Dybcio };
110*30eb0e76SKonrad Dybcio 
111*30eb0e76SKonrad Dybcio static const struct clk_parent_data gpu_cc_parent_data_0[] = {
112*30eb0e76SKonrad Dybcio 	{ .index = DT_BI_TCXO },
113*30eb0e76SKonrad Dybcio 	{ .index = DT_GPLL0_OUT_MAIN },
114*30eb0e76SKonrad Dybcio 	{ .index = DT_GPLL0_OUT_MAIN_DIV },
115*30eb0e76SKonrad Dybcio };
116*30eb0e76SKonrad Dybcio 
117*30eb0e76SKonrad Dybcio static const struct parent_map gpu_cc_parent_map_1[] = {
118*30eb0e76SKonrad Dybcio 	{ P_BI_TCXO, 0 },
119*30eb0e76SKonrad Dybcio 	{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
120*30eb0e76SKonrad Dybcio 	{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
121*30eb0e76SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN, 5 },
122*30eb0e76SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN_DIV, 6 },
123*30eb0e76SKonrad Dybcio };
124*30eb0e76SKonrad Dybcio 
125*30eb0e76SKonrad Dybcio static const struct clk_parent_data gpu_cc_parent_data_1[] = {
126*30eb0e76SKonrad Dybcio 	{ .index = DT_BI_TCXO },
127*30eb0e76SKonrad Dybcio 	{ .hw = &gpu_cc_pll0.clkr.hw },
128*30eb0e76SKonrad Dybcio 	{ .hw = &gpu_cc_pll1.clkr.hw },
129*30eb0e76SKonrad Dybcio 	{ .index = DT_GPLL0_OUT_MAIN },
130*30eb0e76SKonrad Dybcio 	{ .index = DT_GPLL0_OUT_MAIN_DIV },
131*30eb0e76SKonrad Dybcio };
132*30eb0e76SKonrad Dybcio 
133*30eb0e76SKonrad Dybcio static const struct parent_map gpu_cc_parent_map_2[] = {
134*30eb0e76SKonrad Dybcio 	{ P_BI_TCXO, 0 },
135*30eb0e76SKonrad Dybcio 	{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
136*30eb0e76SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN, 5 },
137*30eb0e76SKonrad Dybcio 	{ P_GPLL0_OUT_MAIN_DIV, 6 },
138*30eb0e76SKonrad Dybcio };
139*30eb0e76SKonrad Dybcio 
140*30eb0e76SKonrad Dybcio static const struct clk_parent_data gpu_cc_parent_data_2[] = {
141*30eb0e76SKonrad Dybcio 	{ .index = DT_BI_TCXO },
142*30eb0e76SKonrad Dybcio 	{ .hw = &gpu_cc_pll1.clkr.hw },
143*30eb0e76SKonrad Dybcio 	{ .index = DT_GPLL0_OUT_MAIN },
144*30eb0e76SKonrad Dybcio 	{ .index = DT_GPLL0_OUT_MAIN_DIV },
145*30eb0e76SKonrad Dybcio };
146*30eb0e76SKonrad Dybcio 
147*30eb0e76SKonrad Dybcio static const struct freq_tbl ftbl_gpu_cc_ff_clk_src[] = {
148*30eb0e76SKonrad Dybcio 	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
149*30eb0e76SKonrad Dybcio 	{ }
150*30eb0e76SKonrad Dybcio };
151*30eb0e76SKonrad Dybcio 
152*30eb0e76SKonrad Dybcio static struct clk_rcg2 gpu_cc_ff_clk_src = {
153*30eb0e76SKonrad Dybcio 	.cmd_rcgr = 0x9474,
154*30eb0e76SKonrad Dybcio 	.mnd_width = 0,
155*30eb0e76SKonrad Dybcio 	.hid_width = 5,
156*30eb0e76SKonrad Dybcio 	.parent_map = gpu_cc_parent_map_0,
157*30eb0e76SKonrad Dybcio 	.freq_tbl = ftbl_gpu_cc_ff_clk_src,
158*30eb0e76SKonrad Dybcio 	.clkr.hw.init = &(const struct clk_init_data) {
159*30eb0e76SKonrad Dybcio 		.name = "gpu_cc_ff_clk_src",
160*30eb0e76SKonrad Dybcio 		.parent_data = gpu_cc_parent_data_0,
161*30eb0e76SKonrad Dybcio 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
162*30eb0e76SKonrad Dybcio 		.ops = &clk_rcg2_shared_ops,
163*30eb0e76SKonrad Dybcio 	},
164*30eb0e76SKonrad Dybcio };
165*30eb0e76SKonrad Dybcio 
166*30eb0e76SKonrad Dybcio static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
167*30eb0e76SKonrad Dybcio 	F(19200000, P_BI_TCXO, 1, 0, 0),
168*30eb0e76SKonrad Dybcio 	F(220000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
169*30eb0e76SKonrad Dybcio 	F(550000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
170*30eb0e76SKonrad Dybcio 	{ }
171*30eb0e76SKonrad Dybcio };
172*30eb0e76SKonrad Dybcio 
173*30eb0e76SKonrad Dybcio static struct clk_rcg2 gpu_cc_gmu_clk_src = {
174*30eb0e76SKonrad Dybcio 	.cmd_rcgr = 0x9318,
175*30eb0e76SKonrad Dybcio 	.mnd_width = 0,
176*30eb0e76SKonrad Dybcio 	.hid_width = 5,
177*30eb0e76SKonrad Dybcio 	.parent_map = gpu_cc_parent_map_1,
178*30eb0e76SKonrad Dybcio 	.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
179*30eb0e76SKonrad Dybcio 	.clkr.hw.init = &(const struct clk_init_data) {
180*30eb0e76SKonrad Dybcio 		.name = "gpu_cc_gmu_clk_src",
181*30eb0e76SKonrad Dybcio 		.parent_data = gpu_cc_parent_data_1,
182*30eb0e76SKonrad Dybcio 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
183*30eb0e76SKonrad Dybcio 		.flags = CLK_SET_RATE_PARENT,
184*30eb0e76SKonrad Dybcio 		.ops = &clk_rcg2_shared_ops,
185*30eb0e76SKonrad Dybcio 	},
186*30eb0e76SKonrad Dybcio };
187*30eb0e76SKonrad Dybcio 
188*30eb0e76SKonrad Dybcio static struct clk_rcg2 gpu_cc_hub_clk_src = {
189*30eb0e76SKonrad Dybcio 	.cmd_rcgr = 0x93ec,
190*30eb0e76SKonrad Dybcio 	.mnd_width = 0,
191*30eb0e76SKonrad Dybcio 	.hid_width = 5,
192*30eb0e76SKonrad Dybcio 	.parent_map = gpu_cc_parent_map_2,
193*30eb0e76SKonrad Dybcio 	.freq_tbl = ftbl_gpu_cc_ff_clk_src,
194*30eb0e76SKonrad Dybcio 	.clkr.hw.init = &(const struct clk_init_data) {
195*30eb0e76SKonrad Dybcio 		.name = "gpu_cc_hub_clk_src",
196*30eb0e76SKonrad Dybcio 		.parent_data = gpu_cc_parent_data_2,
197*30eb0e76SKonrad Dybcio 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_2),
198*30eb0e76SKonrad Dybcio 		.ops = &clk_rcg2_shared_ops,
199*30eb0e76SKonrad Dybcio 	},
200*30eb0e76SKonrad Dybcio };
201*30eb0e76SKonrad Dybcio 
202*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_ahb_clk = {
203*30eb0e76SKonrad Dybcio 	.halt_reg = 0x911c,
204*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT_DELAY,
205*30eb0e76SKonrad Dybcio 	.clkr = {
206*30eb0e76SKonrad Dybcio 		.enable_reg = 0x911c,
207*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
208*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
209*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_ahb_clk",
210*30eb0e76SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
211*30eb0e76SKonrad Dybcio 				&gpu_cc_hub_clk_src.clkr.hw,
212*30eb0e76SKonrad Dybcio 			},
213*30eb0e76SKonrad Dybcio 			.num_parents = 1,
214*30eb0e76SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
215*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_ops,
216*30eb0e76SKonrad Dybcio 		},
217*30eb0e76SKonrad Dybcio 	},
218*30eb0e76SKonrad Dybcio };
219*30eb0e76SKonrad Dybcio 
220*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_crc_ahb_clk = {
221*30eb0e76SKonrad Dybcio 	.halt_reg = 0x9120,
222*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT_VOTED,
223*30eb0e76SKonrad Dybcio 	.clkr = {
224*30eb0e76SKonrad Dybcio 		.enable_reg = 0x9120,
225*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
226*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
227*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_crc_ahb_clk",
228*30eb0e76SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
229*30eb0e76SKonrad Dybcio 				&gpu_cc_hub_clk_src.clkr.hw,
230*30eb0e76SKonrad Dybcio 			},
231*30eb0e76SKonrad Dybcio 			.num_parents = 1,
232*30eb0e76SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
233*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_ops,
234*30eb0e76SKonrad Dybcio 		},
235*30eb0e76SKonrad Dybcio 	},
236*30eb0e76SKonrad Dybcio };
237*30eb0e76SKonrad Dybcio 
238*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_cx_ff_clk = {
239*30eb0e76SKonrad Dybcio 	.halt_reg = 0x914c,
240*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT,
241*30eb0e76SKonrad Dybcio 	.clkr = {
242*30eb0e76SKonrad Dybcio 		.enable_reg = 0x914c,
243*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
244*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
245*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_cx_ff_clk",
246*30eb0e76SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
247*30eb0e76SKonrad Dybcio 				&gpu_cc_ff_clk_src.clkr.hw,
248*30eb0e76SKonrad Dybcio 			},
249*30eb0e76SKonrad Dybcio 			.num_parents = 1,
250*30eb0e76SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
251*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_ops,
252*30eb0e76SKonrad Dybcio 		},
253*30eb0e76SKonrad Dybcio 	},
254*30eb0e76SKonrad Dybcio };
255*30eb0e76SKonrad Dybcio 
256*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_cx_gmu_clk = {
257*30eb0e76SKonrad Dybcio 	.halt_reg = 0x913c,
258*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT_VOTED,
259*30eb0e76SKonrad Dybcio 	.clkr = {
260*30eb0e76SKonrad Dybcio 		.enable_reg = 0x913c,
261*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
262*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
263*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_cx_gmu_clk",
264*30eb0e76SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
265*30eb0e76SKonrad Dybcio 				&gpu_cc_gmu_clk_src.clkr.hw,
266*30eb0e76SKonrad Dybcio 			},
267*30eb0e76SKonrad Dybcio 			.num_parents = 1,
268*30eb0e76SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
269*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_aon_ops,
270*30eb0e76SKonrad Dybcio 		},
271*30eb0e76SKonrad Dybcio 	},
272*30eb0e76SKonrad Dybcio };
273*30eb0e76SKonrad Dybcio 
274*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_cxo_aon_clk = {
275*30eb0e76SKonrad Dybcio 	.halt_reg = 0x9004,
276*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT_VOTED,
277*30eb0e76SKonrad Dybcio 	.clkr = {
278*30eb0e76SKonrad Dybcio 		.enable_reg = 0x9004,
279*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
280*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
281*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_cxo_aon_clk",
282*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_ops,
283*30eb0e76SKonrad Dybcio 		},
284*30eb0e76SKonrad Dybcio 	},
285*30eb0e76SKonrad Dybcio };
286*30eb0e76SKonrad Dybcio 
287*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_cxo_clk = {
288*30eb0e76SKonrad Dybcio 	.halt_reg = 0x9144,
289*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT,
290*30eb0e76SKonrad Dybcio 	.clkr = {
291*30eb0e76SKonrad Dybcio 		.enable_reg = 0x9144,
292*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
293*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
294*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_cxo_clk",
295*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_ops,
296*30eb0e76SKonrad Dybcio 		},
297*30eb0e76SKonrad Dybcio 	},
298*30eb0e76SKonrad Dybcio };
299*30eb0e76SKonrad Dybcio 
300*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_gx_gmu_clk = {
301*30eb0e76SKonrad Dybcio 	.halt_reg = 0x90bc,
302*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT,
303*30eb0e76SKonrad Dybcio 	.clkr = {
304*30eb0e76SKonrad Dybcio 		.enable_reg = 0x90bc,
305*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
306*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
307*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_gx_gmu_clk",
308*30eb0e76SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
309*30eb0e76SKonrad Dybcio 				&gpu_cc_gmu_clk_src.clkr.hw,
310*30eb0e76SKonrad Dybcio 			},
311*30eb0e76SKonrad Dybcio 			.num_parents = 1,
312*30eb0e76SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
313*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_ops,
314*30eb0e76SKonrad Dybcio 		},
315*30eb0e76SKonrad Dybcio 	},
316*30eb0e76SKonrad Dybcio };
317*30eb0e76SKonrad Dybcio 
318*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_hub_aon_clk = {
319*30eb0e76SKonrad Dybcio 	.halt_reg = 0x93e8,
320*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT,
321*30eb0e76SKonrad Dybcio 	.clkr = {
322*30eb0e76SKonrad Dybcio 		.enable_reg = 0x93e8,
323*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
324*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
325*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_hub_aon_clk",
326*30eb0e76SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
327*30eb0e76SKonrad Dybcio 				&gpu_cc_hub_clk_src.clkr.hw,
328*30eb0e76SKonrad Dybcio 			},
329*30eb0e76SKonrad Dybcio 			.num_parents = 1,
330*30eb0e76SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
331*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_aon_ops,
332*30eb0e76SKonrad Dybcio 		},
333*30eb0e76SKonrad Dybcio 	},
334*30eb0e76SKonrad Dybcio };
335*30eb0e76SKonrad Dybcio 
336*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_hub_cx_int_clk = {
337*30eb0e76SKonrad Dybcio 	.halt_reg = 0x9148,
338*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT_VOTED,
339*30eb0e76SKonrad Dybcio 	.clkr = {
340*30eb0e76SKonrad Dybcio 		.enable_reg = 0x9148,
341*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
342*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
343*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_hub_cx_int_clk",
344*30eb0e76SKonrad Dybcio 			.parent_hws = (const struct clk_hw*[]) {
345*30eb0e76SKonrad Dybcio 				&gpu_cc_hub_clk_src.clkr.hw,
346*30eb0e76SKonrad Dybcio 			},
347*30eb0e76SKonrad Dybcio 			.num_parents = 1,
348*30eb0e76SKonrad Dybcio 			.flags = CLK_SET_RATE_PARENT,
349*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_aon_ops,
350*30eb0e76SKonrad Dybcio 		},
351*30eb0e76SKonrad Dybcio 	},
352*30eb0e76SKonrad Dybcio };
353*30eb0e76SKonrad Dybcio 
354*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_memnoc_gfx_clk = {
355*30eb0e76SKonrad Dybcio 	.halt_reg = 0x9150,
356*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT_VOTED,
357*30eb0e76SKonrad Dybcio 	.clkr = {
358*30eb0e76SKonrad Dybcio 		.enable_reg = 0x9150,
359*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
360*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
361*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_memnoc_gfx_clk",
362*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_ops,
363*30eb0e76SKonrad Dybcio 		},
364*30eb0e76SKonrad Dybcio 	},
365*30eb0e76SKonrad Dybcio };
366*30eb0e76SKonrad Dybcio 
367*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
368*30eb0e76SKonrad Dybcio 	.halt_reg = 0x7000,
369*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT_VOTED,
370*30eb0e76SKonrad Dybcio 	.clkr = {
371*30eb0e76SKonrad Dybcio 		.enable_reg = 0x7000,
372*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
373*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
374*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
375*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_ops,
376*30eb0e76SKonrad Dybcio 		},
377*30eb0e76SKonrad Dybcio 	},
378*30eb0e76SKonrad Dybcio };
379*30eb0e76SKonrad Dybcio 
380*30eb0e76SKonrad Dybcio static struct clk_branch gpu_cc_sleep_clk = {
381*30eb0e76SKonrad Dybcio 	.halt_reg = 0x9134,
382*30eb0e76SKonrad Dybcio 	.halt_check = BRANCH_HALT_VOTED,
383*30eb0e76SKonrad Dybcio 	.clkr = {
384*30eb0e76SKonrad Dybcio 		.enable_reg = 0x9134,
385*30eb0e76SKonrad Dybcio 		.enable_mask = BIT(0),
386*30eb0e76SKonrad Dybcio 		.hw.init = &(const struct clk_init_data) {
387*30eb0e76SKonrad Dybcio 			.name = "gpu_cc_sleep_clk",
388*30eb0e76SKonrad Dybcio 			.ops = &clk_branch2_ops,
389*30eb0e76SKonrad Dybcio 		},
390*30eb0e76SKonrad Dybcio 	},
391*30eb0e76SKonrad Dybcio };
392*30eb0e76SKonrad Dybcio 
393*30eb0e76SKonrad Dybcio static struct gdsc gpu_cx_gdsc = {
394*30eb0e76SKonrad Dybcio 	.gdscr = 0x9108,
395*30eb0e76SKonrad Dybcio 	.gds_hw_ctrl = 0x953c,
396*30eb0e76SKonrad Dybcio 	.clk_dis_wait_val = 8,
397*30eb0e76SKonrad Dybcio 	.pd = {
398*30eb0e76SKonrad Dybcio 		.name = "gpu_cx_gdsc",
399*30eb0e76SKonrad Dybcio 	},
400*30eb0e76SKonrad Dybcio 	.pwrsts = PWRSTS_OFF_ON,
401*30eb0e76SKonrad Dybcio 	.flags = VOTABLE | RETAIN_FF_ENABLE,
402*30eb0e76SKonrad Dybcio };
403*30eb0e76SKonrad Dybcio 
404*30eb0e76SKonrad Dybcio static struct gdsc gpu_gx_gdsc = {
405*30eb0e76SKonrad Dybcio 	.gdscr = 0x905c,
406*30eb0e76SKonrad Dybcio 	.clamp_io_ctrl = 0x9504,
407*30eb0e76SKonrad Dybcio 	.resets = (unsigned int []){ GPUCC_GPU_CC_GX_BCR,
408*30eb0e76SKonrad Dybcio 				     GPUCC_GPU_CC_ACD_BCR,
409*30eb0e76SKonrad Dybcio 				     GPUCC_GPU_CC_GX_ACD_IROOT_BCR },
410*30eb0e76SKonrad Dybcio 	.reset_count = 3,
411*30eb0e76SKonrad Dybcio 	.pd = {
412*30eb0e76SKonrad Dybcio 		.name = "gpu_gx_gdsc",
413*30eb0e76SKonrad Dybcio 		.power_on = gdsc_gx_do_nothing_enable,
414*30eb0e76SKonrad Dybcio 	},
415*30eb0e76SKonrad Dybcio 	.pwrsts = PWRSTS_OFF_ON,
416*30eb0e76SKonrad Dybcio 	.flags = CLAMP_IO | AON_RESET | SW_RESET,
417*30eb0e76SKonrad Dybcio };
418*30eb0e76SKonrad Dybcio 
419*30eb0e76SKonrad Dybcio static struct clk_regmap *gpu_cc_sar2130p_clocks[] = {
420*30eb0e76SKonrad Dybcio 	[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
421*30eb0e76SKonrad Dybcio 	[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
422*30eb0e76SKonrad Dybcio 	[GPU_CC_CX_FF_CLK] = &gpu_cc_cx_ff_clk.clkr,
423*30eb0e76SKonrad Dybcio 	[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
424*30eb0e76SKonrad Dybcio 	[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
425*30eb0e76SKonrad Dybcio 	[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
426*30eb0e76SKonrad Dybcio 	[GPU_CC_FF_CLK_SRC] = &gpu_cc_ff_clk_src.clkr,
427*30eb0e76SKonrad Dybcio 	[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
428*30eb0e76SKonrad Dybcio 	[GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr,
429*30eb0e76SKonrad Dybcio 	[GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
430*30eb0e76SKonrad Dybcio 	[GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
431*30eb0e76SKonrad Dybcio 	[GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
432*30eb0e76SKonrad Dybcio 	[GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
433*30eb0e76SKonrad Dybcio 	[GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr,
434*30eb0e76SKonrad Dybcio 	[GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
435*30eb0e76SKonrad Dybcio 	[GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
436*30eb0e76SKonrad Dybcio 	[GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
437*30eb0e76SKonrad Dybcio };
438*30eb0e76SKonrad Dybcio 
439*30eb0e76SKonrad Dybcio static const struct qcom_reset_map gpu_cc_sar2130p_resets[] = {
440*30eb0e76SKonrad Dybcio 	[GPUCC_GPU_CC_ACD_BCR] = { 0x9358 },
441*30eb0e76SKonrad Dybcio 	[GPUCC_GPU_CC_GX_ACD_IROOT_BCR] = { 0x958c },
442*30eb0e76SKonrad Dybcio 	[GPUCC_GPU_CC_GX_BCR] = { 0x9058 },
443*30eb0e76SKonrad Dybcio };
444*30eb0e76SKonrad Dybcio 
445*30eb0e76SKonrad Dybcio static struct gdsc *gpu_cc_sar2130p_gdscs[] = {
446*30eb0e76SKonrad Dybcio 	[GPU_CX_GDSC] = &gpu_cx_gdsc,
447*30eb0e76SKonrad Dybcio 	[GPU_GX_GDSC] = &gpu_gx_gdsc,
448*30eb0e76SKonrad Dybcio };
449*30eb0e76SKonrad Dybcio 
450*30eb0e76SKonrad Dybcio static const struct regmap_config gpu_cc_sar2130p_regmap_config = {
451*30eb0e76SKonrad Dybcio 	.reg_bits = 32,
452*30eb0e76SKonrad Dybcio 	.reg_stride = 4,
453*30eb0e76SKonrad Dybcio 	.val_bits = 32,
454*30eb0e76SKonrad Dybcio 	.max_register = 0xa000,
455*30eb0e76SKonrad Dybcio 	.fast_io = true,
456*30eb0e76SKonrad Dybcio };
457*30eb0e76SKonrad Dybcio 
458*30eb0e76SKonrad Dybcio static const struct qcom_cc_desc gpu_cc_sar2130p_desc = {
459*30eb0e76SKonrad Dybcio 	.config = &gpu_cc_sar2130p_regmap_config,
460*30eb0e76SKonrad Dybcio 	.clks = gpu_cc_sar2130p_clocks,
461*30eb0e76SKonrad Dybcio 	.num_clks = ARRAY_SIZE(gpu_cc_sar2130p_clocks),
462*30eb0e76SKonrad Dybcio 	.resets = gpu_cc_sar2130p_resets,
463*30eb0e76SKonrad Dybcio 	.num_resets = ARRAY_SIZE(gpu_cc_sar2130p_resets),
464*30eb0e76SKonrad Dybcio 	.gdscs = gpu_cc_sar2130p_gdscs,
465*30eb0e76SKonrad Dybcio 	.num_gdscs = ARRAY_SIZE(gpu_cc_sar2130p_gdscs),
466*30eb0e76SKonrad Dybcio };
467*30eb0e76SKonrad Dybcio 
468*30eb0e76SKonrad Dybcio static const struct of_device_id gpu_cc_sar2130p_match_table[] = {
469*30eb0e76SKonrad Dybcio 	{ .compatible = "qcom,sar2130p-gpucc" },
470*30eb0e76SKonrad Dybcio 	{ }
471*30eb0e76SKonrad Dybcio };
472*30eb0e76SKonrad Dybcio MODULE_DEVICE_TABLE(of, gpu_cc_sar2130p_match_table);
473*30eb0e76SKonrad Dybcio 
gpu_cc_sar2130p_probe(struct platform_device * pdev)474*30eb0e76SKonrad Dybcio static int gpu_cc_sar2130p_probe(struct platform_device *pdev)
475*30eb0e76SKonrad Dybcio {
476*30eb0e76SKonrad Dybcio 	struct device *dev = &pdev->dev;
477*30eb0e76SKonrad Dybcio 	struct regmap *regmap;
478*30eb0e76SKonrad Dybcio 
479*30eb0e76SKonrad Dybcio 	regmap = qcom_cc_map(pdev, &gpu_cc_sar2130p_desc);
480*30eb0e76SKonrad Dybcio 	if (IS_ERR(regmap))
481*30eb0e76SKonrad Dybcio 		return dev_err_probe(dev, PTR_ERR(regmap), "Couldn't map GPU_CC\n");
482*30eb0e76SKonrad Dybcio 
483*30eb0e76SKonrad Dybcio 	clk_lucid_ole_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
484*30eb0e76SKonrad Dybcio 	clk_lucid_ole_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
485*30eb0e76SKonrad Dybcio 
486*30eb0e76SKonrad Dybcio 	/* Keep some clocks always-on */
487*30eb0e76SKonrad Dybcio 	qcom_branch_set_clk_en(regmap, 0x900c); /* GPU_CC_DEMET_CLK */
488*30eb0e76SKonrad Dybcio 
489*30eb0e76SKonrad Dybcio 	return qcom_cc_really_probe(dev, &gpu_cc_sar2130p_desc, regmap);
490*30eb0e76SKonrad Dybcio }
491*30eb0e76SKonrad Dybcio 
492*30eb0e76SKonrad Dybcio static struct platform_driver gpu_cc_sar2130p_driver = {
493*30eb0e76SKonrad Dybcio 	.probe = gpu_cc_sar2130p_probe,
494*30eb0e76SKonrad Dybcio 	.driver = {
495*30eb0e76SKonrad Dybcio 		.name = "gpu_cc-sar2130p",
496*30eb0e76SKonrad Dybcio 		.of_match_table = gpu_cc_sar2130p_match_table,
497*30eb0e76SKonrad Dybcio 	},
498*30eb0e76SKonrad Dybcio };
499*30eb0e76SKonrad Dybcio module_platform_driver(gpu_cc_sar2130p_driver);
500*30eb0e76SKonrad Dybcio 
501*30eb0e76SKonrad Dybcio MODULE_DESCRIPTION("QTI GPU_CC SAR2130P Driver");
502*30eb0e76SKonrad Dybcio MODULE_LICENSE("GPL");
503