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 #include <linux/reset-controller.h>
0011
0012 #include <dt-bindings/clock/qcom,dispcc-sdm845.h>
0013
0014 #include "clk-alpha-pll.h"
0015 #include "clk-branch.h"
0016 #include "clk-rcg.h"
0017 #include "clk-regmap-divider.h"
0018 #include "common.h"
0019 #include "gdsc.h"
0020 #include "reset.h"
0021
0022 enum {
0023 P_BI_TCXO,
0024 P_DISP_CC_PLL0_OUT_MAIN,
0025 P_DSI0_PHY_PLL_OUT_BYTECLK,
0026 P_DSI0_PHY_PLL_OUT_DSICLK,
0027 P_DSI1_PHY_PLL_OUT_BYTECLK,
0028 P_DSI1_PHY_PLL_OUT_DSICLK,
0029 P_GPLL0_OUT_MAIN,
0030 P_GPLL0_OUT_MAIN_DIV,
0031 P_DP_PHY_PLL_LINK_CLK,
0032 P_DP_PHY_PLL_VCO_DIV_CLK,
0033 };
0034
0035 static struct clk_alpha_pll disp_cc_pll0 = {
0036 .offset = 0x0,
0037 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
0038 .clkr = {
0039 .hw.init = &(struct clk_init_data){
0040 .name = "disp_cc_pll0",
0041 .parent_data = &(const struct clk_parent_data){
0042 .fw_name = "bi_tcxo", .name = "bi_tcxo",
0043 },
0044 .num_parents = 1,
0045 .ops = &clk_alpha_pll_fabia_ops,
0046 },
0047 },
0048 };
0049
0050 static const struct parent_map disp_cc_parent_map_0[] = {
0051 { P_BI_TCXO, 0 },
0052 { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
0053 { P_DSI1_PHY_PLL_OUT_BYTECLK, 2 },
0054 };
0055
0056 static const struct clk_parent_data disp_cc_parent_data_0[] = {
0057 { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
0058 { .fw_name = "dsi0_phy_pll_out_byteclk", .name = "dsi0_phy_pll_out_byteclk" },
0059 { .fw_name = "dsi1_phy_pll_out_byteclk", .name = "dsi1_phy_pll_out_byteclk" },
0060 };
0061
0062 static const struct parent_map disp_cc_parent_map_1[] = {
0063 { P_BI_TCXO, 0 },
0064 { P_DP_PHY_PLL_LINK_CLK, 1 },
0065 { P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
0066 };
0067
0068 static const struct clk_parent_data disp_cc_parent_data_1[] = {
0069 { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
0070 { .fw_name = "dp_link_clk_divsel_ten", .name = "dp_link_clk_divsel_ten" },
0071 { .fw_name = "dp_vco_divided_clk_src_mux", .name = "dp_vco_divided_clk_src_mux" },
0072 };
0073
0074 static const struct parent_map disp_cc_parent_map_2[] = {
0075 { P_BI_TCXO, 0 },
0076 };
0077
0078 static const struct clk_parent_data disp_cc_parent_data_2[] = {
0079 { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
0080 };
0081
0082 static const struct parent_map disp_cc_parent_map_3[] = {
0083 { P_BI_TCXO, 0 },
0084 { P_DISP_CC_PLL0_OUT_MAIN, 1 },
0085 { P_GPLL0_OUT_MAIN, 4 },
0086 { P_GPLL0_OUT_MAIN_DIV, 5 },
0087 };
0088
0089 static const struct clk_parent_data disp_cc_parent_data_3[] = {
0090 { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
0091 { .hw = &disp_cc_pll0.clkr.hw },
0092 { .fw_name = "gcc_disp_gpll0_clk_src", .name = "gcc_disp_gpll0_clk_src" },
0093 { .fw_name = "gcc_disp_gpll0_div_clk_src", .name = "gcc_disp_gpll0_div_clk_src" },
0094 };
0095
0096 static const struct parent_map disp_cc_parent_map_4[] = {
0097 { P_BI_TCXO, 0 },
0098 { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
0099 { P_DSI1_PHY_PLL_OUT_DSICLK, 2 },
0100 };
0101
0102 static const struct clk_parent_data disp_cc_parent_data_4[] = {
0103 { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
0104 { .fw_name = "dsi0_phy_pll_out_dsiclk", .name = "dsi0_phy_pll_out_dsiclk" },
0105 { .fw_name = "dsi1_phy_pll_out_dsiclk", .name = "dsi1_phy_pll_out_dsiclk" },
0106 };
0107
0108
0109 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
0110 .cmd_rcgr = 0x20d0,
0111 .mnd_width = 0,
0112 .hid_width = 5,
0113 .parent_map = disp_cc_parent_map_0,
0114 .clkr.hw.init = &(struct clk_init_data){
0115 .name = "disp_cc_mdss_byte0_clk_src",
0116 .parent_data = disp_cc_parent_data_0,
0117 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0118 .flags = CLK_SET_RATE_PARENT,
0119 .ops = &clk_byte2_ops,
0120 },
0121 };
0122
0123
0124 static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = {
0125 .cmd_rcgr = 0x20ec,
0126 .mnd_width = 0,
0127 .hid_width = 5,
0128 .parent_map = disp_cc_parent_map_0,
0129 .clkr.hw.init = &(struct clk_init_data){
0130 .name = "disp_cc_mdss_byte1_clk_src",
0131 .parent_data = disp_cc_parent_data_0,
0132 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0133 .flags = CLK_SET_RATE_PARENT,
0134 .ops = &clk_byte2_ops,
0135 },
0136 };
0137
0138 static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux_clk_src[] = {
0139 F(19200000, P_BI_TCXO, 1, 0, 0),
0140 { }
0141 };
0142
0143 static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
0144 .cmd_rcgr = 0x219c,
0145 .mnd_width = 0,
0146 .hid_width = 5,
0147 .parent_map = disp_cc_parent_map_2,
0148 .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
0149 .clkr.hw.init = &(struct clk_init_data){
0150 .name = "disp_cc_mdss_dp_aux_clk_src",
0151 .parent_data = disp_cc_parent_data_2,
0152 .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
0153 .flags = CLK_SET_RATE_PARENT,
0154 .ops = &clk_rcg2_ops,
0155 },
0156 };
0157
0158 static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
0159 .cmd_rcgr = 0x2154,
0160 .mnd_width = 0,
0161 .hid_width = 5,
0162 .parent_map = disp_cc_parent_map_1,
0163 .clkr.hw.init = &(struct clk_init_data){
0164 .name = "disp_cc_mdss_dp_crypto_clk_src",
0165 .parent_data = disp_cc_parent_data_1,
0166 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0167 .ops = &clk_byte2_ops,
0168 },
0169 };
0170
0171 static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
0172 .cmd_rcgr = 0x2138,
0173 .mnd_width = 0,
0174 .hid_width = 5,
0175 .parent_map = disp_cc_parent_map_1,
0176 .clkr.hw.init = &(struct clk_init_data){
0177 .name = "disp_cc_mdss_dp_link_clk_src",
0178 .parent_data = disp_cc_parent_data_1,
0179 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0180 .flags = CLK_SET_RATE_PARENT,
0181 .ops = &clk_byte2_ops,
0182 },
0183 };
0184
0185 static struct clk_rcg2 disp_cc_mdss_dp_pixel1_clk_src = {
0186 .cmd_rcgr = 0x2184,
0187 .mnd_width = 16,
0188 .hid_width = 5,
0189 .parent_map = disp_cc_parent_map_1,
0190 .clkr.hw.init = &(struct clk_init_data){
0191 .name = "disp_cc_mdss_dp_pixel1_clk_src",
0192 .parent_data = disp_cc_parent_data_1,
0193 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0194 .flags = CLK_SET_RATE_PARENT,
0195 .ops = &clk_dp_ops,
0196 },
0197 };
0198
0199 static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
0200 .cmd_rcgr = 0x216c,
0201 .mnd_width = 16,
0202 .hid_width = 5,
0203 .parent_map = disp_cc_parent_map_1,
0204 .clkr.hw.init = &(struct clk_init_data){
0205 .name = "disp_cc_mdss_dp_pixel_clk_src",
0206 .parent_data = disp_cc_parent_data_1,
0207 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
0208 .flags = CLK_SET_RATE_PARENT,
0209 .ops = &clk_dp_ops,
0210 },
0211 };
0212
0213 static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
0214 F(19200000, P_BI_TCXO, 1, 0, 0),
0215 { }
0216 };
0217
0218 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
0219 .cmd_rcgr = 0x2108,
0220 .mnd_width = 0,
0221 .hid_width = 5,
0222 .parent_map = disp_cc_parent_map_0,
0223 .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
0224 .clkr.hw.init = &(struct clk_init_data){
0225 .name = "disp_cc_mdss_esc0_clk_src",
0226 .parent_data = disp_cc_parent_data_0,
0227 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0228 .ops = &clk_rcg2_ops,
0229 },
0230 };
0231
0232 static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = {
0233 .cmd_rcgr = 0x2120,
0234 .mnd_width = 0,
0235 .hid_width = 5,
0236 .parent_map = disp_cc_parent_map_0,
0237 .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
0238 .clkr.hw.init = &(struct clk_init_data){
0239 .name = "disp_cc_mdss_esc1_clk_src",
0240 .parent_data = disp_cc_parent_data_0,
0241 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
0242 .ops = &clk_rcg2_ops,
0243 },
0244 };
0245
0246 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
0247 F(19200000, P_BI_TCXO, 1, 0, 0),
0248 F(85714286, P_GPLL0_OUT_MAIN, 7, 0, 0),
0249 F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
0250 F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
0251 F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0),
0252 F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
0253 F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
0254 F(344000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
0255 F(430000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
0256 { }
0257 };
0258
0259 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
0260 .cmd_rcgr = 0x2088,
0261 .mnd_width = 0,
0262 .hid_width = 5,
0263 .parent_map = disp_cc_parent_map_3,
0264 .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
0265 .clkr.hw.init = &(struct clk_init_data){
0266 .name = "disp_cc_mdss_mdp_clk_src",
0267 .parent_data = disp_cc_parent_data_3,
0268 .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
0269 .ops = &clk_rcg2_shared_ops,
0270 },
0271 };
0272
0273
0274 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
0275 .cmd_rcgr = 0x2058,
0276 .mnd_width = 8,
0277 .hid_width = 5,
0278 .parent_map = disp_cc_parent_map_4,
0279 .clkr.hw.init = &(struct clk_init_data){
0280 .name = "disp_cc_mdss_pclk0_clk_src",
0281 .parent_data = disp_cc_parent_data_4,
0282 .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
0283 .flags = CLK_SET_RATE_PARENT,
0284 .ops = &clk_pixel_ops,
0285 },
0286 };
0287
0288
0289 static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = {
0290 .cmd_rcgr = 0x2070,
0291 .mnd_width = 8,
0292 .hid_width = 5,
0293 .parent_map = disp_cc_parent_map_4,
0294 .clkr.hw.init = &(struct clk_init_data){
0295 .name = "disp_cc_mdss_pclk1_clk_src",
0296 .parent_data = disp_cc_parent_data_4,
0297 .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
0298 .flags = CLK_SET_RATE_PARENT,
0299 .ops = &clk_pixel_ops,
0300 },
0301 };
0302
0303 static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
0304 F(19200000, P_BI_TCXO, 1, 0, 0),
0305 F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0),
0306 F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
0307 F(344000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
0308 F(430000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
0309 { }
0310 };
0311
0312 static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
0313 .cmd_rcgr = 0x20a0,
0314 .mnd_width = 0,
0315 .hid_width = 5,
0316 .parent_map = disp_cc_parent_map_3,
0317 .freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
0318 .clkr.hw.init = &(struct clk_init_data){
0319 .name = "disp_cc_mdss_rot_clk_src",
0320 .parent_data = disp_cc_parent_data_3,
0321 .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
0322 .ops = &clk_rcg2_shared_ops,
0323 },
0324 };
0325
0326 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
0327 .cmd_rcgr = 0x20b8,
0328 .mnd_width = 0,
0329 .hid_width = 5,
0330 .parent_map = disp_cc_parent_map_2,
0331 .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
0332 .clkr.hw.init = &(struct clk_init_data){
0333 .name = "disp_cc_mdss_vsync_clk_src",
0334 .parent_data = disp_cc_parent_data_2,
0335 .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
0336 .ops = &clk_rcg2_ops,
0337 },
0338 };
0339
0340 static struct clk_branch disp_cc_mdss_ahb_clk = {
0341 .halt_reg = 0x4004,
0342 .halt_check = BRANCH_HALT,
0343 .clkr = {
0344 .enable_reg = 0x4004,
0345 .enable_mask = BIT(0),
0346 .hw.init = &(struct clk_init_data){
0347 .name = "disp_cc_mdss_ahb_clk",
0348 .ops = &clk_branch2_ops,
0349 },
0350 },
0351 };
0352
0353 static struct clk_branch disp_cc_mdss_axi_clk = {
0354 .halt_reg = 0x4008,
0355 .halt_check = BRANCH_HALT,
0356 .clkr = {
0357 .enable_reg = 0x4008,
0358 .enable_mask = BIT(0),
0359 .hw.init = &(struct clk_init_data){
0360 .name = "disp_cc_mdss_axi_clk",
0361 .ops = &clk_branch2_ops,
0362 },
0363 },
0364 };
0365
0366
0367 static struct clk_branch disp_cc_mdss_byte0_clk = {
0368 .halt_reg = 0x2028,
0369 .halt_check = BRANCH_HALT,
0370 .clkr = {
0371 .enable_reg = 0x2028,
0372 .enable_mask = BIT(0),
0373 .hw.init = &(struct clk_init_data){
0374 .name = "disp_cc_mdss_byte0_clk",
0375 .parent_hws = (const struct clk_hw*[]){
0376 &disp_cc_mdss_byte0_clk_src.clkr.hw,
0377 },
0378 .num_parents = 1,
0379 .flags = CLK_SET_RATE_PARENT,
0380 .ops = &clk_branch2_ops,
0381 },
0382 },
0383 };
0384
0385
0386 static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
0387 .reg = 0x20e8,
0388 .shift = 0,
0389 .width = 2,
0390 .clkr = {
0391 .hw.init = &(struct clk_init_data){
0392 .name = "disp_cc_mdss_byte0_div_clk_src",
0393 .parent_hws = (const struct clk_hw*[]){
0394 &disp_cc_mdss_byte0_clk_src.clkr.hw,
0395 },
0396 .num_parents = 1,
0397 .ops = &clk_regmap_div_ops,
0398 },
0399 },
0400 };
0401
0402
0403 static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
0404 .halt_reg = 0x202c,
0405 .halt_check = BRANCH_HALT,
0406 .clkr = {
0407 .enable_reg = 0x202c,
0408 .enable_mask = BIT(0),
0409 .hw.init = &(struct clk_init_data){
0410 .name = "disp_cc_mdss_byte0_intf_clk",
0411 .parent_hws = (const struct clk_hw*[]){
0412 &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
0413 },
0414 .num_parents = 1,
0415 .flags = CLK_SET_RATE_PARENT,
0416 .ops = &clk_branch2_ops,
0417 },
0418 },
0419 };
0420
0421
0422 static struct clk_branch disp_cc_mdss_byte1_clk = {
0423 .halt_reg = 0x2030,
0424 .halt_check = BRANCH_HALT,
0425 .clkr = {
0426 .enable_reg = 0x2030,
0427 .enable_mask = BIT(0),
0428 .hw.init = &(struct clk_init_data){
0429 .name = "disp_cc_mdss_byte1_clk",
0430 .parent_hws = (const struct clk_hw*[]){
0431 &disp_cc_mdss_byte1_clk_src.clkr.hw,
0432 },
0433 .num_parents = 1,
0434 .flags = CLK_SET_RATE_PARENT,
0435 .ops = &clk_branch2_ops,
0436 },
0437 },
0438 };
0439
0440
0441 static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = {
0442 .reg = 0x2104,
0443 .shift = 0,
0444 .width = 2,
0445 .clkr = {
0446 .hw.init = &(struct clk_init_data){
0447 .name = "disp_cc_mdss_byte1_div_clk_src",
0448 .parent_hws = (const struct clk_hw*[]){
0449 &disp_cc_mdss_byte1_clk_src.clkr.hw,
0450 },
0451 .num_parents = 1,
0452 .ops = &clk_regmap_div_ops,
0453 },
0454 },
0455 };
0456
0457
0458 static struct clk_branch disp_cc_mdss_byte1_intf_clk = {
0459 .halt_reg = 0x2034,
0460 .halt_check = BRANCH_HALT,
0461 .clkr = {
0462 .enable_reg = 0x2034,
0463 .enable_mask = BIT(0),
0464 .hw.init = &(struct clk_init_data){
0465 .name = "disp_cc_mdss_byte1_intf_clk",
0466 .parent_hws = (const struct clk_hw*[]){
0467 &disp_cc_mdss_byte1_div_clk_src.clkr.hw,
0468 },
0469 .num_parents = 1,
0470 .flags = CLK_SET_RATE_PARENT,
0471 .ops = &clk_branch2_ops,
0472 },
0473 },
0474 };
0475
0476 static struct clk_branch disp_cc_mdss_dp_aux_clk = {
0477 .halt_reg = 0x2054,
0478 .halt_check = BRANCH_HALT,
0479 .clkr = {
0480 .enable_reg = 0x2054,
0481 .enable_mask = BIT(0),
0482 .hw.init = &(struct clk_init_data){
0483 .name = "disp_cc_mdss_dp_aux_clk",
0484 .parent_hws = (const struct clk_hw*[]){
0485 &disp_cc_mdss_dp_aux_clk_src.clkr.hw,
0486 },
0487 .num_parents = 1,
0488 .flags = CLK_SET_RATE_PARENT,
0489 .ops = &clk_branch2_ops,
0490 },
0491 },
0492 };
0493
0494 static struct clk_branch disp_cc_mdss_dp_crypto_clk = {
0495 .halt_reg = 0x2048,
0496 .halt_check = BRANCH_HALT,
0497 .clkr = {
0498 .enable_reg = 0x2048,
0499 .enable_mask = BIT(0),
0500 .hw.init = &(struct clk_init_data){
0501 .name = "disp_cc_mdss_dp_crypto_clk",
0502 .parent_hws = (const struct clk_hw*[]){
0503 &disp_cc_mdss_dp_crypto_clk_src.clkr.hw,
0504 },
0505 .num_parents = 1,
0506 .flags = CLK_SET_RATE_PARENT,
0507 .ops = &clk_branch2_ops,
0508 },
0509 },
0510 };
0511
0512 static struct clk_branch disp_cc_mdss_dp_link_clk = {
0513 .halt_reg = 0x2040,
0514 .halt_check = BRANCH_HALT,
0515 .clkr = {
0516 .enable_reg = 0x2040,
0517 .enable_mask = BIT(0),
0518 .hw.init = &(struct clk_init_data){
0519 .name = "disp_cc_mdss_dp_link_clk",
0520 .parent_hws = (const struct clk_hw*[]){
0521 &disp_cc_mdss_dp_link_clk_src.clkr.hw,
0522 },
0523 .num_parents = 1,
0524 .flags = CLK_SET_RATE_PARENT,
0525 .ops = &clk_branch2_ops,
0526 },
0527 },
0528 };
0529
0530
0531 static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
0532 .halt_reg = 0x2044,
0533 .halt_check = BRANCH_HALT,
0534 .clkr = {
0535 .enable_reg = 0x2044,
0536 .enable_mask = BIT(0),
0537 .hw.init = &(struct clk_init_data){
0538 .name = "disp_cc_mdss_dp_link_intf_clk",
0539 .parent_hws = (const struct clk_hw*[]){
0540 &disp_cc_mdss_dp_link_clk_src.clkr.hw,
0541 },
0542 .num_parents = 1,
0543 .ops = &clk_branch2_ops,
0544 },
0545 },
0546 };
0547
0548 static struct clk_branch disp_cc_mdss_dp_pixel1_clk = {
0549 .halt_reg = 0x2050,
0550 .halt_check = BRANCH_HALT,
0551 .clkr = {
0552 .enable_reg = 0x2050,
0553 .enable_mask = BIT(0),
0554 .hw.init = &(struct clk_init_data){
0555 .name = "disp_cc_mdss_dp_pixel1_clk",
0556 .parent_hws = (const struct clk_hw*[]){
0557 &disp_cc_mdss_dp_pixel1_clk_src.clkr.hw,
0558 },
0559 .num_parents = 1,
0560 .flags = CLK_SET_RATE_PARENT,
0561 .ops = &clk_branch2_ops,
0562 },
0563 },
0564 };
0565
0566 static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
0567 .halt_reg = 0x204c,
0568 .halt_check = BRANCH_HALT,
0569 .clkr = {
0570 .enable_reg = 0x204c,
0571 .enable_mask = BIT(0),
0572 .hw.init = &(struct clk_init_data){
0573 .name = "disp_cc_mdss_dp_pixel_clk",
0574 .parent_hws = (const struct clk_hw*[]){
0575 &disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
0576 },
0577 .num_parents = 1,
0578 .flags = CLK_SET_RATE_PARENT,
0579 .ops = &clk_branch2_ops,
0580 },
0581 },
0582 };
0583
0584 static struct clk_branch disp_cc_mdss_esc0_clk = {
0585 .halt_reg = 0x2038,
0586 .halt_check = BRANCH_HALT,
0587 .clkr = {
0588 .enable_reg = 0x2038,
0589 .enable_mask = BIT(0),
0590 .hw.init = &(struct clk_init_data){
0591 .name = "disp_cc_mdss_esc0_clk",
0592 .parent_hws = (const struct clk_hw*[]){
0593 &disp_cc_mdss_esc0_clk_src.clkr.hw,
0594 },
0595 .num_parents = 1,
0596 .flags = CLK_SET_RATE_PARENT,
0597 .ops = &clk_branch2_ops,
0598 },
0599 },
0600 };
0601
0602 static struct clk_branch disp_cc_mdss_esc1_clk = {
0603 .halt_reg = 0x203c,
0604 .halt_check = BRANCH_HALT,
0605 .clkr = {
0606 .enable_reg = 0x203c,
0607 .enable_mask = BIT(0),
0608 .hw.init = &(struct clk_init_data){
0609 .name = "disp_cc_mdss_esc1_clk",
0610 .parent_hws = (const struct clk_hw*[]){
0611 &disp_cc_mdss_esc1_clk_src.clkr.hw,
0612 },
0613 .num_parents = 1,
0614 .flags = CLK_SET_RATE_PARENT,
0615 .ops = &clk_branch2_ops,
0616 },
0617 },
0618 };
0619
0620 static struct clk_branch disp_cc_mdss_mdp_clk = {
0621 .halt_reg = 0x200c,
0622 .halt_check = BRANCH_HALT,
0623 .clkr = {
0624 .enable_reg = 0x200c,
0625 .enable_mask = BIT(0),
0626 .hw.init = &(struct clk_init_data){
0627 .name = "disp_cc_mdss_mdp_clk",
0628 .parent_hws = (const struct clk_hw*[]){
0629 &disp_cc_mdss_mdp_clk_src.clkr.hw,
0630 },
0631 .num_parents = 1,
0632 .flags = CLK_SET_RATE_PARENT,
0633 .ops = &clk_branch2_ops,
0634 },
0635 },
0636 };
0637
0638 static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
0639 .halt_reg = 0x201c,
0640 .halt_check = BRANCH_HALT,
0641 .clkr = {
0642 .enable_reg = 0x201c,
0643 .enable_mask = BIT(0),
0644 .hw.init = &(struct clk_init_data){
0645 .name = "disp_cc_mdss_mdp_lut_clk",
0646 .parent_hws = (const struct clk_hw*[]){
0647 &disp_cc_mdss_mdp_clk_src.clkr.hw,
0648 },
0649 .num_parents = 1,
0650 .ops = &clk_branch2_ops,
0651 },
0652 },
0653 };
0654
0655
0656 static struct clk_branch disp_cc_mdss_pclk0_clk = {
0657 .halt_reg = 0x2004,
0658 .halt_check = BRANCH_HALT,
0659 .clkr = {
0660 .enable_reg = 0x2004,
0661 .enable_mask = BIT(0),
0662 .hw.init = &(struct clk_init_data){
0663 .name = "disp_cc_mdss_pclk0_clk",
0664 .parent_hws = (const struct clk_hw*[]){
0665 &disp_cc_mdss_pclk0_clk_src.clkr.hw,
0666 },
0667 .num_parents = 1,
0668 .flags = CLK_SET_RATE_PARENT,
0669 .ops = &clk_branch2_ops,
0670 },
0671 },
0672 };
0673
0674
0675 static struct clk_branch disp_cc_mdss_pclk1_clk = {
0676 .halt_reg = 0x2008,
0677 .halt_check = BRANCH_HALT,
0678 .clkr = {
0679 .enable_reg = 0x2008,
0680 .enable_mask = BIT(0),
0681 .hw.init = &(struct clk_init_data){
0682 .name = "disp_cc_mdss_pclk1_clk",
0683 .parent_hws = (const struct clk_hw*[]){
0684 &disp_cc_mdss_pclk1_clk_src.clkr.hw,
0685 },
0686 .num_parents = 1,
0687 .flags = CLK_SET_RATE_PARENT,
0688 .ops = &clk_branch2_ops,
0689 },
0690 },
0691 };
0692
0693 static struct clk_branch disp_cc_mdss_rot_clk = {
0694 .halt_reg = 0x2014,
0695 .halt_check = BRANCH_HALT,
0696 .clkr = {
0697 .enable_reg = 0x2014,
0698 .enable_mask = BIT(0),
0699 .hw.init = &(struct clk_init_data){
0700 .name = "disp_cc_mdss_rot_clk",
0701 .parent_hws = (const struct clk_hw*[]){
0702 &disp_cc_mdss_rot_clk_src.clkr.hw,
0703 },
0704 .num_parents = 1,
0705 .flags = CLK_SET_RATE_PARENT,
0706 .ops = &clk_branch2_ops,
0707 },
0708 },
0709 };
0710
0711 static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
0712 .halt_reg = 0x5004,
0713 .halt_check = BRANCH_HALT,
0714 .clkr = {
0715 .enable_reg = 0x5004,
0716 .enable_mask = BIT(0),
0717 .hw.init = &(struct clk_init_data){
0718 .name = "disp_cc_mdss_rscc_ahb_clk",
0719 .ops = &clk_branch2_ops,
0720 },
0721 },
0722 };
0723
0724 static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
0725 .halt_reg = 0x5008,
0726 .halt_check = BRANCH_HALT,
0727 .clkr = {
0728 .enable_reg = 0x5008,
0729 .enable_mask = BIT(0),
0730 .hw.init = &(struct clk_init_data){
0731 .name = "disp_cc_mdss_rscc_vsync_clk",
0732 .parent_hws = (const struct clk_hw*[]){
0733 &disp_cc_mdss_vsync_clk_src.clkr.hw,
0734 },
0735 .num_parents = 1,
0736 .flags = CLK_SET_RATE_PARENT,
0737 .ops = &clk_branch2_ops,
0738 },
0739 },
0740 };
0741
0742 static struct clk_branch disp_cc_mdss_vsync_clk = {
0743 .halt_reg = 0x2024,
0744 .halt_check = BRANCH_HALT,
0745 .clkr = {
0746 .enable_reg = 0x2024,
0747 .enable_mask = BIT(0),
0748 .hw.init = &(struct clk_init_data){
0749 .name = "disp_cc_mdss_vsync_clk",
0750 .parent_hws = (const struct clk_hw*[]){
0751 &disp_cc_mdss_vsync_clk_src.clkr.hw,
0752 },
0753 .num_parents = 1,
0754 .flags = CLK_SET_RATE_PARENT,
0755 .ops = &clk_branch2_ops,
0756 },
0757 },
0758 };
0759
0760 static struct gdsc mdss_gdsc = {
0761 .gdscr = 0x3000,
0762 .pd = {
0763 .name = "mdss_gdsc",
0764 },
0765 .pwrsts = PWRSTS_OFF_ON,
0766 .flags = HW_CTRL | POLL_CFG_GDSCR,
0767 };
0768
0769 static struct clk_regmap *disp_cc_sdm845_clocks[] = {
0770 [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
0771 [DISP_CC_MDSS_AXI_CLK] = &disp_cc_mdss_axi_clk.clkr,
0772 [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
0773 [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
0774 [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
0775 [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] =
0776 &disp_cc_mdss_byte0_div_clk_src.clkr,
0777 [DISP_CC_MDSS_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr,
0778 [DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr,
0779 [DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr,
0780 [DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] =
0781 &disp_cc_mdss_byte1_div_clk_src.clkr,
0782 [DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
0783 [DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
0784 [DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr,
0785 [DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] =
0786 &disp_cc_mdss_dp_crypto_clk_src.clkr,
0787 [DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
0788 [DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
0789 [DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
0790 [DISP_CC_MDSS_DP_PIXEL1_CLK] = &disp_cc_mdss_dp_pixel1_clk.clkr,
0791 [DISP_CC_MDSS_DP_PIXEL1_CLK_SRC] =
0792 &disp_cc_mdss_dp_pixel1_clk_src.clkr,
0793 [DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
0794 [DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
0795 [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
0796 [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
0797 [DISP_CC_MDSS_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr,
0798 [DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr,
0799 [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
0800 [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
0801 [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
0802 [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
0803 [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
0804 [DISP_CC_MDSS_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr,
0805 [DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr,
0806 [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
0807 [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
0808 [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
0809 [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
0810 [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
0811 [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
0812 [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
0813 };
0814
0815 static const struct qcom_reset_map disp_cc_sdm845_resets[] = {
0816 [DISP_CC_MDSS_RSCC_BCR] = { 0x5000 },
0817 };
0818
0819 static struct gdsc *disp_cc_sdm845_gdscs[] = {
0820 [MDSS_GDSC] = &mdss_gdsc,
0821 };
0822
0823 static const struct regmap_config disp_cc_sdm845_regmap_config = {
0824 .reg_bits = 32,
0825 .reg_stride = 4,
0826 .val_bits = 32,
0827 .max_register = 0x10000,
0828 .fast_io = true,
0829 };
0830
0831 static const struct qcom_cc_desc disp_cc_sdm845_desc = {
0832 .config = &disp_cc_sdm845_regmap_config,
0833 .clks = disp_cc_sdm845_clocks,
0834 .num_clks = ARRAY_SIZE(disp_cc_sdm845_clocks),
0835 .resets = disp_cc_sdm845_resets,
0836 .num_resets = ARRAY_SIZE(disp_cc_sdm845_resets),
0837 .gdscs = disp_cc_sdm845_gdscs,
0838 .num_gdscs = ARRAY_SIZE(disp_cc_sdm845_gdscs),
0839 };
0840
0841 static const struct of_device_id disp_cc_sdm845_match_table[] = {
0842 { .compatible = "qcom,sdm845-dispcc" },
0843 { }
0844 };
0845 MODULE_DEVICE_TABLE(of, disp_cc_sdm845_match_table);
0846
0847 static int disp_cc_sdm845_probe(struct platform_device *pdev)
0848 {
0849 struct regmap *regmap;
0850 struct alpha_pll_config disp_cc_pll0_config = {};
0851
0852 regmap = qcom_cc_map(pdev, &disp_cc_sdm845_desc);
0853 if (IS_ERR(regmap))
0854 return PTR_ERR(regmap);
0855
0856 disp_cc_pll0_config.l = 0x2c;
0857 disp_cc_pll0_config.alpha = 0xcaaa;
0858
0859 clk_fabia_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
0860
0861
0862 regmap_update_bits(regmap, 0x8000, 0x7f0, 0x7f0);
0863
0864 return qcom_cc_really_probe(pdev, &disp_cc_sdm845_desc, regmap);
0865 }
0866
0867 static struct platform_driver disp_cc_sdm845_driver = {
0868 .probe = disp_cc_sdm845_probe,
0869 .driver = {
0870 .name = "disp_cc-sdm845",
0871 .of_match_table = disp_cc_sdm845_match_table,
0872 },
0873 };
0874
0875 static int __init disp_cc_sdm845_init(void)
0876 {
0877 return platform_driver_register(&disp_cc_sdm845_driver);
0878 }
0879 subsys_initcall(disp_cc_sdm845_init);
0880
0881 static void __exit disp_cc_sdm845_exit(void)
0882 {
0883 platform_driver_unregister(&disp_cc_sdm845_driver);
0884 }
0885 module_exit(disp_cc_sdm845_exit);
0886
0887 MODULE_LICENSE("GPL v2");
0888 MODULE_DESCRIPTION("QTI DISPCC SDM845 Driver");