Merge tag 'drm-intel-gt-next-2021-05-28' of git://anongit.freedesktop.org/drm/drm...
[linux-2.6-microblaze.git] / drivers / clk / qcom / dispcc-sc7180.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2019, 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
11 #include <dt-bindings/clock/qcom,dispcc-sc7180.h>
12
13 #include "clk-alpha-pll.h"
14 #include "clk-branch.h"
15 #include "clk-rcg.h"
16 #include "clk-regmap-divider.h"
17 #include "common.h"
18 #include "gdsc.h"
19
20 enum {
21         P_BI_TCXO,
22         P_DISP_CC_PLL0_OUT_EVEN,
23         P_DISP_CC_PLL0_OUT_MAIN,
24         P_DP_PHY_PLL_LINK_CLK,
25         P_DP_PHY_PLL_VCO_DIV_CLK,
26         P_DSI0_PHY_PLL_OUT_BYTECLK,
27         P_DSI0_PHY_PLL_OUT_DSICLK,
28         P_GPLL0_OUT_MAIN,
29 };
30
31 static const struct pll_vco fabia_vco[] = {
32         { 249600000, 2000000000, 0 },
33 };
34
35 static struct clk_alpha_pll disp_cc_pll0 = {
36         .offset = 0x0,
37         .vco_table = fabia_vco,
38         .num_vco = ARRAY_SIZE(fabia_vco),
39         .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
40         .clkr = {
41                 .hw.init = &(struct clk_init_data){
42                         .name = "disp_cc_pll0",
43                         .parent_data = &(const struct clk_parent_data){
44                                 .fw_name = "bi_tcxo",
45                         },
46                         .num_parents = 1,
47                         .ops = &clk_alpha_pll_fabia_ops,
48                 },
49         },
50 };
51
52 static const struct clk_div_table post_div_table_disp_cc_pll0_out_even[] = {
53         { 0x0, 1 },
54         { }
55 };
56
57 static struct clk_alpha_pll_postdiv disp_cc_pll0_out_even = {
58         .offset = 0x0,
59         .post_div_shift = 8,
60         .post_div_table = post_div_table_disp_cc_pll0_out_even,
61         .num_post_div = ARRAY_SIZE(post_div_table_disp_cc_pll0_out_even),
62         .width = 4,
63         .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
64         .clkr.hw.init = &(struct clk_init_data){
65                 .name = "disp_cc_pll0_out_even",
66                 .parent_hws = (const struct clk_hw*[]){
67                         &disp_cc_pll0.clkr.hw,
68                 },
69                 .num_parents = 1,
70                 .flags = CLK_SET_RATE_PARENT,
71                 .ops = &clk_alpha_pll_postdiv_fabia_ops,
72         },
73 };
74
75 static const struct parent_map disp_cc_parent_map_0[] = {
76         { P_BI_TCXO, 0 },
77 };
78
79 static const struct clk_parent_data disp_cc_parent_data_0[] = {
80         { .fw_name = "bi_tcxo" },
81 };
82
83 static const struct parent_map disp_cc_parent_map_1[] = {
84         { P_BI_TCXO, 0 },
85         { P_DP_PHY_PLL_LINK_CLK, 1 },
86         { P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
87 };
88
89 static const struct clk_parent_data disp_cc_parent_data_1[] = {
90         { .fw_name = "bi_tcxo" },
91         { .fw_name = "dp_phy_pll_link_clk" },
92         { .fw_name = "dp_phy_pll_vco_div_clk" },
93 };
94
95 static const struct parent_map disp_cc_parent_map_2[] = {
96         { P_BI_TCXO, 0 },
97         { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
98 };
99
100 static const struct clk_parent_data disp_cc_parent_data_2[] = {
101         { .fw_name = "bi_tcxo" },
102         { .fw_name = "dsi0_phy_pll_out_byteclk" },
103 };
104
105 static const struct parent_map disp_cc_parent_map_3[] = {
106         { P_BI_TCXO, 0 },
107         { P_DISP_CC_PLL0_OUT_MAIN, 1 },
108         { P_GPLL0_OUT_MAIN, 4 },
109         { P_DISP_CC_PLL0_OUT_EVEN, 5 },
110 };
111
112 static const struct clk_parent_data disp_cc_parent_data_3[] = {
113         { .fw_name = "bi_tcxo" },
114         { .hw = &disp_cc_pll0.clkr.hw },
115         { .fw_name = "gcc_disp_gpll0_clk_src" },
116         { .hw = &disp_cc_pll0_out_even.clkr.hw },
117 };
118
119 static const struct parent_map disp_cc_parent_map_4[] = {
120         { P_BI_TCXO, 0 },
121         { P_GPLL0_OUT_MAIN, 4 },
122 };
123
124 static const struct clk_parent_data disp_cc_parent_data_4[] = {
125         { .fw_name = "bi_tcxo" },
126         { .fw_name = "gcc_disp_gpll0_clk_src" },
127 };
128
129 static const struct parent_map disp_cc_parent_map_5[] = {
130         { P_BI_TCXO, 0 },
131         { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
132 };
133
134 static const struct clk_parent_data disp_cc_parent_data_5[] = {
135         { .fw_name = "bi_tcxo" },
136         { .fw_name = "dsi0_phy_pll_out_dsiclk" },
137 };
138
139 static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
140         F(19200000, P_BI_TCXO, 1, 0, 0),
141         F(37500000, P_GPLL0_OUT_MAIN, 16, 0, 0),
142         F(75000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
143         { }
144 };
145
146 static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
147         .cmd_rcgr = 0x22bc,
148         .mnd_width = 0,
149         .hid_width = 5,
150         .parent_map = disp_cc_parent_map_4,
151         .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
152         .clkr.hw.init = &(struct clk_init_data){
153                 .name = "disp_cc_mdss_ahb_clk_src",
154                 .parent_data = disp_cc_parent_data_4,
155                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
156                 .flags = CLK_SET_RATE_PARENT,
157                 .ops = &clk_rcg2_shared_ops,
158         },
159 };
160
161 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
162         .cmd_rcgr = 0x2110,
163         .mnd_width = 0,
164         .hid_width = 5,
165         .parent_map = disp_cc_parent_map_2,
166         .clkr.hw.init = &(struct clk_init_data){
167                 .name = "disp_cc_mdss_byte0_clk_src",
168                 .parent_data = disp_cc_parent_data_2,
169                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
170                 .flags = CLK_SET_RATE_PARENT,
171                 .ops = &clk_byte2_ops,
172         },
173 };
174
175 static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux_clk_src[] = {
176         F(19200000, P_BI_TCXO, 1, 0, 0),
177         { }
178 };
179
180 static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
181         .cmd_rcgr = 0x21dc,
182         .mnd_width = 0,
183         .hid_width = 5,
184         .parent_map = disp_cc_parent_map_0,
185         .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
186         .clkr.hw.init = &(struct clk_init_data){
187                 .name = "disp_cc_mdss_dp_aux_clk_src",
188                 .parent_data = disp_cc_parent_data_0,
189                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
190                 .ops = &clk_rcg2_ops,
191         },
192 };
193
194 static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
195         .cmd_rcgr = 0x2194,
196         .mnd_width = 0,
197         .hid_width = 5,
198         .parent_map = disp_cc_parent_map_1,
199         .clkr.hw.init = &(struct clk_init_data){
200                 .name = "disp_cc_mdss_dp_crypto_clk_src",
201                 .parent_data = disp_cc_parent_data_1,
202                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
203                 .ops = &clk_byte2_ops,
204         },
205 };
206
207 static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
208         .cmd_rcgr = 0x2178,
209         .mnd_width = 0,
210         .hid_width = 5,
211         .parent_map = disp_cc_parent_map_1,
212         .clkr.hw.init = &(struct clk_init_data){
213                 .name = "disp_cc_mdss_dp_link_clk_src",
214                 .parent_data = disp_cc_parent_data_1,
215                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
216                 .ops = &clk_byte2_ops,
217         },
218 };
219
220 static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
221         .cmd_rcgr = 0x21ac,
222         .mnd_width = 16,
223         .hid_width = 5,
224         .parent_map = disp_cc_parent_map_1,
225         .clkr.hw.init = &(struct clk_init_data){
226                 .name = "disp_cc_mdss_dp_pixel_clk_src",
227                 .parent_data = disp_cc_parent_data_1,
228                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
229                 .ops = &clk_dp_ops,
230         },
231 };
232
233 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
234         .cmd_rcgr = 0x2148,
235         .mnd_width = 0,
236         .hid_width = 5,
237         .parent_map = disp_cc_parent_map_2,
238         .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
239         .clkr.hw.init = &(struct clk_init_data){
240                 .name = "disp_cc_mdss_esc0_clk_src",
241                 .parent_data = disp_cc_parent_data_2,
242                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
243                 .ops = &clk_rcg2_ops,
244         },
245 };
246
247 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
248         F(19200000, P_BI_TCXO, 1, 0, 0),
249         F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
250         F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
251         F(345000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
252         F(460000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
253         { }
254 };
255
256 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
257         .cmd_rcgr = 0x20c8,
258         .mnd_width = 0,
259         .hid_width = 5,
260         .parent_map = disp_cc_parent_map_3,
261         .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
262         .clkr.hw.init = &(struct clk_init_data){
263                 .name = "disp_cc_mdss_mdp_clk_src",
264                 .parent_data = disp_cc_parent_data_3,
265                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
266                 .ops = &clk_rcg2_shared_ops,
267         },
268 };
269
270 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
271         .cmd_rcgr = 0x2098,
272         .mnd_width = 8,
273         .hid_width = 5,
274         .parent_map = disp_cc_parent_map_5,
275         .clkr.hw.init = &(struct clk_init_data){
276                 .name = "disp_cc_mdss_pclk0_clk_src",
277                 .parent_data = disp_cc_parent_data_5,
278                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
279                 .flags = CLK_SET_RATE_PARENT,
280                 .ops = &clk_pixel_ops,
281         },
282 };
283
284 static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
285         .cmd_rcgr = 0x20e0,
286         .mnd_width = 0,
287         .hid_width = 5,
288         .parent_map = disp_cc_parent_map_3,
289         .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
290         .clkr.hw.init = &(struct clk_init_data){
291                 .name = "disp_cc_mdss_rot_clk_src",
292                 .parent_data = disp_cc_parent_data_3,
293                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
294                 .ops = &clk_rcg2_shared_ops,
295         },
296 };
297
298 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
299         .cmd_rcgr = 0x20f8,
300         .mnd_width = 0,
301         .hid_width = 5,
302         .parent_map = disp_cc_parent_map_0,
303         .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
304         .clkr.hw.init = &(struct clk_init_data){
305                 .name = "disp_cc_mdss_vsync_clk_src",
306                 .parent_data = disp_cc_parent_data_0,
307                 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
308                 .ops = &clk_rcg2_shared_ops,
309         },
310 };
311
312 static struct clk_branch disp_cc_mdss_ahb_clk = {
313         .halt_reg = 0x2080,
314         .halt_check = BRANCH_HALT,
315         .clkr = {
316                 .enable_reg = 0x2080,
317                 .enable_mask = BIT(0),
318                 .hw.init = &(struct clk_init_data){
319                         .name = "disp_cc_mdss_ahb_clk",
320                         .parent_hws = (const struct clk_hw*[]){
321                                 &disp_cc_mdss_ahb_clk_src.clkr.hw,
322                         },
323                         .num_parents = 1,
324                         .flags = CLK_SET_RATE_PARENT,
325                         .ops = &clk_branch2_ops,
326                 },
327         },
328 };
329
330 static struct clk_branch disp_cc_mdss_byte0_clk = {
331         .halt_reg = 0x2028,
332         .halt_check = BRANCH_HALT,
333         .clkr = {
334                 .enable_reg = 0x2028,
335                 .enable_mask = BIT(0),
336                 .hw.init = &(struct clk_init_data){
337                         .name = "disp_cc_mdss_byte0_clk",
338                         .parent_hws = (const struct clk_hw*[]){
339                                 &disp_cc_mdss_byte0_clk_src.clkr.hw,
340                         },
341                         .num_parents = 1,
342                         .flags = CLK_SET_RATE_PARENT,
343                         .ops = &clk_branch2_ops,
344                 },
345         },
346 };
347
348 static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
349         .reg = 0x2128,
350         .shift = 0,
351         .width = 2,
352         .clkr.hw.init = &(struct clk_init_data) {
353                 .name = "disp_cc_mdss_byte0_div_clk_src",
354                 .parent_data = &(const struct clk_parent_data){
355                         .hw = &disp_cc_mdss_byte0_clk_src.clkr.hw
356                 },
357                 .num_parents = 1,
358                 .ops = &clk_regmap_div_ops,
359         },
360 };
361
362 static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
363         .reg = 0x2190,
364         .shift = 0,
365         .width = 2,
366         .clkr.hw.init = &(struct clk_init_data) {
367                 .name = "disp_cc_mdss_dp_link_div_clk_src",
368                 .parent_data = &(const struct clk_parent_data){
369                         .hw = &disp_cc_mdss_dp_link_clk_src.clkr.hw
370                 },
371                 .num_parents = 1,
372                 .ops = &clk_regmap_div_ops,
373         },
374 };
375
376 static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
377         .halt_reg = 0x202c,
378         .halt_check = BRANCH_HALT,
379         .clkr = {
380                 .enable_reg = 0x202c,
381                 .enable_mask = BIT(0),
382                 .hw.init = &(struct clk_init_data){
383                         .name = "disp_cc_mdss_byte0_intf_clk",
384                         .parent_hws = (const struct clk_hw*[]){
385                                 &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
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_dp_aux_clk = {
395         .halt_reg = 0x2054,
396         .halt_check = BRANCH_HALT,
397         .clkr = {
398                 .enable_reg = 0x2054,
399                 .enable_mask = BIT(0),
400                 .hw.init = &(struct clk_init_data){
401                         .name = "disp_cc_mdss_dp_aux_clk",
402                         .parent_hws = (const struct clk_hw*[]){
403                                 &disp_cc_mdss_dp_aux_clk_src.clkr.hw,
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_dp_crypto_clk = {
413         .halt_reg = 0x2048,
414         .halt_check = BRANCH_HALT,
415         .clkr = {
416                 .enable_reg = 0x2048,
417                 .enable_mask = BIT(0),
418                 .hw.init = &(struct clk_init_data){
419                         .name = "disp_cc_mdss_dp_crypto_clk",
420                         .parent_hws = (const struct clk_hw*[]){
421                                 &disp_cc_mdss_dp_crypto_clk_src.clkr.hw,
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_dp_link_clk = {
431         .halt_reg = 0x2040,
432         .halt_check = BRANCH_HALT,
433         .clkr = {
434                 .enable_reg = 0x2040,
435                 .enable_mask = BIT(0),
436                 .hw.init = &(struct clk_init_data){
437                         .name = "disp_cc_mdss_dp_link_clk",
438                         .parent_hws = (const struct clk_hw*[]){
439                                 &disp_cc_mdss_dp_link_clk_src.clkr.hw,
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_dp_link_intf_clk = {
449         .halt_reg = 0x2044,
450         .halt_check = BRANCH_HALT,
451         .clkr = {
452                 .enable_reg = 0x2044,
453                 .enable_mask = BIT(0),
454                 .hw.init = &(struct clk_init_data){
455                         .name = "disp_cc_mdss_dp_link_intf_clk",
456                         .parent_hws = (const struct clk_hw*[]){
457                                 &disp_cc_mdss_dp_link_div_clk_src.clkr.hw,
458                         },
459                         .num_parents = 1,
460                         .ops = &clk_branch2_ops,
461                 },
462         },
463 };
464
465 static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
466         .halt_reg = 0x204c,
467         .halt_check = BRANCH_HALT,
468         .clkr = {
469                 .enable_reg = 0x204c,
470                 .enable_mask = BIT(0),
471                 .hw.init = &(struct clk_init_data){
472                         .name = "disp_cc_mdss_dp_pixel_clk",
473                         .parent_hws = (const struct clk_hw*[]){
474                                 &disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
475                         },
476                         .num_parents = 1,
477                         .flags = CLK_SET_RATE_PARENT,
478                         .ops = &clk_branch2_ops,
479                 },
480         },
481 };
482
483 static struct clk_branch disp_cc_mdss_esc0_clk = {
484         .halt_reg = 0x2038,
485         .halt_check = BRANCH_HALT,
486         .clkr = {
487                 .enable_reg = 0x2038,
488                 .enable_mask = BIT(0),
489                 .hw.init = &(struct clk_init_data){
490                         .name = "disp_cc_mdss_esc0_clk",
491                         .parent_hws = (const struct clk_hw*[]){
492                                 &disp_cc_mdss_esc0_clk_src.clkr.hw,
493                         },
494                         .num_parents = 1,
495                         .flags = CLK_SET_RATE_PARENT,
496                         .ops = &clk_branch2_ops,
497                 },
498         },
499 };
500
501 static struct clk_branch disp_cc_mdss_mdp_clk = {
502         .halt_reg = 0x200c,
503         .halt_check = BRANCH_HALT,
504         .clkr = {
505                 .enable_reg = 0x200c,
506                 .enable_mask = BIT(0),
507                 .hw.init = &(struct clk_init_data){
508                         .name = "disp_cc_mdss_mdp_clk",
509                         .parent_hws = (const struct clk_hw*[]){
510                                 &disp_cc_mdss_mdp_clk_src.clkr.hw,
511                         },
512                         .num_parents = 1,
513                         .flags = CLK_SET_RATE_PARENT,
514                         .ops = &clk_branch2_ops,
515                 },
516         },
517 };
518
519 static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
520         .halt_reg = 0x201c,
521         .halt_check = BRANCH_VOTED,
522         .clkr = {
523                 .enable_reg = 0x201c,
524                 .enable_mask = BIT(0),
525                 .hw.init = &(struct clk_init_data){
526                         .name = "disp_cc_mdss_mdp_lut_clk",
527                         .parent_hws = (const struct clk_hw*[]){
528                                 &disp_cc_mdss_mdp_clk_src.clkr.hw,
529                         },
530                         .num_parents = 1,
531                         .ops = &clk_branch2_ops,
532                 },
533         },
534 };
535
536 static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
537         .halt_reg = 0x4004,
538         .halt_check = BRANCH_VOTED,
539         .clkr = {
540                 .enable_reg = 0x4004,
541                 .enable_mask = BIT(0),
542                 .hw.init = &(struct clk_init_data){
543                         .name = "disp_cc_mdss_non_gdsc_ahb_clk",
544                         .parent_hws = (const struct clk_hw*[]){
545                                 &disp_cc_mdss_ahb_clk_src.clkr.hw,
546                         },
547                         .num_parents = 1,
548                         .flags = CLK_SET_RATE_PARENT,
549                         .ops = &clk_branch2_ops,
550                 },
551         },
552 };
553
554 static struct clk_branch disp_cc_mdss_pclk0_clk = {
555         .halt_reg = 0x2004,
556         .halt_check = BRANCH_HALT,
557         .clkr = {
558                 .enable_reg = 0x2004,
559                 .enable_mask = BIT(0),
560                 .hw.init = &(struct clk_init_data){
561                         .name = "disp_cc_mdss_pclk0_clk",
562                         .parent_hws = (const struct clk_hw*[]){
563                                 &disp_cc_mdss_pclk0_clk_src.clkr.hw,
564                         },
565                         .num_parents = 1,
566                         .flags = CLK_SET_RATE_PARENT,
567                         .ops = &clk_branch2_ops,
568                 },
569         },
570 };
571
572 static struct clk_branch disp_cc_mdss_rot_clk = {
573         .halt_reg = 0x2014,
574         .halt_check = BRANCH_HALT,
575         .clkr = {
576                 .enable_reg = 0x2014,
577                 .enable_mask = BIT(0),
578                 .hw.init = &(struct clk_init_data){
579                         .name = "disp_cc_mdss_rot_clk",
580                         .parent_hws = (const struct clk_hw*[]){
581                                 &disp_cc_mdss_rot_clk_src.clkr.hw,
582                         },
583                         .num_parents = 1,
584                         .flags = CLK_SET_RATE_PARENT,
585                         .ops = &clk_branch2_ops,
586                 },
587         },
588 };
589
590 static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
591         .halt_reg = 0x4008,
592         .halt_check = BRANCH_HALT,
593         .clkr = {
594                 .enable_reg = 0x4008,
595                 .enable_mask = BIT(0),
596                 .hw.init = &(struct clk_init_data){
597                         .name = "disp_cc_mdss_rscc_vsync_clk",
598                         .parent_hws = (const struct clk_hw*[]){
599                                 &disp_cc_mdss_vsync_clk_src.clkr.hw,
600                         },
601                         .num_parents = 1,
602                         .flags = CLK_SET_RATE_PARENT,
603                         .ops = &clk_branch2_ops,
604                 },
605         },
606 };
607
608 static struct clk_branch disp_cc_mdss_vsync_clk = {
609         .halt_reg = 0x2024,
610         .halt_check = BRANCH_HALT,
611         .clkr = {
612                 .enable_reg = 0x2024,
613                 .enable_mask = BIT(0),
614                 .hw.init = &(struct clk_init_data){
615                         .name = "disp_cc_mdss_vsync_clk",
616                         .parent_hws = (const struct clk_hw*[]){
617                                 &disp_cc_mdss_vsync_clk_src.clkr.hw,
618                         },
619                         .num_parents = 1,
620                         .flags = CLK_SET_RATE_PARENT,
621                         .ops = &clk_branch2_ops,
622                 },
623         },
624 };
625
626 static struct gdsc mdss_gdsc = {
627         .gdscr = 0x3000,
628         .pd = {
629                 .name = "mdss_gdsc",
630         },
631         .pwrsts = PWRSTS_OFF_ON,
632         .flags = HW_CTRL,
633 };
634
635 static struct gdsc *disp_cc_sc7180_gdscs[] = {
636         [MDSS_GDSC] = &mdss_gdsc,
637 };
638
639 static struct clk_regmap *disp_cc_sc7180_clocks[] = {
640         [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
641         [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
642         [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
643         [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
644         [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
645         [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
646         [DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
647         [DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
648         [DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr,
649         [DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr,
650         [DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
651         [DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
652         [DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC] =
653                                 &disp_cc_mdss_dp_link_div_clk_src.clkr,
654         [DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
655         [DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
656         [DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
657         [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
658         [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
659         [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
660         [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
661         [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
662         [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
663         [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
664         [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
665         [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
666         [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
667         [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
668         [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
669         [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
670         [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
671         [DISP_CC_PLL0_OUT_EVEN] = &disp_cc_pll0_out_even.clkr,
672 };
673
674 static const struct regmap_config disp_cc_sc7180_regmap_config = {
675         .reg_bits = 32,
676         .reg_stride = 4,
677         .val_bits = 32,
678         .max_register = 0x10000,
679         .fast_io = true,
680 };
681
682 static const struct qcom_cc_desc disp_cc_sc7180_desc = {
683         .config = &disp_cc_sc7180_regmap_config,
684         .clks = disp_cc_sc7180_clocks,
685         .num_clks = ARRAY_SIZE(disp_cc_sc7180_clocks),
686         .gdscs = disp_cc_sc7180_gdscs,
687         .num_gdscs = ARRAY_SIZE(disp_cc_sc7180_gdscs),
688 };
689
690 static const struct of_device_id disp_cc_sc7180_match_table[] = {
691         { .compatible = "qcom,sc7180-dispcc" },
692         { }
693 };
694 MODULE_DEVICE_TABLE(of, disp_cc_sc7180_match_table);
695
696 static int disp_cc_sc7180_probe(struct platform_device *pdev)
697 {
698         struct regmap *regmap;
699         struct alpha_pll_config disp_cc_pll_config = {};
700
701         regmap = qcom_cc_map(pdev, &disp_cc_sc7180_desc);
702         if (IS_ERR(regmap))
703                 return PTR_ERR(regmap);
704
705         /* 1380MHz configuration */
706         disp_cc_pll_config.l = 0x47;
707         disp_cc_pll_config.alpha = 0xe000;
708         disp_cc_pll_config.user_ctl_val = 0x00000001;
709         disp_cc_pll_config.user_ctl_hi_val = 0x00004805;
710
711         clk_fabia_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll_config);
712
713         return qcom_cc_really_probe(pdev, &disp_cc_sc7180_desc, regmap);
714 }
715
716 static struct platform_driver disp_cc_sc7180_driver = {
717         .probe = disp_cc_sc7180_probe,
718         .driver = {
719                 .name = "sc7180-dispcc",
720                 .of_match_table = disp_cc_sc7180_match_table,
721         },
722 };
723
724 static int __init disp_cc_sc7180_init(void)
725 {
726         return platform_driver_register(&disp_cc_sc7180_driver);
727 }
728 subsys_initcall(disp_cc_sc7180_init);
729
730 static void __exit disp_cc_sc7180_exit(void)
731 {
732         platform_driver_unregister(&disp_cc_sc7180_driver);
733 }
734 module_exit(disp_cc_sc7180_exit);
735
736 MODULE_DESCRIPTION("QTI DISP_CC SC7180 Driver");
737 MODULE_LICENSE("GPL v2");