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

clk: qcom: Add GPU clock controller driver for SM6350

Add support for the GPU clock controller found on SM6350.

Signed-off-by: Konrad Dybcio <konrad.dybcio@somainline.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20220222011534.3502-4-konrad.dybcio@somainline.org

authored by

Konrad Dybcio and committed by
Bjorn Andersson
013804a7 7b91b9d8

+530
+8
drivers/clk/qcom/Kconfig
··· 660 660 Say Y if you want to use peripheral devices such as UART, 661 661 SPI, I2C, USB, SD/UFS, PCIe etc. 662 662 663 + config SM_GPUCC_6350 664 + tristate "SM6350 Graphics Clock Controller" 665 + select SM_GCC_6350 666 + help 667 + Support for the graphics clock controller on SM6350 devices. 668 + Say Y if you want to support graphics controller devices and 669 + functionality such as 3D graphics. 670 + 663 671 config SM_GPUCC_8150 664 672 tristate "SM8150 Graphics Clock Controller" 665 673 select SM_GCC_8150
+1
drivers/clk/qcom/Makefile
··· 95 95 obj-$(CONFIG_SM_GCC_8250) += gcc-sm8250.o 96 96 obj-$(CONFIG_SM_GCC_8350) += gcc-sm8350.o 97 97 obj-$(CONFIG_SM_GCC_8450) += gcc-sm8450.o 98 + obj-$(CONFIG_SM_GPUCC_6350) += gpucc-sm6350.o 98 99 obj-$(CONFIG_SM_GPUCC_8150) += gpucc-sm8150.o 99 100 obj-$(CONFIG_SM_GPUCC_8250) += gpucc-sm8250.o 100 101 obj-$(CONFIG_SM_VIDEOCC_8150) += videocc-sm8150.o
+521
drivers/clk/qcom/gpucc-sm6350.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2021, The Linux Foundation. All rights reserved. 4 + * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org> 5 + */ 6 + 7 + #include <linux/clk-provider.h> 8 + #include <linux/module.h> 9 + #include <linux/platform_device.h> 10 + #include <linux/regmap.h> 11 + 12 + #include <dt-bindings/clock/qcom,gpucc-sm6350.h> 13 + 14 + #include "common.h" 15 + #include "clk-alpha-pll.h" 16 + #include "clk-branch.h" 17 + #include "clk-rcg.h" 18 + #include "clk-regmap.h" 19 + #include "reset.h" 20 + #include "gdsc.h" 21 + 22 + #define CX_GMU_CBCR_SLEEP_MASK 0xF 23 + #define CX_GMU_CBCR_SLEEP_SHIFT 4 24 + #define CX_GMU_CBCR_WAKE_MASK 0xF 25 + #define CX_GMU_CBCR_WAKE_SHIFT 8 26 + 27 + enum { 28 + P_BI_TCXO, 29 + P_GPLL0_OUT_MAIN, 30 + P_GPLL0_OUT_MAIN_DIV, 31 + P_GPU_CC_PLL0_OUT_MAIN, 32 + P_GPU_CC_PLL0_OUT_ODD, 33 + P_GPU_CC_PLL1_OUT_EVEN, 34 + P_GPU_CC_PLL1_OUT_MAIN, 35 + P_GPU_CC_PLL1_OUT_ODD, 36 + P_CRC_DIV, 37 + }; 38 + 39 + static const struct pll_vco fabia_vco[] = { 40 + { 249600000, 2000000000, 0 }, 41 + }; 42 + 43 + /* 506MHz Configuration*/ 44 + static const struct alpha_pll_config gpu_cc_pll0_config = { 45 + .l = 0x1A, 46 + .alpha = 0x5AAA, 47 + .config_ctl_val = 0x20485699, 48 + .config_ctl_hi_val = 0x00002067, 49 + .test_ctl_val = 0x40000000, 50 + .test_ctl_hi_val = 0x00000002, 51 + .user_ctl_val = 0x00000001, 52 + .user_ctl_hi_val = 0x00004805, 53 + }; 54 + 55 + static struct clk_alpha_pll gpu_cc_pll0 = { 56 + .offset = 0x0, 57 + .vco_table = fabia_vco, 58 + .num_vco = ARRAY_SIZE(fabia_vco), 59 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 60 + .clkr = { 61 + .hw.init = &(struct clk_init_data){ 62 + .name = "gpu_cc_pll0", 63 + .parent_data = &(const struct clk_parent_data){ 64 + .fw_name = "bi_tcxo", 65 + }, 66 + .num_parents = 1, 67 + .ops = &clk_alpha_pll_fabia_ops, 68 + }, 69 + }, 70 + }; 71 + 72 + static struct clk_fixed_factor crc_div = { 73 + .mult = 1, 74 + .div = 2, 75 + .hw.init = &(struct clk_init_data){ 76 + .name = "crc_div", 77 + .parent_hws = (const struct clk_hw*[]){ 78 + &gpu_cc_pll0.clkr.hw, 79 + }, 80 + .num_parents = 1, 81 + .flags = CLK_SET_RATE_PARENT, 82 + .ops = &clk_fixed_factor_ops, 83 + }, 84 + }; 85 + 86 + /* 514MHz Configuration*/ 87 + static const struct alpha_pll_config gpu_cc_pll1_config = { 88 + .l = 0x1A, 89 + .alpha = 0xC555, 90 + .config_ctl_val = 0x20485699, 91 + .config_ctl_hi_val = 0x00002067, 92 + .test_ctl_val = 0x40000000, 93 + .test_ctl_hi_val = 0x00000002, 94 + .user_ctl_val = 0x00000001, 95 + .user_ctl_hi_val = 0x00004805, 96 + }; 97 + 98 + static struct clk_alpha_pll gpu_cc_pll1 = { 99 + .offset = 0x100, 100 + .vco_table = fabia_vco, 101 + .num_vco = ARRAY_SIZE(fabia_vco), 102 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 103 + .clkr = { 104 + .hw.init = &(struct clk_init_data){ 105 + .name = "gpu_cc_pll1", 106 + .parent_data = &(const struct clk_parent_data){ 107 + .fw_name = "bi_tcxo", 108 + }, 109 + .num_parents = 1, 110 + .ops = &clk_alpha_pll_fabia_ops, 111 + }, 112 + }, 113 + }; 114 + 115 + static const struct parent_map gpu_cc_parent_map_0[] = { 116 + { P_BI_TCXO, 0 }, 117 + { P_GPU_CC_PLL0_OUT_MAIN, 1 }, 118 + { P_GPU_CC_PLL1_OUT_MAIN, 3 }, 119 + { P_GPLL0_OUT_MAIN, 5 }, 120 + { P_GPLL0_OUT_MAIN_DIV, 6 }, 121 + }; 122 + 123 + static const struct clk_parent_data gpu_cc_parent_data_0[] = { 124 + { .fw_name = "bi_tcxo" }, 125 + { .hw = &gpu_cc_pll0.clkr.hw }, 126 + { .hw = &gpu_cc_pll1.clkr.hw }, 127 + { .fw_name = "gcc_gpu_gpll0_clk" }, 128 + { .fw_name = "gcc_gpu_gpll0_div_clk" }, 129 + }; 130 + 131 + static const struct parent_map gpu_cc_parent_map_1[] = { 132 + { P_BI_TCXO, 0 }, 133 + { P_CRC_DIV, 1 }, 134 + { P_GPU_CC_PLL0_OUT_ODD, 2 }, 135 + { P_GPU_CC_PLL1_OUT_EVEN, 3 }, 136 + { P_GPU_CC_PLL1_OUT_ODD, 4 }, 137 + { P_GPLL0_OUT_MAIN, 5 }, 138 + }; 139 + 140 + static const struct clk_parent_data gpu_cc_parent_data_1[] = { 141 + { .fw_name = "bi_tcxo" }, 142 + { .hw = &crc_div.hw }, 143 + { .hw = &gpu_cc_pll0.clkr.hw }, 144 + { .hw = &gpu_cc_pll1.clkr.hw }, 145 + { .hw = &gpu_cc_pll1.clkr.hw }, 146 + { .fw_name = "gcc_gpu_gpll0_clk" }, 147 + }; 148 + 149 + static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = { 150 + F(200000000, P_GPLL0_OUT_MAIN_DIV, 1.5, 0, 0), 151 + { } 152 + }; 153 + 154 + static struct clk_rcg2 gpu_cc_gmu_clk_src = { 155 + .cmd_rcgr = 0x1120, 156 + .mnd_width = 0, 157 + .hid_width = 5, 158 + .parent_map = gpu_cc_parent_map_0, 159 + .freq_tbl = ftbl_gpu_cc_gmu_clk_src, 160 + .clkr.hw.init = &(struct clk_init_data){ 161 + .name = "gpu_cc_gmu_clk_src", 162 + .parent_data = gpu_cc_parent_data_0, 163 + .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0), 164 + .flags = CLK_SET_RATE_PARENT, 165 + .ops = &clk_rcg2_ops, 166 + }, 167 + }; 168 + 169 + static const struct freq_tbl ftbl_gpu_cc_gx_gfx3d_clk_src[] = { 170 + F(253000000, P_CRC_DIV, 1, 0, 0), 171 + F(355000000, P_CRC_DIV, 1, 0, 0), 172 + F(430000000, P_CRC_DIV, 1, 0, 0), 173 + F(565000000, P_CRC_DIV, 1, 0, 0), 174 + F(650000000, P_CRC_DIV, 1, 0, 0), 175 + F(800000000, P_CRC_DIV, 1, 0, 0), 176 + F(825000000, P_CRC_DIV, 1, 0, 0), 177 + F(850000000, P_CRC_DIV, 1, 0, 0), 178 + { } 179 + }; 180 + 181 + static struct clk_rcg2 gpu_cc_gx_gfx3d_clk_src = { 182 + .cmd_rcgr = 0x101c, 183 + .mnd_width = 0, 184 + .hid_width = 5, 185 + .parent_map = gpu_cc_parent_map_1, 186 + .freq_tbl = ftbl_gpu_cc_gx_gfx3d_clk_src, 187 + .clkr.hw.init = &(struct clk_init_data){ 188 + .name = "gpu_cc_gx_gfx3d_clk_src", 189 + .parent_data = gpu_cc_parent_data_1, 190 + .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1), 191 + .flags = CLK_SET_RATE_PARENT, 192 + .ops = &clk_rcg2_ops, 193 + }, 194 + }; 195 + 196 + static struct clk_branch gpu_cc_acd_ahb_clk = { 197 + .halt_reg = 0x1168, 198 + .halt_check = BRANCH_HALT, 199 + .clkr = { 200 + .enable_reg = 0x1168, 201 + .enable_mask = BIT(0), 202 + .hw.init = &(struct clk_init_data){ 203 + .name = "gpu_cc_acd_ahb_clk", 204 + .ops = &clk_branch2_ops, 205 + }, 206 + }, 207 + }; 208 + 209 + static struct clk_branch gpu_cc_acd_cxo_clk = { 210 + .halt_reg = 0x1164, 211 + .halt_check = BRANCH_HALT, 212 + .clkr = { 213 + .enable_reg = 0x1164, 214 + .enable_mask = BIT(0), 215 + .hw.init = &(struct clk_init_data){ 216 + .name = "gpu_cc_acd_cxo_clk", 217 + .ops = &clk_branch2_ops, 218 + }, 219 + }, 220 + }; 221 + 222 + static struct clk_branch gpu_cc_ahb_clk = { 223 + .halt_reg = 0x1078, 224 + .halt_check = BRANCH_HALT_DELAY, 225 + .clkr = { 226 + .enable_reg = 0x1078, 227 + .enable_mask = BIT(0), 228 + .hw.init = &(struct clk_init_data){ 229 + .name = "gpu_cc_ahb_clk", 230 + .flags = CLK_IS_CRITICAL, 231 + .ops = &clk_branch2_ops, 232 + }, 233 + }, 234 + }; 235 + 236 + static struct clk_branch gpu_cc_crc_ahb_clk = { 237 + .halt_reg = 0x107c, 238 + .halt_check = BRANCH_HALT_DELAY, 239 + .clkr = { 240 + .enable_reg = 0x107c, 241 + .enable_mask = BIT(0), 242 + .hw.init = &(struct clk_init_data){ 243 + .name = "gpu_cc_crc_ahb_clk", 244 + .ops = &clk_branch2_ops, 245 + }, 246 + }, 247 + }; 248 + 249 + static struct clk_branch gpu_cc_cx_gfx3d_clk = { 250 + .halt_reg = 0x10a4, 251 + .halt_check = BRANCH_HALT_DELAY, 252 + .clkr = { 253 + .enable_reg = 0x10a4, 254 + .enable_mask = BIT(0), 255 + .hw.init = &(struct clk_init_data){ 256 + .name = "gpu_cc_cx_gfx3d_clk", 257 + .parent_hws = (const struct clk_hw*[]){ 258 + &gpu_cc_gx_gfx3d_clk_src.clkr.hw, 259 + }, 260 + .num_parents = 1, 261 + .flags = CLK_SET_RATE_PARENT, 262 + .ops = &clk_branch2_ops, 263 + }, 264 + }, 265 + }; 266 + 267 + static struct clk_branch gpu_cc_cx_gfx3d_slv_clk = { 268 + .halt_reg = 0x10a8, 269 + .halt_check = BRANCH_HALT_DELAY, 270 + .clkr = { 271 + .enable_reg = 0x10a8, 272 + .enable_mask = BIT(0), 273 + .hw.init = &(struct clk_init_data){ 274 + .name = "gpu_cc_cx_gfx3d_slv_clk", 275 + .parent_hws = (const struct clk_hw*[]){ 276 + &gpu_cc_gx_gfx3d_clk_src.clkr.hw, 277 + }, 278 + .num_parents = 1, 279 + .flags = CLK_SET_RATE_PARENT, 280 + .ops = &clk_branch2_ops, 281 + }, 282 + }, 283 + }; 284 + 285 + static struct clk_branch gpu_cc_cx_gmu_clk = { 286 + .halt_reg = 0x1098, 287 + .halt_check = BRANCH_HALT, 288 + .clkr = { 289 + .enable_reg = 0x1098, 290 + .enable_mask = BIT(0), 291 + .hw.init = &(struct clk_init_data){ 292 + .name = "gpu_cc_cx_gmu_clk", 293 + .parent_hws = (const struct clk_hw*[]){ 294 + &gpu_cc_gmu_clk_src.clkr.hw, 295 + }, 296 + .num_parents = 1, 297 + .flags = CLK_SET_RATE_PARENT, 298 + .ops = &clk_branch2_ops, 299 + }, 300 + }, 301 + }; 302 + 303 + static struct clk_branch gpu_cc_cx_snoc_dvm_clk = { 304 + .halt_reg = 0x108c, 305 + .halt_check = BRANCH_HALT_DELAY, 306 + .clkr = { 307 + .enable_reg = 0x108c, 308 + .enable_mask = BIT(0), 309 + .hw.init = &(struct clk_init_data){ 310 + .name = "gpu_cc_cx_snoc_dvm_clk", 311 + .ops = &clk_branch2_ops, 312 + }, 313 + }, 314 + }; 315 + 316 + static struct clk_branch gpu_cc_cxo_aon_clk = { 317 + .halt_reg = 0x1004, 318 + .halt_check = BRANCH_HALT_DELAY, 319 + .clkr = { 320 + .enable_reg = 0x1004, 321 + .enable_mask = BIT(0), 322 + .hw.init = &(struct clk_init_data){ 323 + .name = "gpu_cc_cxo_aon_clk", 324 + .ops = &clk_branch2_ops, 325 + }, 326 + }, 327 + }; 328 + 329 + static struct clk_branch gpu_cc_cxo_clk = { 330 + .halt_reg = 0x109c, 331 + .halt_check = BRANCH_HALT, 332 + .clkr = { 333 + .enable_reg = 0x109c, 334 + .enable_mask = BIT(0), 335 + .hw.init = &(struct clk_init_data){ 336 + .name = "gpu_cc_cxo_clk", 337 + .ops = &clk_branch2_ops, 338 + }, 339 + }, 340 + }; 341 + 342 + static struct clk_branch gpu_cc_gx_cxo_clk = { 343 + .halt_reg = 0x1060, 344 + .halt_check = BRANCH_HALT, 345 + .clkr = { 346 + .enable_reg = 0x1060, 347 + .enable_mask = BIT(0), 348 + .hw.init = &(struct clk_init_data){ 349 + .name = "gpu_cc_gx_cxo_clk", 350 + .ops = &clk_branch2_ops, 351 + }, 352 + }, 353 + }; 354 + 355 + static struct clk_branch gpu_cc_gx_gfx3d_clk = { 356 + .halt_reg = 0x1054, 357 + .halt_check = BRANCH_HALT_SKIP, 358 + .clkr = { 359 + .enable_reg = 0x1054, 360 + .enable_mask = BIT(0), 361 + .hw.init = &(struct clk_init_data){ 362 + .name = "gpu_cc_gx_gfx3d_clk", 363 + .parent_hws = (const struct clk_hw*[]){ 364 + &gpu_cc_gx_gfx3d_clk_src.clkr.hw, 365 + }, 366 + .num_parents = 1, 367 + .flags = CLK_SET_RATE_PARENT, 368 + .ops = &clk_branch2_ops, 369 + }, 370 + }, 371 + }; 372 + 373 + static struct clk_branch gpu_cc_gx_gmu_clk = { 374 + .halt_reg = 0x1064, 375 + .halt_check = BRANCH_HALT, 376 + .clkr = { 377 + .enable_reg = 0x1064, 378 + .enable_mask = BIT(0), 379 + .hw.init = &(struct clk_init_data){ 380 + .name = "gpu_cc_gx_gmu_clk", 381 + .parent_hws = (const struct clk_hw*[]){ 382 + &gpu_cc_gmu_clk_src.clkr.hw, 383 + }, 384 + .num_parents = 1, 385 + .flags = CLK_SET_RATE_PARENT, 386 + .ops = &clk_branch2_ops, 387 + }, 388 + }, 389 + }; 390 + 391 + static struct clk_branch gpu_cc_gx_vsense_clk = { 392 + .halt_reg = 0x1058, 393 + .halt_check = BRANCH_HALT_DELAY, 394 + .clkr = { 395 + .enable_reg = 0x1058, 396 + .enable_mask = BIT(0), 397 + .hw.init = &(struct clk_init_data){ 398 + .name = "gpu_cc_gx_vsense_clk", 399 + .ops = &clk_branch2_ops, 400 + }, 401 + }, 402 + }; 403 + 404 + static struct gdsc gpu_cx_gdsc = { 405 + .gdscr = 0x106c, 406 + .gds_hw_ctrl = 0x1540, 407 + .pd = { 408 + .name = "gpu_cx_gdsc", 409 + }, 410 + .pwrsts = PWRSTS_OFF_ON, 411 + .flags = VOTABLE, 412 + }; 413 + 414 + static struct gdsc gpu_gx_gdsc = { 415 + .gdscr = 0x100c, 416 + .clamp_io_ctrl = 0x1508, 417 + .pd = { 418 + .name = "gpu_gx_gdsc", 419 + .power_on = gdsc_gx_do_nothing_enable, 420 + }, 421 + .pwrsts = PWRSTS_OFF_ON, 422 + .flags = CLAMP_IO | POLL_CFG_GDSCR, 423 + }; 424 + 425 + static struct clk_hw *gpu_cc_sm6350_hws[] = { 426 + [GPU_CC_CRC_DIV] = &crc_div.hw, 427 + }; 428 + 429 + static struct clk_regmap *gpu_cc_sm6350_clocks[] = { 430 + [GPU_CC_ACD_AHB_CLK] = &gpu_cc_acd_ahb_clk.clkr, 431 + [GPU_CC_ACD_CXO_CLK] = &gpu_cc_acd_cxo_clk.clkr, 432 + [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr, 433 + [GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr, 434 + [GPU_CC_CX_GFX3D_CLK] = &gpu_cc_cx_gfx3d_clk.clkr, 435 + [GPU_CC_CX_GFX3D_SLV_CLK] = &gpu_cc_cx_gfx3d_slv_clk.clkr, 436 + [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr, 437 + [GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr, 438 + [GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr, 439 + [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr, 440 + [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr, 441 + [GPU_CC_GX_CXO_CLK] = &gpu_cc_gx_cxo_clk.clkr, 442 + [GPU_CC_GX_GFX3D_CLK] = &gpu_cc_gx_gfx3d_clk.clkr, 443 + [GPU_CC_GX_GFX3D_CLK_SRC] = &gpu_cc_gx_gfx3d_clk_src.clkr, 444 + [GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr, 445 + [GPU_CC_GX_VSENSE_CLK] = &gpu_cc_gx_vsense_clk.clkr, 446 + [GPU_CC_PLL0] = &gpu_cc_pll0.clkr, 447 + [GPU_CC_PLL1] = &gpu_cc_pll1.clkr, 448 + }; 449 + 450 + static struct gdsc *gpu_cc_sm6350_gdscs[] = { 451 + [GPU_CX_GDSC] = &gpu_cx_gdsc, 452 + [GPU_GX_GDSC] = &gpu_gx_gdsc, 453 + }; 454 + 455 + static const struct regmap_config gpu_cc_sm6350_regmap_config = { 456 + .reg_bits = 32, 457 + .reg_stride = 4, 458 + .val_bits = 32, 459 + .max_register = 0x8008, 460 + .fast_io = true, 461 + }; 462 + 463 + static const struct qcom_cc_desc gpu_cc_sm6350_desc = { 464 + .config = &gpu_cc_sm6350_regmap_config, 465 + .clk_hws = gpu_cc_sm6350_hws, 466 + .num_clk_hws = ARRAY_SIZE(gpu_cc_sm6350_hws), 467 + .clks = gpu_cc_sm6350_clocks, 468 + .num_clks = ARRAY_SIZE(gpu_cc_sm6350_clocks), 469 + .gdscs = gpu_cc_sm6350_gdscs, 470 + .num_gdscs = ARRAY_SIZE(gpu_cc_sm6350_gdscs), 471 + }; 472 + 473 + static const struct of_device_id gpu_cc_sm6350_match_table[] = { 474 + { .compatible = "qcom,sm6350-gpucc" }, 475 + { } 476 + }; 477 + MODULE_DEVICE_TABLE(of, gpu_cc_sm6350_match_table); 478 + 479 + static int gpu_cc_sm6350_probe(struct platform_device *pdev) 480 + { 481 + struct regmap *regmap; 482 + unsigned int value, mask; 483 + 484 + regmap = qcom_cc_map(pdev, &gpu_cc_sm6350_desc); 485 + if (IS_ERR(regmap)) 486 + return PTR_ERR(regmap); 487 + 488 + clk_fabia_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config); 489 + clk_fabia_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config); 490 + 491 + /* Configure gpu_cc_cx_gmu_clk with recommended wakeup/sleep settings */ 492 + mask = CX_GMU_CBCR_WAKE_MASK << CX_GMU_CBCR_WAKE_SHIFT; 493 + mask |= CX_GMU_CBCR_SLEEP_MASK << CX_GMU_CBCR_SLEEP_SHIFT; 494 + value = 0xF << CX_GMU_CBCR_WAKE_SHIFT | 0xF << CX_GMU_CBCR_SLEEP_SHIFT; 495 + regmap_update_bits(regmap, 0x1098, mask, value); 496 + 497 + return qcom_cc_really_probe(pdev, &gpu_cc_sm6350_desc, regmap); 498 + } 499 + 500 + static struct platform_driver gpu_cc_sm6350_driver = { 501 + .probe = gpu_cc_sm6350_probe, 502 + .driver = { 503 + .name = "sm6350-gpucc", 504 + .of_match_table = gpu_cc_sm6350_match_table, 505 + }, 506 + }; 507 + 508 + static int __init gpu_cc_sm6350_init(void) 509 + { 510 + return platform_driver_register(&gpu_cc_sm6350_driver); 511 + } 512 + core_initcall(gpu_cc_sm6350_init); 513 + 514 + static void __exit gpu_cc_sm6350_exit(void) 515 + { 516 + platform_driver_unregister(&gpu_cc_sm6350_driver); 517 + } 518 + module_exit(gpu_cc_sm6350_exit); 519 + 520 + MODULE_DESCRIPTION("QTI GPU_CC LAGOON Driver"); 521 + MODULE_LICENSE("GPL v2");