GNU Linux-libre 4.19.268-gnu1
[releases.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");