GNU Linux-libre 6.1.24-gnu
[releases.git] / drivers / clk / qcom / gpucc-sm8350.c
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
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
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
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");