xref: /openbmc/linux/drivers/clk/qcom/dispcc-sm6115.c (revision a96cbb14)
19b518788SAdam Skladowski // SPDX-License-Identifier: GPL-2.0-only
29b518788SAdam Skladowski /*
39b518788SAdam Skladowski  * Based on dispcc-qcm2290.c
49b518788SAdam Skladowski  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
59b518788SAdam Skladowski  * Copyright (c) 2021, Linaro Ltd.
69b518788SAdam Skladowski  */
79b518788SAdam Skladowski 
89b518788SAdam Skladowski #include <linux/err.h>
99b518788SAdam Skladowski #include <linux/kernel.h>
109b518788SAdam Skladowski #include <linux/module.h>
119b518788SAdam Skladowski #include <linux/of.h>
12*a96cbb14SRob Herring #include <linux/platform_device.h>
139b518788SAdam Skladowski #include <linux/regmap.h>
149b518788SAdam Skladowski 
159b518788SAdam Skladowski #include <dt-bindings/clock/qcom,sm6115-dispcc.h>
169b518788SAdam Skladowski 
179b518788SAdam Skladowski #include "clk-alpha-pll.h"
189b518788SAdam Skladowski #include "clk-branch.h"
199b518788SAdam Skladowski #include "clk-rcg.h"
209b518788SAdam Skladowski #include "clk-regmap.h"
219b518788SAdam Skladowski #include "clk-regmap-divider.h"
229b518788SAdam Skladowski #include "common.h"
239b518788SAdam Skladowski #include "gdsc.h"
249b518788SAdam Skladowski 
259b518788SAdam Skladowski enum {
269b518788SAdam Skladowski 	DT_BI_TCXO,
279b518788SAdam Skladowski 	DT_SLEEP_CLK,
289b518788SAdam Skladowski 	DT_DSI0_PHY_PLL_OUT_BYTECLK,
299b518788SAdam Skladowski 	DT_DSI0_PHY_PLL_OUT_DSICLK,
309b518788SAdam Skladowski 	DT_GPLL0_DISP_DIV,
319b518788SAdam Skladowski };
329b518788SAdam Skladowski 
339b518788SAdam Skladowski enum {
349b518788SAdam Skladowski 	P_BI_TCXO,
359b518788SAdam Skladowski 	P_DISP_CC_PLL0_OUT_MAIN,
369b518788SAdam Skladowski 	P_DSI0_PHY_PLL_OUT_BYTECLK,
379b518788SAdam Skladowski 	P_DSI0_PHY_PLL_OUT_DSICLK,
389b518788SAdam Skladowski 	P_GPLL0_OUT_MAIN,
399b518788SAdam Skladowski 	P_SLEEP_CLK,
409b518788SAdam Skladowski };
419b518788SAdam Skladowski 
429b518788SAdam Skladowski static const struct clk_parent_data parent_data_tcxo = { .index = DT_BI_TCXO };
439b518788SAdam Skladowski 
449b518788SAdam Skladowski static const struct pll_vco spark_vco[] = {
459b518788SAdam Skladowski 	{ 500000000, 1000000000, 2 },
469b518788SAdam Skladowski };
479b518788SAdam Skladowski 
489b518788SAdam Skladowski /* 768MHz configuration */
499b518788SAdam Skladowski static const struct alpha_pll_config disp_cc_pll0_config = {
509b518788SAdam Skladowski 	.l = 0x28,
519b518788SAdam Skladowski 	.alpha = 0x0,
529b518788SAdam Skladowski 	.alpha_en_mask = BIT(24),
539b518788SAdam Skladowski 	.vco_val = 0x2 << 20,
549b518788SAdam Skladowski 	.vco_mask = GENMASK(21, 20),
559b518788SAdam Skladowski 	.main_output_mask = BIT(0),
569b518788SAdam Skladowski 	.config_ctl_val = 0x4001055B,
579b518788SAdam Skladowski };
589b518788SAdam Skladowski 
599b518788SAdam Skladowski static struct clk_alpha_pll disp_cc_pll0 = {
609b518788SAdam Skladowski 	.offset = 0x0,
619b518788SAdam Skladowski 	.vco_table = spark_vco,
629b518788SAdam Skladowski 	.num_vco = ARRAY_SIZE(spark_vco),
639b518788SAdam Skladowski 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
649b518788SAdam Skladowski 	.clkr = {
659b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
669b518788SAdam Skladowski 			.name = "disp_cc_pll0",
679b518788SAdam Skladowski 			.parent_data = &parent_data_tcxo,
689b518788SAdam Skladowski 			.num_parents = 1,
699b518788SAdam Skladowski 			.ops = &clk_alpha_pll_ops,
709b518788SAdam Skladowski 		},
719b518788SAdam Skladowski 	},
729b518788SAdam Skladowski };
739b518788SAdam Skladowski 
749b518788SAdam Skladowski static const struct clk_div_table post_div_table_disp_cc_pll0_out_main[] = {
759b518788SAdam Skladowski 	{ 0x0, 1 },
769b518788SAdam Skladowski 	{ }
779b518788SAdam Skladowski };
789b518788SAdam Skladowski static struct clk_alpha_pll_postdiv disp_cc_pll0_out_main = {
799b518788SAdam Skladowski 	.offset = 0x0,
809b518788SAdam Skladowski 	.post_div_shift = 8,
819b518788SAdam Skladowski 	.post_div_table = post_div_table_disp_cc_pll0_out_main,
829b518788SAdam Skladowski 	.num_post_div = ARRAY_SIZE(post_div_table_disp_cc_pll0_out_main),
839b518788SAdam Skladowski 	.width = 4,
849b518788SAdam Skladowski 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
859b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data){
869b518788SAdam Skladowski 		.name = "disp_cc_pll0_out_main",
879b518788SAdam Skladowski 		.parent_hws = (const struct clk_hw*[]){
889b518788SAdam Skladowski 			&disp_cc_pll0.clkr.hw,
899b518788SAdam Skladowski 		},
909b518788SAdam Skladowski 		.num_parents = 1,
919b518788SAdam Skladowski 		.flags = CLK_SET_RATE_PARENT,
929b518788SAdam Skladowski 		.ops = &clk_alpha_pll_postdiv_ops,
939b518788SAdam Skladowski 	},
949b518788SAdam Skladowski };
959b518788SAdam Skladowski 
969b518788SAdam Skladowski static const struct parent_map disp_cc_parent_map_0[] = {
979b518788SAdam Skladowski 	{ P_BI_TCXO, 0 },
989b518788SAdam Skladowski 	{ P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
999b518788SAdam Skladowski };
1009b518788SAdam Skladowski 
1019b518788SAdam Skladowski static const struct clk_parent_data disp_cc_parent_data_0[] = {
1029b518788SAdam Skladowski 	{ .index = DT_BI_TCXO },
1039b518788SAdam Skladowski 	{ .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
1049b518788SAdam Skladowski };
1059b518788SAdam Skladowski 
1069b518788SAdam Skladowski static const struct parent_map disp_cc_parent_map_1[] = {
1079b518788SAdam Skladowski 	{ P_BI_TCXO, 0 },
1089b518788SAdam Skladowski };
1099b518788SAdam Skladowski 
1109b518788SAdam Skladowski static const struct clk_parent_data disp_cc_parent_data_1[] = {
1119b518788SAdam Skladowski 	{ .index = DT_BI_TCXO },
1129b518788SAdam Skladowski };
1139b518788SAdam Skladowski 
1149b518788SAdam Skladowski static const struct parent_map disp_cc_parent_map_2[] = {
1159b518788SAdam Skladowski 	{ P_BI_TCXO, 0 },
1169b518788SAdam Skladowski 	{ P_GPLL0_OUT_MAIN, 4 },
1179b518788SAdam Skladowski };
1189b518788SAdam Skladowski 
1199b518788SAdam Skladowski static const struct clk_parent_data disp_cc_parent_data_2[] = {
1209b518788SAdam Skladowski 	{ .index = DT_BI_TCXO },
1219b518788SAdam Skladowski 	{ .index = DT_GPLL0_DISP_DIV },
1229b518788SAdam Skladowski };
1239b518788SAdam Skladowski 
1249b518788SAdam Skladowski static const struct parent_map disp_cc_parent_map_3[] = {
1259b518788SAdam Skladowski 	{ P_BI_TCXO, 0 },
1269b518788SAdam Skladowski 	{ P_DISP_CC_PLL0_OUT_MAIN, 1 },
1279b518788SAdam Skladowski };
1289b518788SAdam Skladowski 
1299b518788SAdam Skladowski static const struct clk_parent_data disp_cc_parent_data_3[] = {
1309b518788SAdam Skladowski 	{ .index = DT_BI_TCXO },
1319b518788SAdam Skladowski 	{ .hw = &disp_cc_pll0_out_main.clkr.hw },
1329b518788SAdam Skladowski };
1339b518788SAdam Skladowski 
1349b518788SAdam Skladowski static const struct parent_map disp_cc_parent_map_4[] = {
1359b518788SAdam Skladowski 	{ P_BI_TCXO, 0 },
1369b518788SAdam Skladowski 	{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
1379b518788SAdam Skladowski };
1389b518788SAdam Skladowski 
1399b518788SAdam Skladowski static const struct clk_parent_data disp_cc_parent_data_4[] = {
1409b518788SAdam Skladowski 	{ .index = DT_BI_TCXO },
1419b518788SAdam Skladowski 	{ .index = DT_DSI0_PHY_PLL_OUT_DSICLK },
1429b518788SAdam Skladowski };
1439b518788SAdam Skladowski 
1449b518788SAdam Skladowski static const struct parent_map disp_cc_parent_map_5[] = {
1459b518788SAdam Skladowski 	{ P_SLEEP_CLK, 0 },
1469b518788SAdam Skladowski };
1479b518788SAdam Skladowski 
1489b518788SAdam Skladowski static const struct clk_parent_data disp_cc_parent_data_5[] = {
1499b518788SAdam Skladowski 	{ .index = DT_SLEEP_CLK, },
1509b518788SAdam Skladowski };
1519b518788SAdam Skladowski 
1529b518788SAdam Skladowski static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
1539b518788SAdam Skladowski 	.cmd_rcgr = 0x20bc,
1549b518788SAdam Skladowski 	.mnd_width = 0,
1559b518788SAdam Skladowski 	.hid_width = 5,
1569b518788SAdam Skladowski 	.parent_map = disp_cc_parent_map_0,
1579b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data){
1589b518788SAdam Skladowski 		.name = "disp_cc_mdss_byte0_clk_src",
1599b518788SAdam Skladowski 		.parent_data = disp_cc_parent_data_0,
1609b518788SAdam Skladowski 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
1619b518788SAdam Skladowski 		/* For set_rate and set_parent to succeed, parent(s) must be enabled */
1629b518788SAdam Skladowski 		.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE | CLK_GET_RATE_NOCACHE,
1639b518788SAdam Skladowski 		.ops = &clk_byte2_ops,
1649b518788SAdam Skladowski 	},
1659b518788SAdam Skladowski };
1669b518788SAdam Skladowski 
1679b518788SAdam Skladowski static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
1689b518788SAdam Skladowski 	.reg = 0x20d4,
1699b518788SAdam Skladowski 	.shift = 0,
1709b518788SAdam Skladowski 	.width = 2,
1719b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data) {
1729b518788SAdam Skladowski 		.name = "disp_cc_mdss_byte0_div_clk_src",
1739b518788SAdam Skladowski 		.parent_hws = (const struct clk_hw*[]){
1749b518788SAdam Skladowski 			&disp_cc_mdss_byte0_clk_src.clkr.hw,
1759b518788SAdam Skladowski 		},
1769b518788SAdam Skladowski 		.num_parents = 1,
1779b518788SAdam Skladowski 		.ops = &clk_regmap_div_ops,
1789b518788SAdam Skladowski 	},
1799b518788SAdam Skladowski };
1809b518788SAdam Skladowski 
1819b518788SAdam Skladowski static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
1829b518788SAdam Skladowski 	F(19200000, P_BI_TCXO, 1, 0, 0),
1839b518788SAdam Skladowski 	F(37500000, P_GPLL0_OUT_MAIN, 8, 0, 0),
1849b518788SAdam Skladowski 	F(75000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
1859b518788SAdam Skladowski 	{ }
1869b518788SAdam Skladowski };
1879b518788SAdam Skladowski 
1889b518788SAdam Skladowski static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
1899b518788SAdam Skladowski 	.cmd_rcgr = 0x2154,
1909b518788SAdam Skladowski 	.mnd_width = 0,
1919b518788SAdam Skladowski 	.hid_width = 5,
1929b518788SAdam Skladowski 	.parent_map = disp_cc_parent_map_2,
1939b518788SAdam Skladowski 	.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
1949b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data){
1959b518788SAdam Skladowski 		.name = "disp_cc_mdss_ahb_clk_src",
1969b518788SAdam Skladowski 		.parent_data = disp_cc_parent_data_2,
1979b518788SAdam Skladowski 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
1989b518788SAdam Skladowski 		.ops = &clk_rcg2_shared_ops,
1999b518788SAdam Skladowski 	},
2009b518788SAdam Skladowski };
2019b518788SAdam Skladowski 
2029b518788SAdam Skladowski static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
2039b518788SAdam Skladowski 	F(19200000, P_BI_TCXO, 1, 0, 0),
2049b518788SAdam Skladowski 	{ }
2059b518788SAdam Skladowski };
2069b518788SAdam Skladowski 
2079b518788SAdam Skladowski static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
2089b518788SAdam Skladowski 	.cmd_rcgr = 0x20d8,
2099b518788SAdam Skladowski 	.mnd_width = 0,
2109b518788SAdam Skladowski 	.hid_width = 5,
2119b518788SAdam Skladowski 	.parent_map = disp_cc_parent_map_0,
2129b518788SAdam Skladowski 	.freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
2139b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data){
2149b518788SAdam Skladowski 		.name = "disp_cc_mdss_esc0_clk_src",
2159b518788SAdam Skladowski 		.parent_data = disp_cc_parent_data_0,
2169b518788SAdam Skladowski 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
2179b518788SAdam Skladowski 		.ops = &clk_rcg2_ops,
2189b518788SAdam Skladowski 	},
2199b518788SAdam Skladowski };
2209b518788SAdam Skladowski 
2219b518788SAdam Skladowski static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
2229b518788SAdam Skladowski 	F(19200000, P_BI_TCXO, 1, 0, 0),
2239b518788SAdam Skladowski 	F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
2249b518788SAdam Skladowski 	F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
2259b518788SAdam Skladowski 	F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
2269b518788SAdam Skladowski 	F(384000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
2279b518788SAdam Skladowski 	{ }
2289b518788SAdam Skladowski };
2299b518788SAdam Skladowski 
2309b518788SAdam Skladowski static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
2319b518788SAdam Skladowski 	.cmd_rcgr = 0x2074,
2329b518788SAdam Skladowski 	.mnd_width = 0,
2339b518788SAdam Skladowski 	.hid_width = 5,
2349b518788SAdam Skladowski 	.parent_map = disp_cc_parent_map_3,
2359b518788SAdam Skladowski 	.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
2369b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data){
2379b518788SAdam Skladowski 		.name = "disp_cc_mdss_mdp_clk_src",
2389b518788SAdam Skladowski 		.parent_data = disp_cc_parent_data_3,
2399b518788SAdam Skladowski 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
2409b518788SAdam Skladowski 		.flags = CLK_SET_RATE_PARENT,
2419b518788SAdam Skladowski 		.ops = &clk_rcg2_shared_ops,
2429b518788SAdam Skladowski 	},
2439b518788SAdam Skladowski };
2449b518788SAdam Skladowski 
2459b518788SAdam Skladowski static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
2469b518788SAdam Skladowski 	.cmd_rcgr = 0x205c,
2479b518788SAdam Skladowski 	.mnd_width = 8,
2489b518788SAdam Skladowski 	.hid_width = 5,
2499b518788SAdam Skladowski 	.parent_map = disp_cc_parent_map_4,
2509b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data){
2519b518788SAdam Skladowski 		.name = "disp_cc_mdss_pclk0_clk_src",
2529b518788SAdam Skladowski 		.parent_data = disp_cc_parent_data_4,
2539b518788SAdam Skladowski 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
2549b518788SAdam Skladowski 		/* For set_rate and set_parent to succeed, parent(s) must be enabled */
2559b518788SAdam Skladowski 		.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE | CLK_GET_RATE_NOCACHE,
2569b518788SAdam Skladowski 		.ops = &clk_pixel_ops,
2579b518788SAdam Skladowski 	},
2589b518788SAdam Skladowski };
2599b518788SAdam Skladowski 
2609b518788SAdam Skladowski static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
2619b518788SAdam Skladowski 	F(19200000, P_BI_TCXO, 1, 0, 0),
2629b518788SAdam Skladowski 	F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
2639b518788SAdam Skladowski 	F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
2649b518788SAdam Skladowski 	F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
2659b518788SAdam Skladowski 	{ }
2669b518788SAdam Skladowski };
2679b518788SAdam Skladowski 
2689b518788SAdam Skladowski static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
2699b518788SAdam Skladowski 	.cmd_rcgr = 0x208c,
2709b518788SAdam Skladowski 	.mnd_width = 0,
2719b518788SAdam Skladowski 	.hid_width = 5,
2729b518788SAdam Skladowski 	.parent_map = disp_cc_parent_map_3,
2739b518788SAdam Skladowski 	.freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
2749b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data){
2759b518788SAdam Skladowski 		.name = "disp_cc_mdss_rot_clk_src",
2769b518788SAdam Skladowski 		.parent_data = disp_cc_parent_data_3,
2779b518788SAdam Skladowski 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
2789b518788SAdam Skladowski 		.flags = CLK_SET_RATE_PARENT,
2799b518788SAdam Skladowski 		.ops = &clk_rcg2_shared_ops,
2809b518788SAdam Skladowski 	},
2819b518788SAdam Skladowski };
2829b518788SAdam Skladowski 
2839b518788SAdam Skladowski static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
2849b518788SAdam Skladowski 	.cmd_rcgr = 0x20a4,
2859b518788SAdam Skladowski 	.mnd_width = 0,
2869b518788SAdam Skladowski 	.hid_width = 5,
2879b518788SAdam Skladowski 	.parent_map = disp_cc_parent_map_1,
2889b518788SAdam Skladowski 	.freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
2899b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data){
2909b518788SAdam Skladowski 		.name = "disp_cc_mdss_vsync_clk_src",
2919b518788SAdam Skladowski 		.parent_data = disp_cc_parent_data_1,
2929b518788SAdam Skladowski 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
2939b518788SAdam Skladowski 		.flags = CLK_SET_RATE_PARENT,
2949b518788SAdam Skladowski 		.ops = &clk_rcg2_shared_ops,
2959b518788SAdam Skladowski 	},
2969b518788SAdam Skladowski };
2979b518788SAdam Skladowski 
2989b518788SAdam Skladowski static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = {
2999b518788SAdam Skladowski 	F(32764, P_SLEEP_CLK, 1, 0, 0),
3009b518788SAdam Skladowski 	{ }
3019b518788SAdam Skladowski };
3029b518788SAdam Skladowski 
3039b518788SAdam Skladowski static struct clk_rcg2 disp_cc_sleep_clk_src = {
3049b518788SAdam Skladowski 	.cmd_rcgr = 0x6050,
3059b518788SAdam Skladowski 	.mnd_width = 0,
3069b518788SAdam Skladowski 	.hid_width = 5,
3079b518788SAdam Skladowski 	.parent_map = disp_cc_parent_map_5,
3089b518788SAdam Skladowski 	.freq_tbl = ftbl_disp_cc_sleep_clk_src,
3099b518788SAdam Skladowski 	.clkr.hw.init = &(struct clk_init_data){
3109b518788SAdam Skladowski 		.name = "disp_cc_sleep_clk_src",
3119b518788SAdam Skladowski 		.parent_data = disp_cc_parent_data_5,
3129b518788SAdam Skladowski 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
3139b518788SAdam Skladowski 		.ops = &clk_rcg2_ops,
3149b518788SAdam Skladowski 	},
3159b518788SAdam Skladowski };
3169b518788SAdam Skladowski 
3179b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_ahb_clk = {
3189b518788SAdam Skladowski 	.halt_reg = 0x2044,
3199b518788SAdam Skladowski 	.halt_check = BRANCH_HALT,
3209b518788SAdam Skladowski 	.clkr = {
3219b518788SAdam Skladowski 		.enable_reg = 0x2044,
3229b518788SAdam Skladowski 		.enable_mask = BIT(0),
3239b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
3249b518788SAdam Skladowski 			.name = "disp_cc_mdss_ahb_clk",
3259b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
3269b518788SAdam Skladowski 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
3279b518788SAdam Skladowski 			},
3289b518788SAdam Skladowski 			.num_parents = 1,
3299b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT,
3309b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
3319b518788SAdam Skladowski 		},
3329b518788SAdam Skladowski 	},
3339b518788SAdam Skladowski };
3349b518788SAdam Skladowski 
3359b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_byte0_clk = {
3369b518788SAdam Skladowski 	.halt_reg = 0x2024,
3379b518788SAdam Skladowski 	.halt_check = BRANCH_HALT,
3389b518788SAdam Skladowski 	.clkr = {
3399b518788SAdam Skladowski 		.enable_reg = 0x2024,
3409b518788SAdam Skladowski 		.enable_mask = BIT(0),
3419b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
3429b518788SAdam Skladowski 			.name = "disp_cc_mdss_byte0_clk",
3439b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
3449b518788SAdam Skladowski 				&disp_cc_mdss_byte0_clk_src.clkr.hw,
3459b518788SAdam Skladowski 			},
3469b518788SAdam Skladowski 			.num_parents = 1,
3479b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
3489b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
3499b518788SAdam Skladowski 		},
3509b518788SAdam Skladowski 	},
3519b518788SAdam Skladowski };
3529b518788SAdam Skladowski 
3539b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
3549b518788SAdam Skladowski 	.halt_reg = 0x2028,
3559b518788SAdam Skladowski 	.halt_check = BRANCH_HALT,
3569b518788SAdam Skladowski 	.clkr = {
3579b518788SAdam Skladowski 		.enable_reg = 0x2028,
3589b518788SAdam Skladowski 		.enable_mask = BIT(0),
3599b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
3609b518788SAdam Skladowski 			.name = "disp_cc_mdss_byte0_intf_clk",
3619b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
3629b518788SAdam Skladowski 				&disp_cc_mdss_byte0_div_clk_src.clkr.hw,
3639b518788SAdam Skladowski 			},
3649b518788SAdam Skladowski 			.num_parents = 1,
3659b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
3669b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
3679b518788SAdam Skladowski 		},
3689b518788SAdam Skladowski 	},
3699b518788SAdam Skladowski };
3709b518788SAdam Skladowski 
3719b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_esc0_clk = {
3729b518788SAdam Skladowski 	.halt_reg = 0x202c,
3739b518788SAdam Skladowski 	.halt_check = BRANCH_HALT,
3749b518788SAdam Skladowski 	.clkr = {
3759b518788SAdam Skladowski 		.enable_reg = 0x202c,
3769b518788SAdam Skladowski 		.enable_mask = BIT(0),
3779b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
3789b518788SAdam Skladowski 			.name = "disp_cc_mdss_esc0_clk",
3799b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
3809b518788SAdam Skladowski 				&disp_cc_mdss_esc0_clk_src.clkr.hw,
3819b518788SAdam Skladowski 			},
3829b518788SAdam Skladowski 			.num_parents = 1,
3839b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT,
3849b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
3859b518788SAdam Skladowski 		},
3869b518788SAdam Skladowski 	},
3879b518788SAdam Skladowski };
3889b518788SAdam Skladowski 
3899b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_mdp_clk = {
3909b518788SAdam Skladowski 	.halt_reg = 0x2008,
3919b518788SAdam Skladowski 	.halt_check = BRANCH_HALT,
3929b518788SAdam Skladowski 	.clkr = {
3939b518788SAdam Skladowski 		.enable_reg = 0x2008,
3949b518788SAdam Skladowski 		.enable_mask = BIT(0),
3959b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
3969b518788SAdam Skladowski 			.name = "disp_cc_mdss_mdp_clk",
3979b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
3989b518788SAdam Skladowski 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
3999b518788SAdam Skladowski 			},
4009b518788SAdam Skladowski 			.num_parents = 1,
4019b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT,
4029b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
4039b518788SAdam Skladowski 		},
4049b518788SAdam Skladowski 	},
4059b518788SAdam Skladowski };
4069b518788SAdam Skladowski 
4079b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
4089b518788SAdam Skladowski 	.halt_reg = 0x2018,
4099b518788SAdam Skladowski 	.halt_check = BRANCH_HALT_VOTED,
4109b518788SAdam Skladowski 	.clkr = {
4119b518788SAdam Skladowski 		.enable_reg = 0x2018,
4129b518788SAdam Skladowski 		.enable_mask = BIT(0),
4139b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
4149b518788SAdam Skladowski 			.name = "disp_cc_mdss_mdp_lut_clk",
4159b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
4169b518788SAdam Skladowski 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
4179b518788SAdam Skladowski 			},
4189b518788SAdam Skladowski 			.num_parents = 1,
4199b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT,
4209b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
4219b518788SAdam Skladowski 		},
4229b518788SAdam Skladowski 	},
4239b518788SAdam Skladowski };
4249b518788SAdam Skladowski 
4259b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
4269b518788SAdam Skladowski 	.halt_reg = 0x4004,
4279b518788SAdam Skladowski 	.halt_check = BRANCH_HALT_VOTED,
4289b518788SAdam Skladowski 	.clkr = {
4299b518788SAdam Skladowski 		.enable_reg = 0x4004,
4309b518788SAdam Skladowski 		.enable_mask = BIT(0),
4319b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
4329b518788SAdam Skladowski 			.name = "disp_cc_mdss_non_gdsc_ahb_clk",
4339b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
4349b518788SAdam Skladowski 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
4359b518788SAdam Skladowski 			},
4369b518788SAdam Skladowski 			.num_parents = 1,
4379b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT,
4389b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
4399b518788SAdam Skladowski 		},
4409b518788SAdam Skladowski 	},
4419b518788SAdam Skladowski };
4429b518788SAdam Skladowski 
4439b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_pclk0_clk = {
4449b518788SAdam Skladowski 	.halt_reg = 0x2004,
4459b518788SAdam Skladowski 	.halt_check = BRANCH_HALT,
4469b518788SAdam Skladowski 	.clkr = {
4479b518788SAdam Skladowski 		.enable_reg = 0x2004,
4489b518788SAdam Skladowski 		.enable_mask = BIT(0),
4499b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
4509b518788SAdam Skladowski 			.name = "disp_cc_mdss_pclk0_clk",
4519b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
4529b518788SAdam Skladowski 				&disp_cc_mdss_pclk0_clk_src.clkr.hw,
4539b518788SAdam Skladowski 			},
4549b518788SAdam Skladowski 			.num_parents = 1,
4559b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
4569b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
4579b518788SAdam Skladowski 		},
4589b518788SAdam Skladowski 	},
4599b518788SAdam Skladowski };
4609b518788SAdam Skladowski 
4619b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_rot_clk = {
4629b518788SAdam Skladowski 	.halt_reg = 0x2010,
4639b518788SAdam Skladowski 	.halt_check = BRANCH_HALT,
4649b518788SAdam Skladowski 	.clkr = {
4659b518788SAdam Skladowski 		.enable_reg = 0x2010,
4669b518788SAdam Skladowski 		.enable_mask = BIT(0),
4679b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
4689b518788SAdam Skladowski 			.name = "disp_cc_mdss_rot_clk",
4694c261dfdSDmitry Baryshkov 			.parent_hws = (const struct clk_hw*[]) {
4704c261dfdSDmitry Baryshkov 				&disp_cc_mdss_rot_clk_src.clkr.hw,
4719b518788SAdam Skladowski 			},
4729b518788SAdam Skladowski 			.num_parents = 1,
4739b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT,
4749b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
4759b518788SAdam Skladowski 		},
4769b518788SAdam Skladowski 	},
4779b518788SAdam Skladowski };
4789b518788SAdam Skladowski 
4799b518788SAdam Skladowski static struct clk_branch disp_cc_mdss_vsync_clk = {
4809b518788SAdam Skladowski 	.halt_reg = 0x2020,
4819b518788SAdam Skladowski 	.halt_check = BRANCH_HALT,
4829b518788SAdam Skladowski 	.clkr = {
4839b518788SAdam Skladowski 		.enable_reg = 0x2020,
4849b518788SAdam Skladowski 		.enable_mask = BIT(0),
4859b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
4869b518788SAdam Skladowski 			.name = "disp_cc_mdss_vsync_clk",
4879b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
4889b518788SAdam Skladowski 				&disp_cc_mdss_vsync_clk_src.clkr.hw,
4899b518788SAdam Skladowski 			},
4909b518788SAdam Skladowski 			.num_parents = 1,
4919b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT,
4929b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
4939b518788SAdam Skladowski 		},
4949b518788SAdam Skladowski 	},
4959b518788SAdam Skladowski };
4969b518788SAdam Skladowski 
4979b518788SAdam Skladowski static struct clk_branch disp_cc_sleep_clk = {
4989b518788SAdam Skladowski 	.halt_reg = 0x6068,
4999b518788SAdam Skladowski 	.halt_check = BRANCH_HALT,
5009b518788SAdam Skladowski 	.clkr = {
5019b518788SAdam Skladowski 		.enable_reg = 0x6068,
5029b518788SAdam Skladowski 		.enable_mask = BIT(0),
5039b518788SAdam Skladowski 		.hw.init = &(struct clk_init_data){
5049b518788SAdam Skladowski 			.name = "disp_cc_sleep_clk",
5059b518788SAdam Skladowski 			.parent_hws = (const struct clk_hw*[]){
5069b518788SAdam Skladowski 				&disp_cc_sleep_clk_src.clkr.hw,
5079b518788SAdam Skladowski 			},
5089b518788SAdam Skladowski 			.num_parents = 1,
5099b518788SAdam Skladowski 			.flags = CLK_SET_RATE_PARENT,
5109b518788SAdam Skladowski 			.ops = &clk_branch2_ops,
5119b518788SAdam Skladowski 		},
5129b518788SAdam Skladowski 	},
5139b518788SAdam Skladowski };
5149b518788SAdam Skladowski 
5159b518788SAdam Skladowski static struct gdsc mdss_gdsc = {
5169b518788SAdam Skladowski 	.gdscr = 0x3000,
5179b518788SAdam Skladowski 	.pd = {
5189b518788SAdam Skladowski 		.name = "mdss_gdsc",
5199b518788SAdam Skladowski 	},
5209b518788SAdam Skladowski 	.pwrsts = PWRSTS_OFF_ON,
5219b518788SAdam Skladowski 	.flags = HW_CTRL,
5229b518788SAdam Skladowski };
5239b518788SAdam Skladowski 
5249b518788SAdam Skladowski static struct gdsc *disp_cc_sm6115_gdscs[] = {
5259b518788SAdam Skladowski 	[MDSS_GDSC] = &mdss_gdsc,
5269b518788SAdam Skladowski };
5279b518788SAdam Skladowski 
5289b518788SAdam Skladowski static struct clk_regmap *disp_cc_sm6115_clocks[] = {
5299b518788SAdam Skladowski 	[DISP_CC_PLL0] = &disp_cc_pll0.clkr,
5309b518788SAdam Skladowski 	[DISP_CC_PLL0_OUT_MAIN] = &disp_cc_pll0_out_main.clkr,
5319b518788SAdam Skladowski 	[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
5329b518788SAdam Skladowski 	[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
5339b518788SAdam Skladowski 	[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
5349b518788SAdam Skladowski 	[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
5359b518788SAdam Skladowski 	[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
5369b518788SAdam Skladowski 	[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
5379b518788SAdam Skladowski 	[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
5389b518788SAdam Skladowski 	[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
5399b518788SAdam Skladowski 	[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
5409b518788SAdam Skladowski 	[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
5419b518788SAdam Skladowski 	[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
5429b518788SAdam Skladowski 	[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
5439b518788SAdam Skladowski 	[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
5449b518788SAdam Skladowski 	[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
5459b518788SAdam Skladowski 	[DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
5469b518788SAdam Skladowski 	[DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
5479b518788SAdam Skladowski 	[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
5489b518788SAdam Skladowski 	[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
5499b518788SAdam Skladowski 	[DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
5509b518788SAdam Skladowski 	[DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
5519b518788SAdam Skladowski };
5529b518788SAdam Skladowski 
5539b518788SAdam Skladowski static const struct regmap_config disp_cc_sm6115_regmap_config = {
5549b518788SAdam Skladowski 	.reg_bits = 32,
5559b518788SAdam Skladowski 	.reg_stride = 4,
5569b518788SAdam Skladowski 	.val_bits = 32,
5579b518788SAdam Skladowski 	.max_register = 0x10000,
5589b518788SAdam Skladowski 	.fast_io = true,
5599b518788SAdam Skladowski };
5609b518788SAdam Skladowski 
5619b518788SAdam Skladowski static const struct qcom_cc_desc disp_cc_sm6115_desc = {
5629b518788SAdam Skladowski 	.config = &disp_cc_sm6115_regmap_config,
5639b518788SAdam Skladowski 	.clks = disp_cc_sm6115_clocks,
5649b518788SAdam Skladowski 	.num_clks = ARRAY_SIZE(disp_cc_sm6115_clocks),
5659b518788SAdam Skladowski 	.gdscs = disp_cc_sm6115_gdscs,
5669b518788SAdam Skladowski 	.num_gdscs = ARRAY_SIZE(disp_cc_sm6115_gdscs),
5679b518788SAdam Skladowski };
5689b518788SAdam Skladowski 
5699b518788SAdam Skladowski static const struct of_device_id disp_cc_sm6115_match_table[] = {
5709b518788SAdam Skladowski 	{ .compatible = "qcom,sm6115-dispcc" },
5719b518788SAdam Skladowski 	{ }
5729b518788SAdam Skladowski };
5739b518788SAdam Skladowski MODULE_DEVICE_TABLE(of, disp_cc_sm6115_match_table);
5749b518788SAdam Skladowski 
disp_cc_sm6115_probe(struct platform_device * pdev)5759b518788SAdam Skladowski static int disp_cc_sm6115_probe(struct platform_device *pdev)
5769b518788SAdam Skladowski {
5779b518788SAdam Skladowski 	struct regmap *regmap;
5789b518788SAdam Skladowski 	int ret;
5799b518788SAdam Skladowski 
5809b518788SAdam Skladowski 	regmap = qcom_cc_map(pdev, &disp_cc_sm6115_desc);
5819b518788SAdam Skladowski 	if (IS_ERR(regmap))
5829b518788SAdam Skladowski 		return PTR_ERR(regmap);
5839b518788SAdam Skladowski 
5849b518788SAdam Skladowski 	clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
5859b518788SAdam Skladowski 
5869b518788SAdam Skladowski 	/* Keep DISP_CC_XO_CLK always-ON */
5879b518788SAdam Skladowski 	regmap_update_bits(regmap, 0x604c, BIT(0), BIT(0));
5889b518788SAdam Skladowski 
5899b518788SAdam Skladowski 	ret = qcom_cc_really_probe(pdev, &disp_cc_sm6115_desc, regmap);
5909b518788SAdam Skladowski 	if (ret) {
5919b518788SAdam Skladowski 		dev_err(&pdev->dev, "Failed to register DISP CC clocks\n");
5929b518788SAdam Skladowski 		return ret;
5939b518788SAdam Skladowski 	}
5949b518788SAdam Skladowski 
5959b518788SAdam Skladowski 	return ret;
5969b518788SAdam Skladowski }
5979b518788SAdam Skladowski 
5989b518788SAdam Skladowski static struct platform_driver disp_cc_sm6115_driver = {
5999b518788SAdam Skladowski 	.probe = disp_cc_sm6115_probe,
6009b518788SAdam Skladowski 	.driver = {
6019b518788SAdam Skladowski 		.name = "dispcc-sm6115",
6029b518788SAdam Skladowski 		.of_match_table = disp_cc_sm6115_match_table,
6039b518788SAdam Skladowski 	},
6049b518788SAdam Skladowski };
6059b518788SAdam Skladowski 
6069b518788SAdam Skladowski module_platform_driver(disp_cc_sm6115_driver);
6079b518788SAdam Skladowski MODULE_DESCRIPTION("Qualcomm SM6115 Display Clock controller");
6089b518788SAdam Skladowski MODULE_LICENSE("GPL");
609