xref: /OK3568_Linux_fs/kernel/drivers/clk/qcom/dispcc-sm8250.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <linux/clk-provider.h>
7*4882a593Smuzhiyun #include <linux/module.h>
8*4882a593Smuzhiyun #include <linux/platform_device.h>
9*4882a593Smuzhiyun #include <linux/regmap.h>
10*4882a593Smuzhiyun #include <linux/reset-controller.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <dt-bindings/clock/qcom,dispcc-sm8250.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include "clk-alpha-pll.h"
15*4882a593Smuzhiyun #include "clk-branch.h"
16*4882a593Smuzhiyun #include "clk-rcg.h"
17*4882a593Smuzhiyun #include "clk-regmap-divider.h"
18*4882a593Smuzhiyun #include "common.h"
19*4882a593Smuzhiyun #include "gdsc.h"
20*4882a593Smuzhiyun #include "reset.h"
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun enum {
23*4882a593Smuzhiyun 	P_BI_TCXO,
24*4882a593Smuzhiyun 	P_CHIP_SLEEP_CLK,
25*4882a593Smuzhiyun 	P_CORE_BI_PLL_TEST_SE,
26*4882a593Smuzhiyun 	P_DISP_CC_PLL0_OUT_MAIN,
27*4882a593Smuzhiyun 	P_DISP_CC_PLL1_OUT_EVEN,
28*4882a593Smuzhiyun 	P_DISP_CC_PLL1_OUT_MAIN,
29*4882a593Smuzhiyun 	P_DP_PHY_PLL_LINK_CLK,
30*4882a593Smuzhiyun 	P_DP_PHY_PLL_VCO_DIV_CLK,
31*4882a593Smuzhiyun 	P_DPTX1_PHY_PLL_LINK_CLK,
32*4882a593Smuzhiyun 	P_DPTX1_PHY_PLL_VCO_DIV_CLK,
33*4882a593Smuzhiyun 	P_DPTX2_PHY_PLL_LINK_CLK,
34*4882a593Smuzhiyun 	P_DPTX2_PHY_PLL_VCO_DIV_CLK,
35*4882a593Smuzhiyun 	P_DSI0_PHY_PLL_OUT_BYTECLK,
36*4882a593Smuzhiyun 	P_DSI0_PHY_PLL_OUT_DSICLK,
37*4882a593Smuzhiyun 	P_DSI1_PHY_PLL_OUT_BYTECLK,
38*4882a593Smuzhiyun 	P_DSI1_PHY_PLL_OUT_DSICLK,
39*4882a593Smuzhiyun 	P_EDP_PHY_PLL_LINK_CLK,
40*4882a593Smuzhiyun 	P_EDP_PHY_PLL_VCO_DIV_CLK,
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun static struct pll_vco vco_table[] = {
44*4882a593Smuzhiyun 	{ 249600000, 2000000000, 0 },
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun static struct alpha_pll_config disp_cc_pll0_config = {
48*4882a593Smuzhiyun 	.l = 0x47,
49*4882a593Smuzhiyun 	.alpha = 0xE000,
50*4882a593Smuzhiyun 	.config_ctl_val = 0x20485699,
51*4882a593Smuzhiyun 	.config_ctl_hi_val = 0x00002261,
52*4882a593Smuzhiyun 	.config_ctl_hi1_val = 0x329A699C,
53*4882a593Smuzhiyun 	.user_ctl_val = 0x00000000,
54*4882a593Smuzhiyun 	.user_ctl_hi_val = 0x00000805,
55*4882a593Smuzhiyun 	.user_ctl_hi1_val = 0x00000000,
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun static struct clk_init_data disp_cc_pll0_init = {
59*4882a593Smuzhiyun 	.name = "disp_cc_pll0",
60*4882a593Smuzhiyun 	.parent_data = &(const struct clk_parent_data){
61*4882a593Smuzhiyun 		.fw_name = "bi_tcxo",
62*4882a593Smuzhiyun 	},
63*4882a593Smuzhiyun 	.num_parents = 1,
64*4882a593Smuzhiyun 	.ops = &clk_alpha_pll_lucid_ops,
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun static struct clk_alpha_pll disp_cc_pll0 = {
68*4882a593Smuzhiyun 	.offset = 0x0,
69*4882a593Smuzhiyun 	.vco_table = vco_table,
70*4882a593Smuzhiyun 	.num_vco = ARRAY_SIZE(vco_table),
71*4882a593Smuzhiyun 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
72*4882a593Smuzhiyun 	.clkr.hw.init = &disp_cc_pll0_init
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun static struct alpha_pll_config disp_cc_pll1_config = {
76*4882a593Smuzhiyun 	.l = 0x1F,
77*4882a593Smuzhiyun 	.alpha = 0x4000,
78*4882a593Smuzhiyun 	.config_ctl_val = 0x20485699,
79*4882a593Smuzhiyun 	.config_ctl_hi_val = 0x00002261,
80*4882a593Smuzhiyun 	.config_ctl_hi1_val = 0x329A699C,
81*4882a593Smuzhiyun 	.user_ctl_val = 0x00000000,
82*4882a593Smuzhiyun 	.user_ctl_hi_val = 0x00000805,
83*4882a593Smuzhiyun 	.user_ctl_hi1_val = 0x00000000,
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun static struct clk_init_data disp_cc_pll1_init = {
87*4882a593Smuzhiyun 	.name = "disp_cc_pll1",
88*4882a593Smuzhiyun 	.parent_data = &(const struct clk_parent_data){
89*4882a593Smuzhiyun 		.fw_name = "bi_tcxo",
90*4882a593Smuzhiyun 	},
91*4882a593Smuzhiyun 	.num_parents = 1,
92*4882a593Smuzhiyun 	.ops = &clk_alpha_pll_lucid_ops,
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun static struct clk_alpha_pll disp_cc_pll1 = {
96*4882a593Smuzhiyun 	.offset = 0x1000,
97*4882a593Smuzhiyun 	.vco_table = vco_table,
98*4882a593Smuzhiyun 	.num_vco = ARRAY_SIZE(vco_table),
99*4882a593Smuzhiyun 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
100*4882a593Smuzhiyun 	.clkr.hw.init = &disp_cc_pll1_init
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun static const struct parent_map disp_cc_parent_map_0[] = {
104*4882a593Smuzhiyun 	{ P_BI_TCXO, 0 },
105*4882a593Smuzhiyun 	{ P_DP_PHY_PLL_LINK_CLK, 1 },
106*4882a593Smuzhiyun 	{ P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun static const struct clk_parent_data disp_cc_parent_data_0[] = {
110*4882a593Smuzhiyun 	{ .fw_name = "bi_tcxo" },
111*4882a593Smuzhiyun 	{ .fw_name = "dp_phy_pll_link_clk" },
112*4882a593Smuzhiyun 	{ .fw_name = "dp_phy_pll_vco_div_clk" },
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun static const struct parent_map disp_cc_parent_map_1[] = {
116*4882a593Smuzhiyun 	{ P_BI_TCXO, 0 },
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun static const struct clk_parent_data disp_cc_parent_data_1[] = {
120*4882a593Smuzhiyun 	{ .fw_name = "bi_tcxo" },
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun static const struct parent_map disp_cc_parent_map_2[] = {
124*4882a593Smuzhiyun 	{ P_BI_TCXO, 0 },
125*4882a593Smuzhiyun 	{ P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
126*4882a593Smuzhiyun 	{ P_DSI1_PHY_PLL_OUT_BYTECLK, 2 },
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun static const struct clk_parent_data disp_cc_parent_data_2[] = {
130*4882a593Smuzhiyun 	{ .fw_name = "bi_tcxo" },
131*4882a593Smuzhiyun 	{ .fw_name = "dsi0_phy_pll_out_byteclk" },
132*4882a593Smuzhiyun 	{ .fw_name = "dsi1_phy_pll_out_byteclk" },
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun static const struct parent_map disp_cc_parent_map_3[] = {
136*4882a593Smuzhiyun 	{ P_BI_TCXO, 0 },
137*4882a593Smuzhiyun 	{ P_DISP_CC_PLL1_OUT_MAIN, 4 },
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun static const struct clk_parent_data disp_cc_parent_data_3[] = {
141*4882a593Smuzhiyun 	{ .fw_name = "bi_tcxo" },
142*4882a593Smuzhiyun 	{ .hw = &disp_cc_pll1.clkr.hw },
143*4882a593Smuzhiyun };
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun static const struct parent_map disp_cc_parent_map_5[] = {
146*4882a593Smuzhiyun 	{ P_BI_TCXO, 0 },
147*4882a593Smuzhiyun 	{ P_DISP_CC_PLL0_OUT_MAIN, 1 },
148*4882a593Smuzhiyun 	{ P_DISP_CC_PLL1_OUT_MAIN, 4 },
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun static const struct clk_parent_data disp_cc_parent_data_5[] = {
152*4882a593Smuzhiyun 	{ .fw_name = "bi_tcxo" },
153*4882a593Smuzhiyun 	{ .hw = &disp_cc_pll0.clkr.hw },
154*4882a593Smuzhiyun 	{ .hw = &disp_cc_pll1.clkr.hw },
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun static const struct parent_map disp_cc_parent_map_6[] = {
158*4882a593Smuzhiyun 	{ P_BI_TCXO, 0 },
159*4882a593Smuzhiyun 	{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
160*4882a593Smuzhiyun 	{ P_DSI1_PHY_PLL_OUT_DSICLK, 2 },
161*4882a593Smuzhiyun };
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun static const struct clk_parent_data disp_cc_parent_data_6[] = {
164*4882a593Smuzhiyun 	{ .fw_name = "bi_tcxo" },
165*4882a593Smuzhiyun 	{ .fw_name = "dsi0_phy_pll_out_dsiclk" },
166*4882a593Smuzhiyun 	{ .fw_name = "dsi1_phy_pll_out_dsiclk" },
167*4882a593Smuzhiyun };
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
170*4882a593Smuzhiyun 	F(19200000, P_BI_TCXO, 1, 0, 0),
171*4882a593Smuzhiyun 	F(37500000, P_DISP_CC_PLL1_OUT_MAIN, 16, 0, 0),
172*4882a593Smuzhiyun 	F(75000000, P_DISP_CC_PLL1_OUT_MAIN, 8, 0, 0),
173*4882a593Smuzhiyun 	{ }
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
177*4882a593Smuzhiyun 	.cmd_rcgr = 0x22bc,
178*4882a593Smuzhiyun 	.mnd_width = 0,
179*4882a593Smuzhiyun 	.hid_width = 5,
180*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_3,
181*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
182*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
183*4882a593Smuzhiyun 		.name = "disp_cc_mdss_ahb_clk_src",
184*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_3,
185*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
186*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
187*4882a593Smuzhiyun 		.ops = &clk_rcg2_shared_ops,
188*4882a593Smuzhiyun 	},
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun static const struct freq_tbl ftbl_disp_cc_mdss_byte0_clk_src[] = {
192*4882a593Smuzhiyun 	F(19200000, P_BI_TCXO, 1, 0, 0),
193*4882a593Smuzhiyun 	{ }
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
197*4882a593Smuzhiyun 	.cmd_rcgr = 0x2110,
198*4882a593Smuzhiyun 	.mnd_width = 0,
199*4882a593Smuzhiyun 	.hid_width = 5,
200*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_2,
201*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
202*4882a593Smuzhiyun 		.name = "disp_cc_mdss_byte0_clk_src",
203*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_2,
204*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
205*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
206*4882a593Smuzhiyun 		.ops = &clk_byte2_ops,
207*4882a593Smuzhiyun 	},
208*4882a593Smuzhiyun };
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = {
211*4882a593Smuzhiyun 	.cmd_rcgr = 0x212c,
212*4882a593Smuzhiyun 	.mnd_width = 0,
213*4882a593Smuzhiyun 	.hid_width = 5,
214*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_2,
215*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
216*4882a593Smuzhiyun 		.name = "disp_cc_mdss_byte1_clk_src",
217*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_2,
218*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
219*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
220*4882a593Smuzhiyun 		.ops = &clk_byte2_ops,
221*4882a593Smuzhiyun 	},
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_dp_aux1_clk_src = {
225*4882a593Smuzhiyun 	.cmd_rcgr = 0x2240,
226*4882a593Smuzhiyun 	.mnd_width = 0,
227*4882a593Smuzhiyun 	.hid_width = 5,
228*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_1,
229*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
230*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
231*4882a593Smuzhiyun 		.name = "disp_cc_mdss_dp_aux1_clk_src",
232*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_1,
233*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
234*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
235*4882a593Smuzhiyun 		.ops = &clk_rcg2_ops,
236*4882a593Smuzhiyun 	},
237*4882a593Smuzhiyun };
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
240*4882a593Smuzhiyun 	.cmd_rcgr = 0x21dc,
241*4882a593Smuzhiyun 	.mnd_width = 0,
242*4882a593Smuzhiyun 	.hid_width = 5,
243*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_1,
244*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
245*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
246*4882a593Smuzhiyun 		.name = "disp_cc_mdss_dp_aux_clk_src",
247*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_1,
248*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
249*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
250*4882a593Smuzhiyun 		.ops = &clk_rcg2_ops,
251*4882a593Smuzhiyun 	},
252*4882a593Smuzhiyun };
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun static const struct freq_tbl ftbl_disp_cc_mdss_dp_link1_clk_src[] = {
255*4882a593Smuzhiyun 	F(162000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
256*4882a593Smuzhiyun 	F(270000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
257*4882a593Smuzhiyun 	F(540000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
258*4882a593Smuzhiyun 	F(810000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
259*4882a593Smuzhiyun 	{ }
260*4882a593Smuzhiyun };
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_dp_link1_clk_src = {
263*4882a593Smuzhiyun 	.cmd_rcgr = 0x220c,
264*4882a593Smuzhiyun 	.mnd_width = 0,
265*4882a593Smuzhiyun 	.hid_width = 5,
266*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_0,
267*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_dp_link1_clk_src,
268*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
269*4882a593Smuzhiyun 		.name = "disp_cc_mdss_dp_link1_clk_src",
270*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_0,
271*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
272*4882a593Smuzhiyun 		.ops = &clk_rcg2_ops,
273*4882a593Smuzhiyun 	},
274*4882a593Smuzhiyun };
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
277*4882a593Smuzhiyun 	.cmd_rcgr = 0x2178,
278*4882a593Smuzhiyun 	.mnd_width = 0,
279*4882a593Smuzhiyun 	.hid_width = 5,
280*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_0,
281*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_dp_link1_clk_src,
282*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
283*4882a593Smuzhiyun 		.name = "disp_cc_mdss_dp_link_clk_src",
284*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_0,
285*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
286*4882a593Smuzhiyun 		.ops = &clk_rcg2_ops,
287*4882a593Smuzhiyun 	},
288*4882a593Smuzhiyun };
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_dp_pixel1_clk_src = {
291*4882a593Smuzhiyun 	.cmd_rcgr = 0x21c4,
292*4882a593Smuzhiyun 	.mnd_width = 16,
293*4882a593Smuzhiyun 	.hid_width = 5,
294*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_0,
295*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
296*4882a593Smuzhiyun 		.name = "disp_cc_mdss_dp_pixel1_clk_src",
297*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_0,
298*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
299*4882a593Smuzhiyun 		.ops = &clk_dp_ops,
300*4882a593Smuzhiyun 	},
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_dp_pixel2_clk_src = {
304*4882a593Smuzhiyun 	.cmd_rcgr = 0x21f4,
305*4882a593Smuzhiyun 	.mnd_width = 16,
306*4882a593Smuzhiyun 	.hid_width = 5,
307*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_0,
308*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
309*4882a593Smuzhiyun 		.name = "disp_cc_mdss_dp_pixel2_clk_src",
310*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_0,
311*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
312*4882a593Smuzhiyun 		.ops = &clk_dp_ops,
313*4882a593Smuzhiyun 	},
314*4882a593Smuzhiyun };
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
317*4882a593Smuzhiyun 	.cmd_rcgr = 0x21ac,
318*4882a593Smuzhiyun 	.mnd_width = 16,
319*4882a593Smuzhiyun 	.hid_width = 5,
320*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_0,
321*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
322*4882a593Smuzhiyun 		.name = "disp_cc_mdss_dp_pixel_clk_src",
323*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_0,
324*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
325*4882a593Smuzhiyun 		.ops = &clk_dp_ops,
326*4882a593Smuzhiyun 	},
327*4882a593Smuzhiyun };
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
330*4882a593Smuzhiyun 	.cmd_rcgr = 0x2148,
331*4882a593Smuzhiyun 	.mnd_width = 0,
332*4882a593Smuzhiyun 	.hid_width = 5,
333*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_2,
334*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
335*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
336*4882a593Smuzhiyun 		.name = "disp_cc_mdss_esc0_clk_src",
337*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_2,
338*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
339*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
340*4882a593Smuzhiyun 		.ops = &clk_rcg2_ops,
341*4882a593Smuzhiyun 	},
342*4882a593Smuzhiyun };
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = {
345*4882a593Smuzhiyun 	.cmd_rcgr = 0x2160,
346*4882a593Smuzhiyun 	.mnd_width = 0,
347*4882a593Smuzhiyun 	.hid_width = 5,
348*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_2,
349*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
350*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
351*4882a593Smuzhiyun 		.name = "disp_cc_mdss_esc1_clk_src",
352*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_2,
353*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
354*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
355*4882a593Smuzhiyun 		.ops = &clk_rcg2_ops,
356*4882a593Smuzhiyun 	},
357*4882a593Smuzhiyun };
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
360*4882a593Smuzhiyun 	F(19200000, P_BI_TCXO, 1, 0, 0),
361*4882a593Smuzhiyun 	F(85714286, P_DISP_CC_PLL1_OUT_MAIN, 7, 0, 0),
362*4882a593Smuzhiyun 	F(100000000, P_DISP_CC_PLL1_OUT_MAIN, 6, 0, 0),
363*4882a593Smuzhiyun 	F(150000000, P_DISP_CC_PLL1_OUT_MAIN, 4, 0, 0),
364*4882a593Smuzhiyun 	F(200000000, P_DISP_CC_PLL1_OUT_MAIN, 3, 0, 0),
365*4882a593Smuzhiyun 	F(300000000, P_DISP_CC_PLL1_OUT_MAIN, 2, 0, 0),
366*4882a593Smuzhiyun 	F(345000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
367*4882a593Smuzhiyun 	F(460000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
368*4882a593Smuzhiyun 	{ }
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
372*4882a593Smuzhiyun 	.cmd_rcgr = 0x20c8,
373*4882a593Smuzhiyun 	.mnd_width = 0,
374*4882a593Smuzhiyun 	.hid_width = 5,
375*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_5,
376*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
377*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
378*4882a593Smuzhiyun 		.name = "disp_cc_mdss_mdp_clk_src",
379*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_5,
380*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
381*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
382*4882a593Smuzhiyun 		.ops = &clk_rcg2_shared_ops,
383*4882a593Smuzhiyun 	},
384*4882a593Smuzhiyun };
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
387*4882a593Smuzhiyun 	.cmd_rcgr = 0x2098,
388*4882a593Smuzhiyun 	.mnd_width = 8,
389*4882a593Smuzhiyun 	.hid_width = 5,
390*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_6,
391*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
392*4882a593Smuzhiyun 		.name = "disp_cc_mdss_pclk0_clk_src",
393*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_6,
394*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
395*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
396*4882a593Smuzhiyun 		.ops = &clk_pixel_ops,
397*4882a593Smuzhiyun 	},
398*4882a593Smuzhiyun };
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = {
401*4882a593Smuzhiyun 	.cmd_rcgr = 0x20b0,
402*4882a593Smuzhiyun 	.mnd_width = 8,
403*4882a593Smuzhiyun 	.hid_width = 5,
404*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_6,
405*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
406*4882a593Smuzhiyun 		.name = "disp_cc_mdss_pclk1_clk_src",
407*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_6,
408*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
409*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
410*4882a593Smuzhiyun 		.ops = &clk_pixel_ops,
411*4882a593Smuzhiyun 	},
412*4882a593Smuzhiyun };
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
415*4882a593Smuzhiyun 	F(19200000, P_BI_TCXO, 1, 0, 0),
416*4882a593Smuzhiyun 	F(200000000, P_DISP_CC_PLL1_OUT_MAIN, 3, 0, 0),
417*4882a593Smuzhiyun 	F(300000000, P_DISP_CC_PLL1_OUT_MAIN, 2, 0, 0),
418*4882a593Smuzhiyun 	F(345000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
419*4882a593Smuzhiyun 	F(460000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
420*4882a593Smuzhiyun 	{ }
421*4882a593Smuzhiyun };
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
424*4882a593Smuzhiyun 	.cmd_rcgr = 0x20e0,
425*4882a593Smuzhiyun 	.mnd_width = 0,
426*4882a593Smuzhiyun 	.hid_width = 5,
427*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_5,
428*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
429*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
430*4882a593Smuzhiyun 		.name = "disp_cc_mdss_rot_clk_src",
431*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_5,
432*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
433*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
434*4882a593Smuzhiyun 		.ops = &clk_rcg2_shared_ops,
435*4882a593Smuzhiyun 	},
436*4882a593Smuzhiyun };
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
439*4882a593Smuzhiyun 	.cmd_rcgr = 0x20f8,
440*4882a593Smuzhiyun 	.mnd_width = 0,
441*4882a593Smuzhiyun 	.hid_width = 5,
442*4882a593Smuzhiyun 	.parent_map = disp_cc_parent_map_1,
443*4882a593Smuzhiyun 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
444*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data){
445*4882a593Smuzhiyun 		.name = "disp_cc_mdss_vsync_clk_src",
446*4882a593Smuzhiyun 		.parent_data = disp_cc_parent_data_1,
447*4882a593Smuzhiyun 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
448*4882a593Smuzhiyun 		.flags = CLK_SET_RATE_PARENT,
449*4882a593Smuzhiyun 		.ops = &clk_rcg2_ops,
450*4882a593Smuzhiyun 	},
451*4882a593Smuzhiyun };
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
454*4882a593Smuzhiyun 	.reg = 0x2128,
455*4882a593Smuzhiyun 	.shift = 0,
456*4882a593Smuzhiyun 	.width = 2,
457*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data) {
458*4882a593Smuzhiyun 		.name = "disp_cc_mdss_byte0_div_clk_src",
459*4882a593Smuzhiyun 		.parent_data = &(const struct clk_parent_data){
460*4882a593Smuzhiyun 			.hw = &disp_cc_mdss_byte0_clk_src.clkr.hw,
461*4882a593Smuzhiyun 		},
462*4882a593Smuzhiyun 		.num_parents = 1,
463*4882a593Smuzhiyun 		.ops = &clk_regmap_div_ops,
464*4882a593Smuzhiyun 	},
465*4882a593Smuzhiyun };
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = {
469*4882a593Smuzhiyun 	.reg = 0x2144,
470*4882a593Smuzhiyun 	.shift = 0,
471*4882a593Smuzhiyun 	.width = 2,
472*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data) {
473*4882a593Smuzhiyun 		.name = "disp_cc_mdss_byte1_div_clk_src",
474*4882a593Smuzhiyun 		.parent_data = &(const struct clk_parent_data){
475*4882a593Smuzhiyun 			.hw = &disp_cc_mdss_byte1_clk_src.clkr.hw,
476*4882a593Smuzhiyun 		},
477*4882a593Smuzhiyun 		.num_parents = 1,
478*4882a593Smuzhiyun 		.ops = &clk_regmap_div_ops,
479*4882a593Smuzhiyun 	},
480*4882a593Smuzhiyun };
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun static struct clk_regmap_div disp_cc_mdss_dp_link1_div_clk_src = {
484*4882a593Smuzhiyun 	.reg = 0x2224,
485*4882a593Smuzhiyun 	.shift = 0,
486*4882a593Smuzhiyun 	.width = 2,
487*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data) {
488*4882a593Smuzhiyun 		.name = "disp_cc_mdss_dp_link1_div_clk_src",
489*4882a593Smuzhiyun 		.parent_data = &(const struct clk_parent_data){
490*4882a593Smuzhiyun 			.hw = &disp_cc_mdss_dp_link1_clk_src.clkr.hw,
491*4882a593Smuzhiyun 		},
492*4882a593Smuzhiyun 		.num_parents = 1,
493*4882a593Smuzhiyun 		.ops = &clk_regmap_div_ro_ops,
494*4882a593Smuzhiyun 	},
495*4882a593Smuzhiyun };
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
499*4882a593Smuzhiyun 	.reg = 0x2190,
500*4882a593Smuzhiyun 	.shift = 0,
501*4882a593Smuzhiyun 	.width = 2,
502*4882a593Smuzhiyun 	.clkr.hw.init = &(struct clk_init_data) {
503*4882a593Smuzhiyun 		.name = "disp_cc_mdss_dp_link_div_clk_src",
504*4882a593Smuzhiyun 		.parent_data = &(const struct clk_parent_data){
505*4882a593Smuzhiyun 			.hw = &disp_cc_mdss_dp_link_clk_src.clkr.hw,
506*4882a593Smuzhiyun 		},
507*4882a593Smuzhiyun 		.num_parents = 1,
508*4882a593Smuzhiyun 		.ops = &clk_regmap_div_ro_ops,
509*4882a593Smuzhiyun 	},
510*4882a593Smuzhiyun };
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_ahb_clk = {
513*4882a593Smuzhiyun 	.halt_reg = 0x2080,
514*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
515*4882a593Smuzhiyun 	.clkr = {
516*4882a593Smuzhiyun 		.enable_reg = 0x2080,
517*4882a593Smuzhiyun 		.enable_mask = BIT(0),
518*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
519*4882a593Smuzhiyun 			.name = "disp_cc_mdss_ahb_clk",
520*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
521*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_ahb_clk_src.clkr.hw,
522*4882a593Smuzhiyun 			},
523*4882a593Smuzhiyun 			.num_parents = 1,
524*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
525*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
526*4882a593Smuzhiyun 		},
527*4882a593Smuzhiyun 	},
528*4882a593Smuzhiyun };
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_byte0_clk = {
531*4882a593Smuzhiyun 	.halt_reg = 0x2028,
532*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
533*4882a593Smuzhiyun 	.clkr = {
534*4882a593Smuzhiyun 		.enable_reg = 0x2028,
535*4882a593Smuzhiyun 		.enable_mask = BIT(0),
536*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
537*4882a593Smuzhiyun 			.name = "disp_cc_mdss_byte0_clk",
538*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
539*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_byte0_clk_src.clkr.hw,
540*4882a593Smuzhiyun 			},
541*4882a593Smuzhiyun 			.num_parents = 1,
542*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
543*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
544*4882a593Smuzhiyun 		},
545*4882a593Smuzhiyun 	},
546*4882a593Smuzhiyun };
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
549*4882a593Smuzhiyun 	.halt_reg = 0x202c,
550*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
551*4882a593Smuzhiyun 	.clkr = {
552*4882a593Smuzhiyun 		.enable_reg = 0x202c,
553*4882a593Smuzhiyun 		.enable_mask = BIT(0),
554*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
555*4882a593Smuzhiyun 			.name = "disp_cc_mdss_byte0_intf_clk",
556*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
557*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
558*4882a593Smuzhiyun 			},
559*4882a593Smuzhiyun 			.num_parents = 1,
560*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
561*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
562*4882a593Smuzhiyun 		},
563*4882a593Smuzhiyun 	},
564*4882a593Smuzhiyun };
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_byte1_clk = {
567*4882a593Smuzhiyun 	.halt_reg = 0x2030,
568*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
569*4882a593Smuzhiyun 	.clkr = {
570*4882a593Smuzhiyun 		.enable_reg = 0x2030,
571*4882a593Smuzhiyun 		.enable_mask = BIT(0),
572*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
573*4882a593Smuzhiyun 			.name = "disp_cc_mdss_byte1_clk",
574*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
575*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_byte1_clk_src.clkr.hw,
576*4882a593Smuzhiyun 			},
577*4882a593Smuzhiyun 			.num_parents = 1,
578*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
579*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
580*4882a593Smuzhiyun 		},
581*4882a593Smuzhiyun 	},
582*4882a593Smuzhiyun };
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_byte1_intf_clk = {
585*4882a593Smuzhiyun 	.halt_reg = 0x2034,
586*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
587*4882a593Smuzhiyun 	.clkr = {
588*4882a593Smuzhiyun 		.enable_reg = 0x2034,
589*4882a593Smuzhiyun 		.enable_mask = BIT(0),
590*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
591*4882a593Smuzhiyun 			.name = "disp_cc_mdss_byte1_intf_clk",
592*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
593*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_byte1_div_clk_src.clkr.hw,
594*4882a593Smuzhiyun 			},
595*4882a593Smuzhiyun 			.num_parents = 1,
596*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
597*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
598*4882a593Smuzhiyun 		},
599*4882a593Smuzhiyun 	},
600*4882a593Smuzhiyun };
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_dp_aux1_clk = {
603*4882a593Smuzhiyun 	.halt_reg = 0x2068,
604*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
605*4882a593Smuzhiyun 	.clkr = {
606*4882a593Smuzhiyun 		.enable_reg = 0x2068,
607*4882a593Smuzhiyun 		.enable_mask = BIT(0),
608*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
609*4882a593Smuzhiyun 			.name = "disp_cc_mdss_dp_aux1_clk",
610*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
611*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_dp_aux1_clk_src.clkr.hw,
612*4882a593Smuzhiyun 			},
613*4882a593Smuzhiyun 			.num_parents = 1,
614*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
615*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
616*4882a593Smuzhiyun 		},
617*4882a593Smuzhiyun 	},
618*4882a593Smuzhiyun };
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_dp_aux_clk = {
621*4882a593Smuzhiyun 	.halt_reg = 0x2054,
622*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
623*4882a593Smuzhiyun 	.clkr = {
624*4882a593Smuzhiyun 		.enable_reg = 0x2054,
625*4882a593Smuzhiyun 		.enable_mask = BIT(0),
626*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
627*4882a593Smuzhiyun 			.name = "disp_cc_mdss_dp_aux_clk",
628*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
629*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_dp_aux_clk_src.clkr.hw,
630*4882a593Smuzhiyun 			},
631*4882a593Smuzhiyun 			.num_parents = 1,
632*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
633*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
634*4882a593Smuzhiyun 		},
635*4882a593Smuzhiyun 	},
636*4882a593Smuzhiyun };
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_dp_link1_clk = {
639*4882a593Smuzhiyun 	.halt_reg = 0x205c,
640*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
641*4882a593Smuzhiyun 	.clkr = {
642*4882a593Smuzhiyun 		.enable_reg = 0x205c,
643*4882a593Smuzhiyun 		.enable_mask = BIT(0),
644*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
645*4882a593Smuzhiyun 			.name = "disp_cc_mdss_dp_link1_clk",
646*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
647*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_dp_link1_clk_src.clkr.hw,
648*4882a593Smuzhiyun 			},
649*4882a593Smuzhiyun 			.num_parents = 1,
650*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
651*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
652*4882a593Smuzhiyun 		},
653*4882a593Smuzhiyun 	},
654*4882a593Smuzhiyun };
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_dp_link1_intf_clk = {
657*4882a593Smuzhiyun 	.halt_reg = 0x2060,
658*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
659*4882a593Smuzhiyun 	.clkr = {
660*4882a593Smuzhiyun 		.enable_reg = 0x2060,
661*4882a593Smuzhiyun 		.enable_mask = BIT(0),
662*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
663*4882a593Smuzhiyun 			.name = "disp_cc_mdss_dp_link1_intf_clk",
664*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
665*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_dp_link1_div_clk_src.clkr.hw,
666*4882a593Smuzhiyun 			},
667*4882a593Smuzhiyun 			.num_parents = 1,
668*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
669*4882a593Smuzhiyun 		},
670*4882a593Smuzhiyun 	},
671*4882a593Smuzhiyun };
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_dp_link_clk = {
674*4882a593Smuzhiyun 	.halt_reg = 0x2040,
675*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
676*4882a593Smuzhiyun 	.clkr = {
677*4882a593Smuzhiyun 		.enable_reg = 0x2040,
678*4882a593Smuzhiyun 		.enable_mask = BIT(0),
679*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
680*4882a593Smuzhiyun 			.name = "disp_cc_mdss_dp_link_clk",
681*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
682*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_dp_link_clk_src.clkr.hw,
683*4882a593Smuzhiyun 			},
684*4882a593Smuzhiyun 			.num_parents = 1,
685*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
686*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
687*4882a593Smuzhiyun 		},
688*4882a593Smuzhiyun 	},
689*4882a593Smuzhiyun };
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
692*4882a593Smuzhiyun 	.halt_reg = 0x2044,
693*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
694*4882a593Smuzhiyun 	.clkr = {
695*4882a593Smuzhiyun 		.enable_reg = 0x2044,
696*4882a593Smuzhiyun 		.enable_mask = BIT(0),
697*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
698*4882a593Smuzhiyun 			.name = "disp_cc_mdss_dp_link_intf_clk",
699*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
700*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_dp_link_div_clk_src.clkr.hw,
701*4882a593Smuzhiyun 			},
702*4882a593Smuzhiyun 			.num_parents = 1,
703*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
704*4882a593Smuzhiyun 		},
705*4882a593Smuzhiyun 	},
706*4882a593Smuzhiyun };
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_dp_pixel1_clk = {
709*4882a593Smuzhiyun 	.halt_reg = 0x2050,
710*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
711*4882a593Smuzhiyun 	.clkr = {
712*4882a593Smuzhiyun 		.enable_reg = 0x2050,
713*4882a593Smuzhiyun 		.enable_mask = BIT(0),
714*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
715*4882a593Smuzhiyun 			.name = "disp_cc_mdss_dp_pixel1_clk",
716*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
717*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_dp_pixel1_clk_src.clkr.hw,
718*4882a593Smuzhiyun 			},
719*4882a593Smuzhiyun 			.num_parents = 1,
720*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
721*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
722*4882a593Smuzhiyun 		},
723*4882a593Smuzhiyun 	},
724*4882a593Smuzhiyun };
725*4882a593Smuzhiyun 
726*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_dp_pixel2_clk = {
727*4882a593Smuzhiyun 	.halt_reg = 0x2058,
728*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
729*4882a593Smuzhiyun 	.clkr = {
730*4882a593Smuzhiyun 		.enable_reg = 0x2058,
731*4882a593Smuzhiyun 		.enable_mask = BIT(0),
732*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
733*4882a593Smuzhiyun 			.name = "disp_cc_mdss_dp_pixel2_clk",
734*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
735*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_dp_pixel2_clk_src.clkr.hw,
736*4882a593Smuzhiyun 			},
737*4882a593Smuzhiyun 			.num_parents = 1,
738*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
739*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
740*4882a593Smuzhiyun 		},
741*4882a593Smuzhiyun 	},
742*4882a593Smuzhiyun };
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
745*4882a593Smuzhiyun 	.halt_reg = 0x204c,
746*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
747*4882a593Smuzhiyun 	.clkr = {
748*4882a593Smuzhiyun 		.enable_reg = 0x204c,
749*4882a593Smuzhiyun 		.enable_mask = BIT(0),
750*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
751*4882a593Smuzhiyun 			.name = "disp_cc_mdss_dp_pixel_clk",
752*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
753*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
754*4882a593Smuzhiyun 			},
755*4882a593Smuzhiyun 			.num_parents = 1,
756*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
757*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
758*4882a593Smuzhiyun 		},
759*4882a593Smuzhiyun 	},
760*4882a593Smuzhiyun };
761*4882a593Smuzhiyun 
762*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_esc0_clk = {
763*4882a593Smuzhiyun 	.halt_reg = 0x2038,
764*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
765*4882a593Smuzhiyun 	.clkr = {
766*4882a593Smuzhiyun 		.enable_reg = 0x2038,
767*4882a593Smuzhiyun 		.enable_mask = BIT(0),
768*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
769*4882a593Smuzhiyun 			.name = "disp_cc_mdss_esc0_clk",
770*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
771*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_esc0_clk_src.clkr.hw,
772*4882a593Smuzhiyun 			},
773*4882a593Smuzhiyun 			.num_parents = 1,
774*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
775*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
776*4882a593Smuzhiyun 		},
777*4882a593Smuzhiyun 	},
778*4882a593Smuzhiyun };
779*4882a593Smuzhiyun 
780*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_esc1_clk = {
781*4882a593Smuzhiyun 	.halt_reg = 0x203c,
782*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
783*4882a593Smuzhiyun 	.clkr = {
784*4882a593Smuzhiyun 		.enable_reg = 0x203c,
785*4882a593Smuzhiyun 		.enable_mask = BIT(0),
786*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
787*4882a593Smuzhiyun 			.name = "disp_cc_mdss_esc1_clk",
788*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
789*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_esc1_clk_src.clkr.hw,
790*4882a593Smuzhiyun 			},
791*4882a593Smuzhiyun 			.num_parents = 1,
792*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
793*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
794*4882a593Smuzhiyun 		},
795*4882a593Smuzhiyun 	},
796*4882a593Smuzhiyun };
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_mdp_clk = {
799*4882a593Smuzhiyun 	.halt_reg = 0x200c,
800*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
801*4882a593Smuzhiyun 	.clkr = {
802*4882a593Smuzhiyun 		.enable_reg = 0x200c,
803*4882a593Smuzhiyun 		.enable_mask = BIT(0),
804*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
805*4882a593Smuzhiyun 			.name = "disp_cc_mdss_mdp_clk",
806*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
807*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_mdp_clk_src.clkr.hw,
808*4882a593Smuzhiyun 			},
809*4882a593Smuzhiyun 			.num_parents = 1,
810*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
811*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
812*4882a593Smuzhiyun 		},
813*4882a593Smuzhiyun 	},
814*4882a593Smuzhiyun };
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
817*4882a593Smuzhiyun 	.halt_reg = 0x201c,
818*4882a593Smuzhiyun 	.halt_check = BRANCH_VOTED,
819*4882a593Smuzhiyun 	.clkr = {
820*4882a593Smuzhiyun 		.enable_reg = 0x201c,
821*4882a593Smuzhiyun 		.enable_mask = BIT(0),
822*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
823*4882a593Smuzhiyun 			.name = "disp_cc_mdss_mdp_lut_clk",
824*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
825*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_mdp_clk_src.clkr.hw,
826*4882a593Smuzhiyun 			},
827*4882a593Smuzhiyun 			.num_parents = 1,
828*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
829*4882a593Smuzhiyun 		},
830*4882a593Smuzhiyun 	},
831*4882a593Smuzhiyun };
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
834*4882a593Smuzhiyun 	.halt_reg = 0x4004,
835*4882a593Smuzhiyun 	.halt_check = BRANCH_VOTED,
836*4882a593Smuzhiyun 	.clkr = {
837*4882a593Smuzhiyun 		.enable_reg = 0x4004,
838*4882a593Smuzhiyun 		.enable_mask = BIT(0),
839*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
840*4882a593Smuzhiyun 			.name = "disp_cc_mdss_non_gdsc_ahb_clk",
841*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
842*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_ahb_clk_src.clkr.hw,
843*4882a593Smuzhiyun 			},
844*4882a593Smuzhiyun 			.num_parents = 1,
845*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
846*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
847*4882a593Smuzhiyun 		},
848*4882a593Smuzhiyun 	},
849*4882a593Smuzhiyun };
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_pclk0_clk = {
852*4882a593Smuzhiyun 	.halt_reg = 0x2004,
853*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
854*4882a593Smuzhiyun 	.clkr = {
855*4882a593Smuzhiyun 		.enable_reg = 0x2004,
856*4882a593Smuzhiyun 		.enable_mask = BIT(0),
857*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
858*4882a593Smuzhiyun 			.name = "disp_cc_mdss_pclk0_clk",
859*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
860*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_pclk0_clk_src.clkr.hw,
861*4882a593Smuzhiyun 			},
862*4882a593Smuzhiyun 			.num_parents = 1,
863*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
864*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
865*4882a593Smuzhiyun 		},
866*4882a593Smuzhiyun 	},
867*4882a593Smuzhiyun };
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_pclk1_clk = {
870*4882a593Smuzhiyun 	.halt_reg = 0x2008,
871*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
872*4882a593Smuzhiyun 	.clkr = {
873*4882a593Smuzhiyun 		.enable_reg = 0x2008,
874*4882a593Smuzhiyun 		.enable_mask = BIT(0),
875*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
876*4882a593Smuzhiyun 			.name = "disp_cc_mdss_pclk1_clk",
877*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
878*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_pclk1_clk_src.clkr.hw,
879*4882a593Smuzhiyun 			},
880*4882a593Smuzhiyun 			.num_parents = 1,
881*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
882*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
883*4882a593Smuzhiyun 		},
884*4882a593Smuzhiyun 	},
885*4882a593Smuzhiyun };
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_rot_clk = {
888*4882a593Smuzhiyun 	.halt_reg = 0x2014,
889*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
890*4882a593Smuzhiyun 	.clkr = {
891*4882a593Smuzhiyun 		.enable_reg = 0x2014,
892*4882a593Smuzhiyun 		.enable_mask = BIT(0),
893*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
894*4882a593Smuzhiyun 			.name = "disp_cc_mdss_rot_clk",
895*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
896*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_rot_clk_src.clkr.hw,
897*4882a593Smuzhiyun 			},
898*4882a593Smuzhiyun 			.num_parents = 1,
899*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
900*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
901*4882a593Smuzhiyun 		},
902*4882a593Smuzhiyun 	},
903*4882a593Smuzhiyun };
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
906*4882a593Smuzhiyun 	.halt_reg = 0x400c,
907*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
908*4882a593Smuzhiyun 	.clkr = {
909*4882a593Smuzhiyun 		.enable_reg = 0x400c,
910*4882a593Smuzhiyun 		.enable_mask = BIT(0),
911*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
912*4882a593Smuzhiyun 			.name = "disp_cc_mdss_rscc_ahb_clk",
913*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
914*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_ahb_clk_src.clkr.hw,
915*4882a593Smuzhiyun 			},
916*4882a593Smuzhiyun 			.num_parents = 1,
917*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
918*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
919*4882a593Smuzhiyun 		},
920*4882a593Smuzhiyun 	},
921*4882a593Smuzhiyun };
922*4882a593Smuzhiyun 
923*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
924*4882a593Smuzhiyun 	.halt_reg = 0x4008,
925*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
926*4882a593Smuzhiyun 	.clkr = {
927*4882a593Smuzhiyun 		.enable_reg = 0x4008,
928*4882a593Smuzhiyun 		.enable_mask = BIT(0),
929*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
930*4882a593Smuzhiyun 			.name = "disp_cc_mdss_rscc_vsync_clk",
931*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
932*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_vsync_clk_src.clkr.hw,
933*4882a593Smuzhiyun 			},
934*4882a593Smuzhiyun 			.num_parents = 1,
935*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
936*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
937*4882a593Smuzhiyun 		},
938*4882a593Smuzhiyun 	},
939*4882a593Smuzhiyun };
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun static struct clk_branch disp_cc_mdss_vsync_clk = {
942*4882a593Smuzhiyun 	.halt_reg = 0x2024,
943*4882a593Smuzhiyun 	.halt_check = BRANCH_HALT,
944*4882a593Smuzhiyun 	.clkr = {
945*4882a593Smuzhiyun 		.enable_reg = 0x2024,
946*4882a593Smuzhiyun 		.enable_mask = BIT(0),
947*4882a593Smuzhiyun 		.hw.init = &(struct clk_init_data){
948*4882a593Smuzhiyun 			.name = "disp_cc_mdss_vsync_clk",
949*4882a593Smuzhiyun 			.parent_data = &(const struct clk_parent_data){
950*4882a593Smuzhiyun 				.hw = &disp_cc_mdss_vsync_clk_src.clkr.hw,
951*4882a593Smuzhiyun 			},
952*4882a593Smuzhiyun 			.num_parents = 1,
953*4882a593Smuzhiyun 			.flags = CLK_SET_RATE_PARENT,
954*4882a593Smuzhiyun 			.ops = &clk_branch2_ops,
955*4882a593Smuzhiyun 		},
956*4882a593Smuzhiyun 	},
957*4882a593Smuzhiyun };
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun static struct gdsc mdss_gdsc = {
960*4882a593Smuzhiyun 	.gdscr = 0x3000,
961*4882a593Smuzhiyun 	.pd = {
962*4882a593Smuzhiyun 		.name = "mdss_gdsc",
963*4882a593Smuzhiyun 	},
964*4882a593Smuzhiyun 	.pwrsts = PWRSTS_OFF_ON,
965*4882a593Smuzhiyun 	.flags = HW_CTRL,
966*4882a593Smuzhiyun };
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun static struct clk_regmap *disp_cc_sm8250_clocks[] = {
969*4882a593Smuzhiyun 	[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
970*4882a593Smuzhiyun 	[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
971*4882a593Smuzhiyun 	[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
972*4882a593Smuzhiyun 	[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
973*4882a593Smuzhiyun 	[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
974*4882a593Smuzhiyun 	[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
975*4882a593Smuzhiyun 	[DISP_CC_MDSS_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr,
976*4882a593Smuzhiyun 	[DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr,
977*4882a593Smuzhiyun 	[DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] = &disp_cc_mdss_byte1_div_clk_src.clkr,
978*4882a593Smuzhiyun 	[DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr,
979*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_AUX1_CLK] = &disp_cc_mdss_dp_aux1_clk.clkr,
980*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_AUX1_CLK_SRC] = &disp_cc_mdss_dp_aux1_clk_src.clkr,
981*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
982*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
983*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_LINK1_CLK] = &disp_cc_mdss_dp_link1_clk.clkr,
984*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_LINK1_CLK_SRC] = &disp_cc_mdss_dp_link1_clk_src.clkr,
985*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_LINK1_DIV_CLK_SRC] = &disp_cc_mdss_dp_link1_div_clk_src.clkr,
986*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_LINK1_INTF_CLK] = &disp_cc_mdss_dp_link1_intf_clk.clkr,
987*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
988*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
989*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dp_link_div_clk_src.clkr,
990*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
991*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_PIXEL1_CLK] = &disp_cc_mdss_dp_pixel1_clk.clkr,
992*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_PIXEL1_CLK_SRC] = &disp_cc_mdss_dp_pixel1_clk_src.clkr,
993*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_PIXEL2_CLK] = &disp_cc_mdss_dp_pixel2_clk.clkr,
994*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_PIXEL2_CLK_SRC] = &disp_cc_mdss_dp_pixel2_clk_src.clkr,
995*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
996*4882a593Smuzhiyun 	[DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
997*4882a593Smuzhiyun 	[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
998*4882a593Smuzhiyun 	[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
999*4882a593Smuzhiyun 	[DISP_CC_MDSS_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr,
1000*4882a593Smuzhiyun 	[DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr,
1001*4882a593Smuzhiyun 	[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
1002*4882a593Smuzhiyun 	[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
1003*4882a593Smuzhiyun 	[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
1004*4882a593Smuzhiyun 	[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
1005*4882a593Smuzhiyun 	[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
1006*4882a593Smuzhiyun 	[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
1007*4882a593Smuzhiyun 	[DISP_CC_MDSS_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr,
1008*4882a593Smuzhiyun 	[DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr,
1009*4882a593Smuzhiyun 	[DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
1010*4882a593Smuzhiyun 	[DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
1011*4882a593Smuzhiyun 	[DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
1012*4882a593Smuzhiyun 	[DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
1013*4882a593Smuzhiyun 	[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
1014*4882a593Smuzhiyun 	[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
1015*4882a593Smuzhiyun 	[DISP_CC_PLL0] = &disp_cc_pll0.clkr,
1016*4882a593Smuzhiyun 	[DISP_CC_PLL1] = &disp_cc_pll1.clkr,
1017*4882a593Smuzhiyun };
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun static const struct qcom_reset_map disp_cc_sm8250_resets[] = {
1020*4882a593Smuzhiyun 	[DISP_CC_MDSS_CORE_BCR] = { 0x2000 },
1021*4882a593Smuzhiyun 	[DISP_CC_MDSS_RSCC_BCR] = { 0x4000 },
1022*4882a593Smuzhiyun };
1023*4882a593Smuzhiyun 
1024*4882a593Smuzhiyun static struct gdsc *disp_cc_sm8250_gdscs[] = {
1025*4882a593Smuzhiyun 	[MDSS_GDSC] = &mdss_gdsc,
1026*4882a593Smuzhiyun };
1027*4882a593Smuzhiyun 
1028*4882a593Smuzhiyun static const struct regmap_config disp_cc_sm8250_regmap_config = {
1029*4882a593Smuzhiyun 	.reg_bits	= 32,
1030*4882a593Smuzhiyun 	.reg_stride	= 4,
1031*4882a593Smuzhiyun 	.val_bits	= 32,
1032*4882a593Smuzhiyun 	.max_register	= 0x10000,
1033*4882a593Smuzhiyun 	.fast_io	= true,
1034*4882a593Smuzhiyun };
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun static const struct qcom_cc_desc disp_cc_sm8250_desc = {
1037*4882a593Smuzhiyun 	.config = &disp_cc_sm8250_regmap_config,
1038*4882a593Smuzhiyun 	.clks = disp_cc_sm8250_clocks,
1039*4882a593Smuzhiyun 	.num_clks = ARRAY_SIZE(disp_cc_sm8250_clocks),
1040*4882a593Smuzhiyun 	.resets = disp_cc_sm8250_resets,
1041*4882a593Smuzhiyun 	.num_resets = ARRAY_SIZE(disp_cc_sm8250_resets),
1042*4882a593Smuzhiyun 	.gdscs = disp_cc_sm8250_gdscs,
1043*4882a593Smuzhiyun 	.num_gdscs = ARRAY_SIZE(disp_cc_sm8250_gdscs),
1044*4882a593Smuzhiyun };
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun static const struct of_device_id disp_cc_sm8250_match_table[] = {
1047*4882a593Smuzhiyun 	{ .compatible = "qcom,sm8150-dispcc" },
1048*4882a593Smuzhiyun 	{ .compatible = "qcom,sm8250-dispcc" },
1049*4882a593Smuzhiyun 	{ }
1050*4882a593Smuzhiyun };
1051*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, disp_cc_sm8250_match_table);
1052*4882a593Smuzhiyun 
disp_cc_sm8250_probe(struct platform_device * pdev)1053*4882a593Smuzhiyun static int disp_cc_sm8250_probe(struct platform_device *pdev)
1054*4882a593Smuzhiyun {
1055*4882a593Smuzhiyun 	struct regmap *regmap;
1056*4882a593Smuzhiyun 
1057*4882a593Smuzhiyun 	regmap = qcom_cc_map(pdev, &disp_cc_sm8250_desc);
1058*4882a593Smuzhiyun 	if (IS_ERR(regmap))
1059*4882a593Smuzhiyun 		return PTR_ERR(regmap);
1060*4882a593Smuzhiyun 
1061*4882a593Smuzhiyun 	/* note: trion == lucid, except for the prepare() op */
1062*4882a593Smuzhiyun 	BUILD_BUG_ON(CLK_ALPHA_PLL_TYPE_TRION != CLK_ALPHA_PLL_TYPE_LUCID);
1063*4882a593Smuzhiyun 	if (of_device_is_compatible(pdev->dev.of_node, "qcom,sm8150-dispcc")) {
1064*4882a593Smuzhiyun 		disp_cc_pll0_config.config_ctl_hi_val = 0x00002267;
1065*4882a593Smuzhiyun 		disp_cc_pll0_config.config_ctl_hi1_val = 0x00000024;
1066*4882a593Smuzhiyun 		disp_cc_pll0_config.user_ctl_hi1_val = 0x000000D0;
1067*4882a593Smuzhiyun 		disp_cc_pll0_init.ops = &clk_alpha_pll_trion_ops;
1068*4882a593Smuzhiyun 		disp_cc_pll1_config.config_ctl_hi_val = 0x00002267;
1069*4882a593Smuzhiyun 		disp_cc_pll1_config.config_ctl_hi1_val = 0x00000024;
1070*4882a593Smuzhiyun 		disp_cc_pll1_config.user_ctl_hi1_val = 0x000000D0;
1071*4882a593Smuzhiyun 		disp_cc_pll1_init.ops = &clk_alpha_pll_trion_ops;
1072*4882a593Smuzhiyun 	}
1073*4882a593Smuzhiyun 
1074*4882a593Smuzhiyun 	clk_lucid_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
1075*4882a593Smuzhiyun 	clk_lucid_pll_configure(&disp_cc_pll1, regmap, &disp_cc_pll1_config);
1076*4882a593Smuzhiyun 
1077*4882a593Smuzhiyun 	/* Enable clock gating for MDP clocks */
1078*4882a593Smuzhiyun 	regmap_update_bits(regmap, 0x8000, 0x10, 0x10);
1079*4882a593Smuzhiyun 
1080*4882a593Smuzhiyun 	/* DISP_CC_XO_CLK always-on */
1081*4882a593Smuzhiyun 	regmap_update_bits(regmap, 0x605c, BIT(0), BIT(0));
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun 	return qcom_cc_really_probe(pdev, &disp_cc_sm8250_desc, regmap);
1084*4882a593Smuzhiyun }
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun static struct platform_driver disp_cc_sm8250_driver = {
1087*4882a593Smuzhiyun 	.probe = disp_cc_sm8250_probe,
1088*4882a593Smuzhiyun 	.driver = {
1089*4882a593Smuzhiyun 		.name = "disp_cc-sm8250",
1090*4882a593Smuzhiyun 		.of_match_table = disp_cc_sm8250_match_table,
1091*4882a593Smuzhiyun 	},
1092*4882a593Smuzhiyun };
1093*4882a593Smuzhiyun 
disp_cc_sm8250_init(void)1094*4882a593Smuzhiyun static int __init disp_cc_sm8250_init(void)
1095*4882a593Smuzhiyun {
1096*4882a593Smuzhiyun 	return platform_driver_register(&disp_cc_sm8250_driver);
1097*4882a593Smuzhiyun }
1098*4882a593Smuzhiyun subsys_initcall(disp_cc_sm8250_init);
1099*4882a593Smuzhiyun 
disp_cc_sm8250_exit(void)1100*4882a593Smuzhiyun static void __exit disp_cc_sm8250_exit(void)
1101*4882a593Smuzhiyun {
1102*4882a593Smuzhiyun 	platform_driver_unregister(&disp_cc_sm8250_driver);
1103*4882a593Smuzhiyun }
1104*4882a593Smuzhiyun module_exit(disp_cc_sm8250_exit);
1105*4882a593Smuzhiyun 
1106*4882a593Smuzhiyun MODULE_DESCRIPTION("QTI DISPCC SM8250 Driver");
1107*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
1108