1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2019, The Linux Foundation. All rights reserved.
6 #include <linux/clk-provider.h>
7 #include <linux/module.h>
8 #include <linux/platform_device.h>
9 #include <linux/regmap.h>
11 #include <dt-bindings/clock/qcom,dispcc-sc7180.h>
13 #include "clk-alpha-pll.h"
14 #include "clk-branch.h"
16 #include "clk-regmap-divider.h"
23 P_CORE_BI_PLL_TEST_SE,
24 P_DISP_CC_PLL0_OUT_EVEN,
25 P_DISP_CC_PLL0_OUT_MAIN,
26 P_DP_PHY_PLL_LINK_CLK,
27 P_DP_PHY_PLL_VCO_DIV_CLK,
28 P_DSI0_PHY_PLL_OUT_BYTECLK,
29 P_DSI0_PHY_PLL_OUT_DSICLK,
33 static const struct pll_vco fabia_vco[] = {
34 { 249600000, 2000000000, 0 },
37 static struct clk_alpha_pll disp_cc_pll0 = {
39 .vco_table = fabia_vco,
40 .num_vco = ARRAY_SIZE(fabia_vco),
41 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
43 .hw.init = &(struct clk_init_data){
44 .name = "disp_cc_pll0",
45 .parent_data = &(const struct clk_parent_data){
49 .ops = &clk_alpha_pll_fabia_ops,
54 static const struct clk_div_table post_div_table_disp_cc_pll0_out_even[] = {
59 static struct clk_alpha_pll_postdiv disp_cc_pll0_out_even = {
62 .post_div_table = post_div_table_disp_cc_pll0_out_even,
63 .num_post_div = ARRAY_SIZE(post_div_table_disp_cc_pll0_out_even),
65 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
66 .clkr.hw.init = &(struct clk_init_data){
67 .name = "disp_cc_pll0_out_even",
68 .parent_data = &(const struct clk_parent_data){
69 .hw = &disp_cc_pll0.clkr.hw,
72 .flags = CLK_SET_RATE_PARENT,
73 .ops = &clk_alpha_pll_postdiv_fabia_ops,
77 static const struct parent_map disp_cc_parent_map_0[] = {
79 { P_CORE_BI_PLL_TEST_SE, 7 },
82 static const struct clk_parent_data disp_cc_parent_data_0[] = {
83 { .fw_name = "bi_tcxo" },
84 { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
87 static const struct parent_map disp_cc_parent_map_1[] = {
89 { P_DP_PHY_PLL_LINK_CLK, 1 },
90 { P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
91 { P_CORE_BI_PLL_TEST_SE, 7 },
94 static const struct clk_parent_data disp_cc_parent_data_1[] = {
95 { .fw_name = "bi_tcxo" },
96 { .fw_name = "dp_phy_pll_link_clk", .name = "dp_phy_pll_link_clk" },
97 { .fw_name = "dp_phy_pll_vco_div_clk",
98 .name = "dp_phy_pll_vco_div_clk"},
99 { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
102 static const struct parent_map disp_cc_parent_map_2[] = {
104 { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
105 { P_CORE_BI_PLL_TEST_SE, 7 },
108 static const struct clk_parent_data disp_cc_parent_data_2[] = {
109 { .fw_name = "bi_tcxo" },
110 { .fw_name = "dsi0_phy_pll_out_byteclk",
111 .name = "dsi0_phy_pll_out_byteclk" },
112 { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
115 static const struct parent_map disp_cc_parent_map_3[] = {
117 { P_DISP_CC_PLL0_OUT_MAIN, 1 },
118 { P_GPLL0_OUT_MAIN, 4 },
119 { P_DISP_CC_PLL0_OUT_EVEN, 5 },
120 { P_CORE_BI_PLL_TEST_SE, 7 },
123 static const struct clk_parent_data disp_cc_parent_data_3[] = {
124 { .fw_name = "bi_tcxo" },
125 { .hw = &disp_cc_pll0.clkr.hw },
126 { .fw_name = "gcc_disp_gpll0_clk_src" },
127 { .hw = &disp_cc_pll0_out_even.clkr.hw },
128 { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
131 static const struct parent_map disp_cc_parent_map_4[] = {
133 { P_GPLL0_OUT_MAIN, 4 },
134 { P_CORE_BI_PLL_TEST_SE, 7 },
137 static const struct clk_parent_data disp_cc_parent_data_4[] = {
138 { .fw_name = "bi_tcxo" },
139 { .fw_name = "gcc_disp_gpll0_clk_src" },
140 { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
143 static const struct parent_map disp_cc_parent_map_5[] = {
145 { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
146 { P_CORE_BI_PLL_TEST_SE, 7 },
149 static const struct clk_parent_data disp_cc_parent_data_5[] = {
150 { .fw_name = "bi_tcxo" },
151 { .fw_name = "dsi0_phy_pll_out_dsiclk",
152 .name = "dsi0_phy_pll_out_dsiclk" },
153 { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
156 static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
157 F(19200000, P_BI_TCXO, 1, 0, 0),
158 F(37500000, P_GPLL0_OUT_MAIN, 16, 0, 0),
159 F(75000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
163 static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
167 .parent_map = disp_cc_parent_map_4,
168 .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
169 .clkr.hw.init = &(struct clk_init_data){
170 .name = "disp_cc_mdss_ahb_clk_src",
171 .parent_data = disp_cc_parent_data_4,
173 .flags = CLK_SET_RATE_PARENT,
174 .ops = &clk_rcg2_shared_ops,
178 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
182 .parent_map = disp_cc_parent_map_2,
183 .clkr.hw.init = &(struct clk_init_data){
184 .name = "disp_cc_mdss_byte0_clk_src",
185 .parent_data = disp_cc_parent_data_2,
187 .flags = CLK_SET_RATE_PARENT,
188 .ops = &clk_byte2_ops,
192 static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux_clk_src[] = {
193 F(19200000, P_BI_TCXO, 1, 0, 0),
197 static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
201 .parent_map = disp_cc_parent_map_0,
202 .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
203 .clkr.hw.init = &(struct clk_init_data){
204 .name = "disp_cc_mdss_dp_aux_clk_src",
205 .parent_data = disp_cc_parent_data_0,
207 .ops = &clk_rcg2_ops,
211 static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
215 .parent_map = disp_cc_parent_map_1,
216 .clkr.hw.init = &(struct clk_init_data){
217 .name = "disp_cc_mdss_dp_crypto_clk_src",
218 .parent_data = disp_cc_parent_data_1,
220 .flags = CLK_SET_RATE_PARENT,
221 .ops = &clk_byte2_ops,
225 static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
229 .parent_map = disp_cc_parent_map_1,
230 .clkr.hw.init = &(struct clk_init_data){
231 .name = "disp_cc_mdss_dp_link_clk_src",
232 .parent_data = disp_cc_parent_data_1,
234 .flags = CLK_SET_RATE_PARENT,
235 .ops = &clk_byte2_ops,
239 static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
243 .parent_map = disp_cc_parent_map_1,
244 .clkr.hw.init = &(struct clk_init_data){
245 .name = "disp_cc_mdss_dp_pixel_clk_src",
246 .parent_data = disp_cc_parent_data_1,
248 .flags = CLK_SET_RATE_PARENT,
253 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
257 .parent_map = disp_cc_parent_map_2,
258 .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
259 .clkr.hw.init = &(struct clk_init_data){
260 .name = "disp_cc_mdss_esc0_clk_src",
261 .parent_data = disp_cc_parent_data_2,
263 .ops = &clk_rcg2_ops,
267 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
268 F(19200000, P_BI_TCXO, 1, 0, 0),
269 F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
270 F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
271 F(345000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
272 F(460000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
276 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
280 .parent_map = disp_cc_parent_map_3,
281 .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
282 .clkr.hw.init = &(struct clk_init_data){
283 .name = "disp_cc_mdss_mdp_clk_src",
284 .parent_data = disp_cc_parent_data_3,
286 .ops = &clk_rcg2_shared_ops,
290 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
294 .parent_map = disp_cc_parent_map_5,
295 .clkr.hw.init = &(struct clk_init_data){
296 .name = "disp_cc_mdss_pclk0_clk_src",
297 .parent_data = disp_cc_parent_data_5,
299 .flags = CLK_SET_RATE_PARENT,
300 .ops = &clk_pixel_ops,
304 static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
308 .parent_map = disp_cc_parent_map_3,
309 .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
310 .clkr.hw.init = &(struct clk_init_data){
311 .name = "disp_cc_mdss_rot_clk_src",
312 .parent_data = disp_cc_parent_data_3,
314 .ops = &clk_rcg2_shared_ops,
318 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
322 .parent_map = disp_cc_parent_map_0,
323 .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
324 .clkr.hw.init = &(struct clk_init_data){
325 .name = "disp_cc_mdss_vsync_clk_src",
326 .parent_data = disp_cc_parent_data_0,
328 .ops = &clk_rcg2_shared_ops,
332 static struct clk_branch disp_cc_mdss_ahb_clk = {
334 .halt_check = BRANCH_HALT,
336 .enable_reg = 0x2080,
337 .enable_mask = BIT(0),
338 .hw.init = &(struct clk_init_data){
339 .name = "disp_cc_mdss_ahb_clk",
340 .parent_data = &(const struct clk_parent_data){
341 .hw = &disp_cc_mdss_ahb_clk_src.clkr.hw,
344 .flags = CLK_SET_RATE_PARENT,
345 .ops = &clk_branch2_ops,
350 static struct clk_branch disp_cc_mdss_byte0_clk = {
352 .halt_check = BRANCH_HALT,
354 .enable_reg = 0x2028,
355 .enable_mask = BIT(0),
356 .hw.init = &(struct clk_init_data){
357 .name = "disp_cc_mdss_byte0_clk",
358 .parent_data = &(const struct clk_parent_data){
359 .hw = &disp_cc_mdss_byte0_clk_src.clkr.hw,
362 .flags = CLK_SET_RATE_PARENT,
363 .ops = &clk_branch2_ops,
368 static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
372 .clkr.hw.init = &(struct clk_init_data) {
373 .name = "disp_cc_mdss_byte0_div_clk_src",
374 .parent_data = &(const struct clk_parent_data){
375 .hw = &disp_cc_mdss_byte0_clk_src.clkr.hw
378 .ops = &clk_regmap_div_ops,
382 static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
386 .clkr.hw.init = &(struct clk_init_data) {
387 .name = "disp_cc_mdss_dp_link_div_clk_src",
388 .parent_data = &(const struct clk_parent_data){
389 .hw = &disp_cc_mdss_dp_link_clk_src.clkr.hw
392 .ops = &clk_regmap_div_ops,
396 static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
398 .halt_check = BRANCH_HALT,
400 .enable_reg = 0x202c,
401 .enable_mask = BIT(0),
402 .hw.init = &(struct clk_init_data){
403 .name = "disp_cc_mdss_byte0_intf_clk",
404 .parent_data = &(const struct clk_parent_data){
405 .hw = &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
408 .flags = CLK_SET_RATE_PARENT,
409 .ops = &clk_branch2_ops,
414 static struct clk_branch disp_cc_mdss_dp_aux_clk = {
416 .halt_check = BRANCH_HALT,
418 .enable_reg = 0x2054,
419 .enable_mask = BIT(0),
420 .hw.init = &(struct clk_init_data){
421 .name = "disp_cc_mdss_dp_aux_clk",
422 .parent_data = &(const struct clk_parent_data){
423 .hw = &disp_cc_mdss_dp_aux_clk_src.clkr.hw,
426 .flags = CLK_SET_RATE_PARENT,
427 .ops = &clk_branch2_ops,
432 static struct clk_branch disp_cc_mdss_dp_crypto_clk = {
434 .halt_check = BRANCH_HALT,
436 .enable_reg = 0x2048,
437 .enable_mask = BIT(0),
438 .hw.init = &(struct clk_init_data){
439 .name = "disp_cc_mdss_dp_crypto_clk",
440 .parent_data = &(const struct clk_parent_data){
441 .hw = &disp_cc_mdss_dp_crypto_clk_src.clkr.hw,
444 .flags = CLK_SET_RATE_PARENT,
445 .ops = &clk_branch2_ops,
450 static struct clk_branch disp_cc_mdss_dp_link_clk = {
452 .halt_check = BRANCH_HALT,
454 .enable_reg = 0x2040,
455 .enable_mask = BIT(0),
456 .hw.init = &(struct clk_init_data){
457 .name = "disp_cc_mdss_dp_link_clk",
458 .parent_data = &(const struct clk_parent_data){
459 .hw = &disp_cc_mdss_dp_link_clk_src.clkr.hw,
462 .flags = CLK_SET_RATE_PARENT,
463 .ops = &clk_branch2_ops,
468 static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
470 .halt_check = BRANCH_HALT,
472 .enable_reg = 0x2044,
473 .enable_mask = BIT(0),
474 .hw.init = &(struct clk_init_data){
475 .name = "disp_cc_mdss_dp_link_intf_clk",
476 .parent_data = &(const struct clk_parent_data){
477 .hw = &disp_cc_mdss_dp_link_div_clk_src.clkr.hw,
480 .ops = &clk_branch2_ops,
485 static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
487 .halt_check = BRANCH_HALT,
489 .enable_reg = 0x204c,
490 .enable_mask = BIT(0),
491 .hw.init = &(struct clk_init_data){
492 .name = "disp_cc_mdss_dp_pixel_clk",
493 .parent_data = &(const struct clk_parent_data){
494 .hw = &disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
497 .flags = CLK_SET_RATE_PARENT,
498 .ops = &clk_branch2_ops,
503 static struct clk_branch disp_cc_mdss_esc0_clk = {
505 .halt_check = BRANCH_HALT,
507 .enable_reg = 0x2038,
508 .enable_mask = BIT(0),
509 .hw.init = &(struct clk_init_data){
510 .name = "disp_cc_mdss_esc0_clk",
511 .parent_data = &(const struct clk_parent_data){
512 .hw = &disp_cc_mdss_esc0_clk_src.clkr.hw,
515 .flags = CLK_SET_RATE_PARENT,
516 .ops = &clk_branch2_ops,
521 static struct clk_branch disp_cc_mdss_mdp_clk = {
523 .halt_check = BRANCH_HALT,
525 .enable_reg = 0x200c,
526 .enable_mask = BIT(0),
527 .hw.init = &(struct clk_init_data){
528 .name = "disp_cc_mdss_mdp_clk",
529 .parent_data = &(const struct clk_parent_data){
530 .hw = &disp_cc_mdss_mdp_clk_src.clkr.hw,
533 .flags = CLK_SET_RATE_PARENT,
534 .ops = &clk_branch2_ops,
539 static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
541 .halt_check = BRANCH_VOTED,
543 .enable_reg = 0x201c,
544 .enable_mask = BIT(0),
545 .hw.init = &(struct clk_init_data){
546 .name = "disp_cc_mdss_mdp_lut_clk",
547 .parent_data = &(const struct clk_parent_data){
548 .hw = &disp_cc_mdss_mdp_clk_src.clkr.hw,
551 .ops = &clk_branch2_ops,
556 static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
558 .halt_check = BRANCH_VOTED,
560 .enable_reg = 0x4004,
561 .enable_mask = BIT(0),
562 .hw.init = &(struct clk_init_data){
563 .name = "disp_cc_mdss_non_gdsc_ahb_clk",
564 .parent_data = &(const struct clk_parent_data){
565 .hw = &disp_cc_mdss_ahb_clk_src.clkr.hw,
568 .flags = CLK_SET_RATE_PARENT,
569 .ops = &clk_branch2_ops,
574 static struct clk_branch disp_cc_mdss_pclk0_clk = {
576 .halt_check = BRANCH_HALT,
578 .enable_reg = 0x2004,
579 .enable_mask = BIT(0),
580 .hw.init = &(struct clk_init_data){
581 .name = "disp_cc_mdss_pclk0_clk",
582 .parent_data = &(const struct clk_parent_data){
583 .hw = &disp_cc_mdss_pclk0_clk_src.clkr.hw,
586 .flags = CLK_SET_RATE_PARENT,
587 .ops = &clk_branch2_ops,
592 static struct clk_branch disp_cc_mdss_rot_clk = {
594 .halt_check = BRANCH_HALT,
596 .enable_reg = 0x2014,
597 .enable_mask = BIT(0),
598 .hw.init = &(struct clk_init_data){
599 .name = "disp_cc_mdss_rot_clk",
600 .parent_data = &(const struct clk_parent_data){
601 .hw = &disp_cc_mdss_rot_clk_src.clkr.hw,
604 .flags = CLK_SET_RATE_PARENT,
605 .ops = &clk_branch2_ops,
610 static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
612 .halt_check = BRANCH_HALT,
614 .enable_reg = 0x400c,
615 .enable_mask = BIT(0),
616 .hw.init = &(struct clk_init_data){
617 .name = "disp_cc_mdss_rscc_ahb_clk",
618 .parent_data = &(const struct clk_parent_data){
619 .hw = &disp_cc_mdss_ahb_clk_src.clkr.hw,
622 .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
623 .ops = &clk_branch2_ops,
628 static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
630 .halt_check = BRANCH_HALT,
632 .enable_reg = 0x4008,
633 .enable_mask = BIT(0),
634 .hw.init = &(struct clk_init_data){
635 .name = "disp_cc_mdss_rscc_vsync_clk",
636 .parent_data = &(const struct clk_parent_data){
637 .hw = &disp_cc_mdss_vsync_clk_src.clkr.hw,
640 .flags = CLK_SET_RATE_PARENT,
641 .ops = &clk_branch2_ops,
646 static struct clk_branch disp_cc_mdss_vsync_clk = {
648 .halt_check = BRANCH_HALT,
650 .enable_reg = 0x2024,
651 .enable_mask = BIT(0),
652 .hw.init = &(struct clk_init_data){
653 .name = "disp_cc_mdss_vsync_clk",
654 .parent_data = &(const struct clk_parent_data){
655 .hw = &disp_cc_mdss_vsync_clk_src.clkr.hw,
658 .flags = CLK_SET_RATE_PARENT,
659 .ops = &clk_branch2_ops,
664 static struct gdsc mdss_gdsc = {
669 .pwrsts = PWRSTS_OFF_ON,
673 static struct gdsc *disp_cc_sc7180_gdscs[] = {
674 [MDSS_GDSC] = &mdss_gdsc,
677 static struct clk_regmap *disp_cc_sc7180_clocks[] = {
678 [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
679 [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
680 [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
681 [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
682 [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
683 [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
684 [DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
685 [DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
686 [DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr,
687 [DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr,
688 [DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
689 [DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
690 [DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC] =
691 &disp_cc_mdss_dp_link_div_clk_src.clkr,
692 [DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
693 [DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
694 [DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
695 [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
696 [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
697 [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
698 [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
699 [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
700 [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
701 [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
702 [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
703 [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
704 [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
705 [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
706 [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
707 [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
708 [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
709 [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
710 [DISP_CC_PLL0_OUT_EVEN] = &disp_cc_pll0_out_even.clkr,
713 static const struct regmap_config disp_cc_sc7180_regmap_config = {
717 .max_register = 0x10000,
721 static const struct qcom_cc_desc disp_cc_sc7180_desc = {
722 .config = &disp_cc_sc7180_regmap_config,
723 .clks = disp_cc_sc7180_clocks,
724 .num_clks = ARRAY_SIZE(disp_cc_sc7180_clocks),
725 .gdscs = disp_cc_sc7180_gdscs,
726 .num_gdscs = ARRAY_SIZE(disp_cc_sc7180_gdscs),
729 static const struct of_device_id disp_cc_sc7180_match_table[] = {
730 { .compatible = "qcom,sc7180-dispcc" },
733 MODULE_DEVICE_TABLE(of, disp_cc_sc7180_match_table);
735 static int disp_cc_sc7180_probe(struct platform_device *pdev)
737 struct regmap *regmap;
738 struct alpha_pll_config disp_cc_pll_config = {};
740 regmap = qcom_cc_map(pdev, &disp_cc_sc7180_desc);
742 return PTR_ERR(regmap);
744 /* 1380MHz configuration */
745 disp_cc_pll_config.l = 0x47;
746 disp_cc_pll_config.alpha = 0xe000;
747 disp_cc_pll_config.user_ctl_val = 0x00000001;
748 disp_cc_pll_config.user_ctl_hi_val = 0x00004805;
750 clk_fabia_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll_config);
752 return qcom_cc_really_probe(pdev, &disp_cc_sc7180_desc, regmap);
755 static struct platform_driver disp_cc_sc7180_driver = {
756 .probe = disp_cc_sc7180_probe,
758 .name = "sc7180-dispcc",
759 .of_match_table = disp_cc_sc7180_match_table,
763 static int __init disp_cc_sc7180_init(void)
765 return platform_driver_register(&disp_cc_sc7180_driver);
767 subsys_initcall(disp_cc_sc7180_init);
769 static void __exit disp_cc_sc7180_exit(void)
771 platform_driver_unregister(&disp_cc_sc7180_driver);
773 module_exit(disp_cc_sc7180_exit);
775 MODULE_DESCRIPTION("QTI DISP_CC SC7180 Driver");
776 MODULE_LICENSE("GPL v2");