xref: /linux/drivers/clk/qcom/dispcc-x1e80100.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
4  */
5 
6 #include <linux/clk-provider.h>
7 #include <linux/err.h>
8 #include <linux/kernel.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/module.h>
11 #include <linux/platform_device.h>
12 #include <linux/pm_runtime.h>
13 #include <linux/regmap.h>
14 
15 #include <dt-bindings/clock/qcom,x1e80100-dispcc.h>
16 
17 #include "common.h"
18 #include "clk-alpha-pll.h"
19 #include "clk-branch.h"
20 #include "clk-pll.h"
21 #include "clk-rcg.h"
22 #include "clk-regmap.h"
23 #include "clk-regmap-divider.h"
24 #include "reset.h"
25 #include "gdsc.h"
26 
27 /* Need to match the order of clocks in DT binding */
28 enum {
29 	DT_BI_TCXO,
30 	DT_BI_TCXO_AO,
31 	DT_AHB_CLK,
32 	DT_SLEEP_CLK,
33 
34 	DT_DSI0_PHY_PLL_OUT_BYTECLK,
35 	DT_DSI0_PHY_PLL_OUT_DSICLK,
36 	DT_DSI1_PHY_PLL_OUT_BYTECLK,
37 	DT_DSI1_PHY_PLL_OUT_DSICLK,
38 
39 	DT_DP0_PHY_PLL_LINK_CLK,
40 	DT_DP0_PHY_PLL_VCO_DIV_CLK,
41 	DT_DP1_PHY_PLL_LINK_CLK,
42 	DT_DP1_PHY_PLL_VCO_DIV_CLK,
43 	DT_DP2_PHY_PLL_LINK_CLK,
44 	DT_DP2_PHY_PLL_VCO_DIV_CLK,
45 	DT_DP3_PHY_PLL_LINK_CLK,
46 	DT_DP3_PHY_PLL_VCO_DIV_CLK,
47 };
48 
49 #define DISP_CC_MISC_CMD	0xF000
50 
51 enum {
52 	P_BI_TCXO,
53 	P_BI_TCXO_AO,
54 	P_DISP_CC_PLL0_OUT_MAIN,
55 	P_DISP_CC_PLL1_OUT_EVEN,
56 	P_DISP_CC_PLL1_OUT_MAIN,
57 	P_DP0_PHY_PLL_LINK_CLK,
58 	P_DP0_PHY_PLL_VCO_DIV_CLK,
59 	P_DP1_PHY_PLL_LINK_CLK,
60 	P_DP1_PHY_PLL_VCO_DIV_CLK,
61 	P_DP2_PHY_PLL_LINK_CLK,
62 	P_DP2_PHY_PLL_VCO_DIV_CLK,
63 	P_DP3_PHY_PLL_LINK_CLK,
64 	P_DP3_PHY_PLL_VCO_DIV_CLK,
65 	P_DSI0_PHY_PLL_OUT_BYTECLK,
66 	P_DSI0_PHY_PLL_OUT_DSICLK,
67 	P_DSI1_PHY_PLL_OUT_BYTECLK,
68 	P_DSI1_PHY_PLL_OUT_DSICLK,
69 	P_SLEEP_CLK,
70 };
71 
72 static const struct pll_vco lucid_ole_vco[] = {
73 	{ 249600000, 2300000000, 0 },
74 };
75 
76 static const struct alpha_pll_config disp_cc_pll0_config = {
77 	.l = 0xd,
78 	.alpha = 0x6492,
79 	.config_ctl_val = 0x20485699,
80 	.config_ctl_hi_val = 0x00182261,
81 	.config_ctl_hi1_val = 0x82aa299c,
82 	.test_ctl_val = 0x00000000,
83 	.test_ctl_hi_val = 0x00000003,
84 	.test_ctl_hi1_val = 0x00009000,
85 	.test_ctl_hi2_val = 0x00000034,
86 	.user_ctl_val = 0x00000000,
87 	.user_ctl_hi_val = 0x00000005,
88 };
89 
90 static struct clk_alpha_pll disp_cc_pll0 = {
91 	.offset = 0x0,
92 	.vco_table = lucid_ole_vco,
93 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
94 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
95 	.clkr = {
96 		.hw.init = &(const struct clk_init_data) {
97 			.name = "disp_cc_pll0",
98 			.parent_data = &(const struct clk_parent_data) {
99 				.index = DT_BI_TCXO,
100 			},
101 			.num_parents = 1,
102 			.ops = &clk_alpha_pll_reset_lucid_ole_ops,
103 		},
104 	},
105 };
106 
107 static const struct alpha_pll_config disp_cc_pll1_config = {
108 	.l = 0x1f,
109 	.alpha = 0x4000,
110 	.config_ctl_val = 0x20485699,
111 	.config_ctl_hi_val = 0x00182261,
112 	.config_ctl_hi1_val = 0x82aa299c,
113 	.test_ctl_val = 0x00000000,
114 	.test_ctl_hi_val = 0x00000003,
115 	.test_ctl_hi1_val = 0x00009000,
116 	.test_ctl_hi2_val = 0x00000034,
117 	.user_ctl_val = 0x00000000,
118 	.user_ctl_hi_val = 0x00000005,
119 };
120 
121 static struct clk_alpha_pll disp_cc_pll1 = {
122 	.offset = 0x1000,
123 	.vco_table = lucid_ole_vco,
124 	.num_vco = ARRAY_SIZE(lucid_ole_vco),
125 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
126 	.clkr = {
127 		.hw.init = &(const struct clk_init_data) {
128 			.name = "disp_cc_pll1",
129 			.parent_data = &(const struct clk_parent_data) {
130 				.index = DT_BI_TCXO,
131 			},
132 			.num_parents = 1,
133 			.ops = &clk_alpha_pll_reset_lucid_ole_ops,
134 		},
135 	},
136 };
137 
138 static const struct parent_map disp_cc_parent_map_0[] = {
139 	{ P_BI_TCXO, 0 },
140 	{ P_DP0_PHY_PLL_LINK_CLK, 1 },
141 	{ P_DP0_PHY_PLL_VCO_DIV_CLK, 2 },
142 	{ P_DP3_PHY_PLL_VCO_DIV_CLK, 3 },
143 	{ P_DP1_PHY_PLL_VCO_DIV_CLK, 4 },
144 	{ P_DP2_PHY_PLL_VCO_DIV_CLK, 6 },
145 };
146 
147 static const struct clk_parent_data disp_cc_parent_data_0[] = {
148 	{ .index = DT_BI_TCXO },
149 	{ .index = DT_DP0_PHY_PLL_LINK_CLK },
150 	{ .index = DT_DP0_PHY_PLL_VCO_DIV_CLK },
151 	{ .index = DT_DP3_PHY_PLL_VCO_DIV_CLK },
152 	{ .index = DT_DP1_PHY_PLL_VCO_DIV_CLK },
153 	{ .index = DT_DP2_PHY_PLL_VCO_DIV_CLK },
154 };
155 
156 static const struct parent_map disp_cc_parent_map_1[] = {
157 	{ P_BI_TCXO, 0 },
158 };
159 
160 static const struct clk_parent_data disp_cc_parent_data_1[] = {
161 	{ .index = DT_BI_TCXO },
162 };
163 
164 static const struct clk_parent_data disp_cc_parent_data_1_ao[] = {
165 	{ .index = DT_BI_TCXO_AO },
166 };
167 
168 static const struct parent_map disp_cc_parent_map_2[] = {
169 	{ P_BI_TCXO, 0 },
170 	{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
171 	{ P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
172 	{ P_DSI1_PHY_PLL_OUT_DSICLK, 3 },
173 	{ P_DSI1_PHY_PLL_OUT_BYTECLK, 4 },
174 };
175 
176 static const struct clk_parent_data disp_cc_parent_data_2[] = {
177 	{ .index = DT_BI_TCXO },
178 	{ .index = DT_DSI0_PHY_PLL_OUT_DSICLK },
179 	{ .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
180 	{ .index = DT_DSI1_PHY_PLL_OUT_DSICLK },
181 	{ .index = DT_DSI1_PHY_PLL_OUT_BYTECLK },
182 };
183 
184 static const struct parent_map disp_cc_parent_map_3[] = {
185 	{ P_BI_TCXO, 0 },
186 	{ P_DP0_PHY_PLL_LINK_CLK, 1 },
187 	{ P_DP1_PHY_PLL_LINK_CLK, 2 },
188 	{ P_DP2_PHY_PLL_LINK_CLK, 3 },
189 	{ P_DP3_PHY_PLL_LINK_CLK, 4 },
190 };
191 
192 static const struct clk_parent_data disp_cc_parent_data_3[] = {
193 	{ .index = DT_BI_TCXO },
194 	{ .index = DT_DP0_PHY_PLL_LINK_CLK },
195 	{ .index = DT_DP1_PHY_PLL_LINK_CLK },
196 	{ .index = DT_DP2_PHY_PLL_LINK_CLK },
197 	{ .index = DT_DP3_PHY_PLL_LINK_CLK },
198 };
199 
200 static const struct parent_map disp_cc_parent_map_4[] = {
201 	{ P_BI_TCXO, 0 },
202 	{ P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
203 	{ P_DSI1_PHY_PLL_OUT_BYTECLK, 4 },
204 };
205 
206 static const struct clk_parent_data disp_cc_parent_data_4[] = {
207 	{ .index = DT_BI_TCXO },
208 	{ .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
209 	{ .index = DT_DSI1_PHY_PLL_OUT_BYTECLK },
210 };
211 
212 static const struct parent_map disp_cc_parent_map_5[] = {
213 	{ P_BI_TCXO, 0 },
214 	{ P_DISP_CC_PLL1_OUT_MAIN, 4 },
215 	{ P_DISP_CC_PLL1_OUT_EVEN, 6 },
216 };
217 
218 static const struct clk_parent_data disp_cc_parent_data_5[] = {
219 	{ .index = DT_BI_TCXO },
220 	{ .hw = &disp_cc_pll1.clkr.hw },
221 	{ .hw = &disp_cc_pll1.clkr.hw },
222 };
223 
224 static const struct parent_map disp_cc_parent_map_6[] = {
225 	{ P_BI_TCXO, 0 },
226 	{ P_DISP_CC_PLL0_OUT_MAIN, 1 },
227 	{ P_DISP_CC_PLL1_OUT_MAIN, 4 },
228 	{ P_DISP_CC_PLL1_OUT_EVEN, 6 },
229 };
230 
231 static const struct clk_parent_data disp_cc_parent_data_6[] = {
232 	{ .index = DT_BI_TCXO },
233 	{ .hw = &disp_cc_pll0.clkr.hw },
234 	{ .hw = &disp_cc_pll1.clkr.hw },
235 	{ .hw = &disp_cc_pll1.clkr.hw },
236 };
237 
238 static const struct parent_map disp_cc_parent_map_7[] = {
239 	{ P_SLEEP_CLK, 0 },
240 };
241 
242 static const struct clk_parent_data disp_cc_parent_data_7[] = {
243 	{ .index = DT_SLEEP_CLK },
244 };
245 
246 static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
247 	F(19200000, P_BI_TCXO, 1, 0, 0),
248 	F(37500000, P_DISP_CC_PLL1_OUT_MAIN, 16, 0, 0),
249 	F(75000000, P_DISP_CC_PLL1_OUT_MAIN, 8, 0, 0),
250 	{ }
251 };
252 
253 static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
254 	.cmd_rcgr = 0x82ec,
255 	.mnd_width = 0,
256 	.hid_width = 5,
257 	.parent_map = disp_cc_parent_map_5,
258 	.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
259 	.clkr.hw.init = &(const struct clk_init_data) {
260 		.name = "disp_cc_mdss_ahb_clk_src",
261 		.parent_data = disp_cc_parent_data_5,
262 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
263 		.flags = CLK_SET_RATE_PARENT,
264 		.ops = &clk_rcg2_ops,
265 	},
266 };
267 
268 static const struct freq_tbl ftbl_disp_cc_mdss_byte0_clk_src[] = {
269 	F(19200000, P_BI_TCXO, 1, 0, 0),
270 	{ }
271 };
272 
273 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
274 	.cmd_rcgr = 0x810c,
275 	.mnd_width = 0,
276 	.hid_width = 5,
277 	.parent_map = disp_cc_parent_map_2,
278 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
279 	.clkr.hw.init = &(const struct clk_init_data) {
280 		.name = "disp_cc_mdss_byte0_clk_src",
281 		.parent_data = disp_cc_parent_data_2,
282 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
283 		.flags = CLK_SET_RATE_PARENT,
284 		.ops = &clk_byte2_ops,
285 	},
286 };
287 
288 static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = {
289 	.cmd_rcgr = 0x8128,
290 	.mnd_width = 0,
291 	.hid_width = 5,
292 	.parent_map = disp_cc_parent_map_2,
293 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
294 	.clkr.hw.init = &(const struct clk_init_data) {
295 		.name = "disp_cc_mdss_byte1_clk_src",
296 		.parent_data = disp_cc_parent_data_2,
297 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
298 		.flags = CLK_SET_RATE_PARENT,
299 		.ops = &clk_byte2_ops,
300 	},
301 };
302 
303 static struct clk_rcg2 disp_cc_mdss_dptx0_aux_clk_src = {
304 	.cmd_rcgr = 0x81c0,
305 	.mnd_width = 0,
306 	.hid_width = 5,
307 	.parent_map = disp_cc_parent_map_1,
308 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
309 	.clkr.hw.init = &(const struct clk_init_data) {
310 		.name = "disp_cc_mdss_dptx0_aux_clk_src",
311 		.parent_data = disp_cc_parent_data_1,
312 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
313 		.flags = CLK_SET_RATE_PARENT,
314 		.ops = &clk_rcg2_ops,
315 	},
316 };
317 
318 static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = {
319 	.cmd_rcgr = 0x8174,
320 	.mnd_width = 0,
321 	.hid_width = 5,
322 	.parent_map = disp_cc_parent_map_3,
323 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
324 	.clkr.hw.init = &(const struct clk_init_data) {
325 		.name = "disp_cc_mdss_dptx0_link_clk_src",
326 		.parent_data = disp_cc_parent_data_3,
327 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
328 		.flags = CLK_SET_RATE_PARENT,
329 		.ops = &clk_byte2_ops,
330 	},
331 };
332 
333 static struct clk_rcg2 disp_cc_mdss_dptx0_pixel0_clk_src = {
334 	.cmd_rcgr = 0x8190,
335 	.mnd_width = 16,
336 	.hid_width = 5,
337 	.parent_map = disp_cc_parent_map_0,
338 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
339 	.clkr.hw.init = &(const struct clk_init_data) {
340 		.name = "disp_cc_mdss_dptx0_pixel0_clk_src",
341 		.parent_data = disp_cc_parent_data_0,
342 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
343 		.flags = CLK_SET_RATE_PARENT,
344 		.ops = &clk_dp_ops,
345 	},
346 };
347 
348 static struct clk_rcg2 disp_cc_mdss_dptx0_pixel1_clk_src = {
349 	.cmd_rcgr = 0x81a8,
350 	.mnd_width = 16,
351 	.hid_width = 5,
352 	.parent_map = disp_cc_parent_map_0,
353 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
354 	.clkr.hw.init = &(const struct clk_init_data) {
355 		.name = "disp_cc_mdss_dptx0_pixel1_clk_src",
356 		.parent_data = disp_cc_parent_data_0,
357 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
358 		.flags = CLK_SET_RATE_PARENT,
359 		.ops = &clk_dp_ops,
360 	},
361 };
362 
363 static struct clk_rcg2 disp_cc_mdss_dptx1_aux_clk_src = {
364 	.cmd_rcgr = 0x8224,
365 	.mnd_width = 0,
366 	.hid_width = 5,
367 	.parent_map = disp_cc_parent_map_1,
368 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
369 	.clkr.hw.init = &(const struct clk_init_data) {
370 		.name = "disp_cc_mdss_dptx1_aux_clk_src",
371 		.parent_data = disp_cc_parent_data_1,
372 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
373 		.flags = CLK_SET_RATE_PARENT,
374 		.ops = &clk_rcg2_ops,
375 	},
376 };
377 
378 static struct clk_rcg2 disp_cc_mdss_dptx1_link_clk_src = {
379 	.cmd_rcgr = 0x8208,
380 	.mnd_width = 0,
381 	.hid_width = 5,
382 	.parent_map = disp_cc_parent_map_3,
383 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
384 	.clkr.hw.init = &(const struct clk_init_data) {
385 		.name = "disp_cc_mdss_dptx1_link_clk_src",
386 		.parent_data = disp_cc_parent_data_3,
387 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
388 		.flags = CLK_SET_RATE_PARENT,
389 		.ops = &clk_byte2_ops,
390 	},
391 };
392 
393 static struct clk_rcg2 disp_cc_mdss_dptx1_pixel0_clk_src = {
394 	.cmd_rcgr = 0x81d8,
395 	.mnd_width = 16,
396 	.hid_width = 5,
397 	.parent_map = disp_cc_parent_map_0,
398 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
399 	.clkr.hw.init = &(const struct clk_init_data) {
400 		.name = "disp_cc_mdss_dptx1_pixel0_clk_src",
401 		.parent_data = disp_cc_parent_data_0,
402 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
403 		.flags = CLK_SET_RATE_PARENT,
404 		.ops = &clk_dp_ops,
405 	},
406 };
407 
408 static struct clk_rcg2 disp_cc_mdss_dptx1_pixel1_clk_src = {
409 	.cmd_rcgr = 0x81f0,
410 	.mnd_width = 16,
411 	.hid_width = 5,
412 	.parent_map = disp_cc_parent_map_0,
413 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
414 	.clkr.hw.init = &(const struct clk_init_data) {
415 		.name = "disp_cc_mdss_dptx1_pixel1_clk_src",
416 		.parent_data = disp_cc_parent_data_0,
417 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
418 		.flags = CLK_SET_RATE_PARENT,
419 		.ops = &clk_dp_ops,
420 	},
421 };
422 
423 static struct clk_rcg2 disp_cc_mdss_dptx2_aux_clk_src = {
424 	.cmd_rcgr = 0x8288,
425 	.mnd_width = 0,
426 	.hid_width = 5,
427 	.parent_map = disp_cc_parent_map_1,
428 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
429 	.clkr.hw.init = &(const struct clk_init_data) {
430 		.name = "disp_cc_mdss_dptx2_aux_clk_src",
431 		.parent_data = disp_cc_parent_data_1,
432 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
433 		.flags = CLK_SET_RATE_PARENT,
434 		.ops = &clk_rcg2_ops,
435 	},
436 };
437 
438 static struct clk_rcg2 disp_cc_mdss_dptx2_link_clk_src = {
439 	.cmd_rcgr = 0x823c,
440 	.mnd_width = 0,
441 	.hid_width = 5,
442 	.parent_map = disp_cc_parent_map_3,
443 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
444 	.clkr.hw.init = &(const struct clk_init_data) {
445 		.name = "disp_cc_mdss_dptx2_link_clk_src",
446 		.parent_data = disp_cc_parent_data_3,
447 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
448 		.flags = CLK_SET_RATE_PARENT,
449 		.ops = &clk_byte2_ops,
450 	},
451 };
452 
453 static struct clk_rcg2 disp_cc_mdss_dptx2_pixel0_clk_src = {
454 	.cmd_rcgr = 0x8258,
455 	.mnd_width = 16,
456 	.hid_width = 5,
457 	.parent_map = disp_cc_parent_map_0,
458 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
459 	.clkr.hw.init = &(const struct clk_init_data) {
460 		.name = "disp_cc_mdss_dptx2_pixel0_clk_src",
461 		.parent_data = disp_cc_parent_data_0,
462 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
463 		.flags = CLK_SET_RATE_PARENT,
464 		.ops = &clk_dp_ops,
465 	},
466 };
467 
468 static struct clk_rcg2 disp_cc_mdss_dptx2_pixel1_clk_src = {
469 	.cmd_rcgr = 0x8270,
470 	.mnd_width = 16,
471 	.hid_width = 5,
472 	.parent_map = disp_cc_parent_map_0,
473 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
474 	.clkr.hw.init = &(const struct clk_init_data) {
475 		.name = "disp_cc_mdss_dptx2_pixel1_clk_src",
476 		.parent_data = disp_cc_parent_data_0,
477 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
478 		.flags = CLK_SET_RATE_PARENT,
479 		.ops = &clk_dp_ops,
480 	},
481 };
482 
483 static struct clk_rcg2 disp_cc_mdss_dptx3_aux_clk_src = {
484 	.cmd_rcgr = 0x82d4,
485 	.mnd_width = 0,
486 	.hid_width = 5,
487 	.parent_map = disp_cc_parent_map_1,
488 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
489 	.clkr.hw.init = &(const struct clk_init_data) {
490 		.name = "disp_cc_mdss_dptx3_aux_clk_src",
491 		.parent_data = disp_cc_parent_data_1,
492 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
493 		.flags = CLK_SET_RATE_PARENT,
494 		.ops = &clk_rcg2_ops,
495 	},
496 };
497 
498 static struct clk_rcg2 disp_cc_mdss_dptx3_link_clk_src = {
499 	.cmd_rcgr = 0x82b8,
500 	.mnd_width = 0,
501 	.hid_width = 5,
502 	.parent_map = disp_cc_parent_map_3,
503 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
504 	.clkr.hw.init = &(const struct clk_init_data) {
505 		.name = "disp_cc_mdss_dptx3_link_clk_src",
506 		.parent_data = disp_cc_parent_data_3,
507 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
508 		.flags = CLK_SET_RATE_PARENT,
509 		.ops = &clk_byte2_ops,
510 	},
511 };
512 
513 static struct clk_rcg2 disp_cc_mdss_dptx3_pixel0_clk_src = {
514 	.cmd_rcgr = 0x82a0,
515 	.mnd_width = 16,
516 	.hid_width = 5,
517 	.parent_map = disp_cc_parent_map_0,
518 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
519 	.clkr.hw.init = &(const struct clk_init_data) {
520 		.name = "disp_cc_mdss_dptx3_pixel0_clk_src",
521 		.parent_data = disp_cc_parent_data_0,
522 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
523 		.flags = CLK_SET_RATE_PARENT,
524 		.ops = &clk_dp_ops,
525 	},
526 };
527 
528 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
529 	.cmd_rcgr = 0x8144,
530 	.mnd_width = 0,
531 	.hid_width = 5,
532 	.parent_map = disp_cc_parent_map_4,
533 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
534 	.clkr.hw.init = &(const struct clk_init_data) {
535 		.name = "disp_cc_mdss_esc0_clk_src",
536 		.parent_data = disp_cc_parent_data_4,
537 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
538 		.flags = CLK_SET_RATE_PARENT,
539 		.ops = &clk_rcg2_ops,
540 	},
541 };
542 
543 static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = {
544 	.cmd_rcgr = 0x815c,
545 	.mnd_width = 0,
546 	.hid_width = 5,
547 	.parent_map = disp_cc_parent_map_4,
548 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
549 	.clkr.hw.init = &(const struct clk_init_data) {
550 		.name = "disp_cc_mdss_esc1_clk_src",
551 		.parent_data = disp_cc_parent_data_4,
552 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
553 		.flags = CLK_SET_RATE_PARENT,
554 		.ops = &clk_rcg2_ops,
555 	},
556 };
557 
558 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
559 	F(19200000, P_BI_TCXO, 1, 0, 0),
560 	F(85714286, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
561 	F(100000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
562 	F(150000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
563 	F(172000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
564 	F(200000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
565 	F(325000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
566 	F(375000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
567 	F(514000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
568 	F(575000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
569 	{ }
570 };
571 
572 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
573 	.cmd_rcgr = 0x80dc,
574 	.mnd_width = 0,
575 	.hid_width = 5,
576 	.parent_map = disp_cc_parent_map_6,
577 	.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
578 	.clkr.hw.init = &(const struct clk_init_data) {
579 		.name = "disp_cc_mdss_mdp_clk_src",
580 		.parent_data = disp_cc_parent_data_6,
581 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
582 		.flags = CLK_SET_RATE_PARENT,
583 		.ops = &clk_rcg2_shared_ops,
584 	},
585 };
586 
587 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
588 	.cmd_rcgr = 0x80ac,
589 	.mnd_width = 8,
590 	.hid_width = 5,
591 	.parent_map = disp_cc_parent_map_2,
592 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
593 	.clkr.hw.init = &(const struct clk_init_data) {
594 		.name = "disp_cc_mdss_pclk0_clk_src",
595 		.parent_data = disp_cc_parent_data_2,
596 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
597 		.flags = CLK_SET_RATE_PARENT,
598 		.ops = &clk_pixel_ops,
599 	},
600 };
601 
602 static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = {
603 	.cmd_rcgr = 0x80c4,
604 	.mnd_width = 8,
605 	.hid_width = 5,
606 	.parent_map = disp_cc_parent_map_2,
607 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
608 	.clkr.hw.init = &(const struct clk_init_data) {
609 		.name = "disp_cc_mdss_pclk1_clk_src",
610 		.parent_data = disp_cc_parent_data_2,
611 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
612 		.flags = CLK_SET_RATE_PARENT,
613 		.ops = &clk_pixel_ops,
614 	},
615 };
616 
617 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
618 	.cmd_rcgr = 0x80f4,
619 	.mnd_width = 0,
620 	.hid_width = 5,
621 	.parent_map = disp_cc_parent_map_1,
622 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
623 	.clkr.hw.init = &(const struct clk_init_data) {
624 		.name = "disp_cc_mdss_vsync_clk_src",
625 		.parent_data = disp_cc_parent_data_1,
626 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
627 		.flags = CLK_SET_RATE_PARENT,
628 		.ops = &clk_rcg2_ops,
629 	},
630 };
631 
632 static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = {
633 	F(32000, P_SLEEP_CLK, 1, 0, 0),
634 	{ }
635 };
636 
637 static struct clk_rcg2 disp_cc_sleep_clk_src = {
638 	.cmd_rcgr = 0xe05c,
639 	.mnd_width = 0,
640 	.hid_width = 5,
641 	.parent_map = disp_cc_parent_map_7,
642 	.freq_tbl = ftbl_disp_cc_sleep_clk_src,
643 	.clkr.hw.init = &(const struct clk_init_data) {
644 		.name = "disp_cc_sleep_clk_src",
645 		.parent_data = disp_cc_parent_data_7,
646 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_7),
647 		.flags = CLK_SET_RATE_PARENT,
648 		.ops = &clk_rcg2_ops,
649 	},
650 };
651 
652 static struct clk_rcg2 disp_cc_xo_clk_src = {
653 	.cmd_rcgr = 0xe03c,
654 	.mnd_width = 0,
655 	.hid_width = 5,
656 	.parent_map = disp_cc_parent_map_1,
657 	.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
658 	.clkr.hw.init = &(const struct clk_init_data) {
659 		.name = "disp_cc_xo_clk_src",
660 		.parent_data = disp_cc_parent_data_1_ao,
661 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1_ao),
662 		.flags = CLK_SET_RATE_PARENT,
663 		.ops = &clk_rcg2_ops,
664 	},
665 };
666 
667 static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
668 	.reg = 0x8124,
669 	.shift = 0,
670 	.width = 4,
671 	.clkr.hw.init = &(const struct clk_init_data) {
672 		.name = "disp_cc_mdss_byte0_div_clk_src",
673 		.parent_hws = (const struct clk_hw*[]) {
674 			&disp_cc_mdss_byte0_clk_src.clkr.hw,
675 		},
676 		.num_parents = 1,
677 		.flags = CLK_SET_RATE_PARENT,
678 		.ops = &clk_regmap_div_ro_ops,
679 	},
680 };
681 
682 static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = {
683 	.reg = 0x8140,
684 	.shift = 0,
685 	.width = 4,
686 	.clkr.hw.init = &(const struct clk_init_data) {
687 		.name = "disp_cc_mdss_byte1_div_clk_src",
688 		.parent_hws = (const struct clk_hw*[]) {
689 			&disp_cc_mdss_byte1_clk_src.clkr.hw,
690 		},
691 		.num_parents = 1,
692 		.flags = CLK_SET_RATE_PARENT,
693 		.ops = &clk_regmap_div_ro_ops,
694 	},
695 };
696 
697 static struct clk_regmap_div disp_cc_mdss_dptx0_link_div_clk_src = {
698 	.reg = 0x818c,
699 	.shift = 0,
700 	.width = 4,
701 	.clkr.hw.init = &(const struct clk_init_data) {
702 		.name = "disp_cc_mdss_dptx0_link_div_clk_src",
703 		.parent_hws = (const struct clk_hw*[]) {
704 			&disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
705 		},
706 		.num_parents = 1,
707 		.flags = CLK_SET_RATE_PARENT,
708 		.ops = &clk_regmap_div_ro_ops,
709 	},
710 };
711 
712 static struct clk_regmap_div disp_cc_mdss_dptx1_link_div_clk_src = {
713 	.reg = 0x8220,
714 	.shift = 0,
715 	.width = 4,
716 	.clkr.hw.init = &(const struct clk_init_data) {
717 		.name = "disp_cc_mdss_dptx1_link_div_clk_src",
718 		.parent_hws = (const struct clk_hw*[]) {
719 			&disp_cc_mdss_dptx1_link_clk_src.clkr.hw,
720 		},
721 		.num_parents = 1,
722 		.flags = CLK_SET_RATE_PARENT,
723 		.ops = &clk_regmap_div_ro_ops,
724 	},
725 };
726 
727 static struct clk_regmap_div disp_cc_mdss_dptx2_link_div_clk_src = {
728 	.reg = 0x8254,
729 	.shift = 0,
730 	.width = 4,
731 	.clkr.hw.init = &(const struct clk_init_data) {
732 		.name = "disp_cc_mdss_dptx2_link_div_clk_src",
733 		.parent_hws = (const struct clk_hw*[]) {
734 			&disp_cc_mdss_dptx2_link_clk_src.clkr.hw,
735 		},
736 		.num_parents = 1,
737 		.flags = CLK_SET_RATE_PARENT,
738 		.ops = &clk_regmap_div_ro_ops,
739 	},
740 };
741 
742 static struct clk_regmap_div disp_cc_mdss_dptx3_link_div_clk_src = {
743 	.reg = 0x82d0,
744 	.shift = 0,
745 	.width = 4,
746 	.clkr.hw.init = &(const struct clk_init_data) {
747 		.name = "disp_cc_mdss_dptx3_link_div_clk_src",
748 		.parent_hws = (const struct clk_hw*[]) {
749 			&disp_cc_mdss_dptx3_link_clk_src.clkr.hw,
750 		},
751 		.num_parents = 1,
752 		.flags = CLK_SET_RATE_PARENT,
753 		.ops = &clk_regmap_div_ro_ops,
754 	},
755 };
756 
757 static struct clk_branch disp_cc_mdss_accu_clk = {
758 	.halt_reg = 0xe058,
759 	.halt_check = BRANCH_HALT_VOTED,
760 	.clkr = {
761 		.enable_reg = 0xe058,
762 		.enable_mask = BIT(0),
763 		.hw.init = &(const struct clk_init_data) {
764 			.name = "disp_cc_mdss_accu_clk",
765 			.parent_hws = (const struct clk_hw*[]) {
766 				&disp_cc_xo_clk_src.clkr.hw,
767 			},
768 			.num_parents = 1,
769 			.flags = CLK_SET_RATE_PARENT,
770 			.ops = &clk_branch2_ops,
771 		},
772 	},
773 };
774 
775 static struct clk_branch disp_cc_mdss_ahb1_clk = {
776 	.halt_reg = 0xa020,
777 	.halt_check = BRANCH_HALT,
778 	.clkr = {
779 		.enable_reg = 0xa020,
780 		.enable_mask = BIT(0),
781 		.hw.init = &(const struct clk_init_data) {
782 			.name = "disp_cc_mdss_ahb1_clk",
783 			.parent_hws = (const struct clk_hw*[]) {
784 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
785 			},
786 			.num_parents = 1,
787 			.flags = CLK_SET_RATE_PARENT,
788 			.ops = &clk_branch2_ops,
789 		},
790 	},
791 };
792 
793 static struct clk_branch disp_cc_mdss_ahb_clk = {
794 	.halt_reg = 0x80a8,
795 	.halt_check = BRANCH_HALT,
796 	.clkr = {
797 		.enable_reg = 0x80a8,
798 		.enable_mask = BIT(0),
799 		.hw.init = &(const struct clk_init_data) {
800 			.name = "disp_cc_mdss_ahb_clk",
801 			.parent_hws = (const struct clk_hw*[]) {
802 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
803 			},
804 			.num_parents = 1,
805 			.flags = CLK_SET_RATE_PARENT,
806 			.ops = &clk_branch2_ops,
807 		},
808 	},
809 };
810 
811 static struct clk_branch disp_cc_mdss_byte0_clk = {
812 	.halt_reg = 0x8028,
813 	.halt_check = BRANCH_HALT,
814 	.clkr = {
815 		.enable_reg = 0x8028,
816 		.enable_mask = BIT(0),
817 		.hw.init = &(const struct clk_init_data) {
818 			.name = "disp_cc_mdss_byte0_clk",
819 			.parent_hws = (const struct clk_hw*[]) {
820 				&disp_cc_mdss_byte0_clk_src.clkr.hw,
821 			},
822 			.num_parents = 1,
823 			.flags = CLK_SET_RATE_PARENT,
824 			.ops = &clk_branch2_ops,
825 		},
826 	},
827 };
828 
829 static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
830 	.halt_reg = 0x802c,
831 	.halt_check = BRANCH_HALT,
832 	.clkr = {
833 		.enable_reg = 0x802c,
834 		.enable_mask = BIT(0),
835 		.hw.init = &(const struct clk_init_data) {
836 			.name = "disp_cc_mdss_byte0_intf_clk",
837 			.parent_hws = (const struct clk_hw*[]) {
838 				&disp_cc_mdss_byte0_div_clk_src.clkr.hw,
839 			},
840 			.num_parents = 1,
841 			.flags = CLK_SET_RATE_PARENT,
842 			.ops = &clk_branch2_ops,
843 		},
844 	},
845 };
846 
847 static struct clk_branch disp_cc_mdss_byte1_clk = {
848 	.halt_reg = 0x8030,
849 	.halt_check = BRANCH_HALT,
850 	.clkr = {
851 		.enable_reg = 0x8030,
852 		.enable_mask = BIT(0),
853 		.hw.init = &(const struct clk_init_data) {
854 			.name = "disp_cc_mdss_byte1_clk",
855 			.parent_hws = (const struct clk_hw*[]) {
856 				&disp_cc_mdss_byte1_clk_src.clkr.hw,
857 			},
858 			.num_parents = 1,
859 			.flags = CLK_SET_RATE_PARENT,
860 			.ops = &clk_branch2_ops,
861 		},
862 	},
863 };
864 
865 static struct clk_branch disp_cc_mdss_byte1_intf_clk = {
866 	.halt_reg = 0x8034,
867 	.halt_check = BRANCH_HALT,
868 	.clkr = {
869 		.enable_reg = 0x8034,
870 		.enable_mask = BIT(0),
871 		.hw.init = &(const struct clk_init_data) {
872 			.name = "disp_cc_mdss_byte1_intf_clk",
873 			.parent_hws = (const struct clk_hw*[]) {
874 				&disp_cc_mdss_byte1_div_clk_src.clkr.hw,
875 			},
876 			.num_parents = 1,
877 			.flags = CLK_SET_RATE_PARENT,
878 			.ops = &clk_branch2_ops,
879 		},
880 	},
881 };
882 
883 static struct clk_branch disp_cc_mdss_dptx0_aux_clk = {
884 	.halt_reg = 0x8058,
885 	.halt_check = BRANCH_HALT,
886 	.clkr = {
887 		.enable_reg = 0x8058,
888 		.enable_mask = BIT(0),
889 		.hw.init = &(const struct clk_init_data) {
890 			.name = "disp_cc_mdss_dptx0_aux_clk",
891 			.parent_hws = (const struct clk_hw*[]) {
892 				&disp_cc_mdss_dptx0_aux_clk_src.clkr.hw,
893 			},
894 			.num_parents = 1,
895 			.flags = CLK_SET_RATE_PARENT,
896 			.ops = &clk_branch2_ops,
897 		},
898 	},
899 };
900 
901 static struct clk_branch disp_cc_mdss_dptx0_link_clk = {
902 	.halt_reg = 0x8040,
903 	.halt_check = BRANCH_HALT,
904 	.clkr = {
905 		.enable_reg = 0x8040,
906 		.enable_mask = BIT(0),
907 		.hw.init = &(const struct clk_init_data) {
908 			.name = "disp_cc_mdss_dptx0_link_clk",
909 			.parent_hws = (const struct clk_hw*[]) {
910 				&disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
911 			},
912 			.num_parents = 1,
913 			.flags = CLK_SET_RATE_PARENT,
914 			.ops = &clk_branch2_ops,
915 		},
916 	},
917 };
918 
919 static struct clk_branch disp_cc_mdss_dptx0_link_intf_clk = {
920 	.halt_reg = 0x8048,
921 	.halt_check = BRANCH_HALT,
922 	.clkr = {
923 		.enable_reg = 0x8048,
924 		.enable_mask = BIT(0),
925 		.hw.init = &(const struct clk_init_data) {
926 			.name = "disp_cc_mdss_dptx0_link_intf_clk",
927 			.parent_hws = (const struct clk_hw*[]) {
928 				&disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw,
929 			},
930 			.num_parents = 1,
931 			.flags = CLK_SET_RATE_PARENT,
932 			.ops = &clk_branch2_ops,
933 		},
934 	},
935 };
936 
937 static struct clk_branch disp_cc_mdss_dptx0_pixel0_clk = {
938 	.halt_reg = 0x8050,
939 	.halt_check = BRANCH_HALT,
940 	.clkr = {
941 		.enable_reg = 0x8050,
942 		.enable_mask = BIT(0),
943 		.hw.init = &(const struct clk_init_data) {
944 			.name = "disp_cc_mdss_dptx0_pixel0_clk",
945 			.parent_hws = (const struct clk_hw*[]) {
946 				&disp_cc_mdss_dptx0_pixel0_clk_src.clkr.hw,
947 			},
948 			.num_parents = 1,
949 			.flags = CLK_SET_RATE_PARENT,
950 			.ops = &clk_branch2_ops,
951 		},
952 	},
953 };
954 
955 static struct clk_branch disp_cc_mdss_dptx0_pixel1_clk = {
956 	.halt_reg = 0x8054,
957 	.halt_check = BRANCH_HALT,
958 	.clkr = {
959 		.enable_reg = 0x8054,
960 		.enable_mask = BIT(0),
961 		.hw.init = &(const struct clk_init_data) {
962 			.name = "disp_cc_mdss_dptx0_pixel1_clk",
963 			.parent_hws = (const struct clk_hw*[]) {
964 				&disp_cc_mdss_dptx0_pixel1_clk_src.clkr.hw,
965 			},
966 			.num_parents = 1,
967 			.flags = CLK_SET_RATE_PARENT,
968 			.ops = &clk_branch2_ops,
969 		},
970 	},
971 };
972 
973 static struct clk_branch disp_cc_mdss_dptx0_usb_router_link_intf_clk = {
974 	.halt_reg = 0x8044,
975 	.halt_check = BRANCH_HALT,
976 	.clkr = {
977 		.enable_reg = 0x8044,
978 		.enable_mask = BIT(0),
979 		.hw.init = &(const struct clk_init_data) {
980 			.name = "disp_cc_mdss_dptx0_usb_router_link_intf_clk",
981 			.parent_hws = (const struct clk_hw*[]) {
982 				&disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw,
983 			},
984 			.num_parents = 1,
985 			.flags = CLK_SET_RATE_PARENT,
986 			.ops = &clk_branch2_ops,
987 		},
988 	},
989 };
990 
991 static struct clk_branch disp_cc_mdss_dptx1_aux_clk = {
992 	.halt_reg = 0x8074,
993 	.halt_check = BRANCH_HALT,
994 	.clkr = {
995 		.enable_reg = 0x8074,
996 		.enable_mask = BIT(0),
997 		.hw.init = &(const struct clk_init_data) {
998 			.name = "disp_cc_mdss_dptx1_aux_clk",
999 			.parent_hws = (const struct clk_hw*[]) {
1000 				&disp_cc_mdss_dptx1_aux_clk_src.clkr.hw,
1001 			},
1002 			.num_parents = 1,
1003 			.flags = CLK_SET_RATE_PARENT,
1004 			.ops = &clk_branch2_ops,
1005 		},
1006 	},
1007 };
1008 
1009 static struct clk_branch disp_cc_mdss_dptx1_link_clk = {
1010 	.halt_reg = 0x8064,
1011 	.halt_check = BRANCH_HALT,
1012 	.clkr = {
1013 		.enable_reg = 0x8064,
1014 		.enable_mask = BIT(0),
1015 		.hw.init = &(const struct clk_init_data) {
1016 			.name = "disp_cc_mdss_dptx1_link_clk",
1017 			.parent_hws = (const struct clk_hw*[]) {
1018 				&disp_cc_mdss_dptx1_link_clk_src.clkr.hw,
1019 			},
1020 			.num_parents = 1,
1021 			.flags = CLK_SET_RATE_PARENT,
1022 			.ops = &clk_branch2_ops,
1023 		},
1024 	},
1025 };
1026 
1027 static struct clk_branch disp_cc_mdss_dptx1_link_intf_clk = {
1028 	.halt_reg = 0x806c,
1029 	.halt_check = BRANCH_HALT,
1030 	.clkr = {
1031 		.enable_reg = 0x806c,
1032 		.enable_mask = BIT(0),
1033 		.hw.init = &(const struct clk_init_data) {
1034 			.name = "disp_cc_mdss_dptx1_link_intf_clk",
1035 			.parent_hws = (const struct clk_hw*[]) {
1036 				&disp_cc_mdss_dptx1_link_div_clk_src.clkr.hw,
1037 			},
1038 			.num_parents = 1,
1039 			.flags = CLK_SET_RATE_PARENT,
1040 			.ops = &clk_branch2_ops,
1041 		},
1042 	},
1043 };
1044 
1045 static struct clk_branch disp_cc_mdss_dptx1_pixel0_clk = {
1046 	.halt_reg = 0x805c,
1047 	.halt_check = BRANCH_HALT,
1048 	.clkr = {
1049 		.enable_reg = 0x805c,
1050 		.enable_mask = BIT(0),
1051 		.hw.init = &(const struct clk_init_data) {
1052 			.name = "disp_cc_mdss_dptx1_pixel0_clk",
1053 			.parent_hws = (const struct clk_hw*[]) {
1054 				&disp_cc_mdss_dptx1_pixel0_clk_src.clkr.hw,
1055 			},
1056 			.num_parents = 1,
1057 			.flags = CLK_SET_RATE_PARENT,
1058 			.ops = &clk_branch2_ops,
1059 		},
1060 	},
1061 };
1062 
1063 static struct clk_branch disp_cc_mdss_dptx1_pixel1_clk = {
1064 	.halt_reg = 0x8060,
1065 	.halt_check = BRANCH_HALT,
1066 	.clkr = {
1067 		.enable_reg = 0x8060,
1068 		.enable_mask = BIT(0),
1069 		.hw.init = &(const struct clk_init_data) {
1070 			.name = "disp_cc_mdss_dptx1_pixel1_clk",
1071 			.parent_hws = (const struct clk_hw*[]) {
1072 				&disp_cc_mdss_dptx1_pixel1_clk_src.clkr.hw,
1073 			},
1074 			.num_parents = 1,
1075 			.flags = CLK_SET_RATE_PARENT,
1076 			.ops = &clk_branch2_ops,
1077 		},
1078 	},
1079 };
1080 
1081 static struct clk_branch disp_cc_mdss_dptx1_usb_router_link_intf_clk = {
1082 	.halt_reg = 0x8068,
1083 	.halt_check = BRANCH_HALT,
1084 	.clkr = {
1085 		.enable_reg = 0x8068,
1086 		.enable_mask = BIT(0),
1087 		.hw.init = &(const struct clk_init_data) {
1088 			.name = "disp_cc_mdss_dptx1_usb_router_link_intf_clk",
1089 			.parent_hws = (const struct clk_hw*[]) {
1090 				&disp_cc_mdss_dptx1_link_div_clk_src.clkr.hw,
1091 			},
1092 			.num_parents = 1,
1093 			.flags = CLK_SET_RATE_PARENT,
1094 			.ops = &clk_branch2_ops,
1095 		},
1096 	},
1097 };
1098 
1099 static struct clk_branch disp_cc_mdss_dptx2_aux_clk = {
1100 	.halt_reg = 0x8090,
1101 	.halt_check = BRANCH_HALT,
1102 	.clkr = {
1103 		.enable_reg = 0x8090,
1104 		.enable_mask = BIT(0),
1105 		.hw.init = &(const struct clk_init_data) {
1106 			.name = "disp_cc_mdss_dptx2_aux_clk",
1107 			.parent_hws = (const struct clk_hw*[]) {
1108 				&disp_cc_mdss_dptx2_aux_clk_src.clkr.hw,
1109 			},
1110 			.num_parents = 1,
1111 			.flags = CLK_SET_RATE_PARENT,
1112 			.ops = &clk_branch2_ops,
1113 		},
1114 	},
1115 };
1116 
1117 static struct clk_branch disp_cc_mdss_dptx2_link_clk = {
1118 	.halt_reg = 0x8080,
1119 	.halt_check = BRANCH_HALT,
1120 	.clkr = {
1121 		.enable_reg = 0x8080,
1122 		.enable_mask = BIT(0),
1123 		.hw.init = &(const struct clk_init_data) {
1124 			.name = "disp_cc_mdss_dptx2_link_clk",
1125 			.parent_hws = (const struct clk_hw*[]) {
1126 				&disp_cc_mdss_dptx2_link_clk_src.clkr.hw,
1127 			},
1128 			.num_parents = 1,
1129 			.flags = CLK_SET_RATE_PARENT,
1130 			.ops = &clk_branch2_ops,
1131 		},
1132 	},
1133 };
1134 
1135 static struct clk_branch disp_cc_mdss_dptx2_link_intf_clk = {
1136 	.halt_reg = 0x8084,
1137 	.halt_check = BRANCH_HALT,
1138 	.clkr = {
1139 		.enable_reg = 0x8084,
1140 		.enable_mask = BIT(0),
1141 		.hw.init = &(const struct clk_init_data) {
1142 			.name = "disp_cc_mdss_dptx2_link_intf_clk",
1143 			.parent_hws = (const struct clk_hw*[]) {
1144 				&disp_cc_mdss_dptx2_link_div_clk_src.clkr.hw,
1145 			},
1146 			.num_parents = 1,
1147 			.flags = CLK_SET_RATE_PARENT,
1148 			.ops = &clk_branch2_ops,
1149 		},
1150 	},
1151 };
1152 
1153 static struct clk_branch disp_cc_mdss_dptx2_pixel0_clk = {
1154 	.halt_reg = 0x8078,
1155 	.halt_check = BRANCH_HALT,
1156 	.clkr = {
1157 		.enable_reg = 0x8078,
1158 		.enable_mask = BIT(0),
1159 		.hw.init = &(const struct clk_init_data) {
1160 			.name = "disp_cc_mdss_dptx2_pixel0_clk",
1161 			.parent_hws = (const struct clk_hw*[]) {
1162 				&disp_cc_mdss_dptx2_pixel0_clk_src.clkr.hw,
1163 			},
1164 			.num_parents = 1,
1165 			.flags = CLK_SET_RATE_PARENT,
1166 			.ops = &clk_branch2_ops,
1167 		},
1168 	},
1169 };
1170 
1171 static struct clk_branch disp_cc_mdss_dptx2_pixel1_clk = {
1172 	.halt_reg = 0x807c,
1173 	.halt_check = BRANCH_HALT,
1174 	.clkr = {
1175 		.enable_reg = 0x807c,
1176 		.enable_mask = BIT(0),
1177 		.hw.init = &(const struct clk_init_data) {
1178 			.name = "disp_cc_mdss_dptx2_pixel1_clk",
1179 			.parent_hws = (const struct clk_hw*[]) {
1180 				&disp_cc_mdss_dptx2_pixel1_clk_src.clkr.hw,
1181 			},
1182 			.num_parents = 1,
1183 			.flags = CLK_SET_RATE_PARENT,
1184 			.ops = &clk_branch2_ops,
1185 		},
1186 	},
1187 };
1188 
1189 static struct clk_branch disp_cc_mdss_dptx2_usb_router_link_intf_clk = {
1190 	.halt_reg = 0x8088,
1191 	.halt_check = BRANCH_HALT,
1192 	.clkr = {
1193 		.enable_reg = 0x8088,
1194 		.enable_mask = BIT(0),
1195 		.hw.init = &(const struct clk_init_data) {
1196 			.name = "disp_cc_mdss_dptx2_usb_router_link_intf_clk",
1197 			.parent_hws = (const struct clk_hw*[]) {
1198 				&disp_cc_mdss_dptx2_link_div_clk_src.clkr.hw,
1199 			},
1200 			.num_parents = 1,
1201 			.flags = CLK_SET_RATE_PARENT,
1202 			.ops = &clk_branch2_ops,
1203 		},
1204 	},
1205 };
1206 
1207 static struct clk_branch disp_cc_mdss_dptx3_aux_clk = {
1208 	.halt_reg = 0x80a0,
1209 	.halt_check = BRANCH_HALT,
1210 	.clkr = {
1211 		.enable_reg = 0x80a0,
1212 		.enable_mask = BIT(0),
1213 		.hw.init = &(const struct clk_init_data) {
1214 			.name = "disp_cc_mdss_dptx3_aux_clk",
1215 			.parent_hws = (const struct clk_hw*[]) {
1216 				&disp_cc_mdss_dptx3_aux_clk_src.clkr.hw,
1217 			},
1218 			.num_parents = 1,
1219 			.flags = CLK_SET_RATE_PARENT,
1220 			.ops = &clk_branch2_ops,
1221 		},
1222 	},
1223 };
1224 
1225 static struct clk_branch disp_cc_mdss_dptx3_link_clk = {
1226 	.halt_reg = 0x8098,
1227 	.halt_check = BRANCH_HALT,
1228 	.clkr = {
1229 		.enable_reg = 0x8098,
1230 		.enable_mask = BIT(0),
1231 		.hw.init = &(const struct clk_init_data) {
1232 			.name = "disp_cc_mdss_dptx3_link_clk",
1233 			.parent_hws = (const struct clk_hw*[]) {
1234 				&disp_cc_mdss_dptx3_link_clk_src.clkr.hw,
1235 			},
1236 			.num_parents = 1,
1237 			.flags = CLK_SET_RATE_PARENT,
1238 			.ops = &clk_branch2_ops,
1239 		},
1240 	},
1241 };
1242 
1243 static struct clk_branch disp_cc_mdss_dptx3_link_intf_clk = {
1244 	.halt_reg = 0x809c,
1245 	.halt_check = BRANCH_HALT,
1246 	.clkr = {
1247 		.enable_reg = 0x809c,
1248 		.enable_mask = BIT(0),
1249 		.hw.init = &(const struct clk_init_data) {
1250 			.name = "disp_cc_mdss_dptx3_link_intf_clk",
1251 			.parent_hws = (const struct clk_hw*[]) {
1252 				&disp_cc_mdss_dptx3_link_div_clk_src.clkr.hw,
1253 			},
1254 			.num_parents = 1,
1255 			.flags = CLK_SET_RATE_PARENT,
1256 			.ops = &clk_branch2_ops,
1257 		},
1258 	},
1259 };
1260 
1261 static struct clk_branch disp_cc_mdss_dptx3_pixel0_clk = {
1262 	.halt_reg = 0x8094,
1263 	.halt_check = BRANCH_HALT,
1264 	.clkr = {
1265 		.enable_reg = 0x8094,
1266 		.enable_mask = BIT(0),
1267 		.hw.init = &(const struct clk_init_data) {
1268 			.name = "disp_cc_mdss_dptx3_pixel0_clk",
1269 			.parent_hws = (const struct clk_hw*[]) {
1270 				&disp_cc_mdss_dptx3_pixel0_clk_src.clkr.hw,
1271 			},
1272 			.num_parents = 1,
1273 			.flags = CLK_SET_RATE_PARENT,
1274 			.ops = &clk_branch2_ops,
1275 		},
1276 	},
1277 };
1278 
1279 static struct clk_branch disp_cc_mdss_esc0_clk = {
1280 	.halt_reg = 0x8038,
1281 	.halt_check = BRANCH_HALT,
1282 	.clkr = {
1283 		.enable_reg = 0x8038,
1284 		.enable_mask = BIT(0),
1285 		.hw.init = &(const struct clk_init_data) {
1286 			.name = "disp_cc_mdss_esc0_clk",
1287 			.parent_hws = (const struct clk_hw*[]) {
1288 				&disp_cc_mdss_esc0_clk_src.clkr.hw,
1289 			},
1290 			.num_parents = 1,
1291 			.flags = CLK_SET_RATE_PARENT,
1292 			.ops = &clk_branch2_ops,
1293 		},
1294 	},
1295 };
1296 
1297 static struct clk_branch disp_cc_mdss_esc1_clk = {
1298 	.halt_reg = 0x803c,
1299 	.halt_check = BRANCH_HALT,
1300 	.clkr = {
1301 		.enable_reg = 0x803c,
1302 		.enable_mask = BIT(0),
1303 		.hw.init = &(const struct clk_init_data) {
1304 			.name = "disp_cc_mdss_esc1_clk",
1305 			.parent_hws = (const struct clk_hw*[]) {
1306 				&disp_cc_mdss_esc1_clk_src.clkr.hw,
1307 			},
1308 			.num_parents = 1,
1309 			.flags = CLK_SET_RATE_PARENT,
1310 			.ops = &clk_branch2_ops,
1311 		},
1312 	},
1313 };
1314 
1315 static struct clk_branch disp_cc_mdss_mdp1_clk = {
1316 	.halt_reg = 0xa004,
1317 	.halt_check = BRANCH_HALT,
1318 	.clkr = {
1319 		.enable_reg = 0xa004,
1320 		.enable_mask = BIT(0),
1321 		.hw.init = &(const struct clk_init_data) {
1322 			.name = "disp_cc_mdss_mdp1_clk",
1323 			.parent_hws = (const struct clk_hw*[]) {
1324 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
1325 			},
1326 			.num_parents = 1,
1327 			.flags = CLK_SET_RATE_PARENT,
1328 			.ops = &clk_branch2_ops,
1329 		},
1330 	},
1331 };
1332 
1333 static struct clk_branch disp_cc_mdss_mdp_clk = {
1334 	.halt_reg = 0x800c,
1335 	.halt_check = BRANCH_HALT,
1336 	.clkr = {
1337 		.enable_reg = 0x800c,
1338 		.enable_mask = BIT(0),
1339 		.hw.init = &(const struct clk_init_data) {
1340 			.name = "disp_cc_mdss_mdp_clk",
1341 			.parent_hws = (const struct clk_hw*[]) {
1342 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
1343 			},
1344 			.num_parents = 1,
1345 			.flags = CLK_SET_RATE_PARENT,
1346 			.ops = &clk_branch2_ops,
1347 		},
1348 	},
1349 };
1350 
1351 static struct clk_branch disp_cc_mdss_mdp_lut1_clk = {
1352 	.halt_reg = 0xa010,
1353 	.halt_check = BRANCH_HALT,
1354 	.clkr = {
1355 		.enable_reg = 0xa010,
1356 		.enable_mask = BIT(0),
1357 		.hw.init = &(const struct clk_init_data) {
1358 			.name = "disp_cc_mdss_mdp_lut1_clk",
1359 			.parent_hws = (const struct clk_hw*[]) {
1360 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
1361 			},
1362 			.num_parents = 1,
1363 			.flags = CLK_SET_RATE_PARENT,
1364 			.ops = &clk_branch2_ops,
1365 		},
1366 	},
1367 };
1368 
1369 static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
1370 	.halt_reg = 0x8018,
1371 	.halt_check = BRANCH_HALT_VOTED,
1372 	.clkr = {
1373 		.enable_reg = 0x8018,
1374 		.enable_mask = BIT(0),
1375 		.hw.init = &(const struct clk_init_data) {
1376 			.name = "disp_cc_mdss_mdp_lut_clk",
1377 			.parent_hws = (const struct clk_hw*[]) {
1378 				&disp_cc_mdss_mdp_clk_src.clkr.hw,
1379 			},
1380 			.num_parents = 1,
1381 			.flags = CLK_SET_RATE_PARENT,
1382 			.ops = &clk_branch2_ops,
1383 		},
1384 	},
1385 };
1386 
1387 static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
1388 	.halt_reg = 0xc004,
1389 	.halt_check = BRANCH_HALT_VOTED,
1390 	.clkr = {
1391 		.enable_reg = 0xc004,
1392 		.enable_mask = BIT(0),
1393 		.hw.init = &(const struct clk_init_data) {
1394 			.name = "disp_cc_mdss_non_gdsc_ahb_clk",
1395 			.parent_hws = (const struct clk_hw*[]) {
1396 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
1397 			},
1398 			.num_parents = 1,
1399 			.flags = CLK_SET_RATE_PARENT,
1400 			.ops = &clk_branch2_ops,
1401 		},
1402 	},
1403 };
1404 
1405 static struct clk_branch disp_cc_mdss_pclk0_clk = {
1406 	.halt_reg = 0x8004,
1407 	.halt_check = BRANCH_HALT,
1408 	.clkr = {
1409 		.enable_reg = 0x8004,
1410 		.enable_mask = BIT(0),
1411 		.hw.init = &(const struct clk_init_data) {
1412 			.name = "disp_cc_mdss_pclk0_clk",
1413 			.parent_hws = (const struct clk_hw*[]) {
1414 				&disp_cc_mdss_pclk0_clk_src.clkr.hw,
1415 			},
1416 			.num_parents = 1,
1417 			.flags = CLK_SET_RATE_PARENT,
1418 			.ops = &clk_branch2_ops,
1419 		},
1420 	},
1421 };
1422 
1423 static struct clk_branch disp_cc_mdss_pclk1_clk = {
1424 	.halt_reg = 0x8008,
1425 	.halt_check = BRANCH_HALT,
1426 	.clkr = {
1427 		.enable_reg = 0x8008,
1428 		.enable_mask = BIT(0),
1429 		.hw.init = &(const struct clk_init_data) {
1430 			.name = "disp_cc_mdss_pclk1_clk",
1431 			.parent_hws = (const struct clk_hw*[]) {
1432 				&disp_cc_mdss_pclk1_clk_src.clkr.hw,
1433 			},
1434 			.num_parents = 1,
1435 			.flags = CLK_SET_RATE_PARENT,
1436 			.ops = &clk_branch2_ops,
1437 		},
1438 	},
1439 };
1440 
1441 static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
1442 	.halt_reg = 0xc00c,
1443 	.halt_check = BRANCH_HALT,
1444 	.clkr = {
1445 		.enable_reg = 0xc00c,
1446 		.enable_mask = BIT(0),
1447 		.hw.init = &(const struct clk_init_data) {
1448 			.name = "disp_cc_mdss_rscc_ahb_clk",
1449 			.parent_hws = (const struct clk_hw*[]) {
1450 				&disp_cc_mdss_ahb_clk_src.clkr.hw,
1451 			},
1452 			.num_parents = 1,
1453 			.flags = CLK_SET_RATE_PARENT,
1454 			.ops = &clk_branch2_ops,
1455 		},
1456 	},
1457 };
1458 
1459 static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
1460 	.halt_reg = 0xc008,
1461 	.halt_check = BRANCH_HALT,
1462 	.clkr = {
1463 		.enable_reg = 0xc008,
1464 		.enable_mask = BIT(0),
1465 		.hw.init = &(const struct clk_init_data) {
1466 			.name = "disp_cc_mdss_rscc_vsync_clk",
1467 			.parent_hws = (const struct clk_hw*[]) {
1468 				&disp_cc_mdss_vsync_clk_src.clkr.hw,
1469 			},
1470 			.num_parents = 1,
1471 			.flags = CLK_SET_RATE_PARENT,
1472 			.ops = &clk_branch2_ops,
1473 		},
1474 	},
1475 };
1476 
1477 static struct clk_branch disp_cc_mdss_vsync1_clk = {
1478 	.halt_reg = 0xa01c,
1479 	.halt_check = BRANCH_HALT,
1480 	.clkr = {
1481 		.enable_reg = 0xa01c,
1482 		.enable_mask = BIT(0),
1483 		.hw.init = &(const struct clk_init_data) {
1484 			.name = "disp_cc_mdss_vsync1_clk",
1485 			.parent_hws = (const struct clk_hw*[]) {
1486 				&disp_cc_mdss_vsync_clk_src.clkr.hw,
1487 			},
1488 			.num_parents = 1,
1489 			.flags = CLK_SET_RATE_PARENT,
1490 			.ops = &clk_branch2_ops,
1491 		},
1492 	},
1493 };
1494 
1495 static struct clk_branch disp_cc_mdss_vsync_clk = {
1496 	.halt_reg = 0x8024,
1497 	.halt_check = BRANCH_HALT,
1498 	.clkr = {
1499 		.enable_reg = 0x8024,
1500 		.enable_mask = BIT(0),
1501 		.hw.init = &(const struct clk_init_data) {
1502 			.name = "disp_cc_mdss_vsync_clk",
1503 			.parent_hws = (const struct clk_hw*[]) {
1504 				&disp_cc_mdss_vsync_clk_src.clkr.hw,
1505 			},
1506 			.num_parents = 1,
1507 			.flags = CLK_SET_RATE_PARENT,
1508 			.ops = &clk_branch2_ops,
1509 		},
1510 	},
1511 };
1512 
1513 static struct gdsc mdss_gdsc = {
1514 	.gdscr = 0x9000,
1515 	.en_rest_wait_val = 0x2,
1516 	.en_few_wait_val = 0x2,
1517 	.clk_dis_wait_val = 0xf,
1518 	.pd = {
1519 		.name = "mdss_gdsc",
1520 	},
1521 	.pwrsts = PWRSTS_OFF_ON,
1522 	.flags = HW_CTRL | RETAIN_FF_ENABLE,
1523 };
1524 
1525 static struct gdsc mdss_int2_gdsc = {
1526 	.gdscr = 0xb000,
1527 	.en_rest_wait_val = 0x2,
1528 	.en_few_wait_val = 0x2,
1529 	.clk_dis_wait_val = 0xf,
1530 	.pd = {
1531 		.name = "mdss_int2_gdsc",
1532 	},
1533 	.pwrsts = PWRSTS_OFF_ON,
1534 	.flags = HW_CTRL | RETAIN_FF_ENABLE,
1535 };
1536 
1537 static struct clk_regmap *disp_cc_x1e80100_clocks[] = {
1538 	[DISP_CC_MDSS_ACCU_CLK] = &disp_cc_mdss_accu_clk.clkr,
1539 	[DISP_CC_MDSS_AHB1_CLK] = &disp_cc_mdss_ahb1_clk.clkr,
1540 	[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
1541 	[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
1542 	[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
1543 	[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
1544 	[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
1545 	[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
1546 	[DISP_CC_MDSS_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr,
1547 	[DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr,
1548 	[DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] = &disp_cc_mdss_byte1_div_clk_src.clkr,
1549 	[DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr,
1550 	[DISP_CC_MDSS_DPTX0_AUX_CLK] = &disp_cc_mdss_dptx0_aux_clk.clkr,
1551 	[DISP_CC_MDSS_DPTX0_AUX_CLK_SRC] = &disp_cc_mdss_dptx0_aux_clk_src.clkr,
1552 	[DISP_CC_MDSS_DPTX0_LINK_CLK] = &disp_cc_mdss_dptx0_link_clk.clkr,
1553 	[DISP_CC_MDSS_DPTX0_LINK_CLK_SRC] = &disp_cc_mdss_dptx0_link_clk_src.clkr,
1554 	[DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx0_link_div_clk_src.clkr,
1555 	[DISP_CC_MDSS_DPTX0_LINK_INTF_CLK] = &disp_cc_mdss_dptx0_link_intf_clk.clkr,
1556 	[DISP_CC_MDSS_DPTX0_PIXEL0_CLK] = &disp_cc_mdss_dptx0_pixel0_clk.clkr,
1557 	[DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx0_pixel0_clk_src.clkr,
1558 	[DISP_CC_MDSS_DPTX0_PIXEL1_CLK] = &disp_cc_mdss_dptx0_pixel1_clk.clkr,
1559 	[DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx0_pixel1_clk_src.clkr,
1560 	[DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK] =
1561 		&disp_cc_mdss_dptx0_usb_router_link_intf_clk.clkr,
1562 	[DISP_CC_MDSS_DPTX1_AUX_CLK] = &disp_cc_mdss_dptx1_aux_clk.clkr,
1563 	[DISP_CC_MDSS_DPTX1_AUX_CLK_SRC] = &disp_cc_mdss_dptx1_aux_clk_src.clkr,
1564 	[DISP_CC_MDSS_DPTX1_LINK_CLK] = &disp_cc_mdss_dptx1_link_clk.clkr,
1565 	[DISP_CC_MDSS_DPTX1_LINK_CLK_SRC] = &disp_cc_mdss_dptx1_link_clk_src.clkr,
1566 	[DISP_CC_MDSS_DPTX1_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx1_link_div_clk_src.clkr,
1567 	[DISP_CC_MDSS_DPTX1_LINK_INTF_CLK] = &disp_cc_mdss_dptx1_link_intf_clk.clkr,
1568 	[DISP_CC_MDSS_DPTX1_PIXEL0_CLK] = &disp_cc_mdss_dptx1_pixel0_clk.clkr,
1569 	[DISP_CC_MDSS_DPTX1_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx1_pixel0_clk_src.clkr,
1570 	[DISP_CC_MDSS_DPTX1_PIXEL1_CLK] = &disp_cc_mdss_dptx1_pixel1_clk.clkr,
1571 	[DISP_CC_MDSS_DPTX1_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx1_pixel1_clk_src.clkr,
1572 	[DISP_CC_MDSS_DPTX1_USB_ROUTER_LINK_INTF_CLK] =
1573 		&disp_cc_mdss_dptx1_usb_router_link_intf_clk.clkr,
1574 	[DISP_CC_MDSS_DPTX2_AUX_CLK] = &disp_cc_mdss_dptx2_aux_clk.clkr,
1575 	[DISP_CC_MDSS_DPTX2_AUX_CLK_SRC] = &disp_cc_mdss_dptx2_aux_clk_src.clkr,
1576 	[DISP_CC_MDSS_DPTX2_LINK_CLK] = &disp_cc_mdss_dptx2_link_clk.clkr,
1577 	[DISP_CC_MDSS_DPTX2_LINK_CLK_SRC] = &disp_cc_mdss_dptx2_link_clk_src.clkr,
1578 	[DISP_CC_MDSS_DPTX2_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx2_link_div_clk_src.clkr,
1579 	[DISP_CC_MDSS_DPTX2_LINK_INTF_CLK] = &disp_cc_mdss_dptx2_link_intf_clk.clkr,
1580 	[DISP_CC_MDSS_DPTX2_PIXEL0_CLK] = &disp_cc_mdss_dptx2_pixel0_clk.clkr,
1581 	[DISP_CC_MDSS_DPTX2_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx2_pixel0_clk_src.clkr,
1582 	[DISP_CC_MDSS_DPTX2_PIXEL1_CLK] = &disp_cc_mdss_dptx2_pixel1_clk.clkr,
1583 	[DISP_CC_MDSS_DPTX2_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx2_pixel1_clk_src.clkr,
1584 	[DISP_CC_MDSS_DPTX2_USB_ROUTER_LINK_INTF_CLK] =
1585 		&disp_cc_mdss_dptx2_usb_router_link_intf_clk.clkr,
1586 	[DISP_CC_MDSS_DPTX3_AUX_CLK] = &disp_cc_mdss_dptx3_aux_clk.clkr,
1587 	[DISP_CC_MDSS_DPTX3_AUX_CLK_SRC] = &disp_cc_mdss_dptx3_aux_clk_src.clkr,
1588 	[DISP_CC_MDSS_DPTX3_LINK_CLK] = &disp_cc_mdss_dptx3_link_clk.clkr,
1589 	[DISP_CC_MDSS_DPTX3_LINK_CLK_SRC] = &disp_cc_mdss_dptx3_link_clk_src.clkr,
1590 	[DISP_CC_MDSS_DPTX3_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx3_link_div_clk_src.clkr,
1591 	[DISP_CC_MDSS_DPTX3_LINK_INTF_CLK] = &disp_cc_mdss_dptx3_link_intf_clk.clkr,
1592 	[DISP_CC_MDSS_DPTX3_PIXEL0_CLK] = &disp_cc_mdss_dptx3_pixel0_clk.clkr,
1593 	[DISP_CC_MDSS_DPTX3_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx3_pixel0_clk_src.clkr,
1594 	[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
1595 	[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
1596 	[DISP_CC_MDSS_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr,
1597 	[DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr,
1598 	[DISP_CC_MDSS_MDP1_CLK] = &disp_cc_mdss_mdp1_clk.clkr,
1599 	[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
1600 	[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
1601 	[DISP_CC_MDSS_MDP_LUT1_CLK] = &disp_cc_mdss_mdp_lut1_clk.clkr,
1602 	[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
1603 	[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
1604 	[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
1605 	[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
1606 	[DISP_CC_MDSS_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr,
1607 	[DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr,
1608 	[DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
1609 	[DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
1610 	[DISP_CC_MDSS_VSYNC1_CLK] = &disp_cc_mdss_vsync1_clk.clkr,
1611 	[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
1612 	[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
1613 	[DISP_CC_PLL0] = &disp_cc_pll0.clkr,
1614 	[DISP_CC_PLL1] = &disp_cc_pll1.clkr,
1615 	[DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
1616 	[DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr,
1617 };
1618 
1619 static const struct qcom_reset_map disp_cc_x1e80100_resets[] = {
1620 	[DISP_CC_MDSS_CORE_BCR] = { 0x8000 },
1621 	[DISP_CC_MDSS_CORE_INT2_BCR] = { 0xa000 },
1622 	[DISP_CC_MDSS_RSCC_BCR] = { 0xc000 },
1623 };
1624 
1625 static struct gdsc *disp_cc_x1e80100_gdscs[] = {
1626 	[MDSS_GDSC] = &mdss_gdsc,
1627 	[MDSS_INT2_GDSC] = &mdss_int2_gdsc,
1628 };
1629 
1630 static const struct regmap_config disp_cc_x1e80100_regmap_config = {
1631 	.reg_bits = 32,
1632 	.reg_stride = 4,
1633 	.val_bits = 32,
1634 	.max_register = 0x11008,
1635 	.fast_io = true,
1636 };
1637 
1638 static const struct qcom_cc_desc disp_cc_x1e80100_desc = {
1639 	.config = &disp_cc_x1e80100_regmap_config,
1640 	.clks = disp_cc_x1e80100_clocks,
1641 	.num_clks = ARRAY_SIZE(disp_cc_x1e80100_clocks),
1642 	.resets = disp_cc_x1e80100_resets,
1643 	.num_resets = ARRAY_SIZE(disp_cc_x1e80100_resets),
1644 	.gdscs = disp_cc_x1e80100_gdscs,
1645 	.num_gdscs = ARRAY_SIZE(disp_cc_x1e80100_gdscs),
1646 };
1647 
1648 static const struct of_device_id disp_cc_x1e80100_match_table[] = {
1649 	{ .compatible = "qcom,x1e80100-dispcc" },
1650 	{ }
1651 };
1652 MODULE_DEVICE_TABLE(of, disp_cc_x1e80100_match_table);
1653 
disp_cc_x1e80100_probe(struct platform_device * pdev)1654 static int disp_cc_x1e80100_probe(struct platform_device *pdev)
1655 {
1656 	struct regmap *regmap;
1657 	int ret;
1658 
1659 	ret = devm_pm_runtime_enable(&pdev->dev);
1660 	if (ret)
1661 		return ret;
1662 
1663 	ret = pm_runtime_resume_and_get(&pdev->dev);
1664 	if (ret)
1665 		return ret;
1666 
1667 	regmap = qcom_cc_map(pdev, &disp_cc_x1e80100_desc);
1668 	if (IS_ERR(regmap)) {
1669 		ret = PTR_ERR(regmap);
1670 		goto err_put_rpm;
1671 	}
1672 
1673 	clk_lucid_evo_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
1674 	clk_lucid_evo_pll_configure(&disp_cc_pll1, regmap, &disp_cc_pll1_config);
1675 
1676 	/* Enable clock gating for MDP clocks */
1677 	regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
1678 
1679 	/* Keep clocks always enabled */
1680 	qcom_branch_set_clk_en(regmap, 0xe074); /* DISP_CC_SLEEP_CLK */
1681 	qcom_branch_set_clk_en(regmap, 0xe054); /* DISP_CC_XO_CLK */
1682 
1683 	ret = qcom_cc_really_probe(&pdev->dev, &disp_cc_x1e80100_desc, regmap);
1684 	if (ret)
1685 		goto err_put_rpm;
1686 
1687 	pm_runtime_put(&pdev->dev);
1688 
1689 	return 0;
1690 
1691 err_put_rpm:
1692 	pm_runtime_put_sync(&pdev->dev);
1693 
1694 	return ret;
1695 }
1696 
1697 static struct platform_driver disp_cc_x1e80100_driver = {
1698 	.probe = disp_cc_x1e80100_probe,
1699 	.driver = {
1700 		.name = "dispcc-x1e80100",
1701 		.of_match_table = disp_cc_x1e80100_match_table,
1702 	},
1703 };
1704 
disp_cc_x1e80100_init(void)1705 static int __init disp_cc_x1e80100_init(void)
1706 {
1707 	return platform_driver_register(&disp_cc_x1e80100_driver);
1708 }
1709 subsys_initcall(disp_cc_x1e80100_init);
1710 
disp_cc_x1e80100_exit(void)1711 static void __exit disp_cc_x1e80100_exit(void)
1712 {
1713 	platform_driver_unregister(&disp_cc_x1e80100_driver);
1714 }
1715 module_exit(disp_cc_x1e80100_exit);
1716 
1717 MODULE_DESCRIPTION("QTI Display Clock Controller X1E80100 Driver");
1718 MODULE_LICENSE("GPL");
1719