0001
0002
0003
0004
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");