]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/clk/qcom/dispcc-sdm845.c
Merge tag 'v4.20' into next
[mirror_ubuntu-jammy-kernel.git] / drivers / clk / qcom / dispcc-sdm845.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2018, The Linux Foundation. All rights reserved.
4 */
5
6 #include <linux/clk-provider.h>
7 #include <linux/module.h>
8 #include <linux/platform_device.h>
9 #include <linux/regmap.h>
10 #include <linux/reset-controller.h>
11
12 #include <dt-bindings/clock/qcom,dispcc-sdm845.h>
13
14 #include "clk-alpha-pll.h"
15 #include "clk-branch.h"
16 #include "clk-rcg.h"
17 #include "clk-regmap-divider.h"
18 #include "common.h"
19 #include "gdsc.h"
20 #include "reset.h"
21
22 enum {
23 P_BI_TCXO,
24 P_CORE_BI_PLL_TEST_SE,
25 P_DISP_CC_PLL0_OUT_MAIN,
26 P_DSI0_PHY_PLL_OUT_BYTECLK,
27 P_DSI0_PHY_PLL_OUT_DSICLK,
28 P_DSI1_PHY_PLL_OUT_BYTECLK,
29 P_DSI1_PHY_PLL_OUT_DSICLK,
30 P_GPLL0_OUT_MAIN,
31 P_GPLL0_OUT_MAIN_DIV,
32 };
33
34 static const struct parent_map disp_cc_parent_map_0[] = {
35 { P_BI_TCXO, 0 },
36 { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
37 { P_DSI1_PHY_PLL_OUT_BYTECLK, 2 },
38 { P_CORE_BI_PLL_TEST_SE, 7 },
39 };
40
41 static const char * const disp_cc_parent_names_0[] = {
42 "bi_tcxo",
43 "dsi0_phy_pll_out_byteclk",
44 "dsi1_phy_pll_out_byteclk",
45 "core_bi_pll_test_se",
46 };
47
48 static const struct parent_map disp_cc_parent_map_2[] = {
49 { P_BI_TCXO, 0 },
50 { P_CORE_BI_PLL_TEST_SE, 7 },
51 };
52
53 static const char * const disp_cc_parent_names_2[] = {
54 "bi_tcxo",
55 "core_bi_pll_test_se",
56 };
57
58 static const struct parent_map disp_cc_parent_map_3[] = {
59 { P_BI_TCXO, 0 },
60 { P_DISP_CC_PLL0_OUT_MAIN, 1 },
61 { P_GPLL0_OUT_MAIN, 4 },
62 { P_GPLL0_OUT_MAIN_DIV, 5 },
63 { P_CORE_BI_PLL_TEST_SE, 7 },
64 };
65
66 static const char * const disp_cc_parent_names_3[] = {
67 "bi_tcxo",
68 "disp_cc_pll0",
69 "gcc_disp_gpll0_clk_src",
70 "gcc_disp_gpll0_div_clk_src",
71 "core_bi_pll_test_se",
72 };
73
74 static const struct parent_map disp_cc_parent_map_4[] = {
75 { P_BI_TCXO, 0 },
76 { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
77 { P_DSI1_PHY_PLL_OUT_DSICLK, 2 },
78 { P_CORE_BI_PLL_TEST_SE, 7 },
79 };
80
81 static const char * const disp_cc_parent_names_4[] = {
82 "bi_tcxo",
83 "dsi0_phy_pll_out_dsiclk",
84 "dsi1_phy_pll_out_dsiclk",
85 "core_bi_pll_test_se",
86 };
87
88 static struct clk_alpha_pll disp_cc_pll0 = {
89 .offset = 0x0,
90 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
91 .clkr = {
92 .hw.init = &(struct clk_init_data){
93 .name = "disp_cc_pll0",
94 .parent_names = (const char *[]){ "bi_tcxo" },
95 .num_parents = 1,
96 .ops = &clk_alpha_pll_fabia_ops,
97 },
98 },
99 };
100
101 /* Return the HW recalc rate for idle use case */
102 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
103 .cmd_rcgr = 0x20d0,
104 .mnd_width = 0,
105 .hid_width = 5,
106 .parent_map = disp_cc_parent_map_0,
107 .clkr.hw.init = &(struct clk_init_data){
108 .name = "disp_cc_mdss_byte0_clk_src",
109 .parent_names = disp_cc_parent_names_0,
110 .num_parents = 4,
111 .flags = CLK_SET_RATE_PARENT,
112 .ops = &clk_byte2_ops,
113 },
114 };
115
116 /* Return the HW recalc rate for idle use case */
117 static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = {
118 .cmd_rcgr = 0x20ec,
119 .mnd_width = 0,
120 .hid_width = 5,
121 .parent_map = disp_cc_parent_map_0,
122 .clkr.hw.init = &(struct clk_init_data){
123 .name = "disp_cc_mdss_byte1_clk_src",
124 .parent_names = disp_cc_parent_names_0,
125 .num_parents = 4,
126 .flags = CLK_SET_RATE_PARENT,
127 .ops = &clk_byte2_ops,
128 },
129 };
130
131 static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
132 F(19200000, P_BI_TCXO, 1, 0, 0),
133 { }
134 };
135
136 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
137 .cmd_rcgr = 0x2108,
138 .mnd_width = 0,
139 .hid_width = 5,
140 .parent_map = disp_cc_parent_map_0,
141 .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
142 .clkr.hw.init = &(struct clk_init_data){
143 .name = "disp_cc_mdss_esc0_clk_src",
144 .parent_names = disp_cc_parent_names_0,
145 .num_parents = 4,
146 .ops = &clk_rcg2_ops,
147 },
148 };
149
150 static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = {
151 .cmd_rcgr = 0x2120,
152 .mnd_width = 0,
153 .hid_width = 5,
154 .parent_map = disp_cc_parent_map_0,
155 .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
156 .clkr.hw.init = &(struct clk_init_data){
157 .name = "disp_cc_mdss_esc1_clk_src",
158 .parent_names = disp_cc_parent_names_0,
159 .num_parents = 4,
160 .ops = &clk_rcg2_ops,
161 },
162 };
163
164 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
165 F(19200000, P_BI_TCXO, 1, 0, 0),
166 F(85714286, P_GPLL0_OUT_MAIN, 7, 0, 0),
167 F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
168 F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
169 F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0),
170 F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
171 F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
172 F(344000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
173 F(430000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
174 { }
175 };
176
177 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
178 .cmd_rcgr = 0x2088,
179 .mnd_width = 0,
180 .hid_width = 5,
181 .parent_map = disp_cc_parent_map_3,
182 .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
183 .clkr.hw.init = &(struct clk_init_data){
184 .name = "disp_cc_mdss_mdp_clk_src",
185 .parent_names = disp_cc_parent_names_3,
186 .num_parents = 5,
187 .ops = &clk_rcg2_shared_ops,
188 },
189 };
190
191 /* Return the HW recalc rate for idle use case */
192 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
193 .cmd_rcgr = 0x2058,
194 .mnd_width = 8,
195 .hid_width = 5,
196 .parent_map = disp_cc_parent_map_4,
197 .clkr.hw.init = &(struct clk_init_data){
198 .name = "disp_cc_mdss_pclk0_clk_src",
199 .parent_names = disp_cc_parent_names_4,
200 .num_parents = 4,
201 .flags = CLK_SET_RATE_PARENT,
202 .ops = &clk_pixel_ops,
203 },
204 };
205
206 /* Return the HW recalc rate for idle use case */
207 static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = {
208 .cmd_rcgr = 0x2070,
209 .mnd_width = 8,
210 .hid_width = 5,
211 .parent_map = disp_cc_parent_map_4,
212 .clkr.hw.init = &(struct clk_init_data){
213 .name = "disp_cc_mdss_pclk1_clk_src",
214 .parent_names = disp_cc_parent_names_4,
215 .num_parents = 4,
216 .flags = CLK_SET_RATE_PARENT,
217 .ops = &clk_pixel_ops,
218 },
219 };
220
221 static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
222 F(19200000, P_BI_TCXO, 1, 0, 0),
223 F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0),
224 F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
225 F(344000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
226 F(430000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
227 { }
228 };
229
230 static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
231 .cmd_rcgr = 0x20a0,
232 .mnd_width = 0,
233 .hid_width = 5,
234 .parent_map = disp_cc_parent_map_3,
235 .freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
236 .clkr.hw.init = &(struct clk_init_data){
237 .name = "disp_cc_mdss_rot_clk_src",
238 .parent_names = disp_cc_parent_names_3,
239 .num_parents = 5,
240 .ops = &clk_rcg2_shared_ops,
241 },
242 };
243
244 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
245 .cmd_rcgr = 0x20b8,
246 .mnd_width = 0,
247 .hid_width = 5,
248 .parent_map = disp_cc_parent_map_2,
249 .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
250 .clkr.hw.init = &(struct clk_init_data){
251 .name = "disp_cc_mdss_vsync_clk_src",
252 .parent_names = disp_cc_parent_names_2,
253 .num_parents = 2,
254 .ops = &clk_rcg2_ops,
255 },
256 };
257
258 static struct clk_branch disp_cc_mdss_ahb_clk = {
259 .halt_reg = 0x4004,
260 .halt_check = BRANCH_HALT,
261 .clkr = {
262 .enable_reg = 0x4004,
263 .enable_mask = BIT(0),
264 .hw.init = &(struct clk_init_data){
265 .name = "disp_cc_mdss_ahb_clk",
266 .ops = &clk_branch2_ops,
267 },
268 },
269 };
270
271 static struct clk_branch disp_cc_mdss_axi_clk = {
272 .halt_reg = 0x4008,
273 .halt_check = BRANCH_HALT,
274 .clkr = {
275 .enable_reg = 0x4008,
276 .enable_mask = BIT(0),
277 .hw.init = &(struct clk_init_data){
278 .name = "disp_cc_mdss_axi_clk",
279 .ops = &clk_branch2_ops,
280 },
281 },
282 };
283
284 /* Return the HW recalc rate for idle use case */
285 static struct clk_branch disp_cc_mdss_byte0_clk = {
286 .halt_reg = 0x2028,
287 .halt_check = BRANCH_HALT,
288 .clkr = {
289 .enable_reg = 0x2028,
290 .enable_mask = BIT(0),
291 .hw.init = &(struct clk_init_data){
292 .name = "disp_cc_mdss_byte0_clk",
293 .parent_names = (const char *[]){
294 "disp_cc_mdss_byte0_clk_src",
295 },
296 .num_parents = 1,
297 .flags = CLK_SET_RATE_PARENT,
298 .ops = &clk_branch2_ops,
299 },
300 },
301 };
302
303 /* Return the HW recalc rate for idle use case */
304 static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
305 .reg = 0x20e8,
306 .shift = 0,
307 .width = 2,
308 .clkr = {
309 .hw.init = &(struct clk_init_data){
310 .name = "disp_cc_mdss_byte0_div_clk_src",
311 .parent_names = (const char *[]){
312 "disp_cc_mdss_byte0_clk_src",
313 },
314 .num_parents = 1,
315 .ops = &clk_regmap_div_ops,
316 },
317 },
318 };
319
320 /* Return the HW recalc rate for idle use case */
321 static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
322 .halt_reg = 0x202c,
323 .halt_check = BRANCH_HALT,
324 .clkr = {
325 .enable_reg = 0x202c,
326 .enable_mask = BIT(0),
327 .hw.init = &(struct clk_init_data){
328 .name = "disp_cc_mdss_byte0_intf_clk",
329 .parent_names = (const char *[]){
330 "disp_cc_mdss_byte0_div_clk_src",
331 },
332 .num_parents = 1,
333 .flags = CLK_SET_RATE_PARENT,
334 .ops = &clk_branch2_ops,
335 },
336 },
337 };
338
339 /* Return the HW recalc rate for idle use case */
340 static struct clk_branch disp_cc_mdss_byte1_clk = {
341 .halt_reg = 0x2030,
342 .halt_check = BRANCH_HALT,
343 .clkr = {
344 .enable_reg = 0x2030,
345 .enable_mask = BIT(0),
346 .hw.init = &(struct clk_init_data){
347 .name = "disp_cc_mdss_byte1_clk",
348 .parent_names = (const char *[]){
349 "disp_cc_mdss_byte1_clk_src",
350 },
351 .num_parents = 1,
352 .flags = CLK_SET_RATE_PARENT,
353 .ops = &clk_branch2_ops,
354 },
355 },
356 };
357
358 /* Return the HW recalc rate for idle use case */
359 static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = {
360 .reg = 0x2104,
361 .shift = 0,
362 .width = 2,
363 .clkr = {
364 .hw.init = &(struct clk_init_data){
365 .name = "disp_cc_mdss_byte1_div_clk_src",
366 .parent_names = (const char *[]){
367 "disp_cc_mdss_byte1_clk_src",
368 },
369 .num_parents = 1,
370 .ops = &clk_regmap_div_ops,
371 },
372 },
373 };
374
375 /* Return the HW recalc rate for idle use case */
376 static struct clk_branch disp_cc_mdss_byte1_intf_clk = {
377 .halt_reg = 0x2034,
378 .halt_check = BRANCH_HALT,
379 .clkr = {
380 .enable_reg = 0x2034,
381 .enable_mask = BIT(0),
382 .hw.init = &(struct clk_init_data){
383 .name = "disp_cc_mdss_byte1_intf_clk",
384 .parent_names = (const char *[]){
385 "disp_cc_mdss_byte1_div_clk_src",
386 },
387 .num_parents = 1,
388 .flags = CLK_SET_RATE_PARENT,
389 .ops = &clk_branch2_ops,
390 },
391 },
392 };
393
394 static struct clk_branch disp_cc_mdss_esc0_clk = {
395 .halt_reg = 0x2038,
396 .halt_check = BRANCH_HALT,
397 .clkr = {
398 .enable_reg = 0x2038,
399 .enable_mask = BIT(0),
400 .hw.init = &(struct clk_init_data){
401 .name = "disp_cc_mdss_esc0_clk",
402 .parent_names = (const char *[]){
403 "disp_cc_mdss_esc0_clk_src",
404 },
405 .num_parents = 1,
406 .flags = CLK_SET_RATE_PARENT,
407 .ops = &clk_branch2_ops,
408 },
409 },
410 };
411
412 static struct clk_branch disp_cc_mdss_esc1_clk = {
413 .halt_reg = 0x203c,
414 .halt_check = BRANCH_HALT,
415 .clkr = {
416 .enable_reg = 0x203c,
417 .enable_mask = BIT(0),
418 .hw.init = &(struct clk_init_data){
419 .name = "disp_cc_mdss_esc1_clk",
420 .parent_names = (const char *[]){
421 "disp_cc_mdss_esc1_clk_src",
422 },
423 .num_parents = 1,
424 .flags = CLK_SET_RATE_PARENT,
425 .ops = &clk_branch2_ops,
426 },
427 },
428 };
429
430 static struct clk_branch disp_cc_mdss_mdp_clk = {
431 .halt_reg = 0x200c,
432 .halt_check = BRANCH_HALT,
433 .clkr = {
434 .enable_reg = 0x200c,
435 .enable_mask = BIT(0),
436 .hw.init = &(struct clk_init_data){
437 .name = "disp_cc_mdss_mdp_clk",
438 .parent_names = (const char *[]){
439 "disp_cc_mdss_mdp_clk_src",
440 },
441 .num_parents = 1,
442 .flags = CLK_SET_RATE_PARENT,
443 .ops = &clk_branch2_ops,
444 },
445 },
446 };
447
448 static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
449 .halt_reg = 0x201c,
450 .halt_check = BRANCH_HALT,
451 .clkr = {
452 .enable_reg = 0x201c,
453 .enable_mask = BIT(0),
454 .hw.init = &(struct clk_init_data){
455 .name = "disp_cc_mdss_mdp_lut_clk",
456 .parent_names = (const char *[]){
457 "disp_cc_mdss_mdp_clk_src",
458 },
459 .num_parents = 1,
460 .ops = &clk_branch2_ops,
461 },
462 },
463 };
464
465 /* Return the HW recalc rate for idle use case */
466 static struct clk_branch disp_cc_mdss_pclk0_clk = {
467 .halt_reg = 0x2004,
468 .halt_check = BRANCH_HALT,
469 .clkr = {
470 .enable_reg = 0x2004,
471 .enable_mask = BIT(0),
472 .hw.init = &(struct clk_init_data){
473 .name = "disp_cc_mdss_pclk0_clk",
474 .parent_names = (const char *[]){
475 "disp_cc_mdss_pclk0_clk_src",
476 },
477 .num_parents = 1,
478 .flags = CLK_SET_RATE_PARENT,
479 .ops = &clk_branch2_ops,
480 },
481 },
482 };
483
484 /* Return the HW recalc rate for idle use case */
485 static struct clk_branch disp_cc_mdss_pclk1_clk = {
486 .halt_reg = 0x2008,
487 .halt_check = BRANCH_HALT,
488 .clkr = {
489 .enable_reg = 0x2008,
490 .enable_mask = BIT(0),
491 .hw.init = &(struct clk_init_data){
492 .name = "disp_cc_mdss_pclk1_clk",
493 .parent_names = (const char *[]){
494 "disp_cc_mdss_pclk1_clk_src",
495 },
496 .num_parents = 1,
497 .flags = CLK_SET_RATE_PARENT,
498 .ops = &clk_branch2_ops,
499 },
500 },
501 };
502
503 static struct clk_branch disp_cc_mdss_rot_clk = {
504 .halt_reg = 0x2014,
505 .halt_check = BRANCH_HALT,
506 .clkr = {
507 .enable_reg = 0x2014,
508 .enable_mask = BIT(0),
509 .hw.init = &(struct clk_init_data){
510 .name = "disp_cc_mdss_rot_clk",
511 .parent_names = (const char *[]){
512 "disp_cc_mdss_rot_clk_src",
513 },
514 .num_parents = 1,
515 .flags = CLK_SET_RATE_PARENT,
516 .ops = &clk_branch2_ops,
517 },
518 },
519 };
520
521 static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
522 .halt_reg = 0x5004,
523 .halt_check = BRANCH_HALT,
524 .clkr = {
525 .enable_reg = 0x5004,
526 .enable_mask = BIT(0),
527 .hw.init = &(struct clk_init_data){
528 .name = "disp_cc_mdss_rscc_ahb_clk",
529 .ops = &clk_branch2_ops,
530 },
531 },
532 };
533
534 static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
535 .halt_reg = 0x5008,
536 .halt_check = BRANCH_HALT,
537 .clkr = {
538 .enable_reg = 0x5008,
539 .enable_mask = BIT(0),
540 .hw.init = &(struct clk_init_data){
541 .name = "disp_cc_mdss_rscc_vsync_clk",
542 .parent_names = (const char *[]){
543 "disp_cc_mdss_vsync_clk_src",
544 },
545 .num_parents = 1,
546 .flags = CLK_SET_RATE_PARENT,
547 .ops = &clk_branch2_ops,
548 },
549 },
550 };
551
552 static struct clk_branch disp_cc_mdss_vsync_clk = {
553 .halt_reg = 0x2024,
554 .halt_check = BRANCH_HALT,
555 .clkr = {
556 .enable_reg = 0x2024,
557 .enable_mask = BIT(0),
558 .hw.init = &(struct clk_init_data){
559 .name = "disp_cc_mdss_vsync_clk",
560 .parent_names = (const char *[]){
561 "disp_cc_mdss_vsync_clk_src",
562 },
563 .num_parents = 1,
564 .flags = CLK_SET_RATE_PARENT,
565 .ops = &clk_branch2_ops,
566 },
567 },
568 };
569
570 static struct gdsc mdss_gdsc = {
571 .gdscr = 0x3000,
572 .pd = {
573 .name = "mdss_gdsc",
574 },
575 .pwrsts = PWRSTS_OFF_ON,
576 .flags = HW_CTRL | POLL_CFG_GDSCR,
577 };
578
579 static struct clk_regmap *disp_cc_sdm845_clocks[] = {
580 [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
581 [DISP_CC_MDSS_AXI_CLK] = &disp_cc_mdss_axi_clk.clkr,
582 [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
583 [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
584 [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
585 [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] =
586 &disp_cc_mdss_byte0_div_clk_src.clkr,
587 [DISP_CC_MDSS_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr,
588 [DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr,
589 [DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr,
590 [DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] =
591 &disp_cc_mdss_byte1_div_clk_src.clkr,
592 [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
593 [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
594 [DISP_CC_MDSS_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr,
595 [DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr,
596 [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
597 [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
598 [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
599 [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
600 [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
601 [DISP_CC_MDSS_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr,
602 [DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr,
603 [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
604 [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
605 [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
606 [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
607 [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
608 [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
609 [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
610 };
611
612 static const struct qcom_reset_map disp_cc_sdm845_resets[] = {
613 [DISP_CC_MDSS_RSCC_BCR] = { 0x5000 },
614 };
615
616 static struct gdsc *disp_cc_sdm845_gdscs[] = {
617 [MDSS_GDSC] = &mdss_gdsc,
618 };
619
620 static const struct regmap_config disp_cc_sdm845_regmap_config = {
621 .reg_bits = 32,
622 .reg_stride = 4,
623 .val_bits = 32,
624 .max_register = 0x10000,
625 .fast_io = true,
626 };
627
628 static const struct qcom_cc_desc disp_cc_sdm845_desc = {
629 .config = &disp_cc_sdm845_regmap_config,
630 .clks = disp_cc_sdm845_clocks,
631 .num_clks = ARRAY_SIZE(disp_cc_sdm845_clocks),
632 .resets = disp_cc_sdm845_resets,
633 .num_resets = ARRAY_SIZE(disp_cc_sdm845_resets),
634 .gdscs = disp_cc_sdm845_gdscs,
635 .num_gdscs = ARRAY_SIZE(disp_cc_sdm845_gdscs),
636 };
637
638 static const struct of_device_id disp_cc_sdm845_match_table[] = {
639 { .compatible = "qcom,sdm845-dispcc" },
640 { }
641 };
642 MODULE_DEVICE_TABLE(of, disp_cc_sdm845_match_table);
643
644 static int disp_cc_sdm845_probe(struct platform_device *pdev)
645 {
646 struct regmap *regmap;
647 struct alpha_pll_config disp_cc_pll0_config = {};
648
649 regmap = qcom_cc_map(pdev, &disp_cc_sdm845_desc);
650 if (IS_ERR(regmap))
651 return PTR_ERR(regmap);
652
653 disp_cc_pll0_config.l = 0x2c;
654 disp_cc_pll0_config.alpha = 0xcaaa;
655
656 clk_fabia_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
657
658 /* Enable hardware clock gating for DSI and MDP clocks */
659 regmap_update_bits(regmap, 0x8000, 0x7f0, 0x7f0);
660
661 return qcom_cc_really_probe(pdev, &disp_cc_sdm845_desc, regmap);
662 }
663
664 static struct platform_driver disp_cc_sdm845_driver = {
665 .probe = disp_cc_sdm845_probe,
666 .driver = {
667 .name = "disp_cc-sdm845",
668 .of_match_table = disp_cc_sdm845_match_table,
669 },
670 };
671
672 static int __init disp_cc_sdm845_init(void)
673 {
674 return platform_driver_register(&disp_cc_sdm845_driver);
675 }
676 subsys_initcall(disp_cc_sdm845_init);
677
678 static void __exit disp_cc_sdm845_exit(void)
679 {
680 platform_driver_unregister(&disp_cc_sdm845_driver);
681 }
682 module_exit(disp_cc_sdm845_exit);
683
684 MODULE_LICENSE("GPL v2");
685 MODULE_DESCRIPTION("QTI DISPCC SDM845 Driver");