1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
4 * Copyright (c) 2022, Linaro Limited
5 */
6
7 #include <linux/clk.h>
8 #include <linux/err.h>
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/of_device.h>
12 #include <linux/of.h>
13 #include <linux/regmap.h>
14
15 #include <dt-bindings/clock/qcom,gpucc-sm8350.h>
16
17 #include "clk-alpha-pll.h"
18 #include "clk-branch.h"
19 #include "clk-pll.h"
20 #include "clk-rcg.h"
21 #include "clk-regmap.h"
22 #include "common.h"
23 #include "clk-regmap-mux.h"
24 #include "clk-regmap-divider.h"
25 #include "gdsc.h"
26 #include "reset.h"
27
28 enum {
29 P_BI_TCXO,
30 P_GPLL0_OUT_MAIN,
31 P_GPLL0_OUT_MAIN_DIV,
32 P_GPU_CC_PLL0_OUT_MAIN,
33 P_GPU_CC_PLL1_OUT_MAIN,
34 };
35
36 static struct pll_vco lucid_5lpe_vco[] = {
37 { 249600000, 1750000000, 0 },
38 };
39
40 static const struct alpha_pll_config gpu_cc_pll0_config = {
41 .l = 0x18,
42 .alpha = 0x6000,
43 .config_ctl_val = 0x20485699,
44 .config_ctl_hi_val = 0x00002261,
45 .config_ctl_hi1_val = 0x2a9a699c,
46 .test_ctl_val = 0x00000000,
47 .test_ctl_hi_val = 0x00000000,
48 .test_ctl_hi1_val = 0x01800000,
49 .user_ctl_val = 0x00000000,
50 .user_ctl_hi_val = 0x00000805,
51 .user_ctl_hi1_val = 0x00000000,
52 };
53
54 static const struct clk_parent_data gpu_cc_parent = {
55 .fw_name = "bi_tcxo",
56 };
57
58 static struct clk_alpha_pll gpu_cc_pll0 = {
59 .offset = 0x0,
60 .vco_table = lucid_5lpe_vco,
61 .num_vco = ARRAY_SIZE(lucid_5lpe_vco),
62 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
63 .clkr = {
64 .hw.init = &(const struct clk_init_data){
65 .name = "gpu_cc_pll0",
66 .parent_data = &gpu_cc_parent,
67 .num_parents = 1,
68 .ops = &clk_alpha_pll_lucid_5lpe_ops,
69 },
70 },
71 };
72
73 static const struct alpha_pll_config gpu_cc_pll1_config = {
74 .l = 0x1a,
75 .alpha = 0xaaa,
76 .config_ctl_val = 0x20485699,
77 .config_ctl_hi_val = 0x00002261,
78 .config_ctl_hi1_val = 0x2a9a699c,
79 .test_ctl_val = 0x00000000,
80 .test_ctl_hi_val = 0x00000000,
81 .test_ctl_hi1_val = 0x01800000,
82 .user_ctl_val = 0x00000000,
83 .user_ctl_hi_val = 0x00000805,
84 .user_ctl_hi1_val = 0x00000000,
85 };
86
87 static struct clk_alpha_pll gpu_cc_pll1 = {
88 .offset = 0x100,
89 .vco_table = lucid_5lpe_vco,
90 .num_vco = ARRAY_SIZE(lucid_5lpe_vco),
91 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
92 .clkr = {
93 .hw.init = &(struct clk_init_data){
94 .name = "gpu_cc_pll1",
95 .parent_data = &gpu_cc_parent,
96 .num_parents = 1,
97 .ops = &clk_alpha_pll_lucid_5lpe_ops,
98 },
99 },
100 };
101
102 static const struct parent_map gpu_cc_parent_map_0[] = {
103 { P_BI_TCXO, 0 },
104 { P_GPU_CC_PLL0_OUT_MAIN, 1 },
105 { P_GPU_CC_PLL1_OUT_MAIN, 3 },
106 { P_GPLL0_OUT_MAIN, 5 },
107 { P_GPLL0_OUT_MAIN_DIV, 6 },
108 };
109
110 static const struct clk_parent_data gpu_cc_parent_data_0[] = {
111 { .fw_name = "bi_tcxo" },
112 { .hw = &gpu_cc_pll0.clkr.hw },
113 { .hw = &gpu_cc_pll1.clkr.hw },
114 { .fw_name = "gcc_gpu_gpll0_clk_src" },
115 { .fw_name = "gcc_gpu_gpll0_div_clk_src" },
116 };
117
118 static const struct parent_map gpu_cc_parent_map_1[] = {
119 { P_BI_TCXO, 0 },
120 { P_GPU_CC_PLL1_OUT_MAIN, 3 },
121 { P_GPLL0_OUT_MAIN, 5 },
122 { P_GPLL0_OUT_MAIN_DIV, 6 },
123 };
124
125 static const struct clk_parent_data gpu_cc_parent_data_1[] = {
126 { .fw_name = "bi_tcxo" },
127 { .hw = &gpu_cc_pll1.clkr.hw },
128 { .fw_name = "gcc_gpu_gpll0_clk_src" },
129 { .fw_name = "gcc_gpu_gpll0_div_clk_src" },
130 };
131
132 static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
133 F(19200000, P_BI_TCXO, 1, 0, 0),
134 F(200000000, P_GPLL0_OUT_MAIN_DIV, 1.5, 0, 0),
135 F(500000000, P_GPU_CC_PLL1_OUT_MAIN, 1, 0, 0),
136 { }
137 };
138
139 static struct clk_rcg2 gpu_cc_gmu_clk_src = {
140 .cmd_rcgr = 0x1120,
141 .mnd_width = 0,
142 .hid_width = 5,
143 .parent_map = gpu_cc_parent_map_0,
144 .freq_tbl = ftbl_gpu_cc_gmu_clk_src,
145 .clkr.hw.init = &(struct clk_init_data){
146 .name = "gpu_cc_gmu_clk_src",
147 .parent_data = gpu_cc_parent_data_0,
148 .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
149 .flags = CLK_SET_RATE_PARENT,
150 .ops = &clk_rcg2_ops,
151 },
152 };
153
154 static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
155 F(150000000, P_GPLL0_OUT_MAIN_DIV, 2, 0, 0),
156 F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
157 F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
158 { }
159 };
160
161 static struct clk_rcg2 gpu_cc_hub_clk_src = {
162 .cmd_rcgr = 0x117c,
163 .mnd_width = 0,
164 .hid_width = 5,
165 .parent_map = gpu_cc_parent_map_1,
166 .freq_tbl = ftbl_gpu_cc_hub_clk_src,
167 .clkr.hw.init = &(struct clk_init_data){
168 .name = "gpu_cc_hub_clk_src",
169 .parent_data = gpu_cc_parent_data_1,
170 .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
171 .flags = CLK_SET_RATE_PARENT,
172 .ops = &clk_rcg2_ops,
173 },
174 };
175
176 static struct clk_regmap_div gpu_cc_hub_ahb_div_clk_src = {
177 .reg = 0x11c0,
178 .shift = 0,
179 .width = 4,
180 .clkr.hw.init = &(struct clk_init_data) {
181 .name = "gpu_cc_hub_ahb_div_clk_src",
182 .parent_hws = (const struct clk_hw*[]){
183 &gpu_cc_hub_clk_src.clkr.hw,
184 },
185 .num_parents = 1,
186 .flags = CLK_SET_RATE_PARENT,
187 .ops = &clk_regmap_div_ro_ops,
188 },
189 };
190
191 static struct clk_regmap_div gpu_cc_hub_cx_int_div_clk_src = {
192 .reg = 0x11bc,
193 .shift = 0,
194 .width = 4,
195 .clkr.hw.init = &(struct clk_init_data) {
196 .name = "gpu_cc_hub_cx_int_div_clk_src",
197 .parent_hws = (const struct clk_hw*[]){
198 &gpu_cc_hub_clk_src.clkr.hw,
199 },
200 .num_parents = 1,
201 .flags = CLK_SET_RATE_PARENT,
202 .ops = &clk_regmap_div_ro_ops,
203 },
204 };
205
206 static struct clk_branch gpu_cc_ahb_clk = {
207 .halt_reg = 0x1078,
208 .halt_check = BRANCH_HALT_DELAY,
209 .clkr = {
210 .enable_reg = 0x1078,
211 .enable_mask = BIT(0),
212 .hw.init = &(struct clk_init_data){
213 .name = "gpu_cc_ahb_clk",
214 .parent_hws = (const struct clk_hw*[]){
215 &gpu_cc_hub_ahb_div_clk_src.clkr.hw,
216 },
217 .num_parents = 1,
218 .flags = CLK_SET_RATE_PARENT,
219 .ops = &clk_branch2_ops,
220 },
221 },
222 };
223
224 static struct clk_branch gpu_cc_cb_clk = {
225 .halt_reg = 0x1170,
226 .halt_check = BRANCH_HALT,
227 .clkr = {
228 .enable_reg = 0x1170,
229 .enable_mask = BIT(0),
230 .hw.init = &(struct clk_init_data){
231 .name = "gpu_cc_cb_clk",
232 .ops = &clk_branch2_ops,
233 },
234 },
235 };
236
237 static struct clk_branch gpu_cc_crc_ahb_clk = {
238 .halt_reg = 0x107c,
239 .halt_check = BRANCH_HALT_VOTED,
240 .clkr = {
241 .enable_reg = 0x107c,
242 .enable_mask = BIT(0),
243 .hw.init = &(struct clk_init_data){
244 .name = "gpu_cc_crc_ahb_clk",
245 .parent_hws = (const struct clk_hw*[]){
246 &gpu_cc_hub_ahb_div_clk_src.clkr.hw,
247 },
248 .num_parents = 1,
249 .flags = CLK_SET_RATE_PARENT,
250 .ops = &clk_branch2_ops,
251 },
252 },
253 };
254
255 static struct clk_branch gpu_cc_cx_apb_clk = {
256 .halt_reg = 0x1088,
257 .halt_check = BRANCH_HALT_VOTED,
258 .clkr = {
259 .enable_reg = 0x1088,
260 .enable_mask = BIT(0),
261 .hw.init = &(struct clk_init_data){
262 .name = "gpu_cc_cx_apb_clk",
263 .ops = &clk_branch2_ops,
264 },
265 },
266 };
267
268 static struct clk_branch gpu_cc_cx_gmu_clk = {
269 .halt_reg = 0x1098,
270 .halt_check = BRANCH_HALT,
271 .clkr = {
272 .enable_reg = 0x1098,
273 .enable_mask = BIT(0),
274 .hw.init = &(struct clk_init_data){
275 .name = "gpu_cc_cx_gmu_clk",
276 .parent_hws = (const struct clk_hw*[]){
277 &gpu_cc_gmu_clk_src.clkr.hw,
278 },
279 .num_parents = 1,
280 .flags = CLK_SET_RATE_PARENT,
281 .ops = &clk_branch2_aon_ops,
282 },
283 },
284 };
285
286 static struct clk_branch gpu_cc_cx_qdss_at_clk = {
287 .halt_reg = 0x1080,
288 .halt_check = BRANCH_HALT_VOTED,
289 .clkr = {
290 .enable_reg = 0x1080,
291 .enable_mask = BIT(0),
292 .hw.init = &(struct clk_init_data){
293 .name = "gpu_cc_cx_qdss_at_clk",
294 .ops = &clk_branch2_ops,
295 },
296 },
297 };
298
299 static struct clk_branch gpu_cc_cx_qdss_trig_clk = {
300 .halt_reg = 0x1094,
301 .halt_check = BRANCH_HALT_VOTED,
302 .clkr = {
303 .enable_reg = 0x1094,
304 .enable_mask = BIT(0),
305 .hw.init = &(struct clk_init_data){
306 .name = "gpu_cc_cx_qdss_trig_clk",
307 .ops = &clk_branch2_ops,
308 },
309 },
310 };
311
312 static struct clk_branch gpu_cc_cx_qdss_tsctr_clk = {
313 .halt_reg = 0x1084,
314 .halt_check = BRANCH_HALT_VOTED,
315 .clkr = {
316 .enable_reg = 0x1084,
317 .enable_mask = BIT(0),
318 .hw.init = &(struct clk_init_data){
319 .name = "gpu_cc_cx_qdss_tsctr_clk",
320 .ops = &clk_branch2_ops,
321 },
322 },
323 };
324
325 static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
326 .halt_reg = 0x108c,
327 .halt_check = BRANCH_HALT_VOTED,
328 .clkr = {
329 .enable_reg = 0x108c,
330 .enable_mask = BIT(0),
331 .hw.init = &(struct clk_init_data){
332 .name = "gpu_cc_cx_snoc_dvm_clk",
333 .ops = &clk_branch2_ops,
334 },
335 },
336 };
337
338 static struct clk_branch gpu_cc_cxo_aon_clk = {
339 .halt_reg = 0x1004,
340 .halt_check = BRANCH_HALT_VOTED,
341 .clkr = {
342 .enable_reg = 0x1004,
343 .enable_mask = BIT(0),
344 .hw.init = &(struct clk_init_data){
345 .name = "gpu_cc_cxo_aon_clk",
346 .ops = &clk_branch2_ops,
347 },
348 },
349 };
350
351 static struct clk_branch gpu_cc_cxo_clk = {
352 .halt_reg = 0x109c,
353 .halt_check = BRANCH_HALT,
354 .clkr = {
355 .enable_reg = 0x109c,
356 .enable_mask = BIT(0),
357 .hw.init = &(struct clk_init_data){
358 .name = "gpu_cc_cxo_clk",
359 .ops = &clk_branch2_ops,
360 },
361 },
362 };
363
364 static struct clk_branch gpu_cc_freq_measure_clk = {
365 .halt_reg = 0x120c,
366 .halt_check = BRANCH_HALT,
367 .clkr = {
368 .enable_reg = 0x120c,
369 .enable_mask = BIT(0),
370 .hw.init = &(struct clk_init_data){
371 .name = "gpu_cc_freq_measure_clk",
372 .ops = &clk_branch2_ops,
373 },
374 },
375 };
376
377 static struct clk_branch gpu_cc_gx_gmu_clk = {
378 .halt_reg = 0x1064,
379 .halt_check = BRANCH_HALT,
380 .clkr = {
381 .enable_reg = 0x1064,
382 .enable_mask = BIT(0),
383 .hw.init = &(struct clk_init_data){
384 .name = "gpu_cc_gx_gmu_clk",
385 .parent_hws = (const struct clk_hw*[]){
386 &gpu_cc_gmu_clk_src.clkr.hw,
387 },
388 .num_parents = 1,
389 .flags = CLK_SET_RATE_PARENT,
390 .ops = &clk_branch2_ops,
391 },
392 },
393 };
394
395 static struct clk_branch gpu_cc_gx_qdss_tsctr_clk = {
396 .halt_reg = 0x105c,
397 .halt_check = BRANCH_HALT_VOTED,
398 .clkr = {
399 .enable_reg = 0x105c,
400 .enable_mask = BIT(0),
401 .hw.init = &(struct clk_init_data){
402 .name = "gpu_cc_gx_qdss_tsctr_clk",
403 .ops = &clk_branch2_ops,
404 },
405 },
406 };
407
408 static struct clk_branch gpu_cc_gx_vsense_clk = {
409 .halt_reg = 0x1058,
410 .halt_check = BRANCH_HALT_VOTED,
411 .clkr = {
412 .enable_reg = 0x1058,
413 .enable_mask = BIT(0),
414 .hw.init = &(struct clk_init_data){
415 .name = "gpu_cc_gx_vsense_clk",
416 .ops = &clk_branch2_ops,
417 },
418 },
419 };
420
421 static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
422 .halt_reg = 0x5000,
423 .halt_check = BRANCH_HALT_VOTED,
424 .clkr = {
425 .enable_reg = 0x5000,
426 .enable_mask = BIT(0),
427 .hw.init = &(struct clk_init_data){
428 .name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
429 .ops = &clk_branch2_ops,
430 },
431 },
432 };
433
434 static struct clk_branch gpu_cc_hub_aon_clk = {
435 .halt_reg = 0x1178,
436 .halt_check = BRANCH_HALT,
437 .clkr = {
438 .enable_reg = 0x1178,
439 .enable_mask = BIT(0),
440 .hw.init = &(struct clk_init_data){
441 .name = "gpu_cc_hub_aon_clk",
442 .parent_hws = (const struct clk_hw*[]){
443 &gpu_cc_hub_clk_src.clkr.hw,
444 },
445 .num_parents = 1,
446 .flags = CLK_SET_RATE_PARENT,
447 .ops = &clk_branch2_aon_ops,
448 },
449 },
450 };
451
452 static struct clk_branch gpu_cc_hub_cx_int_clk = {
453 .halt_reg = 0x1204,
454 .halt_check = BRANCH_HALT,
455 .clkr = {
456 .enable_reg = 0x1204,
457 .enable_mask = BIT(0),
458 .hw.init = &(struct clk_init_data){
459 .name = "gpu_cc_hub_cx_int_clk",
460 .parent_hws = (const struct clk_hw*[]){
461 &gpu_cc_hub_cx_int_div_clk_src.clkr.hw,
462 },
463 .num_parents = 1,
464 .flags = CLK_SET_RATE_PARENT,
465 .ops = &clk_branch2_aon_ops,
466 },
467 },
468 };
469
470 static struct clk_branch gpu_cc_mnd1x_0_gfx3d_clk = {
471 .halt_reg = 0x802c,
472 .halt_check = BRANCH_HALT,
473 .clkr = {
474 .enable_reg = 0x802c,
475 .enable_mask = BIT(0),
476 .hw.init = &(struct clk_init_data){
477 .name = "gpu_cc_mnd1x_0_gfx3d_clk",
478 .ops = &clk_branch2_ops,
479 },
480 },
481 };
482
483 static struct clk_branch gpu_cc_mnd1x_1_gfx3d_clk = {
484 .halt_reg = 0x8030,
485 .halt_check = BRANCH_HALT,
486 .clkr = {
487 .enable_reg = 0x8030,
488 .enable_mask = BIT(0),
489 .hw.init = &(struct clk_init_data){
490 .name = "gpu_cc_mnd1x_1_gfx3d_clk",
491 .ops = &clk_branch2_ops,
492 },
493 },
494 };
495
496 static struct clk_branch gpu_cc_sleep_clk = {
497 .halt_reg = 0x1090,
498 .halt_check = BRANCH_HALT_VOTED,
499 .clkr = {
500 .enable_reg = 0x1090,
501 .enable_mask = BIT(0),
502 .hw.init = &(struct clk_init_data){
503 .name = "gpu_cc_sleep_clk",
504 .ops = &clk_branch2_ops,
505 },
506 },
507 };
508
509 static struct gdsc gpu_cx_gdsc = {
510 .gdscr = 0x106c,
511 .gds_hw_ctrl = 0x1540,
512 .pd = {
513 .name = "gpu_cx_gdsc",
514 },
515 .pwrsts = PWRSTS_OFF_ON,
516 .flags = VOTABLE,
517 };
518
519 static struct gdsc gpu_gx_gdsc = {
520 .gdscr = 0x100c,
521 .clamp_io_ctrl = 0x1508,
522 .pd = {
523 .name = "gpu_gx_gdsc",
524 .power_on = gdsc_gx_do_nothing_enable,
525 },
526 .pwrsts = PWRSTS_OFF_ON,
527 .flags = CLAMP_IO | AON_RESET | POLL_CFG_GDSCR,
528 };
529
530 static struct clk_regmap *gpu_cc_sm8350_clocks[] = {
531 [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
532 [GPU_CC_CB_CLK] = &gpu_cc_cb_clk.clkr,
533 [GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
534 [GPU_CC_CX_APB_CLK] = &gpu_cc_cx_apb_clk.clkr,
535 [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
536 [GPU_CC_CX_QDSS_AT_CLK] = &gpu_cc_cx_qdss_at_clk.clkr,
537 [GPU_CC_CX_QDSS_TRIG_CLK] = &gpu_cc_cx_qdss_trig_clk.clkr,
538 [GPU_CC_CX_QDSS_TSCTR_CLK] = &gpu_cc_cx_qdss_tsctr_clk.clkr,
539 [GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
540 [GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
541 [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
542 [GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_clk.clkr,
543 [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
544 [GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr,
545 [GPU_CC_GX_QDSS_TSCTR_CLK] = &gpu_cc_gx_qdss_tsctr_clk.clkr,
546 [GPU_CC_GX_VSENSE_CLK] = &gpu_cc_gx_vsense_clk.clkr,
547 [GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
548 [GPU_CC_HUB_AHB_DIV_CLK_SRC] = &gpu_cc_hub_ahb_div_clk_src.clkr,
549 [GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
550 [GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
551 [GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
552 [GPU_CC_HUB_CX_INT_DIV_CLK_SRC] = &gpu_cc_hub_cx_int_div_clk_src.clkr,
553 [GPU_CC_MND1X_0_GFX3D_CLK] = &gpu_cc_mnd1x_0_gfx3d_clk.clkr,
554 [GPU_CC_MND1X_1_GFX3D_CLK] = &gpu_cc_mnd1x_1_gfx3d_clk.clkr,
555 [GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
556 [GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
557 [GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
558 };
559
560 static const struct qcom_reset_map gpu_cc_sm8350_resets[] = {
561 [GPUCC_GPU_CC_ACD_BCR] = { 0x1160 },
562 [GPUCC_GPU_CC_CB_BCR] = { 0x116c },
563 [GPUCC_GPU_CC_CX_BCR] = { 0x1068 },
564 [GPUCC_GPU_CC_FAST_HUB_BCR] = { 0x1174 },
565 [GPUCC_GPU_CC_GFX3D_AON_BCR] = { 0x10a0 },
566 [GPUCC_GPU_CC_GMU_BCR] = { 0x111c },
567 [GPUCC_GPU_CC_GX_BCR] = { 0x1008 },
568 [GPUCC_GPU_CC_XO_BCR] = { 0x1000 },
569 };
570
571 static struct gdsc *gpu_cc_sm8350_gdscs[] = {
572 [GPU_CX_GDSC] = &gpu_cx_gdsc,
573 [GPU_GX_GDSC] = &gpu_gx_gdsc,
574 };
575
576 static const struct regmap_config gpu_cc_sm8350_regmap_config = {
577 .reg_bits = 32,
578 .reg_stride = 4,
579 .val_bits = 32,
580 .max_register = 0x8030,
581 .fast_io = true,
582 };
583
584 static const struct qcom_cc_desc gpu_cc_sm8350_desc = {
585 .config = &gpu_cc_sm8350_regmap_config,
586 .clks = gpu_cc_sm8350_clocks,
587 .num_clks = ARRAY_SIZE(gpu_cc_sm8350_clocks),
588 .resets = gpu_cc_sm8350_resets,
589 .num_resets = ARRAY_SIZE(gpu_cc_sm8350_resets),
590 .gdscs = gpu_cc_sm8350_gdscs,
591 .num_gdscs = ARRAY_SIZE(gpu_cc_sm8350_gdscs),
592 };
593
gpu_cc_sm8350_probe(struct platform_device * pdev)594 static int gpu_cc_sm8350_probe(struct platform_device *pdev)
595 {
596 struct regmap *regmap;
597
598 regmap = qcom_cc_map(pdev, &gpu_cc_sm8350_desc);
599 if (IS_ERR(regmap)) {
600 dev_err(&pdev->dev, "Failed to map gpu cc registers\n");
601 return PTR_ERR(regmap);
602 }
603
604 clk_lucid_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
605 clk_lucid_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
606
607 return qcom_cc_really_probe(pdev, &gpu_cc_sm8350_desc, regmap);
608 }
609
610 static const struct of_device_id gpu_cc_sm8350_match_table[] = {
611 { .compatible = "qcom,sm8350-gpucc" },
612 { }
613 };
614 MODULE_DEVICE_TABLE(of, gpu_cc_sm8350_match_table);
615
616 static struct platform_driver gpu_cc_sm8350_driver = {
617 .probe = gpu_cc_sm8350_probe,
618 .driver = {
619 .name = "sm8350-gpucc",
620 .of_match_table = gpu_cc_sm8350_match_table,
621 },
622 };
623
gpu_cc_sm8350_init(void)624 static int __init gpu_cc_sm8350_init(void)
625 {
626 return platform_driver_register(&gpu_cc_sm8350_driver);
627 }
628 subsys_initcall(gpu_cc_sm8350_init);
629
gpu_cc_sm8350_exit(void)630 static void __exit gpu_cc_sm8350_exit(void)
631 {
632 platform_driver_unregister(&gpu_cc_sm8350_driver);
633 }
634 module_exit(gpu_cc_sm8350_exit);
635
636 MODULE_DESCRIPTION("QTI GPU_CC SM8350 Driver");
637 MODULE_LICENSE("GPL v2");
638