Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: qcom: add support for SM8350 GPUCC

The GPUCC manages the clocks for the Adreno GPU found on the
sm8350 SoCs.

Signed-off-by: Robert Foss <robert.foss@linaro.org>
Signed-off-by: Jonathan Marek <jonathan@marek.ca>
Reviewed-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20220706154337.2026269-3-robert.foss@linaro.org

authored by

Robert Foss and committed by
Bjorn Andersson
160758b0 7e06c692

+646
+8
drivers/clk/qcom/Kconfig
··· 720 720 Say Y if you want to support graphics controller devices and 721 721 functionality such as 3D graphics. 722 722 723 + config SM_GPUCC_8350 724 + tristate "SM8350 Graphics Clock Controller" 725 + select SM_GCC_8350 726 + help 727 + Support for the graphics clock controller on SM8350 devices. 728 + Say Y if you want to support graphics controller devices and 729 + functionality such as 3D graphics. 730 + 723 731 config SM_VIDEOCC_8150 724 732 tristate "SM8150 Video Clock Controller" 725 733 select SM_GCC_8150
+1
drivers/clk/qcom/Makefile
··· 103 103 obj-$(CONFIG_SM_GPUCC_6350) += gpucc-sm6350.o 104 104 obj-$(CONFIG_SM_GPUCC_8150) += gpucc-sm8150.o 105 105 obj-$(CONFIG_SM_GPUCC_8250) += gpucc-sm8250.o 106 + obj-$(CONFIG_SM_GPUCC_8350) += gpucc-sm8350.o 106 107 obj-$(CONFIG_SM_VIDEOCC_8150) += videocc-sm8150.o 107 108 obj-$(CONFIG_SM_VIDEOCC_8250) += videocc-sm8250.o 108 109 obj-$(CONFIG_SPMI_PMIC_CLKDIV) += clk-spmi-pmic-div.o
+637
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 + gpu_cc_parent, 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 + gpu_cc_parent, 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");