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