1*685ec348STaniya Das // SPDX-License-Identifier: GPL-2.0-only 2*685ec348STaniya Das /* 3*685ec348STaniya Das * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 4*685ec348STaniya Das */ 5*685ec348STaniya Das 6*685ec348STaniya Das #include <linux/clk-provider.h> 7*685ec348STaniya Das #include <linux/mod_devicetable.h> 8*685ec348STaniya Das #include <linux/module.h> 9*685ec348STaniya Das #include <linux/of.h> 10*685ec348STaniya Das #include <linux/platform_device.h> 11*685ec348STaniya Das #include <linux/regmap.h> 12*685ec348STaniya Das 13*685ec348STaniya Das #include <dt-bindings/clock/qcom,kaanapali-gpucc.h> 14*685ec348STaniya Das 15*685ec348STaniya Das #include "clk-alpha-pll.h" 16*685ec348STaniya Das #include "clk-branch.h" 17*685ec348STaniya Das #include "clk-pll.h" 18*685ec348STaniya Das #include "clk-rcg.h" 19*685ec348STaniya Das #include "clk-regmap.h" 20*685ec348STaniya Das #include "clk-regmap-divider.h" 21*685ec348STaniya Das #include "clk-regmap-mux.h" 22*685ec348STaniya Das #include "common.h" 23*685ec348STaniya Das #include "gdsc.h" 24*685ec348STaniya Das #include "reset.h" 25*685ec348STaniya Das 26*685ec348STaniya Das enum { 27*685ec348STaniya Das DT_BI_TCXO, 28*685ec348STaniya Das DT_GPLL0_OUT_MAIN, 29*685ec348STaniya Das DT_GPLL0_OUT_MAIN_DIV, 30*685ec348STaniya Das }; 31*685ec348STaniya Das 32*685ec348STaniya Das enum { 33*685ec348STaniya Das P_BI_TCXO, 34*685ec348STaniya Das P_GPLL0_OUT_MAIN, 35*685ec348STaniya Das P_GPLL0_OUT_MAIN_DIV, 36*685ec348STaniya Das P_GPU_CC_PLL0_OUT_EVEN, 37*685ec348STaniya Das P_GPU_CC_PLL0_OUT_MAIN, 38*685ec348STaniya Das P_GPU_CC_PLL0_OUT_ODD, 39*685ec348STaniya Das }; 40*685ec348STaniya Das 41*685ec348STaniya Das static const struct pll_vco taycan_eko_t_vco[] = { 42*685ec348STaniya Das { 249600000, 2500000000, 0 }, 43*685ec348STaniya Das }; 44*685ec348STaniya Das 45*685ec348STaniya Das /* 950.0 MHz Configuration */ 46*685ec348STaniya Das static const struct alpha_pll_config gpu_cc_pll0_config = { 47*685ec348STaniya Das .l = 0x31, 48*685ec348STaniya Das .cal_l = 0x48, 49*685ec348STaniya Das .alpha = 0x7aaa, 50*685ec348STaniya Das .config_ctl_val = 0x25c400e7, 51*685ec348STaniya Das .config_ctl_hi_val = 0x0a8062e0, 52*685ec348STaniya Das .config_ctl_hi1_val = 0xf51dea20, 53*685ec348STaniya Das .user_ctl_val = 0x00000408, 54*685ec348STaniya Das .user_ctl_hi_val = 0x00000002, 55*685ec348STaniya Das }; 56*685ec348STaniya Das 57*685ec348STaniya Das static struct clk_alpha_pll gpu_cc_pll0 = { 58*685ec348STaniya Das .offset = 0x0, 59*685ec348STaniya Das .config = &gpu_cc_pll0_config, 60*685ec348STaniya Das .vco_table = taycan_eko_t_vco, 61*685ec348STaniya Das .num_vco = ARRAY_SIZE(taycan_eko_t_vco), 62*685ec348STaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T], 63*685ec348STaniya Das .clkr = { 64*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 65*685ec348STaniya Das .name = "gpu_cc_pll0", 66*685ec348STaniya Das .parent_data = &(const struct clk_parent_data) { 67*685ec348STaniya Das .index = DT_BI_TCXO, 68*685ec348STaniya Das }, 69*685ec348STaniya Das .num_parents = 1, 70*685ec348STaniya Das .ops = &clk_alpha_pll_taycan_eko_t_ops, 71*685ec348STaniya Das }, 72*685ec348STaniya Das }, 73*685ec348STaniya Das }; 74*685ec348STaniya Das 75*685ec348STaniya Das static const struct clk_div_table post_div_table_gpu_cc_pll0_out_even[] = { 76*685ec348STaniya Das { 0x1, 2 }, 77*685ec348STaniya Das { } 78*685ec348STaniya Das }; 79*685ec348STaniya Das 80*685ec348STaniya Das static struct clk_alpha_pll_postdiv gpu_cc_pll0_out_even = { 81*685ec348STaniya Das .offset = 0x0, 82*685ec348STaniya Das .post_div_shift = 10, 83*685ec348STaniya Das .post_div_table = post_div_table_gpu_cc_pll0_out_even, 84*685ec348STaniya Das .num_post_div = ARRAY_SIZE(post_div_table_gpu_cc_pll0_out_even), 85*685ec348STaniya Das .width = 4, 86*685ec348STaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T], 87*685ec348STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 88*685ec348STaniya Das .name = "gpu_cc_pll0_out_even", 89*685ec348STaniya Das .parent_hws = (const struct clk_hw*[]) { 90*685ec348STaniya Das &gpu_cc_pll0.clkr.hw, 91*685ec348STaniya Das }, 92*685ec348STaniya Das .num_parents = 1, 93*685ec348STaniya Das .flags = CLK_SET_RATE_PARENT, 94*685ec348STaniya Das .ops = &clk_alpha_pll_postdiv_taycan_eko_t_ops, 95*685ec348STaniya Das }, 96*685ec348STaniya Das }; 97*685ec348STaniya Das 98*685ec348STaniya Das static const struct parent_map gpu_cc_parent_map_0[] = { 99*685ec348STaniya Das { P_BI_TCXO, 0 }, 100*685ec348STaniya Das { P_GPU_CC_PLL0_OUT_MAIN, 1 }, 101*685ec348STaniya Das { P_GPU_CC_PLL0_OUT_EVEN, 2 }, 102*685ec348STaniya Das { P_GPU_CC_PLL0_OUT_ODD, 3 }, 103*685ec348STaniya Das { P_GPLL0_OUT_MAIN, 5 }, 104*685ec348STaniya Das { P_GPLL0_OUT_MAIN_DIV, 6 }, 105*685ec348STaniya Das }; 106*685ec348STaniya Das 107*685ec348STaniya Das static const struct clk_parent_data gpu_cc_parent_data_0[] = { 108*685ec348STaniya Das { .index = DT_BI_TCXO }, 109*685ec348STaniya Das { .hw = &gpu_cc_pll0.clkr.hw }, 110*685ec348STaniya Das { .hw = &gpu_cc_pll0_out_even.clkr.hw }, 111*685ec348STaniya Das { .hw = &gpu_cc_pll0.clkr.hw }, 112*685ec348STaniya Das { .index = DT_GPLL0_OUT_MAIN }, 113*685ec348STaniya Das { .index = DT_GPLL0_OUT_MAIN_DIV }, 114*685ec348STaniya Das }; 115*685ec348STaniya Das 116*685ec348STaniya Das static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = { 117*685ec348STaniya Das F(19200000, P_BI_TCXO, 1, 0, 0), 118*685ec348STaniya Das F(475000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0), 119*685ec348STaniya Das F(575000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0), 120*685ec348STaniya Das F(700000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0), 121*685ec348STaniya Das F(725000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0), 122*685ec348STaniya Das F(750000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0), 123*685ec348STaniya Das { } 124*685ec348STaniya Das }; 125*685ec348STaniya Das 126*685ec348STaniya Das static struct clk_rcg2 gpu_cc_gmu_clk_src = { 127*685ec348STaniya Das .cmd_rcgr = 0x9318, 128*685ec348STaniya Das .mnd_width = 0, 129*685ec348STaniya Das .hid_width = 5, 130*685ec348STaniya Das .parent_map = gpu_cc_parent_map_0, 131*685ec348STaniya Das .hw_clk_ctrl = true, 132*685ec348STaniya Das .freq_tbl = ftbl_gpu_cc_gmu_clk_src, 133*685ec348STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 134*685ec348STaniya Das .name = "gpu_cc_gmu_clk_src", 135*685ec348STaniya Das .parent_data = gpu_cc_parent_data_0, 136*685ec348STaniya Das .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0), 137*685ec348STaniya Das .flags = CLK_SET_RATE_PARENT, 138*685ec348STaniya Das .ops = &clk_rcg2_shared_ops, 139*685ec348STaniya Das }, 140*685ec348STaniya Das }; 141*685ec348STaniya Das 142*685ec348STaniya Das static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = { 143*685ec348STaniya Das F(150000000, P_GPLL0_OUT_MAIN_DIV, 2, 0, 0), 144*685ec348STaniya Das F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 145*685ec348STaniya Das F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 146*685ec348STaniya Das F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0), 147*685ec348STaniya Das { } 148*685ec348STaniya Das }; 149*685ec348STaniya Das 150*685ec348STaniya Das static struct clk_rcg2 gpu_cc_hub_clk_src = { 151*685ec348STaniya Das .cmd_rcgr = 0x93f0, 152*685ec348STaniya Das .mnd_width = 0, 153*685ec348STaniya Das .hid_width = 5, 154*685ec348STaniya Das .parent_map = gpu_cc_parent_map_0, 155*685ec348STaniya Das .hw_clk_ctrl = true, 156*685ec348STaniya Das .freq_tbl = ftbl_gpu_cc_hub_clk_src, 157*685ec348STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 158*685ec348STaniya Das .name = "gpu_cc_hub_clk_src", 159*685ec348STaniya Das .parent_data = gpu_cc_parent_data_0, 160*685ec348STaniya Das .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0), 161*685ec348STaniya Das .flags = CLK_SET_RATE_PARENT, 162*685ec348STaniya Das .ops = &clk_rcg2_shared_ops, 163*685ec348STaniya Das }, 164*685ec348STaniya Das }; 165*685ec348STaniya Das 166*685ec348STaniya Das static struct clk_regmap_div gpu_cc_hub_div_clk_src = { 167*685ec348STaniya Das .reg = 0x9430, 168*685ec348STaniya Das .shift = 0, 169*685ec348STaniya Das .width = 4, 170*685ec348STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 171*685ec348STaniya Das .name = "gpu_cc_hub_div_clk_src", 172*685ec348STaniya Das .parent_hws = (const struct clk_hw*[]) { 173*685ec348STaniya Das &gpu_cc_hub_clk_src.clkr.hw, 174*685ec348STaniya Das }, 175*685ec348STaniya Das .num_parents = 1, 176*685ec348STaniya Das .flags = CLK_SET_RATE_PARENT, 177*685ec348STaniya Das .ops = &clk_regmap_div_ro_ops, 178*685ec348STaniya Das }, 179*685ec348STaniya Das }; 180*685ec348STaniya Das 181*685ec348STaniya Das static struct clk_branch gpu_cc_ahb_clk = { 182*685ec348STaniya Das .halt_reg = 0x90bc, 183*685ec348STaniya Das .halt_check = BRANCH_HALT_DELAY, 184*685ec348STaniya Das .clkr = { 185*685ec348STaniya Das .enable_reg = 0x90bc, 186*685ec348STaniya Das .enable_mask = BIT(0), 187*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 188*685ec348STaniya Das .name = "gpu_cc_ahb_clk", 189*685ec348STaniya Das .parent_hws = (const struct clk_hw*[]) { 190*685ec348STaniya Das &gpu_cc_hub_div_clk_src.clkr.hw, 191*685ec348STaniya Das }, 192*685ec348STaniya Das .num_parents = 1, 193*685ec348STaniya Das .flags = CLK_SET_RATE_PARENT, 194*685ec348STaniya Das .ops = &clk_branch2_ops, 195*685ec348STaniya Das }, 196*685ec348STaniya Das }, 197*685ec348STaniya Das }; 198*685ec348STaniya Das 199*685ec348STaniya Das static struct clk_branch gpu_cc_cx_accu_shift_clk = { 200*685ec348STaniya Das .halt_reg = 0x9104, 201*685ec348STaniya Das .halt_check = BRANCH_HALT_VOTED, 202*685ec348STaniya Das .clkr = { 203*685ec348STaniya Das .enable_reg = 0x9104, 204*685ec348STaniya Das .enable_mask = BIT(0), 205*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 206*685ec348STaniya Das .name = "gpu_cc_cx_accu_shift_clk", 207*685ec348STaniya Das .ops = &clk_branch2_ops, 208*685ec348STaniya Das }, 209*685ec348STaniya Das }, 210*685ec348STaniya Das }; 211*685ec348STaniya Das 212*685ec348STaniya Das static struct clk_branch gpu_cc_cx_gmu_clk = { 213*685ec348STaniya Das .halt_reg = 0x90d4, 214*685ec348STaniya Das .halt_check = BRANCH_HALT_VOTED, 215*685ec348STaniya Das .clkr = { 216*685ec348STaniya Das .enable_reg = 0x90d4, 217*685ec348STaniya Das .enable_mask = BIT(0), 218*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 219*685ec348STaniya Das .name = "gpu_cc_cx_gmu_clk", 220*685ec348STaniya Das .parent_hws = (const struct clk_hw*[]) { 221*685ec348STaniya Das &gpu_cc_gmu_clk_src.clkr.hw, 222*685ec348STaniya Das }, 223*685ec348STaniya Das .num_parents = 1, 224*685ec348STaniya Das .flags = CLK_SET_RATE_PARENT, 225*685ec348STaniya Das .ops = &clk_branch2_aon_ops, 226*685ec348STaniya Das }, 227*685ec348STaniya Das }, 228*685ec348STaniya Das }; 229*685ec348STaniya Das 230*685ec348STaniya Das static struct clk_branch gpu_cc_cxo_clk = { 231*685ec348STaniya Das .halt_reg = 0x90e4, 232*685ec348STaniya Das .halt_check = BRANCH_HALT, 233*685ec348STaniya Das .clkr = { 234*685ec348STaniya Das .enable_reg = 0x90e4, 235*685ec348STaniya Das .enable_mask = BIT(0), 236*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 237*685ec348STaniya Das .name = "gpu_cc_cxo_clk", 238*685ec348STaniya Das .ops = &clk_branch2_aon_ops, 239*685ec348STaniya Das }, 240*685ec348STaniya Das }, 241*685ec348STaniya Das }; 242*685ec348STaniya Das 243*685ec348STaniya Das static struct clk_branch gpu_cc_demet_clk = { 244*685ec348STaniya Das .halt_reg = 0x9010, 245*685ec348STaniya Das .halt_check = BRANCH_HALT_VOTED, 246*685ec348STaniya Das .clkr = { 247*685ec348STaniya Das .enable_reg = 0x9010, 248*685ec348STaniya Das .enable_mask = BIT(0), 249*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 250*685ec348STaniya Das .name = "gpu_cc_demet_clk", 251*685ec348STaniya Das .ops = &clk_branch2_ops, 252*685ec348STaniya Das }, 253*685ec348STaniya Das }, 254*685ec348STaniya Das }; 255*685ec348STaniya Das 256*685ec348STaniya Das static struct clk_branch gpu_cc_dpm_clk = { 257*685ec348STaniya Das .halt_reg = 0x9108, 258*685ec348STaniya Das .halt_check = BRANCH_HALT, 259*685ec348STaniya Das .clkr = { 260*685ec348STaniya Das .enable_reg = 0x9108, 261*685ec348STaniya Das .enable_mask = BIT(0), 262*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 263*685ec348STaniya Das .name = "gpu_cc_dpm_clk", 264*685ec348STaniya Das .ops = &clk_branch2_ops, 265*685ec348STaniya Das }, 266*685ec348STaniya Das }, 267*685ec348STaniya Das }; 268*685ec348STaniya Das 269*685ec348STaniya Das static struct clk_branch gpu_cc_freq_measure_clk = { 270*685ec348STaniya Das .halt_reg = 0x900c, 271*685ec348STaniya Das .halt_check = BRANCH_HALT, 272*685ec348STaniya Das .clkr = { 273*685ec348STaniya Das .enable_reg = 0x900c, 274*685ec348STaniya Das .enable_mask = BIT(0), 275*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 276*685ec348STaniya Das .name = "gpu_cc_freq_measure_clk", 277*685ec348STaniya Das .ops = &clk_branch2_ops, 278*685ec348STaniya Das }, 279*685ec348STaniya Das }, 280*685ec348STaniya Das }; 281*685ec348STaniya Das 282*685ec348STaniya Das static struct clk_branch gpu_cc_gpu_smmu_vote_clk = { 283*685ec348STaniya Das .halt_reg = 0x7000, 284*685ec348STaniya Das .halt_check = BRANCH_HALT_VOTED, 285*685ec348STaniya Das .clkr = { 286*685ec348STaniya Das .enable_reg = 0x7000, 287*685ec348STaniya Das .enable_mask = BIT(0), 288*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 289*685ec348STaniya Das .name = "gpu_cc_gpu_smmu_vote_clk", 290*685ec348STaniya Das .ops = &clk_branch2_ops, 291*685ec348STaniya Das }, 292*685ec348STaniya Das }, 293*685ec348STaniya Das }; 294*685ec348STaniya Das 295*685ec348STaniya Das static struct clk_branch gpu_cc_gx_accu_shift_clk = { 296*685ec348STaniya Das .halt_reg = 0x9070, 297*685ec348STaniya Das .halt_check = BRANCH_HALT_VOTED, 298*685ec348STaniya Das .clkr = { 299*685ec348STaniya Das .enable_reg = 0x9070, 300*685ec348STaniya Das .enable_mask = BIT(0), 301*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 302*685ec348STaniya Das .name = "gpu_cc_gx_accu_shift_clk", 303*685ec348STaniya Das .ops = &clk_branch2_ops, 304*685ec348STaniya Das }, 305*685ec348STaniya Das }, 306*685ec348STaniya Das }; 307*685ec348STaniya Das 308*685ec348STaniya Das static struct clk_branch gpu_cc_gx_gmu_clk = { 309*685ec348STaniya Das .halt_reg = 0x9060, 310*685ec348STaniya Das .halt_check = BRANCH_HALT, 311*685ec348STaniya Das .clkr = { 312*685ec348STaniya Das .enable_reg = 0x9060, 313*685ec348STaniya Das .enable_mask = BIT(0), 314*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 315*685ec348STaniya Das .name = "gpu_cc_gx_gmu_clk", 316*685ec348STaniya Das .parent_hws = (const struct clk_hw*[]) { 317*685ec348STaniya Das &gpu_cc_gmu_clk_src.clkr.hw, 318*685ec348STaniya Das }, 319*685ec348STaniya Das .num_parents = 1, 320*685ec348STaniya Das .flags = CLK_SET_RATE_PARENT, 321*685ec348STaniya Das .ops = &clk_branch2_ops, 322*685ec348STaniya Das }, 323*685ec348STaniya Das }, 324*685ec348STaniya Das }; 325*685ec348STaniya Das 326*685ec348STaniya Das static struct clk_branch gpu_cc_hub_aon_clk = { 327*685ec348STaniya Das .halt_reg = 0x93ec, 328*685ec348STaniya Das .halt_check = BRANCH_HALT_VOTED, 329*685ec348STaniya Das .clkr = { 330*685ec348STaniya Das .enable_reg = 0x93ec, 331*685ec348STaniya Das .enable_mask = BIT(0), 332*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 333*685ec348STaniya Das .name = "gpu_cc_hub_aon_clk", 334*685ec348STaniya Das .parent_hws = (const struct clk_hw*[]) { 335*685ec348STaniya Das &gpu_cc_hub_clk_src.clkr.hw, 336*685ec348STaniya Das }, 337*685ec348STaniya Das .num_parents = 1, 338*685ec348STaniya Das .flags = CLK_SET_RATE_PARENT, 339*685ec348STaniya Das .ops = &clk_branch2_aon_ops, 340*685ec348STaniya Das }, 341*685ec348STaniya Das }, 342*685ec348STaniya Das }; 343*685ec348STaniya Das 344*685ec348STaniya Das static struct clk_branch gpu_cc_hub_cx_int_clk = { 345*685ec348STaniya Das .halt_reg = 0x90e8, 346*685ec348STaniya Das .halt_check = BRANCH_HALT_VOTED, 347*685ec348STaniya Das .clkr = { 348*685ec348STaniya Das .enable_reg = 0x90e8, 349*685ec348STaniya Das .enable_mask = BIT(0), 350*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 351*685ec348STaniya Das .name = "gpu_cc_hub_cx_int_clk", 352*685ec348STaniya Das .parent_hws = (const struct clk_hw*[]) { 353*685ec348STaniya Das &gpu_cc_hub_clk_src.clkr.hw, 354*685ec348STaniya Das }, 355*685ec348STaniya Das .num_parents = 1, 356*685ec348STaniya Das .flags = CLK_SET_RATE_PARENT, 357*685ec348STaniya Das .ops = &clk_branch2_aon_ops, 358*685ec348STaniya Das }, 359*685ec348STaniya Das }, 360*685ec348STaniya Das }; 361*685ec348STaniya Das 362*685ec348STaniya Das static struct clk_branch gpu_cc_memnoc_gfx_clk = { 363*685ec348STaniya Das .halt_reg = 0x90ec, 364*685ec348STaniya Das .halt_check = BRANCH_HALT_VOTED, 365*685ec348STaniya Das .clkr = { 366*685ec348STaniya Das .enable_reg = 0x90ec, 367*685ec348STaniya Das .enable_mask = BIT(0), 368*685ec348STaniya Das .hw.init = &(const struct clk_init_data) { 369*685ec348STaniya Das .name = "gpu_cc_memnoc_gfx_clk", 370*685ec348STaniya Das .ops = &clk_branch2_ops, 371*685ec348STaniya Das }, 372*685ec348STaniya Das }, 373*685ec348STaniya Das }; 374*685ec348STaniya Das 375*685ec348STaniya Das static struct gdsc gpu_cc_cx_gdsc = { 376*685ec348STaniya Das .gdscr = 0x9080, 377*685ec348STaniya Das .gds_hw_ctrl = 0x9094, 378*685ec348STaniya Das .en_rest_wait_val = 0x2, 379*685ec348STaniya Das .en_few_wait_val = 0x2, 380*685ec348STaniya Das .clk_dis_wait_val = 0x8, 381*685ec348STaniya Das .pd = { 382*685ec348STaniya Das .name = "gpu_cc_cx_gdsc", 383*685ec348STaniya Das }, 384*685ec348STaniya Das .pwrsts = PWRSTS_OFF_ON, 385*685ec348STaniya Das .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 386*685ec348STaniya Das }; 387*685ec348STaniya Das 388*685ec348STaniya Das static struct clk_regmap *gpu_cc_kaanapali_clocks[] = { 389*685ec348STaniya Das [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr, 390*685ec348STaniya Das [GPU_CC_CX_ACCU_SHIFT_CLK] = &gpu_cc_cx_accu_shift_clk.clkr, 391*685ec348STaniya Das [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr, 392*685ec348STaniya Das [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr, 393*685ec348STaniya Das [GPU_CC_DEMET_CLK] = &gpu_cc_demet_clk.clkr, 394*685ec348STaniya Das [GPU_CC_DPM_CLK] = &gpu_cc_dpm_clk.clkr, 395*685ec348STaniya Das [GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_clk.clkr, 396*685ec348STaniya Das [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr, 397*685ec348STaniya Das [GPU_CC_GPU_SMMU_VOTE_CLK] = &gpu_cc_gpu_smmu_vote_clk.clkr, 398*685ec348STaniya Das [GPU_CC_GX_ACCU_SHIFT_CLK] = &gpu_cc_gx_accu_shift_clk.clkr, 399*685ec348STaniya Das [GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr, 400*685ec348STaniya Das [GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr, 401*685ec348STaniya Das [GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr, 402*685ec348STaniya Das [GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr, 403*685ec348STaniya Das [GPU_CC_HUB_DIV_CLK_SRC] = &gpu_cc_hub_div_clk_src.clkr, 404*685ec348STaniya Das [GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr, 405*685ec348STaniya Das [GPU_CC_PLL0] = &gpu_cc_pll0.clkr, 406*685ec348STaniya Das [GPU_CC_PLL0_OUT_EVEN] = &gpu_cc_pll0_out_even.clkr, 407*685ec348STaniya Das }; 408*685ec348STaniya Das 409*685ec348STaniya Das static struct gdsc *gpu_cc_kaanapali_gdscs[] = { 410*685ec348STaniya Das [GPU_CC_CX_GDSC] = &gpu_cc_cx_gdsc, 411*685ec348STaniya Das }; 412*685ec348STaniya Das 413*685ec348STaniya Das static const struct qcom_reset_map gpu_cc_kaanapali_resets[] = { 414*685ec348STaniya Das [GPU_CC_CB_BCR] = { 0x93a0 }, 415*685ec348STaniya Das [GPU_CC_CX_BCR] = { 0x907c }, 416*685ec348STaniya Das [GPU_CC_FAST_HUB_BCR] = { 0x93e4 }, 417*685ec348STaniya Das [GPU_CC_FF_BCR] = { 0x9470 }, 418*685ec348STaniya Das [GPU_CC_GMU_BCR] = { 0x9314 }, 419*685ec348STaniya Das [GPU_CC_GX_BCR] = { 0x905c }, 420*685ec348STaniya Das [GPU_CC_XO_BCR] = { 0x9000 }, 421*685ec348STaniya Das }; 422*685ec348STaniya Das 423*685ec348STaniya Das static struct clk_alpha_pll *gpu_cc_kaanapali_plls[] = { 424*685ec348STaniya Das &gpu_cc_pll0, 425*685ec348STaniya Das }; 426*685ec348STaniya Das 427*685ec348STaniya Das static u32 gpu_cc_kaanapali_critical_cbcrs[] = { 428*685ec348STaniya Das 0x9008, /* GPU_CC_CXO_AON_CLK */ 429*685ec348STaniya Das 0x93e8, /* GPU_CC_RSCC_HUB_AON_CLK */ 430*685ec348STaniya Das 0x9004, /* GPU_CC_RSCC_XO_AON_CLK */ 431*685ec348STaniya Das }; 432*685ec348STaniya Das 433*685ec348STaniya Das static const struct regmap_config gpu_cc_kaanapali_regmap_config = { 434*685ec348STaniya Das .reg_bits = 32, 435*685ec348STaniya Das .reg_stride = 4, 436*685ec348STaniya Das .val_bits = 32, 437*685ec348STaniya Das .max_register = 0x95e8, 438*685ec348STaniya Das .fast_io = true, 439*685ec348STaniya Das }; 440*685ec348STaniya Das 441*685ec348STaniya Das static struct qcom_cc_driver_data gpu_cc_kaanapali_driver_data = { 442*685ec348STaniya Das .alpha_plls = gpu_cc_kaanapali_plls, 443*685ec348STaniya Das .num_alpha_plls = ARRAY_SIZE(gpu_cc_kaanapali_plls), 444*685ec348STaniya Das .clk_cbcrs = gpu_cc_kaanapali_critical_cbcrs, 445*685ec348STaniya Das .num_clk_cbcrs = ARRAY_SIZE(gpu_cc_kaanapali_critical_cbcrs), 446*685ec348STaniya Das }; 447*685ec348STaniya Das 448*685ec348STaniya Das static const struct qcom_cc_desc gpu_cc_kaanapali_desc = { 449*685ec348STaniya Das .config = &gpu_cc_kaanapali_regmap_config, 450*685ec348STaniya Das .clks = gpu_cc_kaanapali_clocks, 451*685ec348STaniya Das .num_clks = ARRAY_SIZE(gpu_cc_kaanapali_clocks), 452*685ec348STaniya Das .resets = gpu_cc_kaanapali_resets, 453*685ec348STaniya Das .num_resets = ARRAY_SIZE(gpu_cc_kaanapali_resets), 454*685ec348STaniya Das .gdscs = gpu_cc_kaanapali_gdscs, 455*685ec348STaniya Das .num_gdscs = ARRAY_SIZE(gpu_cc_kaanapali_gdscs), 456*685ec348STaniya Das .use_rpm = true, 457*685ec348STaniya Das .driver_data = &gpu_cc_kaanapali_driver_data, 458*685ec348STaniya Das }; 459*685ec348STaniya Das 460*685ec348STaniya Das static const struct of_device_id gpu_cc_kaanapali_match_table[] = { 461*685ec348STaniya Das { .compatible = "qcom,kaanapali-gpucc" }, 462*685ec348STaniya Das { } 463*685ec348STaniya Das }; 464*685ec348STaniya Das MODULE_DEVICE_TABLE(of, gpu_cc_kaanapali_match_table); 465*685ec348STaniya Das 466*685ec348STaniya Das static int gpu_cc_kaanapali_probe(struct platform_device *pdev) 467*685ec348STaniya Das { 468*685ec348STaniya Das return qcom_cc_probe(pdev, &gpu_cc_kaanapali_desc); 469*685ec348STaniya Das } 470*685ec348STaniya Das 471*685ec348STaniya Das static struct platform_driver gpu_cc_kaanapali_driver = { 472*685ec348STaniya Das .probe = gpu_cc_kaanapali_probe, 473*685ec348STaniya Das .driver = { 474*685ec348STaniya Das .name = "gpucc-kaanapali", 475*685ec348STaniya Das .of_match_table = gpu_cc_kaanapali_match_table, 476*685ec348STaniya Das }, 477*685ec348STaniya Das }; 478*685ec348STaniya Das 479*685ec348STaniya Das module_platform_driver(gpu_cc_kaanapali_driver); 480*685ec348STaniya Das 481*685ec348STaniya Das MODULE_DESCRIPTION("QTI GPUCC Kaanapali Driver"); 482*685ec348STaniya Das MODULE_LICENSE("GPL"); 483