Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
0004  */
0005 
0006 #include <linux/clk-provider.h>
0007 #include <linux/module.h>
0008 #include <linux/platform_device.h>
0009 #include <linux/regmap.h>
0010 
0011 #include <dt-bindings/clock/qcom,dispcc-sm6125.h>
0012 
0013 #include "clk-alpha-pll.h"
0014 #include "clk-branch.h"
0015 #include "clk-rcg.h"
0016 #include "clk-regmap.h"
0017 #include "common.h"
0018 #include "gdsc.h"
0019 
0020 enum {
0021     P_BI_TCXO,
0022     P_DISP_CC_PLL0_OUT_MAIN,
0023     P_DP_PHY_PLL_LINK_CLK,
0024     P_DP_PHY_PLL_VCO_DIV_CLK,
0025     P_DSI0_PHY_PLL_OUT_BYTECLK,
0026     P_DSI0_PHY_PLL_OUT_DSICLK,
0027     P_DSI1_PHY_PLL_OUT_DSICLK,
0028     P_GPLL0_OUT_MAIN,
0029 };
0030 
0031 static struct pll_vco disp_cc_pll_vco[] = {
0032     { 500000000, 1000000000, 2 },
0033 };
0034 
0035 static struct clk_alpha_pll disp_cc_pll0 = {
0036     .offset = 0x0,
0037     .vco_table = disp_cc_pll_vco,
0038     .num_vco = ARRAY_SIZE(disp_cc_pll_vco),
0039     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0040     .flags = SUPPORTS_DYNAMIC_UPDATE,
0041     .clkr = {
0042         .hw.init = &(struct clk_init_data){
0043             .name = "disp_cc_pll0",
0044             .parent_data = &(const struct clk_parent_data){
0045                 .fw_name = "bi_tcxo",
0046             },
0047             .num_parents = 1,
0048             .ops = &clk_alpha_pll_ops,
0049         },
0050     },
0051 };
0052 
0053 /* 768MHz configuration */
0054 static const struct alpha_pll_config disp_cc_pll0_config = {
0055     .l = 0x28,
0056     .vco_val = 0x2 << 20,
0057     .vco_mask = 0x3 << 20,
0058     .main_output_mask = BIT(0),
0059     .config_ctl_val = 0x4001055b,
0060 };
0061 
0062 static const struct parent_map disp_cc_parent_map_0[] = {
0063     { P_BI_TCXO, 0 },
0064 };
0065 
0066 static const struct clk_parent_data disp_cc_parent_data_0[] = {
0067     { .fw_name = "bi_tcxo" },
0068 };
0069 
0070 static const struct parent_map disp_cc_parent_map_1[] = {
0071     { P_BI_TCXO, 0 },
0072     { P_DP_PHY_PLL_LINK_CLK, 1 },
0073     { P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
0074 };
0075 
0076 static const struct clk_parent_data disp_cc_parent_data_1[] = {
0077     { .fw_name = "bi_tcxo" },
0078     { .fw_name = "dp_phy_pll_link_clk" },
0079     { .fw_name = "dp_phy_pll_vco_div_clk" },
0080 };
0081 
0082 static const struct parent_map disp_cc_parent_map_2[] = {
0083     { P_BI_TCXO, 0 },
0084     { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
0085 };
0086 
0087 static const struct clk_parent_data disp_cc_parent_data_2[] = {
0088     { .fw_name = "bi_tcxo" },
0089     { .fw_name = "dsi0_phy_pll_out_byteclk" },
0090 };
0091 
0092 static const struct parent_map disp_cc_parent_map_3[] = {
0093     { P_BI_TCXO, 0 },
0094     { P_DISP_CC_PLL0_OUT_MAIN, 1 },
0095     { P_GPLL0_OUT_MAIN, 4 },
0096 };
0097 
0098 static const struct clk_parent_data disp_cc_parent_data_3[] = {
0099     { .fw_name = "bi_tcxo" },
0100     { .hw = &disp_cc_pll0.clkr.hw },
0101     { .fw_name = "gcc_disp_gpll0_div_clk_src" },
0102 };
0103 
0104 static const struct parent_map disp_cc_parent_map_4[] = {
0105     { P_BI_TCXO, 0 },
0106     { P_GPLL0_OUT_MAIN, 4 },
0107 };
0108 
0109 static const struct clk_parent_data disp_cc_parent_data_4[] = {
0110     { .fw_name = "bi_tcxo" },
0111     { .fw_name = "gcc_disp_gpll0_div_clk_src" },
0112 };
0113 
0114 static const struct parent_map disp_cc_parent_map_5[] = {
0115     { P_BI_TCXO, 0 },
0116     { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
0117     { P_DSI1_PHY_PLL_OUT_DSICLK, 2 },
0118 };
0119 
0120 static const struct clk_parent_data disp_cc_parent_data_5[] = {
0121     { .fw_name = "bi_tcxo" },
0122     { .fw_name = "dsi0_phy_pll_out_dsiclk" },
0123     { .fw_name = "dsi1_phy_pll_out_dsiclk" },
0124 };
0125 
0126 static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
0127     F(19200000, P_BI_TCXO, 1, 0, 0),
0128     F(37500000, P_GPLL0_OUT_MAIN, 16, 0, 0),
0129     F(75000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
0130     { }
0131 };
0132 
0133 static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
0134     .cmd_rcgr = 0x2154,
0135     .mnd_width = 0,
0136     .hid_width = 5,
0137     .parent_map = disp_cc_parent_map_4,
0138     .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
0139     .clkr.hw.init = &(struct clk_init_data){
0140         .name = "disp_cc_mdss_ahb_clk_src",
0141         .parent_data = disp_cc_parent_data_4,
0142         .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
0143         .ops = &clk_rcg2_shared_ops,
0144     },
0145 };
0146 
0147 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
0148     .cmd_rcgr = 0x20bc,
0149     .mnd_width = 0,
0150     .hid_width = 5,
0151     .parent_map = disp_cc_parent_map_2,
0152     .clkr.hw.init = &(struct clk_init_data){
0153         .name = "disp_cc_mdss_byte0_clk_src",
0154         .parent_data = disp_cc_parent_data_2,
0155         .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
0156         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0157         .ops = &clk_byte2_ops,
0158     },
0159 };
0160 
0161 static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux1_clk_src[] = {
0162     F(19200000, P_BI_TCXO, 1, 0, 0),
0163     { }
0164 };
0165 
0166 static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
0167     .cmd_rcgr = 0x213c,
0168     .mnd_width = 0,
0169     .hid_width = 5,
0170     .parent_map = disp_cc_parent_map_0,
0171     .freq_tbl = ftbl_disp_cc_mdss_dp_aux1_clk_src,
0172     .clkr.hw.init = &(struct clk_init_data){
0173         .name = "disp_cc_mdss_dp_aux_clk_src",
0174         .parent_data = disp_cc_parent_data_0,
0175         .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0176         .ops = &clk_rcg2_ops,
0177     },
0178 };
0179 
0180 static const struct freq_tbl ftbl_disp_cc_mdss_dp_crypto_clk_src[] = {
0181     F( 180000, P_DP_PHY_PLL_LINK_CLK,   1.5,   0,   0),
0182     F( 360000, P_DP_PHY_PLL_LINK_CLK,   1.5,   0,   0),
0183     { }
0184 };
0185 
0186 static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
0187     .cmd_rcgr = 0x210c,
0188     .mnd_width = 0,
0189     .hid_width = 5,
0190     .parent_map = disp_cc_parent_map_1,
0191     .freq_tbl = ftbl_disp_cc_mdss_dp_crypto_clk_src,
0192     .clkr.hw.init = &(struct clk_init_data){
0193         .name = "disp_cc_mdss_dp_crypto_clk_src",
0194         .parent_data = disp_cc_parent_data_1,
0195         .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0196         .flags = CLK_GET_RATE_NOCACHE,
0197         .ops = &clk_rcg2_ops,
0198     },
0199 };
0200 
0201 static const struct freq_tbl ftbl_disp_cc_mdss_dp_link_clk_src[] = {
0202     F( 162000, P_DP_PHY_PLL_LINK_CLK,   1,   0,   0),
0203     F( 270000, P_DP_PHY_PLL_LINK_CLK,   1,   0,   0),
0204     F( 540000, P_DP_PHY_PLL_LINK_CLK,   1,   0,   0),
0205     { }
0206 };
0207 
0208 static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
0209     .cmd_rcgr = 0x20f0,
0210     .mnd_width = 0,
0211     .hid_width = 5,
0212     .parent_map = disp_cc_parent_map_1,
0213     .freq_tbl = ftbl_disp_cc_mdss_dp_link_clk_src,
0214     .clkr.hw.init = &(struct clk_init_data){
0215         .name = "disp_cc_mdss_dp_link_clk_src",
0216         .parent_data = disp_cc_parent_data_1,
0217         .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0218         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0219         .ops = &clk_rcg2_ops,
0220     },
0221 };
0222 
0223 static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
0224     .cmd_rcgr = 0x2124,
0225     .mnd_width = 16,
0226     .hid_width = 5,
0227     .parent_map = disp_cc_parent_map_1,
0228     .clkr.hw.init = &(struct clk_init_data){
0229         .name = "disp_cc_mdss_dp_pixel_clk_src",
0230         .parent_data = disp_cc_parent_data_1,
0231         .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0232         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0233         .ops = &clk_dp_ops,
0234     },
0235 };
0236 
0237 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
0238     .cmd_rcgr = 0x20d8,
0239     .mnd_width = 0,
0240     .hid_width = 5,
0241     .parent_map = disp_cc_parent_map_2,
0242     .freq_tbl = ftbl_disp_cc_mdss_dp_aux1_clk_src,
0243     .clkr.hw.init = &(struct clk_init_data){
0244         .name = "disp_cc_mdss_esc0_clk_src",
0245         .parent_data = disp_cc_parent_data_2,
0246         .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
0247         .ops = &clk_rcg2_ops,
0248     },
0249 };
0250 
0251 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
0252     F(19200000, P_BI_TCXO, 1, 0, 0),
0253     F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
0254     F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
0255     F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
0256     F(384000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
0257     F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0),
0258     { }
0259 };
0260 
0261 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
0262     .cmd_rcgr = 0x2074,
0263     .mnd_width = 0,
0264     .hid_width = 5,
0265     .parent_map = disp_cc_parent_map_3,
0266     .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
0267     .clkr.hw.init = &(struct clk_init_data){
0268         .name = "disp_cc_mdss_mdp_clk_src",
0269         .parent_data = disp_cc_parent_data_3,
0270         .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
0271         .ops = &clk_rcg2_shared_ops,
0272     },
0273 };
0274 
0275 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
0276     .cmd_rcgr = 0x205c,
0277     .mnd_width = 8,
0278     .hid_width = 5,
0279     .parent_map = disp_cc_parent_map_5,
0280     .clkr.hw.init = &(struct clk_init_data){
0281         .name = "disp_cc_mdss_pclk0_clk_src",
0282         .parent_data = disp_cc_parent_data_5,
0283         .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
0284         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0285         .ops = &clk_pixel_ops,
0286     },
0287 };
0288 
0289 static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
0290     F(19200000, P_BI_TCXO, 1, 0, 0),
0291     F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
0292     F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
0293     F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
0294     { }
0295 };
0296 
0297 static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
0298     .cmd_rcgr = 0x208c,
0299     .mnd_width = 0,
0300     .hid_width = 5,
0301     .parent_map = disp_cc_parent_map_3,
0302     .freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
0303     .clkr.hw.init = &(struct clk_init_data){
0304         .name = "disp_cc_mdss_rot_clk_src",
0305         .parent_data = disp_cc_parent_data_3,
0306         .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
0307         .flags = CLK_SET_RATE_PARENT,
0308         .ops = &clk_rcg2_shared_ops,
0309     },
0310 };
0311 
0312 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
0313     .cmd_rcgr = 0x20a4,
0314     .mnd_width = 0,
0315     .hid_width = 5,
0316     .parent_map = disp_cc_parent_map_0,
0317     .freq_tbl = ftbl_disp_cc_mdss_dp_aux1_clk_src,
0318     .clkr.hw.init = &(struct clk_init_data){
0319         .name = "disp_cc_mdss_vsync_clk_src",
0320         .parent_data = disp_cc_parent_data_0,
0321         .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0322         .ops = &clk_rcg2_ops,
0323     },
0324 };
0325 
0326 static struct clk_branch disp_cc_mdss_ahb_clk = {
0327     .halt_reg = 0x2044,
0328     .halt_check = BRANCH_HALT,
0329     .clkr = {
0330         .enable_reg = 0x2044,
0331         .enable_mask = BIT(0),
0332         .hw.init = &(struct clk_init_data){
0333             .name = "disp_cc_mdss_ahb_clk",
0334             .parent_hws = (const struct clk_hw*[]){
0335                 &disp_cc_mdss_ahb_clk_src.clkr.hw,
0336             },
0337             .num_parents = 1,
0338             .flags = CLK_SET_RATE_PARENT,
0339             .ops = &clk_branch2_ops,
0340         },
0341     },
0342 };
0343 
0344 static struct clk_branch disp_cc_mdss_byte0_clk = {
0345     .halt_reg = 0x2024,
0346     .halt_check = BRANCH_HALT,
0347     .clkr = {
0348         .enable_reg = 0x2024,
0349         .enable_mask = BIT(0),
0350         .hw.init = &(struct clk_init_data){
0351             .name = "disp_cc_mdss_byte0_clk",
0352             .parent_hws = (const struct clk_hw*[]){
0353                 &disp_cc_mdss_byte0_clk_src.clkr.hw,
0354             },
0355             .num_parents = 1,
0356             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0357             .ops = &clk_branch2_ops,
0358         },
0359     },
0360 };
0361 
0362 static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
0363     .halt_reg = 0x2028,
0364     .halt_check = BRANCH_HALT,
0365     .clkr = {
0366         .enable_reg = 0x2028,
0367         .enable_mask = BIT(0),
0368         .hw.init = &(struct clk_init_data){
0369             .name = "disp_cc_mdss_byte0_intf_clk",
0370             .parent_hws = (const struct clk_hw*[]){
0371                 &disp_cc_mdss_byte0_clk_src.clkr.hw,
0372             },
0373             .num_parents = 1,
0374             .flags = CLK_GET_RATE_NOCACHE,
0375             .ops = &clk_branch2_ops,
0376         },
0377     },
0378 };
0379 
0380 static struct clk_branch disp_cc_mdss_dp_aux_clk = {
0381     .halt_reg = 0x2040,
0382     .halt_check = BRANCH_HALT,
0383     .clkr = {
0384         .enable_reg = 0x2040,
0385         .enable_mask = BIT(0),
0386         .hw.init = &(struct clk_init_data){
0387             .name = "disp_cc_mdss_dp_aux_clk",
0388             .parent_hws = (const struct clk_hw*[]){
0389                 &disp_cc_mdss_dp_aux_clk_src.clkr.hw,
0390             },
0391             .num_parents = 1,
0392             .flags = CLK_SET_RATE_PARENT,
0393             .ops = &clk_branch2_ops,
0394         },
0395     },
0396 };
0397 
0398 static struct clk_branch disp_cc_mdss_dp_crypto_clk = {
0399     .halt_reg = 0x2038,
0400     .halt_check = BRANCH_HALT,
0401     .clkr = {
0402         .enable_reg = 0x2038,
0403         .enable_mask = BIT(0),
0404         .hw.init = &(struct clk_init_data){
0405             .name = "disp_cc_mdss_dp_crypto_clk",
0406             .parent_hws = (const struct clk_hw*[]){
0407                 &disp_cc_mdss_dp_crypto_clk_src.clkr.hw,
0408             },
0409             .num_parents = 1,
0410             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0411             .ops = &clk_branch2_ops,
0412         },
0413     },
0414 };
0415 
0416 static struct clk_branch disp_cc_mdss_dp_link_clk = {
0417     .halt_reg = 0x2030,
0418     .halt_check = BRANCH_HALT,
0419     .clkr = {
0420         .enable_reg = 0x2030,
0421         .enable_mask = BIT(0),
0422         .hw.init = &(struct clk_init_data){
0423             .name = "disp_cc_mdss_dp_link_clk",
0424             .parent_hws = (const struct clk_hw*[]){
0425                 &disp_cc_mdss_dp_link_clk_src.clkr.hw,
0426             },
0427             .num_parents = 1,
0428             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0429             .ops = &clk_branch2_ops,
0430         },
0431     },
0432 };
0433 
0434 static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
0435     .halt_reg = 0x2034,
0436     .halt_check = BRANCH_HALT,
0437     .clkr = {
0438         .enable_reg = 0x2034,
0439         .enable_mask = BIT(0),
0440         .hw.init = &(struct clk_init_data){
0441             .name = "disp_cc_mdss_dp_link_intf_clk",
0442             .parent_hws = (const struct clk_hw*[]){
0443                 &disp_cc_mdss_dp_link_clk_src.clkr.hw,
0444             },
0445             .num_parents = 1,
0446             .flags = CLK_GET_RATE_NOCACHE,
0447             .ops = &clk_branch2_ops,
0448         },
0449     },
0450 };
0451 
0452 static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
0453     .halt_reg = 0x203c,
0454     .halt_check = BRANCH_HALT,
0455     .clkr = {
0456         .enable_reg = 0x203c,
0457         .enable_mask = BIT(0),
0458         .hw.init = &(struct clk_init_data){
0459             .name = "disp_cc_mdss_dp_pixel_clk",
0460             .parent_hws = (const struct clk_hw*[]){
0461                 &disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
0462             },
0463             .num_parents = 1,
0464             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0465             .ops = &clk_branch2_ops,
0466         },
0467     },
0468 };
0469 
0470 static struct clk_branch disp_cc_mdss_esc0_clk = {
0471     .halt_reg = 0x202c,
0472     .halt_check = BRANCH_HALT,
0473     .clkr = {
0474         .enable_reg = 0x202c,
0475         .enable_mask = BIT(0),
0476         .hw.init = &(struct clk_init_data){
0477             .name = "disp_cc_mdss_esc0_clk",
0478             .parent_hws = (const struct clk_hw*[]){
0479                 &disp_cc_mdss_esc0_clk_src.clkr.hw,
0480             },
0481             .num_parents = 1,
0482             .flags = CLK_SET_RATE_PARENT,
0483             .ops = &clk_branch2_ops,
0484         },
0485     },
0486 };
0487 
0488 static struct clk_branch disp_cc_mdss_mdp_clk = {
0489     .halt_reg = 0x2008,
0490     .halt_check = BRANCH_HALT,
0491     .clkr = {
0492         .enable_reg = 0x2008,
0493         .enable_mask = BIT(0),
0494         .hw.init = &(struct clk_init_data){
0495             .name = "disp_cc_mdss_mdp_clk",
0496             .parent_hws = (const struct clk_hw*[]){
0497                 &disp_cc_mdss_mdp_clk_src.clkr.hw,
0498             },
0499             .num_parents = 1,
0500             .flags = CLK_SET_RATE_PARENT,
0501             .ops = &clk_branch2_ops,
0502         },
0503     },
0504 };
0505 
0506 static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
0507     .halt_reg = 0x2018,
0508     .halt_check = BRANCH_VOTED,
0509     .clkr = {
0510         .enable_reg = 0x2018,
0511         .enable_mask = BIT(0),
0512         .hw.init = &(struct clk_init_data){
0513             .name = "disp_cc_mdss_mdp_lut_clk",
0514             .parent_hws = (const struct clk_hw*[]){
0515                 &disp_cc_mdss_mdp_clk_src.clkr.hw,
0516             },
0517             .num_parents = 1,
0518             .ops = &clk_branch2_ops,
0519         },
0520     },
0521 };
0522 
0523 static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
0524     .halt_reg = 0x4004,
0525     .halt_check = BRANCH_VOTED,
0526     .clkr = {
0527         .enable_reg = 0x4004,
0528         .enable_mask = BIT(0),
0529         .hw.init = &(struct clk_init_data){
0530             .name = "disp_cc_mdss_non_gdsc_ahb_clk",
0531             .parent_hws = (const struct clk_hw*[]){
0532                 &disp_cc_mdss_ahb_clk_src.clkr.hw,
0533             },
0534             .num_parents = 1,
0535             .flags = CLK_SET_RATE_PARENT,
0536             .ops = &clk_branch2_ops,
0537         },
0538     },
0539 };
0540 
0541 static struct clk_branch disp_cc_mdss_pclk0_clk = {
0542     .halt_reg = 0x2004,
0543     .halt_check = BRANCH_HALT,
0544     .clkr = {
0545         .enable_reg = 0x2004,
0546         .enable_mask = BIT(0),
0547         .hw.init = &(struct clk_init_data){
0548             .name = "disp_cc_mdss_pclk0_clk",
0549             .parent_hws = (const struct clk_hw*[]){
0550                 &disp_cc_mdss_pclk0_clk_src.clkr.hw,
0551             },
0552             .num_parents = 1,
0553             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0554             .ops = &clk_branch2_ops,
0555         },
0556     },
0557 };
0558 
0559 static struct clk_branch disp_cc_mdss_rot_clk = {
0560     .halt_reg = 0x2010,
0561     .halt_check = BRANCH_HALT,
0562     .clkr = {
0563         .enable_reg = 0x2010,
0564         .enable_mask = BIT(0),
0565         .hw.init = &(struct clk_init_data){
0566             .name = "disp_cc_mdss_rot_clk",
0567             .parent_hws = (const struct clk_hw*[]){
0568                 &disp_cc_mdss_rot_clk_src.clkr.hw,
0569             },
0570             .num_parents = 1,
0571             .flags = CLK_SET_RATE_PARENT,
0572             .ops = &clk_branch2_ops,
0573         },
0574     },
0575 };
0576 
0577 static struct clk_branch disp_cc_mdss_vsync_clk = {
0578     .halt_reg = 0x2020,
0579     .halt_check = BRANCH_HALT,
0580     .clkr = {
0581         .enable_reg = 0x2020,
0582         .enable_mask = BIT(0),
0583         .hw.init = &(struct clk_init_data){
0584             .name = "disp_cc_mdss_vsync_clk",
0585             .parent_hws = (const struct clk_hw*[]){
0586                 &disp_cc_mdss_vsync_clk_src.clkr.hw,
0587             },
0588             .num_parents = 1,
0589             .flags = CLK_SET_RATE_PARENT,
0590             .ops = &clk_branch2_ops,
0591         },
0592     },
0593 };
0594 
0595 static struct clk_branch disp_cc_xo_clk = {
0596     .halt_reg = 0x604c,
0597     .halt_check = BRANCH_HALT,
0598     .clkr = {
0599         .enable_reg = 0x604c,
0600         .enable_mask = BIT(0),
0601         .hw.init = &(struct clk_init_data){
0602             .name = "disp_cc_xo_clk",
0603             .flags = CLK_IS_CRITICAL,
0604             .ops = &clk_branch2_ops,
0605         },
0606     },
0607 };
0608 
0609 static struct gdsc mdss_gdsc = {
0610     .gdscr = 0x3000,
0611     .pd = {
0612         .name = "mdss_gdsc",
0613     },
0614     .pwrsts = PWRSTS_OFF_ON,
0615     .flags = HW_CTRL,
0616 };
0617 
0618 static struct clk_regmap *disp_cc_sm6125_clocks[] = {
0619     [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
0620     [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
0621     [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
0622     [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
0623     [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
0624     [DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
0625     [DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
0626     [DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr,
0627     [DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr,
0628     [DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
0629     [DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
0630     [DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
0631     [DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
0632     [DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
0633     [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
0634     [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
0635     [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
0636     [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
0637     [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
0638     [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
0639     [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
0640     [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
0641     [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
0642     [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
0643     [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
0644     [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
0645     [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
0646     [DISP_CC_XO_CLK] = &disp_cc_xo_clk.clkr,
0647 };
0648 
0649 static struct gdsc *disp_cc_sm6125_gdscs[] = {
0650     [MDSS_GDSC] = &mdss_gdsc,
0651 };
0652 
0653 static const struct regmap_config disp_cc_sm6125_regmap_config = {
0654     .reg_bits = 32,
0655     .reg_stride = 4,
0656     .val_bits = 32,
0657     .max_register = 0x10000,
0658     .fast_io = true,
0659 };
0660 
0661 static const struct qcom_cc_desc disp_cc_sm6125_desc = {
0662     .config = &disp_cc_sm6125_regmap_config,
0663     .clks = disp_cc_sm6125_clocks,
0664     .num_clks = ARRAY_SIZE(disp_cc_sm6125_clocks),
0665     .gdscs = disp_cc_sm6125_gdscs,
0666     .num_gdscs = ARRAY_SIZE(disp_cc_sm6125_gdscs),
0667 };
0668 
0669 static const struct of_device_id disp_cc_sm6125_match_table[] = {
0670     { .compatible = "qcom,dispcc-sm6125" },
0671     { }
0672 };
0673 MODULE_DEVICE_TABLE(of, disp_cc_sm6125_match_table);
0674 
0675 static int disp_cc_sm6125_probe(struct platform_device *pdev)
0676 {
0677     struct regmap *regmap;
0678 
0679     regmap = qcom_cc_map(pdev, &disp_cc_sm6125_desc);
0680     if (IS_ERR(regmap))
0681         return PTR_ERR(regmap);
0682 
0683     clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
0684 
0685     return qcom_cc_really_probe(pdev, &disp_cc_sm6125_desc, regmap);
0686 }
0687 
0688 static struct platform_driver disp_cc_sm6125_driver = {
0689     .probe = disp_cc_sm6125_probe,
0690     .driver = {
0691         .name = "disp_cc-sm6125",
0692         .of_match_table = disp_cc_sm6125_match_table,
0693     },
0694 };
0695 
0696 static int __init disp_cc_sm6125_init(void)
0697 {
0698     return platform_driver_register(&disp_cc_sm6125_driver);
0699 }
0700 subsys_initcall(disp_cc_sm6125_init);
0701 
0702 static void __exit disp_cc_sm6125_exit(void)
0703 {
0704     platform_driver_unregister(&disp_cc_sm6125_driver);
0705 }
0706 module_exit(disp_cc_sm6125_exit);
0707 
0708 MODULE_DESCRIPTION("QTI DISPCC SM6125 Driver");
0709 MODULE_LICENSE("GPL v2");