xref: /linux/drivers/clk/qcom/gpucc-glymur.c (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
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