167e64528STaniya Das // SPDX-License-Identifier: GPL-2.0-only 267e64528STaniya Das /* 367e64528STaniya Das * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 467e64528STaniya Das */ 567e64528STaniya Das 667e64528STaniya Das #include <linux/clk-provider.h> 767e64528STaniya Das #include <linux/mod_devicetable.h> 867e64528STaniya Das #include <linux/module.h> 967e64528STaniya Das #include <linux/platform_device.h> 1067e64528STaniya Das #include <linux/regmap.h> 1167e64528STaniya Das 1267e64528STaniya Das #include <dt-bindings/clock/qcom,glymur-gpucc.h> 1367e64528STaniya Das 1467e64528STaniya Das #include "clk-alpha-pll.h" 1567e64528STaniya Das #include "clk-branch.h" 1667e64528STaniya Das #include "clk-pll.h" 1767e64528STaniya Das #include "clk-rcg.h" 1867e64528STaniya Das #include "clk-regmap.h" 1967e64528STaniya Das #include "clk-regmap-divider.h" 2067e64528STaniya Das #include "clk-regmap-mux.h" 2167e64528STaniya Das #include "common.h" 2267e64528STaniya Das #include "gdsc.h" 2367e64528STaniya Das #include "reset.h" 2467e64528STaniya Das 2567e64528STaniya Das enum { 2667e64528STaniya Das DT_BI_TCXO, 2767e64528STaniya Das DT_GPLL0_OUT_MAIN, 2867e64528STaniya Das DT_GPLL0_OUT_MAIN_DIV, 2967e64528STaniya Das }; 3067e64528STaniya Das 3167e64528STaniya Das enum { 3267e64528STaniya Das P_BI_TCXO, 3367e64528STaniya Das P_GPLL0_OUT_MAIN, 3467e64528STaniya Das P_GPLL0_OUT_MAIN_DIV, 3567e64528STaniya Das P_GPU_CC_PLL0_OUT_EVEN, 3667e64528STaniya Das P_GPU_CC_PLL0_OUT_MAIN, 3767e64528STaniya Das P_GPU_CC_PLL0_OUT_ODD, 3867e64528STaniya Das }; 3967e64528STaniya Das 4067e64528STaniya Das static const struct pll_vco taycan_eko_t_vco[] = { 4167e64528STaniya Das { 249600000, 2500000000, 0 }, 4267e64528STaniya Das }; 4367e64528STaniya Das 4467e64528STaniya Das /* 1150.0 MHz Configuration */ 4567e64528STaniya Das static const struct alpha_pll_config gpu_cc_pll0_config = { 4667e64528STaniya Das .l = 0x3b, 4767e64528STaniya Das .alpha = 0xe555, 4867e64528STaniya Das .config_ctl_val = 0x25c400e7, 4967e64528STaniya Das .config_ctl_hi_val = 0x0a8060e0, 5067e64528STaniya Das .config_ctl_hi1_val = 0xf51dea20, 5167e64528STaniya Das .user_ctl_val = 0x00000408, 5267e64528STaniya Das .user_ctl_hi_val = 0x00000002, 5367e64528STaniya Das }; 5467e64528STaniya Das 5567e64528STaniya Das static struct clk_alpha_pll gpu_cc_pll0 = { 5667e64528STaniya Das .offset = 0x0, 5767e64528STaniya Das .config = &gpu_cc_pll0_config, 5867e64528STaniya Das .vco_table = taycan_eko_t_vco, 5967e64528STaniya Das .num_vco = ARRAY_SIZE(taycan_eko_t_vco), 6067e64528STaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T], 6167e64528STaniya Das .clkr = { 6267e64528STaniya Das .hw.init = &(const struct clk_init_data) { 6367e64528STaniya Das .name = "gpu_cc_pll0", 6467e64528STaniya Das .parent_data = &(const struct clk_parent_data) { 6567e64528STaniya Das .index = DT_BI_TCXO, 6667e64528STaniya Das }, 6767e64528STaniya Das .num_parents = 1, 6867e64528STaniya Das .ops = &clk_alpha_pll_taycan_eko_t_ops, 6967e64528STaniya Das }, 7067e64528STaniya Das }, 7167e64528STaniya Das }; 7267e64528STaniya Das 7367e64528STaniya Das static const struct clk_div_table post_div_table_gpu_cc_pll0_out_even[] = { 7467e64528STaniya Das { 0x1, 2 }, 7567e64528STaniya Das { } 7667e64528STaniya Das }; 7767e64528STaniya Das 7867e64528STaniya Das static struct clk_alpha_pll_postdiv gpu_cc_pll0_out_even = { 7967e64528STaniya Das .offset = 0x0, 8067e64528STaniya Das .post_div_shift = 10, 8167e64528STaniya Das .post_div_table = post_div_table_gpu_cc_pll0_out_even, 8267e64528STaniya Das .num_post_div = ARRAY_SIZE(post_div_table_gpu_cc_pll0_out_even), 8367e64528STaniya Das .width = 4, 8467e64528STaniya Das .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EKO_T], 8567e64528STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 8667e64528STaniya Das .name = "gpu_cc_pll0_out_even", 8767e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 8867e64528STaniya Das &gpu_cc_pll0.clkr.hw, 8967e64528STaniya Das }, 9067e64528STaniya Das .num_parents = 1, 9167e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 9267e64528STaniya Das .ops = &clk_alpha_pll_postdiv_taycan_eko_t_ops, 9367e64528STaniya Das }, 9467e64528STaniya Das }; 9567e64528STaniya Das 9667e64528STaniya Das static const struct parent_map gpu_cc_parent_map_0[] = { 9767e64528STaniya Das { P_BI_TCXO, 0 }, 9867e64528STaniya Das { P_GPLL0_OUT_MAIN, 5 }, 9967e64528STaniya Das { P_GPLL0_OUT_MAIN_DIV, 6 }, 10067e64528STaniya Das }; 10167e64528STaniya Das 10267e64528STaniya Das static const struct clk_parent_data gpu_cc_parent_data_0[] = { 10367e64528STaniya Das { .index = DT_BI_TCXO }, 10467e64528STaniya Das { .index = DT_GPLL0_OUT_MAIN }, 10567e64528STaniya Das { .index = DT_GPLL0_OUT_MAIN_DIV }, 10667e64528STaniya Das }; 10767e64528STaniya Das 10867e64528STaniya Das static const struct parent_map gpu_cc_parent_map_1[] = { 10967e64528STaniya Das { P_BI_TCXO, 0 }, 11067e64528STaniya Das { P_GPU_CC_PLL0_OUT_MAIN, 1 }, 11167e64528STaniya Das { P_GPU_CC_PLL0_OUT_EVEN, 2 }, 11267e64528STaniya Das { P_GPU_CC_PLL0_OUT_ODD, 3 }, 11367e64528STaniya Das { P_GPLL0_OUT_MAIN, 5 }, 11467e64528STaniya Das { P_GPLL0_OUT_MAIN_DIV, 6 }, 11567e64528STaniya Das }; 11667e64528STaniya Das 11767e64528STaniya Das static const struct clk_parent_data gpu_cc_parent_data_1[] = { 11867e64528STaniya Das { .index = DT_BI_TCXO }, 11967e64528STaniya Das { .hw = &gpu_cc_pll0.clkr.hw }, 12067e64528STaniya Das { .hw = &gpu_cc_pll0_out_even.clkr.hw }, 12167e64528STaniya Das { .hw = &gpu_cc_pll0.clkr.hw }, 12267e64528STaniya Das { .index = DT_GPLL0_OUT_MAIN }, 12367e64528STaniya Das { .index = DT_GPLL0_OUT_MAIN_DIV }, 12467e64528STaniya Das }; 12567e64528STaniya Das 12667e64528STaniya Das static const struct freq_tbl ftbl_gpu_cc_ff_clk_src[] = { 12767e64528STaniya Das F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 12867e64528STaniya Das { } 12967e64528STaniya Das }; 13067e64528STaniya Das 13167e64528STaniya Das static struct clk_rcg2 gpu_cc_ff_clk_src = { 13267e64528STaniya Das .cmd_rcgr = 0x9474, 13367e64528STaniya Das .mnd_width = 0, 13467e64528STaniya Das .hid_width = 5, 13567e64528STaniya Das .parent_map = gpu_cc_parent_map_0, 13667e64528STaniya Das .freq_tbl = ftbl_gpu_cc_ff_clk_src, 13767e64528STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 13867e64528STaniya Das .name = "gpu_cc_ff_clk_src", 13967e64528STaniya Das .parent_data = gpu_cc_parent_data_0, 14067e64528STaniya Das .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0), 14167e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 14267e64528STaniya Das .ops = &clk_rcg2_shared_ops, 14367e64528STaniya Das }, 14467e64528STaniya Das }; 14567e64528STaniya Das 14667e64528STaniya Das static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = { 14767e64528STaniya Das F(19200000, P_BI_TCXO, 1, 0, 0), 14867e64528STaniya Das F(575000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0), 14967e64528STaniya Das F(700000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0), 15067e64528STaniya Das F(725000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0), 15167e64528STaniya Das F(750000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0), 15267e64528STaniya Das { } 15367e64528STaniya Das }; 15467e64528STaniya Das 15567e64528STaniya Das static struct clk_rcg2 gpu_cc_gmu_clk_src = { 15667e64528STaniya Das .cmd_rcgr = 0x9318, 15767e64528STaniya Das .mnd_width = 0, 15867e64528STaniya Das .hid_width = 5, 15967e64528STaniya Das .parent_map = gpu_cc_parent_map_1, 16067e64528STaniya Das .freq_tbl = ftbl_gpu_cc_gmu_clk_src, 16167e64528STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 16267e64528STaniya Das .name = "gpu_cc_gmu_clk_src", 16367e64528STaniya Das .parent_data = gpu_cc_parent_data_1, 16467e64528STaniya Das .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1), 16567e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 16667e64528STaniya Das .ops = &clk_rcg2_shared_ops, 16767e64528STaniya Das }, 16867e64528STaniya Das }; 16967e64528STaniya Das 17067e64528STaniya Das static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = { 17167e64528STaniya Das F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 17267e64528STaniya Das F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 17367e64528STaniya Das F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0), 17467e64528STaniya Das { } 17567e64528STaniya Das }; 17667e64528STaniya Das 17767e64528STaniya Das static struct clk_rcg2 gpu_cc_hub_clk_src = { 17867e64528STaniya Das .cmd_rcgr = 0x93f0, 17967e64528STaniya Das .mnd_width = 0, 18067e64528STaniya Das .hid_width = 5, 18167e64528STaniya Das .parent_map = gpu_cc_parent_map_1, 18267e64528STaniya Das .freq_tbl = ftbl_gpu_cc_hub_clk_src, 18367e64528STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 18467e64528STaniya Das .name = "gpu_cc_hub_clk_src", 18567e64528STaniya Das .parent_data = gpu_cc_parent_data_1, 18667e64528STaniya Das .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1), 18767e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 18867e64528STaniya Das .ops = &clk_rcg2_shared_ops, 18967e64528STaniya Das }, 19067e64528STaniya Das }; 19167e64528STaniya Das 19267e64528STaniya Das static struct clk_regmap_div gpu_cc_hub_div_clk_src = { 19367e64528STaniya Das .reg = 0x9430, 19467e64528STaniya Das .shift = 0, 19567e64528STaniya Das .width = 4, 19667e64528STaniya Das .clkr.hw.init = &(const struct clk_init_data) { 19767e64528STaniya Das .name = "gpu_cc_hub_div_clk_src", 19867e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 19967e64528STaniya Das &gpu_cc_hub_clk_src.clkr.hw, 20067e64528STaniya Das }, 20167e64528STaniya Das .num_parents = 1, 20267e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 20367e64528STaniya Das .ops = &clk_regmap_div_ro_ops, 20467e64528STaniya Das }, 20567e64528STaniya Das }; 20667e64528STaniya Das 20767e64528STaniya Das static struct clk_branch gpu_cc_ahb_clk = { 20867e64528STaniya Das .halt_reg = 0x90bc, 20967e64528STaniya Das .halt_check = BRANCH_HALT_DELAY, 21067e64528STaniya Das .clkr = { 21167e64528STaniya Das .enable_reg = 0x90bc, 21267e64528STaniya Das .enable_mask = BIT(0), 21367e64528STaniya Das .hw.init = &(const struct clk_init_data) { 21467e64528STaniya Das .name = "gpu_cc_ahb_clk", 21567e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 21667e64528STaniya Das &gpu_cc_hub_div_clk_src.clkr.hw, 21767e64528STaniya Das }, 21867e64528STaniya Das .num_parents = 1, 21967e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 22067e64528STaniya Das .ops = &clk_branch2_ops, 22167e64528STaniya Das }, 22267e64528STaniya Das }, 22367e64528STaniya Das }; 22467e64528STaniya Das 22567e64528STaniya Das static struct clk_branch gpu_cc_cx_accu_shift_clk = { 22667e64528STaniya Das .halt_reg = 0x9108, 22767e64528STaniya Das .halt_check = BRANCH_HALT_VOTED, 22867e64528STaniya Das .clkr = { 22967e64528STaniya Das .enable_reg = 0x9108, 23067e64528STaniya Das .enable_mask = BIT(0), 23167e64528STaniya Das .hw.init = &(const struct clk_init_data) { 23267e64528STaniya Das .name = "gpu_cc_cx_accu_shift_clk", 23367e64528STaniya Das .ops = &clk_branch2_ops, 23467e64528STaniya Das }, 23567e64528STaniya Das }, 23667e64528STaniya Das }; 23767e64528STaniya Das 23867e64528STaniya Das static struct clk_branch gpu_cc_cx_ff_clk = { 23967e64528STaniya Das .halt_reg = 0x90ec, 24067e64528STaniya Das .halt_check = BRANCH_HALT, 24167e64528STaniya Das .clkr = { 24267e64528STaniya Das .enable_reg = 0x90ec, 24367e64528STaniya Das .enable_mask = BIT(0), 24467e64528STaniya Das .hw.init = &(const struct clk_init_data) { 24567e64528STaniya Das .name = "gpu_cc_cx_ff_clk", 24667e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 24767e64528STaniya Das &gpu_cc_ff_clk_src.clkr.hw, 24867e64528STaniya Das }, 24967e64528STaniya Das .num_parents = 1, 25067e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 25167e64528STaniya Das .ops = &clk_branch2_ops, 25267e64528STaniya Das }, 25367e64528STaniya Das }, 25467e64528STaniya Das }; 25567e64528STaniya Das 25667e64528STaniya Das static struct clk_branch gpu_cc_cx_gmu_clk = { 25767e64528STaniya Das .halt_reg = 0x90d4, 25867e64528STaniya Das .halt_check = BRANCH_HALT_VOTED, 25967e64528STaniya Das .clkr = { 26067e64528STaniya Das .enable_reg = 0x90d4, 26167e64528STaniya Das .enable_mask = BIT(0), 26267e64528STaniya Das .hw.init = &(const struct clk_init_data) { 26367e64528STaniya Das .name = "gpu_cc_cx_gmu_clk", 26467e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 26567e64528STaniya Das &gpu_cc_gmu_clk_src.clkr.hw, 26667e64528STaniya Das }, 26767e64528STaniya Das .num_parents = 1, 26867e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 26967e64528STaniya Das .ops = &clk_branch2_aon_ops, 27067e64528STaniya Das }, 27167e64528STaniya Das }, 27267e64528STaniya Das }; 27367e64528STaniya Das 27467e64528STaniya Das static struct clk_branch gpu_cc_cxo_clk = { 27567e64528STaniya Das .halt_reg = 0x90e4, 27667e64528STaniya Das .halt_check = BRANCH_HALT, 27767e64528STaniya Das .clkr = { 27867e64528STaniya Das .enable_reg = 0x90e4, 27967e64528STaniya Das .enable_mask = BIT(0), 28067e64528STaniya Das .hw.init = &(const struct clk_init_data) { 28167e64528STaniya Das .name = "gpu_cc_cxo_clk", 28267e64528STaniya Das .ops = &clk_branch2_ops, 28367e64528STaniya Das }, 28467e64528STaniya Das }, 28567e64528STaniya Das }; 28667e64528STaniya Das 28767e64528STaniya Das static struct clk_branch gpu_cc_demet_clk = { 28867e64528STaniya Das .halt_reg = 0x9010, 28967e64528STaniya Das .halt_check = BRANCH_HALT_VOTED, 29067e64528STaniya Das .clkr = { 29167e64528STaniya Das .enable_reg = 0x9010, 29267e64528STaniya Das .enable_mask = BIT(0), 29367e64528STaniya Das .hw.init = &(const struct clk_init_data) { 29467e64528STaniya Das .name = "gpu_cc_demet_clk", 29567e64528STaniya Das .ops = &clk_branch2_ops, 29667e64528STaniya Das }, 29767e64528STaniya Das }, 29867e64528STaniya Das }; 29967e64528STaniya Das 30067e64528STaniya Das static struct clk_branch gpu_cc_dpm_clk = { 30167e64528STaniya Das .halt_reg = 0x910c, 30267e64528STaniya Das .halt_check = BRANCH_HALT, 30367e64528STaniya Das .clkr = { 30467e64528STaniya Das .enable_reg = 0x910c, 30567e64528STaniya Das .enable_mask = BIT(0), 30667e64528STaniya Das .hw.init = &(const struct clk_init_data) { 30767e64528STaniya Das .name = "gpu_cc_dpm_clk", 30867e64528STaniya Das .ops = &clk_branch2_ops, 30967e64528STaniya Das }, 31067e64528STaniya Das }, 31167e64528STaniya Das }; 31267e64528STaniya Das 31367e64528STaniya Das static struct clk_branch gpu_cc_freq_measure_clk = { 31467e64528STaniya Das .halt_reg = 0x900c, 31567e64528STaniya Das .halt_check = BRANCH_HALT, 31667e64528STaniya Das .clkr = { 31767e64528STaniya Das .enable_reg = 0x900c, 31867e64528STaniya Das .enable_mask = BIT(0), 31967e64528STaniya Das .hw.init = &(const struct clk_init_data) { 32067e64528STaniya Das .name = "gpu_cc_freq_measure_clk", 32167e64528STaniya Das .ops = &clk_branch2_ops, 32267e64528STaniya Das }, 32367e64528STaniya Das }, 32467e64528STaniya Das }; 32567e64528STaniya Das 32667e64528STaniya Das static struct clk_branch gpu_cc_gpu_smmu_vote_clk = { 32767e64528STaniya Das .halt_reg = 0x7000, 32867e64528STaniya Das .halt_check = BRANCH_HALT_VOTED, 32967e64528STaniya Das .clkr = { 33067e64528STaniya Das .enable_reg = 0x7000, 33167e64528STaniya Das .enable_mask = BIT(0), 33267e64528STaniya Das .hw.init = &(const struct clk_init_data) { 33367e64528STaniya Das .name = "gpu_cc_gpu_smmu_vote_clk", 33467e64528STaniya Das .ops = &clk_branch2_ops, 33567e64528STaniya Das }, 33667e64528STaniya Das }, 33767e64528STaniya Das }; 33867e64528STaniya Das 33967e64528STaniya Das static struct clk_branch gpu_cc_gx_accu_shift_clk = { 34067e64528STaniya Das .halt_reg = 0x9070, 34167e64528STaniya Das .halt_check = BRANCH_HALT_VOTED, 34267e64528STaniya Das .clkr = { 34367e64528STaniya Das .enable_reg = 0x9070, 34467e64528STaniya Das .enable_mask = BIT(0), 34567e64528STaniya Das .hw.init = &(const struct clk_init_data) { 34667e64528STaniya Das .name = "gpu_cc_gx_accu_shift_clk", 34767e64528STaniya Das .ops = &clk_branch2_ops, 34867e64528STaniya Das }, 34967e64528STaniya Das }, 35067e64528STaniya Das }; 35167e64528STaniya Das 35267e64528STaniya Das static struct clk_branch gpu_cc_gx_acd_ahb_ff_clk = { 35367e64528STaniya Das .halt_reg = 0x9068, 35467e64528STaniya Das .halt_check = BRANCH_HALT, 35567e64528STaniya Das .clkr = { 35667e64528STaniya Das .enable_reg = 0x9068, 35767e64528STaniya Das .enable_mask = BIT(0), 35867e64528STaniya Das .hw.init = &(const struct clk_init_data) { 35967e64528STaniya Das .name = "gpu_cc_gx_acd_ahb_ff_clk", 36067e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 36167e64528STaniya Das &gpu_cc_ff_clk_src.clkr.hw, 36267e64528STaniya Das }, 36367e64528STaniya Das .num_parents = 1, 36467e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 36567e64528STaniya Das .ops = &clk_branch2_ops, 36667e64528STaniya Das }, 36767e64528STaniya Das }, 36867e64528STaniya Das }; 36967e64528STaniya Das 37067e64528STaniya Das static struct clk_branch gpu_cc_gx_ahb_ff_clk = { 37167e64528STaniya Das .halt_reg = 0x9064, 37267e64528STaniya Das .halt_check = BRANCH_HALT, 37367e64528STaniya Das .clkr = { 37467e64528STaniya Das .enable_reg = 0x9064, 37567e64528STaniya Das .enable_mask = BIT(0), 37667e64528STaniya Das .hw.init = &(const struct clk_init_data) { 37767e64528STaniya Das .name = "gpu_cc_gx_ahb_ff_clk", 37867e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 37967e64528STaniya Das &gpu_cc_ff_clk_src.clkr.hw, 38067e64528STaniya Das }, 38167e64528STaniya Das .num_parents = 1, 38267e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 38367e64528STaniya Das .ops = &clk_branch2_ops, 38467e64528STaniya Das }, 38567e64528STaniya Das }, 38667e64528STaniya Das }; 38767e64528STaniya Das 38867e64528STaniya Das static struct clk_branch gpu_cc_gx_gmu_clk = { 38967e64528STaniya Das .halt_reg = 0x9060, 39067e64528STaniya Das .halt_check = BRANCH_HALT, 39167e64528STaniya Das .clkr = { 39267e64528STaniya Das .enable_reg = 0x9060, 39367e64528STaniya Das .enable_mask = BIT(0), 39467e64528STaniya Das .hw.init = &(const struct clk_init_data) { 39567e64528STaniya Das .name = "gpu_cc_gx_gmu_clk", 39667e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 39767e64528STaniya Das &gpu_cc_gmu_clk_src.clkr.hw, 39867e64528STaniya Das }, 39967e64528STaniya Das .num_parents = 1, 40067e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 40167e64528STaniya Das .ops = &clk_branch2_ops, 40267e64528STaniya Das }, 40367e64528STaniya Das }, 40467e64528STaniya Das }; 40567e64528STaniya Das 40667e64528STaniya Das static struct clk_branch gpu_cc_gx_rcg_ahb_ff_clk = { 40767e64528STaniya Das .halt_reg = 0x906c, 40867e64528STaniya Das .halt_check = BRANCH_HALT_VOTED, 40967e64528STaniya Das .clkr = { 41067e64528STaniya Das .enable_reg = 0x906c, 41167e64528STaniya Das .enable_mask = BIT(0), 41267e64528STaniya Das .hw.init = &(const struct clk_init_data) { 41367e64528STaniya Das .name = "gpu_cc_gx_rcg_ahb_ff_clk", 41467e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 41567e64528STaniya Das &gpu_cc_ff_clk_src.clkr.hw, 41667e64528STaniya Das }, 41767e64528STaniya Das .num_parents = 1, 41867e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 41967e64528STaniya Das .ops = &clk_branch2_ops, 42067e64528STaniya Das }, 42167e64528STaniya Das }, 42267e64528STaniya Das }; 42367e64528STaniya Das 42467e64528STaniya Das static struct clk_branch gpu_cc_hub_aon_clk = { 42567e64528STaniya Das .halt_reg = 0x93ec, 42667e64528STaniya Das .halt_check = BRANCH_HALT_VOTED, 42767e64528STaniya Das .clkr = { 42867e64528STaniya Das .enable_reg = 0x93ec, 42967e64528STaniya Das .enable_mask = BIT(0), 43067e64528STaniya Das .hw.init = &(const struct clk_init_data) { 43167e64528STaniya Das .name = "gpu_cc_hub_aon_clk", 43267e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 43367e64528STaniya Das &gpu_cc_hub_clk_src.clkr.hw, 43467e64528STaniya Das }, 43567e64528STaniya Das .num_parents = 1, 43667e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 43767e64528STaniya Das .ops = &clk_branch2_aon_ops, 43867e64528STaniya Das }, 43967e64528STaniya Das }, 44067e64528STaniya Das }; 44167e64528STaniya Das 44267e64528STaniya Das static struct clk_branch gpu_cc_hub_cx_int_clk = { 44367e64528STaniya Das .halt_reg = 0x90e8, 44467e64528STaniya Das .halt_check = BRANCH_HALT_VOTED, 44567e64528STaniya Das .clkr = { 44667e64528STaniya Das .enable_reg = 0x90e8, 44767e64528STaniya Das .enable_mask = BIT(0), 44867e64528STaniya Das .hw.init = &(const struct clk_init_data) { 44967e64528STaniya Das .name = "gpu_cc_hub_cx_int_clk", 45067e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 45167e64528STaniya Das &gpu_cc_hub_clk_src.clkr.hw, 45267e64528STaniya Das }, 45367e64528STaniya Das .num_parents = 1, 45467e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 45567e64528STaniya Das .ops = &clk_branch2_aon_ops, 45667e64528STaniya Das }, 45767e64528STaniya Das }, 45867e64528STaniya Das }; 45967e64528STaniya Das 46067e64528STaniya Das static struct clk_branch gpu_cc_memnoc_gfx_clk = { 46167e64528STaniya Das .halt_reg = 0x90f0, 46267e64528STaniya Das .halt_check = BRANCH_HALT_VOTED, 46367e64528STaniya Das .clkr = { 46467e64528STaniya Das .enable_reg = 0x90f0, 46567e64528STaniya Das .enable_mask = BIT(0), 46667e64528STaniya Das .hw.init = &(const struct clk_init_data) { 46767e64528STaniya Das .name = "gpu_cc_memnoc_gfx_clk", 46867e64528STaniya Das .ops = &clk_branch2_ops, 46967e64528STaniya Das }, 47067e64528STaniya Das }, 47167e64528STaniya Das }; 47267e64528STaniya Das 47367e64528STaniya Das static struct clk_branch gpu_cc_rscc_hub_aon_clk = { 47467e64528STaniya Das .halt_reg = 0x93e8, 47567e64528STaniya Das .halt_check = BRANCH_HALT, 47667e64528STaniya Das .clkr = { 47767e64528STaniya Das .enable_reg = 0x93e8, 47867e64528STaniya Das .enable_mask = BIT(0), 47967e64528STaniya Das .hw.init = &(const struct clk_init_data) { 48067e64528STaniya Das .name = "gpu_cc_rscc_hub_aon_clk", 48167e64528STaniya Das .parent_hws = (const struct clk_hw*[]) { 48267e64528STaniya Das &gpu_cc_hub_clk_src.clkr.hw, 48367e64528STaniya Das }, 48467e64528STaniya Das .num_parents = 1, 48567e64528STaniya Das .flags = CLK_SET_RATE_PARENT, 48667e64528STaniya Das .ops = &clk_branch2_ops, 48767e64528STaniya Das }, 48867e64528STaniya Das }, 48967e64528STaniya Das }; 49067e64528STaniya Das 49167e64528STaniya Das static struct clk_branch gpu_cc_sleep_clk = { 49267e64528STaniya Das .halt_reg = 0x90cc, 49367e64528STaniya Das .halt_check = BRANCH_HALT, 49467e64528STaniya Das .clkr = { 49567e64528STaniya Das .enable_reg = 0x90cc, 49667e64528STaniya Das .enable_mask = BIT(0), 49767e64528STaniya Das .hw.init = &(const struct clk_init_data) { 49867e64528STaniya Das .name = "gpu_cc_sleep_clk", 49967e64528STaniya Das .ops = &clk_branch2_ops, 50067e64528STaniya Das }, 50167e64528STaniya Das }, 50267e64528STaniya Das }; 50367e64528STaniya Das 50467e64528STaniya Das static struct gdsc gpu_cc_cx_gdsc = { 50567e64528STaniya Das .gdscr = 0x9080, 50667e64528STaniya Das .gds_hw_ctrl = 0x9094, 50767e64528STaniya Das .en_rest_wait_val = 0x2, 50867e64528STaniya Das .en_few_wait_val = 0x2, 50967e64528STaniya Das .clk_dis_wait_val = 0xf, 51067e64528STaniya Das .pd = { 51167e64528STaniya Das .name = "gpu_cc_cx_gdsc", 51267e64528STaniya Das }, 51367e64528STaniya Das .pwrsts = PWRSTS_OFF_ON, 51467e64528STaniya Das .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 51567e64528STaniya Das }; 51667e64528STaniya Das 51767e64528STaniya Das static struct clk_regmap *gpu_cc_glymur_clocks[] = { 51867e64528STaniya Das [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr, 51967e64528STaniya Das [GPU_CC_CX_ACCU_SHIFT_CLK] = &gpu_cc_cx_accu_shift_clk.clkr, 52067e64528STaniya Das [GPU_CC_CX_FF_CLK] = &gpu_cc_cx_ff_clk.clkr, 52167e64528STaniya Das [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr, 52267e64528STaniya Das [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr, 52367e64528STaniya Das [GPU_CC_DEMET_CLK] = &gpu_cc_demet_clk.clkr, 52467e64528STaniya Das [GPU_CC_DPM_CLK] = &gpu_cc_dpm_clk.clkr, 52567e64528STaniya Das [GPU_CC_FF_CLK_SRC] = &gpu_cc_ff_clk_src.clkr, 52667e64528STaniya Das [GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_clk.clkr, 52767e64528STaniya Das [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr, 52867e64528STaniya Das [GPU_CC_GPU_SMMU_VOTE_CLK] = &gpu_cc_gpu_smmu_vote_clk.clkr, 52967e64528STaniya Das [GPU_CC_GX_ACCU_SHIFT_CLK] = &gpu_cc_gx_accu_shift_clk.clkr, 53067e64528STaniya Das [GPU_CC_GX_ACD_AHB_FF_CLK] = &gpu_cc_gx_acd_ahb_ff_clk.clkr, 53167e64528STaniya Das [GPU_CC_GX_AHB_FF_CLK] = &gpu_cc_gx_ahb_ff_clk.clkr, 53267e64528STaniya Das [GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr, 53367e64528STaniya Das [GPU_CC_GX_RCG_AHB_FF_CLK] = &gpu_cc_gx_rcg_ahb_ff_clk.clkr, 53467e64528STaniya Das [GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr, 53567e64528STaniya Das [GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr, 53667e64528STaniya Das [GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr, 53767e64528STaniya Das [GPU_CC_HUB_DIV_CLK_SRC] = &gpu_cc_hub_div_clk_src.clkr, 53867e64528STaniya Das [GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr, 53967e64528STaniya Das [GPU_CC_PLL0] = &gpu_cc_pll0.clkr, 54067e64528STaniya Das [GPU_CC_PLL0_OUT_EVEN] = &gpu_cc_pll0_out_even.clkr, 54167e64528STaniya Das [GPU_CC_RSCC_HUB_AON_CLK] = &gpu_cc_rscc_hub_aon_clk.clkr, 54267e64528STaniya Das [GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr, 54367e64528STaniya Das }; 54467e64528STaniya Das 54567e64528STaniya Das static struct gdsc *gpu_cc_glymur_gdscs[] = { 54667e64528STaniya Das [GPU_CC_CX_GDSC] = &gpu_cc_cx_gdsc, 54767e64528STaniya Das }; 54867e64528STaniya Das 54967e64528STaniya Das static const struct qcom_reset_map gpu_cc_glymur_resets[] = { 55067e64528STaniya Das [GPU_CC_CB_BCR] = { 0x93a0 }, 55167e64528STaniya Das [GPU_CC_CX_BCR] = { 0x907c }, 55267e64528STaniya Das [GPU_CC_FAST_HUB_BCR] = { 0x93e4 }, 55367e64528STaniya Das [GPU_CC_FF_BCR] = { 0x9470 }, 55467e64528STaniya Das [GPU_CC_GMU_BCR] = { 0x9314 }, 55567e64528STaniya Das [GPU_CC_GX_BCR] = { 0x905c }, 55667e64528STaniya Das [GPU_CC_XO_BCR] = { 0x9000 }, 55767e64528STaniya Das }; 55867e64528STaniya Das 55967e64528STaniya Das static struct clk_alpha_pll *gpu_cc_glymur_plls[] = { 56067e64528STaniya Das &gpu_cc_pll0, 56167e64528STaniya Das }; 56267e64528STaniya Das 563*87df31eaSKrzysztof Kozlowski static const u32 gpu_cc_glymur_critical_cbcrs[] = { 56467e64528STaniya Das 0x93a4, /* GPU_CC_CB_CLK */ 56567e64528STaniya Das 0x9008, /* GPU_CC_CXO_AON_CLK */ 56667e64528STaniya Das 0x9004, /* GPU_CC_RSCC_XO_AON_CLK */ 56767e64528STaniya Das }; 56867e64528STaniya Das 56967e64528STaniya Das static const struct regmap_config gpu_cc_glymur_regmap_config = { 57067e64528STaniya Das .reg_bits = 32, 57167e64528STaniya Das .reg_stride = 4, 57267e64528STaniya Das .val_bits = 32, 57367e64528STaniya Das .max_register = 0x95e8, 57467e64528STaniya Das .fast_io = true, 57567e64528STaniya Das }; 57667e64528STaniya Das 577573ddd0dSKrzysztof Kozlowski static const struct qcom_cc_driver_data gpu_cc_glymur_driver_data = { 57867e64528STaniya Das .alpha_plls = gpu_cc_glymur_plls, 57967e64528STaniya Das .num_alpha_plls = ARRAY_SIZE(gpu_cc_glymur_plls), 58067e64528STaniya Das .clk_cbcrs = gpu_cc_glymur_critical_cbcrs, 58167e64528STaniya Das .num_clk_cbcrs = ARRAY_SIZE(gpu_cc_glymur_critical_cbcrs), 58267e64528STaniya Das }; 58367e64528STaniya Das 58467e64528STaniya Das static const struct qcom_cc_desc gpu_cc_glymur_desc = { 58567e64528STaniya Das .config = &gpu_cc_glymur_regmap_config, 58667e64528STaniya Das .clks = gpu_cc_glymur_clocks, 58767e64528STaniya Das .num_clks = ARRAY_SIZE(gpu_cc_glymur_clocks), 58867e64528STaniya Das .resets = gpu_cc_glymur_resets, 58967e64528STaniya Das .num_resets = ARRAY_SIZE(gpu_cc_glymur_resets), 59067e64528STaniya Das .gdscs = gpu_cc_glymur_gdscs, 59167e64528STaniya Das .num_gdscs = ARRAY_SIZE(gpu_cc_glymur_gdscs), 59267e64528STaniya Das .use_rpm = true, 59367e64528STaniya Das .driver_data = &gpu_cc_glymur_driver_data, 59467e64528STaniya Das }; 59567e64528STaniya Das 59667e64528STaniya Das static const struct of_device_id gpu_cc_glymur_match_table[] = { 59767e64528STaniya Das { .compatible = "qcom,glymur-gpucc" }, 59867e64528STaniya Das { } 59967e64528STaniya Das }; 60067e64528STaniya Das MODULE_DEVICE_TABLE(of, gpu_cc_glymur_match_table); 60167e64528STaniya Das 60267e64528STaniya Das static int gpu_cc_glymur_probe(struct platform_device *pdev) 60367e64528STaniya Das { 60467e64528STaniya Das return qcom_cc_probe(pdev, &gpu_cc_glymur_desc); 60567e64528STaniya Das } 60667e64528STaniya Das 60767e64528STaniya Das static struct platform_driver gpu_cc_glymur_driver = { 60867e64528STaniya Das .probe = gpu_cc_glymur_probe, 60967e64528STaniya Das .driver = { 61067e64528STaniya Das .name = "gpucc-glymur", 61167e64528STaniya Das .of_match_table = gpu_cc_glymur_match_table, 61267e64528STaniya Das }, 61367e64528STaniya Das }; 61467e64528STaniya Das 61567e64528STaniya Das module_platform_driver(gpu_cc_glymur_driver); 61667e64528STaniya Das 61767e64528STaniya Das MODULE_DESCRIPTION("QTI GPUCC Glymur Driver"); 61867e64528STaniya Das MODULE_LICENSE("GPL"); 619