xref: /openbmc/linux/drivers/clk/qcom/gpucc-sm8550.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1bfae4074SJagadeesh Kona // SPDX-License-Identifier: GPL-2.0-only
2bfae4074SJagadeesh Kona /*
3bfae4074SJagadeesh Kona  * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
4bfae4074SJagadeesh Kona  */
5bfae4074SJagadeesh Kona 
6bfae4074SJagadeesh Kona #include <linux/clk-provider.h>
7*a96cbb14SRob Herring #include <linux/mod_devicetable.h>
8bfae4074SJagadeesh Kona #include <linux/module.h>
9*a96cbb14SRob Herring #include <linux/platform_device.h>
10bfae4074SJagadeesh Kona #include <linux/regmap.h>
11bfae4074SJagadeesh Kona 
12bfae4074SJagadeesh Kona #include <dt-bindings/clock/qcom,sm8550-gpucc.h>
13bfae4074SJagadeesh Kona 
14bfae4074SJagadeesh Kona #include "clk-alpha-pll.h"
15bfae4074SJagadeesh Kona #include "clk-branch.h"
16bfae4074SJagadeesh Kona #include "clk-rcg.h"
17bfae4074SJagadeesh Kona #include "clk-regmap.h"
18bfae4074SJagadeesh Kona #include "clk-regmap-divider.h"
19bfae4074SJagadeesh Kona #include "common.h"
20bfae4074SJagadeesh Kona #include "gdsc.h"
21bfae4074SJagadeesh Kona #include "reset.h"
22bfae4074SJagadeesh Kona 
23bfae4074SJagadeesh Kona enum {
24bfae4074SJagadeesh Kona 	DT_BI_TCXO,
25bfae4074SJagadeesh Kona 	DT_GPLL0_OUT_MAIN,
26bfae4074SJagadeesh Kona 	DT_GPLL0_OUT_MAIN_DIV,
27bfae4074SJagadeesh Kona };
28bfae4074SJagadeesh Kona 
29bfae4074SJagadeesh Kona enum {
30bfae4074SJagadeesh Kona 	P_BI_TCXO,
31bfae4074SJagadeesh Kona 	P_GPLL0_OUT_MAIN,
32bfae4074SJagadeesh Kona 	P_GPLL0_OUT_MAIN_DIV,
33bfae4074SJagadeesh Kona 	P_GPU_CC_PLL0_OUT_MAIN,
34bfae4074SJagadeesh Kona 	P_GPU_CC_PLL1_OUT_MAIN,
35bfae4074SJagadeesh Kona };
36bfae4074SJagadeesh Kona 
37bfae4074SJagadeesh Kona static const struct pll_vco lucid_ole_vco[] = {
38bfae4074SJagadeesh Kona 	{ 249600000, 2300000000, 0 },
39bfae4074SJagadeesh Kona };
40bfae4074SJagadeesh Kona 
41bfae4074SJagadeesh Kona static const struct alpha_pll_config gpu_cc_pll0_config = {
42bfae4074SJagadeesh Kona 	/* .l includes RINGOSC_CAL_L_VAL, CAL_L_VAL, L_VAL fields */
43bfae4074SJagadeesh Kona 	.l = 0x4444000d,
44bfae4074SJagadeesh Kona 	.alpha = 0x0,
45bfae4074SJagadeesh Kona 	.config_ctl_val = 0x20485699,
46bfae4074SJagadeesh Kona 	.config_ctl_hi_val = 0x00182261,
47bfae4074SJagadeesh Kona 	.config_ctl_hi1_val = 0x82aa299c,
48bfae4074SJagadeesh Kona 	.test_ctl_val = 0x00000000,
49bfae4074SJagadeesh Kona 	.test_ctl_hi_val = 0x00000003,
50bfae4074SJagadeesh Kona 	.test_ctl_hi1_val = 0x00009000,
51bfae4074SJagadeesh Kona 	.test_ctl_hi2_val = 0x00000034,
52bfae4074SJagadeesh Kona 	.user_ctl_val = 0x00000000,
53bfae4074SJagadeesh Kona 	.user_ctl_hi_val = 0x00000005,
54bfae4074SJagadeesh Kona };
55bfae4074SJagadeesh Kona 
56bfae4074SJagadeesh Kona static struct clk_alpha_pll gpu_cc_pll0 = {
57bfae4074SJagadeesh Kona 	.offset = 0x0,
58bfae4074SJagadeesh Kona 	.vco_table = lucid_ole_vco,
59bfae4074SJagadeesh Kona 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
60bfae4074SJagadeesh Kona 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
61bfae4074SJagadeesh Kona 	.clkr = {
62bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
63bfae4074SJagadeesh Kona 			.name = "gpu_cc_pll0",
64bfae4074SJagadeesh Kona 			.parent_data = &(const struct clk_parent_data) {
65bfae4074SJagadeesh Kona 				.index = DT_BI_TCXO,
66bfae4074SJagadeesh Kona 			},
67bfae4074SJagadeesh Kona 			.num_parents = 1,
68bfae4074SJagadeesh Kona 			.ops = &clk_alpha_pll_lucid_evo_ops,
69bfae4074SJagadeesh Kona 		},
70bfae4074SJagadeesh Kona 	},
71bfae4074SJagadeesh Kona };
72bfae4074SJagadeesh Kona 
73bfae4074SJagadeesh Kona static const struct alpha_pll_config gpu_cc_pll1_config = {
74bfae4074SJagadeesh Kona 	/* .l includes RINGOSC_CAL_L_VAL, CAL_L_VAL, L_VAL fields */
75bfae4074SJagadeesh Kona 	.l = 0x44440016,
76bfae4074SJagadeesh Kona 	.alpha = 0xeaaa,
77bfae4074SJagadeesh Kona 	.config_ctl_val = 0x20485699,
78bfae4074SJagadeesh Kona 	.config_ctl_hi_val = 0x00182261,
79bfae4074SJagadeesh Kona 	.config_ctl_hi1_val = 0x82aa299c,
80bfae4074SJagadeesh Kona 	.test_ctl_val = 0x00000000,
81bfae4074SJagadeesh Kona 	.test_ctl_hi_val = 0x00000003,
82bfae4074SJagadeesh Kona 	.test_ctl_hi1_val = 0x00009000,
83bfae4074SJagadeesh Kona 	.test_ctl_hi2_val = 0x00000034,
84bfae4074SJagadeesh Kona 	.user_ctl_val = 0x00000000,
85bfae4074SJagadeesh Kona 	.user_ctl_hi_val = 0x00000005,
86bfae4074SJagadeesh Kona };
87bfae4074SJagadeesh Kona 
88bfae4074SJagadeesh Kona static struct clk_alpha_pll gpu_cc_pll1 = {
89bfae4074SJagadeesh Kona 	.offset = 0x1000,
90bfae4074SJagadeesh Kona 	.vco_table = lucid_ole_vco,
91bfae4074SJagadeesh Kona 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
92bfae4074SJagadeesh Kona 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
93bfae4074SJagadeesh Kona 	.clkr = {
94bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
95bfae4074SJagadeesh Kona 			.name = "gpu_cc_pll1",
96bfae4074SJagadeesh Kona 			.parent_data = &(const struct clk_parent_data) {
97bfae4074SJagadeesh Kona 				.index = DT_BI_TCXO,
98bfae4074SJagadeesh Kona 			},
99bfae4074SJagadeesh Kona 			.num_parents = 1,
100bfae4074SJagadeesh Kona 			.ops = &clk_alpha_pll_lucid_evo_ops,
101bfae4074SJagadeesh Kona 		},
102bfae4074SJagadeesh Kona 	},
103bfae4074SJagadeesh Kona };
104bfae4074SJagadeesh Kona 
105bfae4074SJagadeesh Kona static const struct parent_map gpu_cc_parent_map_0[] = {
106bfae4074SJagadeesh Kona 	{ P_BI_TCXO, 0 },
107bfae4074SJagadeesh Kona 	{ P_GPLL0_OUT_MAIN, 5 },
108bfae4074SJagadeesh Kona 	{ P_GPLL0_OUT_MAIN_DIV, 6 },
109bfae4074SJagadeesh Kona };
110bfae4074SJagadeesh Kona 
111bfae4074SJagadeesh Kona static const struct clk_parent_data gpu_cc_parent_data_0[] = {
112bfae4074SJagadeesh Kona 	{ .index = DT_BI_TCXO },
113bfae4074SJagadeesh Kona 	{ .index = DT_GPLL0_OUT_MAIN },
114bfae4074SJagadeesh Kona 	{ .index = DT_GPLL0_OUT_MAIN_DIV },
115bfae4074SJagadeesh Kona };
116bfae4074SJagadeesh Kona 
117bfae4074SJagadeesh Kona static const struct parent_map gpu_cc_parent_map_1[] = {
118bfae4074SJagadeesh Kona 	{ P_BI_TCXO, 0 },
119bfae4074SJagadeesh Kona 	{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
120bfae4074SJagadeesh Kona 	{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
121bfae4074SJagadeesh Kona 	{ P_GPLL0_OUT_MAIN, 5 },
122bfae4074SJagadeesh Kona 	{ P_GPLL0_OUT_MAIN_DIV, 6 },
123bfae4074SJagadeesh Kona };
124bfae4074SJagadeesh Kona 
125bfae4074SJagadeesh Kona static const struct clk_parent_data gpu_cc_parent_data_1[] = {
126bfae4074SJagadeesh Kona 	{ .index = DT_BI_TCXO },
127bfae4074SJagadeesh Kona 	{ .hw = &gpu_cc_pll0.clkr.hw },
128bfae4074SJagadeesh Kona 	{ .hw = &gpu_cc_pll1.clkr.hw },
129bfae4074SJagadeesh Kona 	{ .index = DT_GPLL0_OUT_MAIN },
130bfae4074SJagadeesh Kona 	{ .index = DT_GPLL0_OUT_MAIN_DIV },
131bfae4074SJagadeesh Kona };
132bfae4074SJagadeesh Kona 
133bfae4074SJagadeesh Kona static const struct parent_map gpu_cc_parent_map_2[] = {
134bfae4074SJagadeesh Kona 	{ P_BI_TCXO, 0 },
135bfae4074SJagadeesh Kona 	{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
136bfae4074SJagadeesh Kona 	{ P_GPLL0_OUT_MAIN, 5 },
137bfae4074SJagadeesh Kona 	{ P_GPLL0_OUT_MAIN_DIV, 6 },
138bfae4074SJagadeesh Kona };
139bfae4074SJagadeesh Kona 
140bfae4074SJagadeesh Kona static const struct clk_parent_data gpu_cc_parent_data_2[] = {
141bfae4074SJagadeesh Kona 	{ .index = DT_BI_TCXO },
142bfae4074SJagadeesh Kona 	{ .hw = &gpu_cc_pll1.clkr.hw },
143bfae4074SJagadeesh Kona 	{ .index = DT_GPLL0_OUT_MAIN },
144bfae4074SJagadeesh Kona 	{ .index = DT_GPLL0_OUT_MAIN_DIV },
145bfae4074SJagadeesh Kona };
146bfae4074SJagadeesh Kona 
147bfae4074SJagadeesh Kona static const struct parent_map gpu_cc_parent_map_3[] = {
148bfae4074SJagadeesh Kona 	{ P_BI_TCXO, 0 },
149bfae4074SJagadeesh Kona };
150bfae4074SJagadeesh Kona 
151bfae4074SJagadeesh Kona static const struct clk_parent_data gpu_cc_parent_data_3[] = {
152bfae4074SJagadeesh Kona 	{ .index = DT_BI_TCXO },
153bfae4074SJagadeesh Kona };
154bfae4074SJagadeesh Kona 
155bfae4074SJagadeesh Kona static const struct freq_tbl ftbl_gpu_cc_ff_clk_src[] = {
156bfae4074SJagadeesh Kona 	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
157bfae4074SJagadeesh Kona 	{ }
158bfae4074SJagadeesh Kona };
159bfae4074SJagadeesh Kona 
160bfae4074SJagadeesh Kona static struct clk_rcg2 gpu_cc_ff_clk_src = {
161bfae4074SJagadeesh Kona 	.cmd_rcgr = 0x9474,
162bfae4074SJagadeesh Kona 	.mnd_width = 0,
163bfae4074SJagadeesh Kona 	.hid_width = 5,
164bfae4074SJagadeesh Kona 	.parent_map = gpu_cc_parent_map_0,
165bfae4074SJagadeesh Kona 	.freq_tbl = ftbl_gpu_cc_ff_clk_src,
166bfae4074SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
167bfae4074SJagadeesh Kona 		.name = "gpu_cc_ff_clk_src",
168bfae4074SJagadeesh Kona 		.parent_data = gpu_cc_parent_data_0,
169bfae4074SJagadeesh Kona 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
170bfae4074SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
171bfae4074SJagadeesh Kona 		.ops = &clk_rcg2_shared_ops,
172bfae4074SJagadeesh Kona 	},
173bfae4074SJagadeesh Kona };
174bfae4074SJagadeesh Kona 
175bfae4074SJagadeesh Kona static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
176bfae4074SJagadeesh Kona 	F(19200000, P_BI_TCXO, 1, 0, 0),
177bfae4074SJagadeesh Kona 	F(220000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
178bfae4074SJagadeesh Kona 	F(550000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
179bfae4074SJagadeesh Kona 	{ }
180bfae4074SJagadeesh Kona };
181bfae4074SJagadeesh Kona 
182bfae4074SJagadeesh Kona static struct clk_rcg2 gpu_cc_gmu_clk_src = {
183bfae4074SJagadeesh Kona 	.cmd_rcgr = 0x9318,
184bfae4074SJagadeesh Kona 	.mnd_width = 0,
185bfae4074SJagadeesh Kona 	.hid_width = 5,
186bfae4074SJagadeesh Kona 	.parent_map = gpu_cc_parent_map_1,
187bfae4074SJagadeesh Kona 	.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
188bfae4074SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
189bfae4074SJagadeesh Kona 		.name = "gpu_cc_gmu_clk_src",
190bfae4074SJagadeesh Kona 		.parent_data = gpu_cc_parent_data_1,
191bfae4074SJagadeesh Kona 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
192bfae4074SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
193bfae4074SJagadeesh Kona 		.ops = &clk_rcg2_shared_ops,
194bfae4074SJagadeesh Kona 	},
195bfae4074SJagadeesh Kona };
196bfae4074SJagadeesh Kona 
197bfae4074SJagadeesh Kona static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
198bfae4074SJagadeesh Kona 	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
199bfae4074SJagadeesh Kona 	F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
200bfae4074SJagadeesh Kona 	F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0),
201bfae4074SJagadeesh Kona 	{ }
202bfae4074SJagadeesh Kona };
203bfae4074SJagadeesh Kona 
204bfae4074SJagadeesh Kona static struct clk_rcg2 gpu_cc_hub_clk_src = {
205bfae4074SJagadeesh Kona 	.cmd_rcgr = 0x93ec,
206bfae4074SJagadeesh Kona 	.mnd_width = 0,
207bfae4074SJagadeesh Kona 	.hid_width = 5,
208bfae4074SJagadeesh Kona 	.parent_map = gpu_cc_parent_map_2,
209bfae4074SJagadeesh Kona 	.freq_tbl = ftbl_gpu_cc_hub_clk_src,
210bfae4074SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
211bfae4074SJagadeesh Kona 		.name = "gpu_cc_hub_clk_src",
212bfae4074SJagadeesh Kona 		.parent_data = gpu_cc_parent_data_2,
213bfae4074SJagadeesh Kona 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_2),
214bfae4074SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
215bfae4074SJagadeesh Kona 		.ops = &clk_rcg2_shared_ops,
216bfae4074SJagadeesh Kona 	},
217bfae4074SJagadeesh Kona };
218bfae4074SJagadeesh Kona 
219bfae4074SJagadeesh Kona static const struct freq_tbl ftbl_gpu_cc_xo_clk_src[] = {
220bfae4074SJagadeesh Kona 	F(19200000, P_BI_TCXO, 1, 0, 0),
221bfae4074SJagadeesh Kona 	{ }
222bfae4074SJagadeesh Kona };
223bfae4074SJagadeesh Kona 
224bfae4074SJagadeesh Kona static struct clk_rcg2 gpu_cc_xo_clk_src = {
225bfae4074SJagadeesh Kona 	.cmd_rcgr = 0x9010,
226bfae4074SJagadeesh Kona 	.mnd_width = 0,
227bfae4074SJagadeesh Kona 	.hid_width = 5,
228bfae4074SJagadeesh Kona 	.parent_map = gpu_cc_parent_map_3,
229bfae4074SJagadeesh Kona 	.freq_tbl = ftbl_gpu_cc_xo_clk_src,
230bfae4074SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
231bfae4074SJagadeesh Kona 		.name = "gpu_cc_xo_clk_src",
232bfae4074SJagadeesh Kona 		.parent_data = gpu_cc_parent_data_3,
233bfae4074SJagadeesh Kona 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_3),
234bfae4074SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
235bfae4074SJagadeesh Kona 		.ops = &clk_rcg2_shared_ops,
236bfae4074SJagadeesh Kona 	},
237bfae4074SJagadeesh Kona };
238bfae4074SJagadeesh Kona 
239bfae4074SJagadeesh Kona static struct clk_regmap_div gpu_cc_demet_div_clk_src = {
240bfae4074SJagadeesh Kona 	.reg = 0x9054,
241bfae4074SJagadeesh Kona 	.shift = 0,
242bfae4074SJagadeesh Kona 	.width = 4,
243bfae4074SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
244bfae4074SJagadeesh Kona 		.name = "gpu_cc_demet_div_clk_src",
245bfae4074SJagadeesh Kona 		.parent_hws = (const struct clk_hw*[]) {
246bfae4074SJagadeesh Kona 			&gpu_cc_xo_clk_src.clkr.hw,
247bfae4074SJagadeesh Kona 		},
248bfae4074SJagadeesh Kona 		.num_parents = 1,
249bfae4074SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
250bfae4074SJagadeesh Kona 		.ops = &clk_regmap_div_ro_ops,
251bfae4074SJagadeesh Kona 	},
252bfae4074SJagadeesh Kona };
253bfae4074SJagadeesh Kona 
254bfae4074SJagadeesh Kona static struct clk_regmap_div gpu_cc_xo_div_clk_src = {
255bfae4074SJagadeesh Kona 	.reg = 0x9050,
256bfae4074SJagadeesh Kona 	.shift = 0,
257bfae4074SJagadeesh Kona 	.width = 4,
258bfae4074SJagadeesh Kona 	.clkr.hw.init = &(const struct clk_init_data) {
259bfae4074SJagadeesh Kona 		.name = "gpu_cc_xo_div_clk_src",
260bfae4074SJagadeesh Kona 		.parent_hws = (const struct clk_hw*[]) {
261bfae4074SJagadeesh Kona 			&gpu_cc_xo_clk_src.clkr.hw,
262bfae4074SJagadeesh Kona 		},
263bfae4074SJagadeesh Kona 		.num_parents = 1,
264bfae4074SJagadeesh Kona 		.flags = CLK_SET_RATE_PARENT,
265bfae4074SJagadeesh Kona 		.ops = &clk_regmap_div_ro_ops,
266bfae4074SJagadeesh Kona 	},
267bfae4074SJagadeesh Kona };
268bfae4074SJagadeesh Kona 
269bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_ahb_clk = {
270bfae4074SJagadeesh Kona 	.halt_reg = 0x911c,
271bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT_DELAY,
272bfae4074SJagadeesh Kona 	.clkr = {
273bfae4074SJagadeesh Kona 		.enable_reg = 0x911c,
274bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
275bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
276bfae4074SJagadeesh Kona 			.name = "gpu_cc_ahb_clk",
277bfae4074SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
278bfae4074SJagadeesh Kona 				&gpu_cc_hub_clk_src.clkr.hw,
279bfae4074SJagadeesh Kona 			},
280bfae4074SJagadeesh Kona 			.num_parents = 1,
281bfae4074SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
282bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
283bfae4074SJagadeesh Kona 		},
284bfae4074SJagadeesh Kona 	},
285bfae4074SJagadeesh Kona };
286bfae4074SJagadeesh Kona 
287bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_crc_ahb_clk = {
288bfae4074SJagadeesh Kona 	.halt_reg = 0x9120,
289bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
290bfae4074SJagadeesh Kona 	.clkr = {
291bfae4074SJagadeesh Kona 		.enable_reg = 0x9120,
292bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
293bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
294bfae4074SJagadeesh Kona 			.name = "gpu_cc_crc_ahb_clk",
295bfae4074SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
296bfae4074SJagadeesh Kona 				&gpu_cc_hub_clk_src.clkr.hw,
297bfae4074SJagadeesh Kona 			},
298bfae4074SJagadeesh Kona 			.num_parents = 1,
299bfae4074SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
300bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
301bfae4074SJagadeesh Kona 		},
302bfae4074SJagadeesh Kona 	},
303bfae4074SJagadeesh Kona };
304bfae4074SJagadeesh Kona 
305bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_cx_ff_clk = {
306bfae4074SJagadeesh Kona 	.halt_reg = 0x914c,
307bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT,
308bfae4074SJagadeesh Kona 	.clkr = {
309bfae4074SJagadeesh Kona 		.enable_reg = 0x914c,
310bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
311bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
312bfae4074SJagadeesh Kona 			.name = "gpu_cc_cx_ff_clk",
313bfae4074SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
314bfae4074SJagadeesh Kona 				&gpu_cc_ff_clk_src.clkr.hw,
315bfae4074SJagadeesh Kona 			},
316bfae4074SJagadeesh Kona 			.num_parents = 1,
317bfae4074SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
318bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
319bfae4074SJagadeesh Kona 		},
320bfae4074SJagadeesh Kona 	},
321bfae4074SJagadeesh Kona };
322bfae4074SJagadeesh Kona 
323bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_cx_gmu_clk = {
324bfae4074SJagadeesh Kona 	.halt_reg = 0x913c,
325bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
326bfae4074SJagadeesh Kona 	.clkr = {
327bfae4074SJagadeesh Kona 		.enable_reg = 0x913c,
328bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
329bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
330bfae4074SJagadeesh Kona 			.name = "gpu_cc_cx_gmu_clk",
331bfae4074SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
332bfae4074SJagadeesh Kona 				&gpu_cc_gmu_clk_src.clkr.hw,
333bfae4074SJagadeesh Kona 			},
334bfae4074SJagadeesh Kona 			.num_parents = 1,
335bfae4074SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
336bfae4074SJagadeesh Kona 			.ops = &clk_branch2_aon_ops,
337bfae4074SJagadeesh Kona 		},
338bfae4074SJagadeesh Kona 	},
339bfae4074SJagadeesh Kona };
340bfae4074SJagadeesh Kona 
341bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_cxo_clk = {
342bfae4074SJagadeesh Kona 	.halt_reg = 0x9144,
343bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT,
344bfae4074SJagadeesh Kona 	.clkr = {
345bfae4074SJagadeesh Kona 		.enable_reg = 0x9144,
346bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
347bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
348bfae4074SJagadeesh Kona 			.name = "gpu_cc_cxo_clk",
349bfae4074SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
350bfae4074SJagadeesh Kona 				&gpu_cc_xo_clk_src.clkr.hw,
351bfae4074SJagadeesh Kona 			},
352bfae4074SJagadeesh Kona 			.num_parents = 1,
353bfae4074SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
354bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
355bfae4074SJagadeesh Kona 		},
356bfae4074SJagadeesh Kona 	},
357bfae4074SJagadeesh Kona };
358bfae4074SJagadeesh Kona 
359bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_freq_measure_clk = {
360bfae4074SJagadeesh Kona 	.halt_reg = 0x9008,
361bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT,
362bfae4074SJagadeesh Kona 	.clkr = {
363bfae4074SJagadeesh Kona 		.enable_reg = 0x9008,
364bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
365bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
366bfae4074SJagadeesh Kona 			.name = "gpu_cc_freq_measure_clk",
367bfae4074SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
368bfae4074SJagadeesh Kona 				&gpu_cc_xo_div_clk_src.clkr.hw,
369bfae4074SJagadeesh Kona 			},
370bfae4074SJagadeesh Kona 			.num_parents = 1,
371bfae4074SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
372bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
373bfae4074SJagadeesh Kona 		},
374bfae4074SJagadeesh Kona 	},
375bfae4074SJagadeesh Kona };
376bfae4074SJagadeesh Kona 
377bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
378bfae4074SJagadeesh Kona 	.halt_reg = 0x7000,
379bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
380bfae4074SJagadeesh Kona 	.clkr = {
381bfae4074SJagadeesh Kona 		.enable_reg = 0x7000,
382bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
383bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
384bfae4074SJagadeesh Kona 			.name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
385bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
386bfae4074SJagadeesh Kona 		},
387bfae4074SJagadeesh Kona 	},
388bfae4074SJagadeesh Kona };
389bfae4074SJagadeesh Kona 
390bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_hub_aon_clk = {
391bfae4074SJagadeesh Kona 	.halt_reg = 0x93e8,
392bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT,
393bfae4074SJagadeesh Kona 	.clkr = {
394bfae4074SJagadeesh Kona 		.enable_reg = 0x93e8,
395bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
396bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
397bfae4074SJagadeesh Kona 			.name = "gpu_cc_hub_aon_clk",
398bfae4074SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
399bfae4074SJagadeesh Kona 				&gpu_cc_hub_clk_src.clkr.hw,
400bfae4074SJagadeesh Kona 			},
401bfae4074SJagadeesh Kona 			.num_parents = 1,
402bfae4074SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
403bfae4074SJagadeesh Kona 			.ops = &clk_branch2_aon_ops,
404bfae4074SJagadeesh Kona 		},
405bfae4074SJagadeesh Kona 	},
406bfae4074SJagadeesh Kona };
407bfae4074SJagadeesh Kona 
408bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_hub_cx_int_clk = {
409bfae4074SJagadeesh Kona 	.halt_reg = 0x9148,
410bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
411bfae4074SJagadeesh Kona 	.clkr = {
412bfae4074SJagadeesh Kona 		.enable_reg = 0x9148,
413bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
414bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
415bfae4074SJagadeesh Kona 			.name = "gpu_cc_hub_cx_int_clk",
416bfae4074SJagadeesh Kona 			.parent_hws = (const struct clk_hw*[]) {
417bfae4074SJagadeesh Kona 				&gpu_cc_hub_clk_src.clkr.hw,
418bfae4074SJagadeesh Kona 			},
419bfae4074SJagadeesh Kona 			.num_parents = 1,
420bfae4074SJagadeesh Kona 			.flags = CLK_SET_RATE_PARENT,
421bfae4074SJagadeesh Kona 			.ops = &clk_branch2_aon_ops,
422bfae4074SJagadeesh Kona 		},
423bfae4074SJagadeesh Kona 	},
424bfae4074SJagadeesh Kona };
425bfae4074SJagadeesh Kona 
426bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_memnoc_gfx_clk = {
427bfae4074SJagadeesh Kona 	.halt_reg = 0x9150,
428bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
429bfae4074SJagadeesh Kona 	.clkr = {
430bfae4074SJagadeesh Kona 		.enable_reg = 0x9150,
431bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
432bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
433bfae4074SJagadeesh Kona 			.name = "gpu_cc_memnoc_gfx_clk",
434bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
435bfae4074SJagadeesh Kona 		},
436bfae4074SJagadeesh Kona 	},
437bfae4074SJagadeesh Kona };
438bfae4074SJagadeesh Kona 
439bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_mnd1x_0_gfx3d_clk = {
440bfae4074SJagadeesh Kona 	.halt_reg = 0x9288,
441bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT,
442bfae4074SJagadeesh Kona 	.clkr = {
443bfae4074SJagadeesh Kona 		.enable_reg = 0x9288,
444bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
445bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
446bfae4074SJagadeesh Kona 			.name = "gpu_cc_mnd1x_0_gfx3d_clk",
447bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
448bfae4074SJagadeesh Kona 		},
449bfae4074SJagadeesh Kona 	},
450bfae4074SJagadeesh Kona };
451bfae4074SJagadeesh Kona 
452bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_mnd1x_1_gfx3d_clk = {
453bfae4074SJagadeesh Kona 	.halt_reg = 0x928c,
454bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT,
455bfae4074SJagadeesh Kona 	.clkr = {
456bfae4074SJagadeesh Kona 		.enable_reg = 0x928c,
457bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
458bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
459bfae4074SJagadeesh Kona 			.name = "gpu_cc_mnd1x_1_gfx3d_clk",
460bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
461bfae4074SJagadeesh Kona 		},
462bfae4074SJagadeesh Kona 	},
463bfae4074SJagadeesh Kona };
464bfae4074SJagadeesh Kona 
465bfae4074SJagadeesh Kona static struct clk_branch gpu_cc_sleep_clk = {
466bfae4074SJagadeesh Kona 	.halt_reg = 0x9134,
467bfae4074SJagadeesh Kona 	.halt_check = BRANCH_HALT_VOTED,
468bfae4074SJagadeesh Kona 	.clkr = {
469bfae4074SJagadeesh Kona 		.enable_reg = 0x9134,
470bfae4074SJagadeesh Kona 		.enable_mask = BIT(0),
471bfae4074SJagadeesh Kona 		.hw.init = &(const struct clk_init_data) {
472bfae4074SJagadeesh Kona 			.name = "gpu_cc_sleep_clk",
473bfae4074SJagadeesh Kona 			.ops = &clk_branch2_ops,
474bfae4074SJagadeesh Kona 		},
475bfae4074SJagadeesh Kona 	},
476bfae4074SJagadeesh Kona };
477bfae4074SJagadeesh Kona 
478bfae4074SJagadeesh Kona static struct gdsc gpu_cc_cx_gdsc = {
479bfae4074SJagadeesh Kona 	.gdscr = 0x9108,
480bfae4074SJagadeesh Kona 	.gds_hw_ctrl = 0x953c,
481bfae4074SJagadeesh Kona 	.en_rest_wait_val = 0x2,
482bfae4074SJagadeesh Kona 	.en_few_wait_val = 0x2,
483bfae4074SJagadeesh Kona 	.clk_dis_wait_val = 0xf,
484bfae4074SJagadeesh Kona 	.pd = {
485bfae4074SJagadeesh Kona 		.name = "gpu_cc_cx_gdsc",
486bfae4074SJagadeesh Kona 	},
487bfae4074SJagadeesh Kona 	.pwrsts = PWRSTS_OFF_ON,
488bfae4074SJagadeesh Kona 	.flags = RETAIN_FF_ENABLE | VOTABLE,
489bfae4074SJagadeesh Kona };
490bfae4074SJagadeesh Kona 
491bfae4074SJagadeesh Kona static struct gdsc gpu_cc_gx_gdsc = {
492bfae4074SJagadeesh Kona 	.gdscr = 0x905c,
493bfae4074SJagadeesh Kona 	.clamp_io_ctrl = 0x9504,
494bfae4074SJagadeesh Kona 	.en_rest_wait_val = 0x2,
495bfae4074SJagadeesh Kona 	.en_few_wait_val = 0x2,
496bfae4074SJagadeesh Kona 	.clk_dis_wait_val = 0xf,
497bfae4074SJagadeesh Kona 	.pd = {
498bfae4074SJagadeesh Kona 		.name = "gpu_cc_gx_gdsc",
499bfae4074SJagadeesh Kona 		.power_on = gdsc_gx_do_nothing_enable,
500bfae4074SJagadeesh Kona 	},
501bfae4074SJagadeesh Kona 	.pwrsts = PWRSTS_OFF_ON,
502bfae4074SJagadeesh Kona 	.flags = CLAMP_IO | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
503bfae4074SJagadeesh Kona };
504bfae4074SJagadeesh Kona 
505bfae4074SJagadeesh Kona static struct clk_regmap *gpu_cc_sm8550_clocks[] = {
506bfae4074SJagadeesh Kona 	[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
507bfae4074SJagadeesh Kona 	[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
508bfae4074SJagadeesh Kona 	[GPU_CC_CX_FF_CLK] = &gpu_cc_cx_ff_clk.clkr,
509bfae4074SJagadeesh Kona 	[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
510bfae4074SJagadeesh Kona 	[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
511bfae4074SJagadeesh Kona 	[GPU_CC_DEMET_DIV_CLK_SRC] = &gpu_cc_demet_div_clk_src.clkr,
512bfae4074SJagadeesh Kona 	[GPU_CC_FF_CLK_SRC] = &gpu_cc_ff_clk_src.clkr,
513bfae4074SJagadeesh Kona 	[GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_clk.clkr,
514bfae4074SJagadeesh Kona 	[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
515bfae4074SJagadeesh Kona 	[GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
516bfae4074SJagadeesh Kona 	[GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
517bfae4074SJagadeesh Kona 	[GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
518bfae4074SJagadeesh Kona 	[GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
519bfae4074SJagadeesh Kona 	[GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr,
520bfae4074SJagadeesh Kona 	[GPU_CC_MND1X_0_GFX3D_CLK] = &gpu_cc_mnd1x_0_gfx3d_clk.clkr,
521bfae4074SJagadeesh Kona 	[GPU_CC_MND1X_1_GFX3D_CLK] = &gpu_cc_mnd1x_1_gfx3d_clk.clkr,
522bfae4074SJagadeesh Kona 	[GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
523bfae4074SJagadeesh Kona 	[GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
524bfae4074SJagadeesh Kona 	[GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
525bfae4074SJagadeesh Kona 	[GPU_CC_XO_CLK_SRC] = &gpu_cc_xo_clk_src.clkr,
526bfae4074SJagadeesh Kona 	[GPU_CC_XO_DIV_CLK_SRC] = &gpu_cc_xo_div_clk_src.clkr,
527bfae4074SJagadeesh Kona };
528bfae4074SJagadeesh Kona 
529bfae4074SJagadeesh Kona static struct gdsc *gpu_cc_sm8550_gdscs[] = {
530bfae4074SJagadeesh Kona 	[GPU_CC_CX_GDSC] = &gpu_cc_cx_gdsc,
531bfae4074SJagadeesh Kona 	[GPU_CC_GX_GDSC] = &gpu_cc_gx_gdsc,
532bfae4074SJagadeesh Kona };
533bfae4074SJagadeesh Kona 
534bfae4074SJagadeesh Kona static const struct qcom_reset_map gpu_cc_sm8550_resets[] = {
535bfae4074SJagadeesh Kona 	[GPUCC_GPU_CC_ACD_BCR] = { 0x9358 },
536bfae4074SJagadeesh Kona 	[GPUCC_GPU_CC_CX_BCR] = { 0x9104 },
537bfae4074SJagadeesh Kona 	[GPUCC_GPU_CC_FAST_HUB_BCR] = { 0x93e4 },
538bfae4074SJagadeesh Kona 	[GPUCC_GPU_CC_FF_BCR] = { 0x9470 },
539bfae4074SJagadeesh Kona 	[GPUCC_GPU_CC_GFX3D_AON_BCR] = { 0x9198 },
540bfae4074SJagadeesh Kona 	[GPUCC_GPU_CC_GMU_BCR] = { 0x9314 },
541bfae4074SJagadeesh Kona 	[GPUCC_GPU_CC_GX_BCR] = { 0x9058 },
542bfae4074SJagadeesh Kona 	[GPUCC_GPU_CC_XO_BCR] = { 0x9000 },
543bfae4074SJagadeesh Kona };
544bfae4074SJagadeesh Kona 
545bfae4074SJagadeesh Kona static const struct regmap_config gpu_cc_sm8550_regmap_config = {
546bfae4074SJagadeesh Kona 	.reg_bits = 32,
547bfae4074SJagadeesh Kona 	.reg_stride = 4,
548bfae4074SJagadeesh Kona 	.val_bits = 32,
549bfae4074SJagadeesh Kona 	.max_register = 0x9988,
550bfae4074SJagadeesh Kona 	.fast_io = true,
551bfae4074SJagadeesh Kona };
552bfae4074SJagadeesh Kona 
553bfae4074SJagadeesh Kona static const struct qcom_cc_desc gpu_cc_sm8550_desc = {
554bfae4074SJagadeesh Kona 	.config = &gpu_cc_sm8550_regmap_config,
555bfae4074SJagadeesh Kona 	.clks = gpu_cc_sm8550_clocks,
556bfae4074SJagadeesh Kona 	.num_clks = ARRAY_SIZE(gpu_cc_sm8550_clocks),
557bfae4074SJagadeesh Kona 	.resets = gpu_cc_sm8550_resets,
558bfae4074SJagadeesh Kona 	.num_resets = ARRAY_SIZE(gpu_cc_sm8550_resets),
559bfae4074SJagadeesh Kona 	.gdscs = gpu_cc_sm8550_gdscs,
560bfae4074SJagadeesh Kona 	.num_gdscs = ARRAY_SIZE(gpu_cc_sm8550_gdscs),
561bfae4074SJagadeesh Kona };
562bfae4074SJagadeesh Kona 
563bfae4074SJagadeesh Kona static const struct of_device_id gpu_cc_sm8550_match_table[] = {
564bfae4074SJagadeesh Kona 	{ .compatible = "qcom,sm8550-gpucc" },
565bfae4074SJagadeesh Kona 	{ }
566bfae4074SJagadeesh Kona };
567bfae4074SJagadeesh Kona MODULE_DEVICE_TABLE(of, gpu_cc_sm8550_match_table);
568bfae4074SJagadeesh Kona 
gpu_cc_sm8550_probe(struct platform_device * pdev)569bfae4074SJagadeesh Kona static int gpu_cc_sm8550_probe(struct platform_device *pdev)
570bfae4074SJagadeesh Kona {
571bfae4074SJagadeesh Kona 	struct regmap *regmap;
572bfae4074SJagadeesh Kona 
573bfae4074SJagadeesh Kona 	regmap = qcom_cc_map(pdev, &gpu_cc_sm8550_desc);
574bfae4074SJagadeesh Kona 	if (IS_ERR(regmap))
575bfae4074SJagadeesh Kona 		return PTR_ERR(regmap);
576bfae4074SJagadeesh Kona 
577bfae4074SJagadeesh Kona 	clk_lucid_evo_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
578bfae4074SJagadeesh Kona 	clk_lucid_evo_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
579bfae4074SJagadeesh Kona 
580bfae4074SJagadeesh Kona 	/*
581bfae4074SJagadeesh Kona 	 * Keep clocks always enabled:
582bfae4074SJagadeesh Kona 	 *	gpu_cc_cxo_aon_clk
583bfae4074SJagadeesh Kona 	 *	gpu_cc_demet_clk
584bfae4074SJagadeesh Kona 	 */
585bfae4074SJagadeesh Kona 	regmap_update_bits(regmap, 0x9004, BIT(0), BIT(0));
586bfae4074SJagadeesh Kona 	regmap_update_bits(regmap, 0x900c, BIT(0), BIT(0));
587bfae4074SJagadeesh Kona 
588bfae4074SJagadeesh Kona 	return qcom_cc_really_probe(pdev, &gpu_cc_sm8550_desc, regmap);
589bfae4074SJagadeesh Kona }
590bfae4074SJagadeesh Kona 
591bfae4074SJagadeesh Kona static struct platform_driver gpu_cc_sm8550_driver = {
592bfae4074SJagadeesh Kona 	.probe = gpu_cc_sm8550_probe,
593bfae4074SJagadeesh Kona 	.driver = {
594bfae4074SJagadeesh Kona 		.name = "gpu_cc-sm8550",
595bfae4074SJagadeesh Kona 		.of_match_table = gpu_cc_sm8550_match_table,
596bfae4074SJagadeesh Kona 	},
597bfae4074SJagadeesh Kona };
598bfae4074SJagadeesh Kona 
gpu_cc_sm8550_init(void)599bfae4074SJagadeesh Kona static int __init gpu_cc_sm8550_init(void)
600bfae4074SJagadeesh Kona {
601bfae4074SJagadeesh Kona 	return platform_driver_register(&gpu_cc_sm8550_driver);
602bfae4074SJagadeesh Kona }
603bfae4074SJagadeesh Kona subsys_initcall(gpu_cc_sm8550_init);
604bfae4074SJagadeesh Kona 
gpu_cc_sm8550_exit(void)605bfae4074SJagadeesh Kona static void __exit gpu_cc_sm8550_exit(void)
606bfae4074SJagadeesh Kona {
607bfae4074SJagadeesh Kona 	platform_driver_unregister(&gpu_cc_sm8550_driver);
608bfae4074SJagadeesh Kona }
609bfae4074SJagadeesh Kona module_exit(gpu_cc_sm8550_exit);
610bfae4074SJagadeesh Kona 
611bfae4074SJagadeesh Kona MODULE_DESCRIPTION("QTI GPUCC SM8550 Driver");
612bfae4074SJagadeesh Kona MODULE_LICENSE("GPL");
613