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