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  * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org>
0005  */
0006 
0007 #include <linux/clk-provider.h>
0008 #include <linux/module.h>
0009 #include <linux/platform_device.h>
0010 #include <linux/regmap.h>
0011 
0012 #include <dt-bindings/clock/qcom,dispcc-sm6350.h>
0013 
0014 #include "clk-alpha-pll.h"
0015 #include "clk-branch.h"
0016 #include "clk-rcg.h"
0017 #include "clk-regmap.h"
0018 #include "clk-regmap-divider.h"
0019 #include "common.h"
0020 #include "gdsc.h"
0021 #include "reset.h"
0022 
0023 enum {
0024     P_BI_TCXO,
0025     P_DISP_CC_PLL0_OUT_EVEN,
0026     P_DISP_CC_PLL0_OUT_MAIN,
0027     P_DP_PHY_PLL_LINK_CLK,
0028     P_DP_PHY_PLL_VCO_DIV_CLK,
0029     P_DSI0_PHY_PLL_OUT_BYTECLK,
0030     P_DSI0_PHY_PLL_OUT_DSICLK,
0031     P_GCC_DISP_GPLL0_CLK,
0032 };
0033 
0034 static struct pll_vco fabia_vco[] = {
0035     { 249600000, 2000000000, 0 },
0036 };
0037 
0038 static const struct alpha_pll_config disp_cc_pll0_config = {
0039     .l = 0x3a,
0040     .alpha = 0x5555,
0041     .config_ctl_val = 0x20485699,
0042     .config_ctl_hi_val = 0x00002067,
0043     .test_ctl_val = 0x40000000,
0044     .test_ctl_hi_val = 0x00000002,
0045     .user_ctl_val = 0x00000000,
0046     .user_ctl_hi_val = 0x00004805,
0047 };
0048 
0049 static struct clk_alpha_pll disp_cc_pll0 = {
0050     .offset = 0x0,
0051     .vco_table = fabia_vco,
0052     .num_vco = ARRAY_SIZE(fabia_vco),
0053     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
0054     .clkr = {
0055         .hw.init = &(struct clk_init_data){
0056             .name = "disp_cc_pll0",
0057             .parent_data = &(const struct clk_parent_data){
0058                 .fw_name = "bi_tcxo",
0059             },
0060             .num_parents = 1,
0061             .ops = &clk_alpha_pll_fabia_ops,
0062         },
0063     },
0064 };
0065 
0066 static const struct parent_map disp_cc_parent_map_0[] = {
0067     { P_BI_TCXO, 0 },
0068     { P_DP_PHY_PLL_LINK_CLK, 1 },
0069     { P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
0070 };
0071 
0072 static const struct clk_parent_data disp_cc_parent_data_0[] = {
0073     { .fw_name = "bi_tcxo" },
0074     { .fw_name = "dp_phy_pll_link_clk" },
0075     { .fw_name = "dp_phy_pll_vco_div_clk" },
0076 };
0077 
0078 static const struct parent_map disp_cc_parent_map_1[] = {
0079     { P_BI_TCXO, 0 },
0080     { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
0081 };
0082 
0083 static const struct clk_parent_data disp_cc_parent_data_1[] = {
0084     { .fw_name = "bi_tcxo" },
0085     { .fw_name = "dsi0_phy_pll_out_byteclk" },
0086 };
0087 
0088 static const struct parent_map disp_cc_parent_map_3[] = {
0089     { P_BI_TCXO, 0 },
0090     { P_DISP_CC_PLL0_OUT_MAIN, 1 },
0091     { P_GCC_DISP_GPLL0_CLK, 4 },
0092     { P_DISP_CC_PLL0_OUT_EVEN, 5 },
0093 };
0094 
0095 static const struct clk_parent_data disp_cc_parent_data_3[] = {
0096     { .fw_name = "bi_tcxo" },
0097     { .hw = &disp_cc_pll0.clkr.hw },
0098     { .fw_name = "gcc_disp_gpll0_clk" },
0099     { .hw = &disp_cc_pll0.clkr.hw },
0100 };
0101 
0102 static const struct parent_map disp_cc_parent_map_4[] = {
0103     { P_BI_TCXO, 0 },
0104     { P_GCC_DISP_GPLL0_CLK, 4 },
0105 };
0106 
0107 static const struct clk_parent_data disp_cc_parent_data_4[] = {
0108     { .fw_name = "bi_tcxo" },
0109     { .fw_name = "gcc_disp_gpll0_clk" },
0110 };
0111 
0112 static const struct parent_map disp_cc_parent_map_5[] = {
0113     { P_BI_TCXO, 0 },
0114     { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
0115 };
0116 
0117 static const struct clk_parent_data disp_cc_parent_data_5[] = {
0118     { .fw_name = "bi_tcxo" },
0119     { .fw_name = "dsi0_phy_pll_out_dsiclk" },
0120 };
0121 
0122 static const struct parent_map disp_cc_parent_map_6[] = {
0123     { P_BI_TCXO, 0 },
0124 };
0125 
0126 static const struct clk_parent_data disp_cc_parent_data_6[] = {
0127     { .fw_name = "bi_tcxo" },
0128 };
0129 
0130 static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
0131     F(19200000, P_BI_TCXO, 1, 0, 0),
0132     F(37500000, P_GCC_DISP_GPLL0_CLK, 16, 0, 0),
0133     F(75000000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0),
0134     { }
0135 };
0136 
0137 static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
0138     .cmd_rcgr = 0x115c,
0139     .mnd_width = 0,
0140     .hid_width = 5,
0141     .parent_map = disp_cc_parent_map_4,
0142     .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
0143     .clkr.hw.init = &(struct clk_init_data){
0144         .name = "disp_cc_mdss_ahb_clk_src",
0145         .parent_data = disp_cc_parent_data_4,
0146         .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
0147         .flags = CLK_SET_RATE_PARENT,
0148         .ops = &clk_rcg2_ops,
0149     },
0150 };
0151 
0152 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
0153     .cmd_rcgr = 0x10c4,
0154     .mnd_width = 0,
0155     .hid_width = 5,
0156     .parent_map = disp_cc_parent_map_1,
0157     .clkr.hw.init = &(struct clk_init_data){
0158         .name = "disp_cc_mdss_byte0_clk_src",
0159         .parent_data = disp_cc_parent_data_1,
0160         .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0161         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0162         .ops = &clk_byte2_ops,
0163     },
0164 };
0165 
0166 static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
0167     .reg = 0x10dc,
0168     .shift = 0,
0169     .width = 2,
0170     .clkr.hw.init = &(struct clk_init_data) {
0171         .name = "disp_cc_mdss_byte0_div_clk_src",
0172         .parent_hws = (const struct clk_hw*[]){
0173             &disp_cc_mdss_byte0_clk_src.clkr.hw,
0174         },
0175         .num_parents = 1,
0176         .flags = CLK_GET_RATE_NOCACHE,
0177         .ops = &clk_regmap_div_ro_ops,
0178     },
0179 };
0180 
0181 static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux_clk_src[] = {
0182     F(19200000, P_BI_TCXO, 1, 0, 0),
0183     { }
0184 };
0185 
0186 static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
0187     .cmd_rcgr = 0x1144,
0188     .mnd_width = 0,
0189     .hid_width = 5,
0190     .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
0191     .clkr.hw.init = &(struct clk_init_data){
0192         .name = "disp_cc_mdss_dp_aux_clk_src",
0193         .parent_data = &(const struct clk_parent_data){
0194             .fw_name = "bi_tcxo",
0195         },
0196         .num_parents = 1,
0197         .ops = &clk_rcg2_ops,
0198     },
0199 };
0200 
0201 static const struct freq_tbl ftbl_disp_cc_mdss_dp_crypto_clk_src[] = {
0202     F(108000, P_DP_PHY_PLL_LINK_CLK, 3, 0, 0),
0203     F(180000, P_DP_PHY_PLL_LINK_CLK, 3, 0, 0),
0204     F(360000, P_DP_PHY_PLL_LINK_CLK, 1.5, 0, 0),
0205     F(540000, P_DP_PHY_PLL_LINK_CLK, 1.5, 0, 0),
0206     { }
0207 };
0208 
0209 static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
0210     .cmd_rcgr = 0x1114,
0211     .mnd_width = 0,
0212     .hid_width = 5,
0213     .parent_map = disp_cc_parent_map_0,
0214     .freq_tbl = ftbl_disp_cc_mdss_dp_crypto_clk_src,
0215     .clkr.hw.init = &(struct clk_init_data){
0216         .name = "disp_cc_mdss_dp_crypto_clk_src",
0217         .parent_data = disp_cc_parent_data_0,
0218         .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0219         .flags = CLK_GET_RATE_NOCACHE,
0220         .ops = &clk_rcg2_ops,
0221     },
0222 };
0223 
0224 static const struct freq_tbl ftbl_disp_cc_mdss_dp_link_clk_src[] = {
0225     F(162000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
0226     F(270000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
0227     F(540000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
0228     F(810000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
0229     { }
0230 };
0231 
0232 static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
0233     .cmd_rcgr = 0x10f8,
0234     .mnd_width = 0,
0235     .hid_width = 5,
0236     .parent_map = disp_cc_parent_map_0,
0237     .freq_tbl = ftbl_disp_cc_mdss_dp_link_clk_src,
0238     .clkr.hw.init = &(struct clk_init_data){
0239         .name = "disp_cc_mdss_dp_link_clk_src",
0240         .parent_data = disp_cc_parent_data_0,
0241         .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0242         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0243         .ops = &clk_rcg2_ops,
0244     },
0245 };
0246 
0247 static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
0248     .cmd_rcgr = 0x112c,
0249     .mnd_width = 16,
0250     .hid_width = 5,
0251     .parent_map = disp_cc_parent_map_0,
0252     .clkr.hw.init = &(struct clk_init_data){
0253         .name = "disp_cc_mdss_dp_pixel_clk_src",
0254         .parent_data = disp_cc_parent_data_0,
0255         .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0256         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0257         .ops = &clk_dp_ops,
0258     },
0259 };
0260 
0261 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
0262     .cmd_rcgr = 0x10e0,
0263     .mnd_width = 0,
0264     .hid_width = 5,
0265     .parent_map = disp_cc_parent_map_1,
0266     .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
0267     .clkr.hw.init = &(struct clk_init_data){
0268         .name = "disp_cc_mdss_esc0_clk_src",
0269         .parent_data = disp_cc_parent_data_1,
0270         .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0271         .ops = &clk_rcg2_ops,
0272     },
0273 };
0274 
0275 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
0276     F(19200000, P_BI_TCXO, 1, 0, 0),
0277     F(200000000, P_GCC_DISP_GPLL0_CLK, 3, 0, 0),
0278     F(300000000, P_GCC_DISP_GPLL0_CLK, 2, 0, 0),
0279     F(373333333, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
0280     F(448000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
0281     F(560000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
0282     { }
0283 };
0284 
0285 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
0286     .cmd_rcgr = 0x107c,
0287     .mnd_width = 0,
0288     .hid_width = 5,
0289     .parent_map = disp_cc_parent_map_3,
0290     .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
0291     .clkr.hw.init = &(struct clk_init_data){
0292         .name = "disp_cc_mdss_mdp_clk_src",
0293         .parent_data = disp_cc_parent_data_3,
0294         .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
0295         .flags = CLK_SET_RATE_PARENT,
0296         .ops = &clk_rcg2_ops,
0297     },
0298 };
0299 
0300 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
0301     .cmd_rcgr = 0x1064,
0302     .mnd_width = 8,
0303     .hid_width = 5,
0304     .parent_map = disp_cc_parent_map_5,
0305     .clkr.hw.init = &(struct clk_init_data){
0306         .name = "disp_cc_mdss_pclk0_clk_src",
0307         .parent_data = disp_cc_parent_data_5,
0308         .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
0309         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0310         .ops = &clk_pixel_ops,
0311     },
0312 };
0313 
0314 static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
0315     .cmd_rcgr = 0x1094,
0316     .mnd_width = 0,
0317     .hid_width = 5,
0318     .parent_map = disp_cc_parent_map_3,
0319     .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
0320     .clkr.hw.init = &(struct clk_init_data){
0321         .name = "disp_cc_mdss_rot_clk_src",
0322         .parent_data = disp_cc_parent_data_3,
0323         .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
0324         .flags = CLK_SET_RATE_PARENT,
0325         .ops = &clk_rcg2_ops,
0326     },
0327 };
0328 
0329 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
0330     .cmd_rcgr = 0x10ac,
0331     .mnd_width = 0,
0332     .hid_width = 5,
0333     .parent_map = disp_cc_parent_map_6,
0334     .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
0335     .clkr.hw.init = &(struct clk_init_data){
0336         .name = "disp_cc_mdss_vsync_clk_src",
0337         .parent_data = disp_cc_parent_data_6,
0338         .num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
0339         .ops = &clk_rcg2_ops,
0340     },
0341 };
0342 
0343 static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
0344     .reg = 0x1110,
0345     .shift = 0,
0346     .width = 2,
0347     .clkr.hw.init = &(struct clk_init_data) {
0348         .name = "disp_cc_mdss_dp_link_div_clk_src",
0349         .parent_hws = (const struct clk_hw*[]){
0350             &disp_cc_mdss_dp_link_clk_src.clkr.hw,
0351         },
0352         .num_parents = 1,
0353         .flags = CLK_GET_RATE_NOCACHE,
0354         .ops = &clk_regmap_div_ro_ops,
0355     },
0356 };
0357 
0358 static struct clk_branch disp_cc_mdss_ahb_clk = {
0359     .halt_reg = 0x104c,
0360     .halt_check = BRANCH_HALT,
0361     .clkr = {
0362         .enable_reg = 0x104c,
0363         .enable_mask = BIT(0),
0364         .hw.init = &(struct clk_init_data){
0365             .name = "disp_cc_mdss_ahb_clk",
0366             .parent_hws = (const struct clk_hw*[]){
0367                 &disp_cc_mdss_ahb_clk_src.clkr.hw,
0368             },
0369             .num_parents = 1,
0370             .flags = CLK_SET_RATE_PARENT,
0371             .ops = &clk_branch2_ops,
0372         },
0373     },
0374 };
0375 
0376 static struct clk_branch disp_cc_mdss_byte0_clk = {
0377     .halt_reg = 0x102c,
0378     .halt_check = BRANCH_HALT,
0379     .clkr = {
0380         .enable_reg = 0x102c,
0381         .enable_mask = BIT(0),
0382         .hw.init = &(struct clk_init_data){
0383             .name = "disp_cc_mdss_byte0_clk",
0384             .parent_hws = (const struct clk_hw*[]){
0385                 &disp_cc_mdss_byte0_clk_src.clkr.hw,
0386             },
0387             .num_parents = 1,
0388             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0389             .ops = &clk_branch2_ops,
0390         },
0391     },
0392 };
0393 
0394 static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
0395     .halt_reg = 0x1030,
0396     .halt_check = BRANCH_HALT,
0397     .clkr = {
0398         .enable_reg = 0x1030,
0399         .enable_mask = BIT(0),
0400         .hw.init = &(struct clk_init_data){
0401             .name = "disp_cc_mdss_byte0_intf_clk",
0402             .parent_hws = (const struct clk_hw*[]){
0403                 &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
0404             },
0405             .num_parents = 1,
0406             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0407             .ops = &clk_branch2_ops,
0408         },
0409     },
0410 };
0411 
0412 static struct clk_branch disp_cc_mdss_dp_aux_clk = {
0413     .halt_reg = 0x1048,
0414     .halt_check = BRANCH_HALT,
0415     .clkr = {
0416         .enable_reg = 0x1048,
0417         .enable_mask = BIT(0),
0418         .hw.init = &(struct clk_init_data){
0419             .name = "disp_cc_mdss_dp_aux_clk",
0420             .parent_hws = (const struct clk_hw*[]){
0421                 &disp_cc_mdss_dp_aux_clk_src.clkr.hw,
0422             },
0423             .num_parents = 1,
0424             .flags = CLK_SET_RATE_PARENT,
0425             .ops = &clk_branch2_ops,
0426         },
0427     },
0428 };
0429 
0430 static struct clk_branch disp_cc_mdss_dp_crypto_clk = {
0431     .halt_reg = 0x1040,
0432     .halt_check = BRANCH_HALT,
0433     .clkr = {
0434         .enable_reg = 0x1040,
0435         .enable_mask = BIT(0),
0436         .hw.init = &(struct clk_init_data){
0437             .name = "disp_cc_mdss_dp_crypto_clk",
0438             .parent_hws = (const struct clk_hw*[]){
0439                 &disp_cc_mdss_dp_crypto_clk_src.clkr.hw,
0440             },
0441             .num_parents = 1,
0442             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0443             .ops = &clk_branch2_ops,
0444         },
0445     },
0446 };
0447 
0448 static struct clk_branch disp_cc_mdss_dp_link_clk = {
0449     .halt_reg = 0x1038,
0450     .halt_check = BRANCH_HALT,
0451     .clkr = {
0452         .enable_reg = 0x1038,
0453         .enable_mask = BIT(0),
0454         .hw.init = &(struct clk_init_data){
0455             .name = "disp_cc_mdss_dp_link_clk",
0456             .parent_hws = (const struct clk_hw*[]){
0457                 &disp_cc_mdss_dp_link_clk_src.clkr.hw,
0458             },
0459             .num_parents = 1,
0460             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0461             .ops = &clk_branch2_ops,
0462         },
0463     },
0464 };
0465 
0466 static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
0467     .halt_reg = 0x103c,
0468     .halt_check = BRANCH_HALT,
0469     .clkr = {
0470         .enable_reg = 0x103c,
0471         .enable_mask = BIT(0),
0472         .hw.init = &(struct clk_init_data){
0473             .name = "disp_cc_mdss_dp_link_intf_clk",
0474             .parent_hws = (const struct clk_hw*[]){
0475                 &disp_cc_mdss_dp_link_div_clk_src.clkr.hw,
0476             },
0477             .num_parents = 1,
0478             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0479             .ops = &clk_branch2_ops,
0480         },
0481     },
0482 };
0483 
0484 static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
0485     .halt_reg = 0x1044,
0486     .halt_check = BRANCH_HALT,
0487     .clkr = {
0488         .enable_reg = 0x1044,
0489         .enable_mask = BIT(0),
0490         .hw.init = &(struct clk_init_data){
0491             .name = "disp_cc_mdss_dp_pixel_clk",
0492             .parent_hws = (const struct clk_hw*[]){
0493                 &disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
0494             },
0495             .num_parents = 1,
0496             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0497             .ops = &clk_branch2_ops,
0498         },
0499     },
0500 };
0501 
0502 static struct clk_branch disp_cc_mdss_esc0_clk = {
0503     .halt_reg = 0x1034,
0504     .halt_check = BRANCH_HALT,
0505     .clkr = {
0506         .enable_reg = 0x1034,
0507         .enable_mask = BIT(0),
0508         .hw.init = &(struct clk_init_data){
0509             .name = "disp_cc_mdss_esc0_clk",
0510             .parent_hws = (const struct clk_hw*[]){
0511                 &disp_cc_mdss_esc0_clk_src.clkr.hw,
0512             },
0513             .num_parents = 1,
0514             .flags = CLK_SET_RATE_PARENT,
0515             .ops = &clk_branch2_ops,
0516         },
0517     },
0518 };
0519 
0520 static struct clk_branch disp_cc_mdss_mdp_clk = {
0521     .halt_reg = 0x1010,
0522     .halt_check = BRANCH_HALT,
0523     .clkr = {
0524         .enable_reg = 0x1010,
0525         .enable_mask = BIT(0),
0526         .hw.init = &(struct clk_init_data){
0527             .name = "disp_cc_mdss_mdp_clk",
0528             .parent_hws = (const struct clk_hw*[]){
0529                 &disp_cc_mdss_mdp_clk_src.clkr.hw,
0530             },
0531             .num_parents = 1,
0532             .flags = CLK_SET_RATE_PARENT,
0533             .ops = &clk_branch2_ops,
0534         },
0535     },
0536 };
0537 
0538 static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
0539     .halt_reg = 0x1020,
0540     .halt_check = BRANCH_HALT_VOTED,
0541     .clkr = {
0542         .enable_reg = 0x1020,
0543         .enable_mask = BIT(0),
0544         .hw.init = &(struct clk_init_data){
0545             .name = "disp_cc_mdss_mdp_lut_clk",
0546             .parent_hws = (const struct clk_hw*[]){
0547                 &disp_cc_mdss_mdp_clk_src.clkr.hw,
0548             },
0549             .num_parents = 1,
0550             .flags = CLK_SET_RATE_PARENT,
0551             .ops = &clk_branch2_ops,
0552         },
0553     },
0554 };
0555 
0556 static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
0557     .halt_reg = 0x2004,
0558     .halt_check = BRANCH_HALT_VOTED,
0559     .clkr = {
0560         .enable_reg = 0x2004,
0561         .enable_mask = BIT(0),
0562         .hw.init = &(struct clk_init_data){
0563             .name = "disp_cc_mdss_non_gdsc_ahb_clk",
0564             .parent_hws = (const struct clk_hw*[]){
0565                 &disp_cc_mdss_ahb_clk_src.clkr.hw,
0566             },
0567             .num_parents = 1,
0568             .flags = CLK_SET_RATE_PARENT,
0569             .ops = &clk_branch2_ops,
0570         },
0571     },
0572 };
0573 
0574 static struct clk_branch disp_cc_mdss_pclk0_clk = {
0575     .halt_reg = 0x100c,
0576     .halt_check = BRANCH_HALT,
0577     .clkr = {
0578         .enable_reg = 0x100c,
0579         .enable_mask = BIT(0),
0580         .hw.init = &(struct clk_init_data){
0581             .name = "disp_cc_mdss_pclk0_clk",
0582             .parent_hws = (const struct clk_hw*[]){
0583                 &disp_cc_mdss_pclk0_clk_src.clkr.hw,
0584             },
0585             .num_parents = 1,
0586             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0587             .ops = &clk_branch2_ops,
0588         },
0589     },
0590 };
0591 
0592 static struct clk_branch disp_cc_mdss_rot_clk = {
0593     .halt_reg = 0x1018,
0594     .halt_check = BRANCH_HALT,
0595     .clkr = {
0596         .enable_reg = 0x1018,
0597         .enable_mask = BIT(0),
0598         .hw.init = &(struct clk_init_data){
0599             .name = "disp_cc_mdss_rot_clk",
0600             .parent_hws = (const struct clk_hw*[]){
0601                 &disp_cc_mdss_rot_clk_src.clkr.hw,
0602             },
0603             .num_parents = 1,
0604             .flags = CLK_SET_RATE_PARENT,
0605             .ops = &clk_branch2_ops,
0606         },
0607     },
0608 };
0609 
0610 static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
0611     .halt_reg = 0x200c,
0612     .halt_check = BRANCH_HALT,
0613     .clkr = {
0614         .enable_reg = 0x200c,
0615         .enable_mask = BIT(0),
0616         .hw.init = &(struct clk_init_data){
0617             .name = "disp_cc_mdss_rscc_ahb_clk",
0618             .parent_hws = (const struct clk_hw*[]){
0619                 &disp_cc_mdss_ahb_clk_src.clkr.hw,
0620             },
0621             .num_parents = 1,
0622             .flags = CLK_SET_RATE_PARENT,
0623             .ops = &clk_branch2_ops,
0624         },
0625     },
0626 };
0627 
0628 static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
0629     .halt_reg = 0x2008,
0630     .halt_check = BRANCH_HALT,
0631     .clkr = {
0632         .enable_reg = 0x2008,
0633         .enable_mask = BIT(0),
0634         .hw.init = &(struct clk_init_data){
0635             .name = "disp_cc_mdss_rscc_vsync_clk",
0636             .parent_hws = (const struct clk_hw*[]){
0637                 &disp_cc_mdss_vsync_clk_src.clkr.hw,
0638             },
0639             .num_parents = 1,
0640             .flags = CLK_SET_RATE_PARENT,
0641             .ops = &clk_branch2_ops,
0642         },
0643     },
0644 };
0645 
0646 static struct clk_branch disp_cc_mdss_vsync_clk = {
0647     .halt_reg = 0x1028,
0648     .halt_check = BRANCH_HALT,
0649     .clkr = {
0650         .enable_reg = 0x1028,
0651         .enable_mask = BIT(0),
0652         .hw.init = &(struct clk_init_data){
0653             .name = "disp_cc_mdss_vsync_clk",
0654             .parent_hws = (const struct clk_hw*[]){
0655                 &disp_cc_mdss_vsync_clk_src.clkr.hw,
0656             },
0657             .num_parents = 1,
0658             .flags = CLK_SET_RATE_PARENT,
0659             .ops = &clk_branch2_ops,
0660         },
0661     },
0662 };
0663 
0664 static struct clk_branch disp_cc_sleep_clk = {
0665     .halt_reg = 0x5004,
0666     .halt_check = BRANCH_HALT,
0667     .clkr = {
0668         .enable_reg = 0x5004,
0669         .enable_mask = BIT(0),
0670         .hw.init = &(struct clk_init_data){
0671             .name = "disp_cc_sleep_clk",
0672             .ops = &clk_branch2_ops,
0673         },
0674     },
0675 };
0676 
0677 static struct clk_branch disp_cc_xo_clk = {
0678     .halt_reg = 0x5008,
0679     .halt_check = BRANCH_HALT,
0680     .clkr = {
0681         .enable_reg = 0x5008,
0682         .enable_mask = BIT(0),
0683         .hw.init = &(struct clk_init_data){
0684             .name = "disp_cc_xo_clk",
0685             .flags = CLK_IS_CRITICAL,
0686             .ops = &clk_branch2_ops,
0687         },
0688     },
0689 };
0690 
0691 static struct gdsc mdss_gdsc = {
0692     .gdscr = 0x1004,
0693     .pd = {
0694         .name = "mdss_gdsc",
0695     },
0696     .pwrsts = PWRSTS_OFF_ON,
0697     .flags = RETAIN_FF_ENABLE,
0698 };
0699 
0700 static struct clk_regmap *disp_cc_sm6350_clocks[] = {
0701     [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
0702     [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
0703     [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
0704     [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
0705     [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
0706     [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
0707     [DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
0708     [DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
0709     [DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr,
0710     [DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr,
0711     [DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
0712     [DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
0713     [DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC] =
0714         &disp_cc_mdss_dp_link_div_clk_src.clkr,
0715     [DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
0716     [DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
0717     [DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
0718     [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
0719     [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
0720     [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
0721     [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
0722     [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
0723     [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
0724     [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
0725     [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
0726     [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
0727     [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
0728     [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
0729     [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
0730     [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
0731     [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
0732     [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
0733     [DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
0734     [DISP_CC_XO_CLK] = &disp_cc_xo_clk.clkr,
0735 };
0736 
0737 static struct gdsc *disp_cc_sm6350_gdscs[] = {
0738     [MDSS_GDSC] = &mdss_gdsc,
0739 };
0740 
0741 static const struct regmap_config disp_cc_sm6350_regmap_config = {
0742     .reg_bits = 32,
0743     .reg_stride = 4,
0744     .val_bits = 32,
0745     .max_register = 0x10000,
0746     .fast_io = true,
0747 };
0748 
0749 static const struct qcom_cc_desc disp_cc_sm6350_desc = {
0750     .config = &disp_cc_sm6350_regmap_config,
0751     .clks = disp_cc_sm6350_clocks,
0752     .num_clks = ARRAY_SIZE(disp_cc_sm6350_clocks),
0753     .gdscs = disp_cc_sm6350_gdscs,
0754     .num_gdscs = ARRAY_SIZE(disp_cc_sm6350_gdscs),
0755 };
0756 
0757 static const struct of_device_id disp_cc_sm6350_match_table[] = {
0758     { .compatible = "qcom,sm6350-dispcc" },
0759     { }
0760 };
0761 MODULE_DEVICE_TABLE(of, disp_cc_sm6350_match_table);
0762 
0763 static int disp_cc_sm6350_probe(struct platform_device *pdev)
0764 {
0765     struct regmap *regmap;
0766 
0767     regmap = qcom_cc_map(pdev, &disp_cc_sm6350_desc);
0768     if (IS_ERR(regmap))
0769         return PTR_ERR(regmap);
0770 
0771     clk_fabia_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
0772 
0773     return qcom_cc_really_probe(pdev, &disp_cc_sm6350_desc, regmap);
0774 }
0775 
0776 static struct platform_driver disp_cc_sm6350_driver = {
0777     .probe = disp_cc_sm6350_probe,
0778     .driver = {
0779         .name = "disp_cc-sm6350",
0780         .of_match_table = disp_cc_sm6350_match_table,
0781     },
0782 };
0783 
0784 static int __init disp_cc_sm6350_init(void)
0785 {
0786     return platform_driver_register(&disp_cc_sm6350_driver);
0787 }
0788 subsys_initcall(disp_cc_sm6350_init);
0789 
0790 static void __exit disp_cc_sm6350_exit(void)
0791 {
0792     platform_driver_unregister(&disp_cc_sm6350_driver);
0793 }
0794 module_exit(disp_cc_sm6350_exit);
0795 
0796 MODULE_DESCRIPTION("QTI DISP_CC SM6350 Driver");
0797 MODULE_LICENSE("GPL v2");