0001
0002
0003
0004
0005
0006 #include <linux/kernel.h>
0007 #include <linux/bitops.h>
0008 #include <linux/err.h>
0009 #include <linux/delay.h>
0010 #include <linux/platform_device.h>
0011 #include <linux/module.h>
0012 #include <linux/of.h>
0013 #include <linux/of_device.h>
0014 #include <linux/clk.h>
0015 #include <linux/clk-provider.h>
0016 #include <linux/regmap.h>
0017 #include <linux/reset-controller.h>
0018
0019 #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
0020 #include <dt-bindings/reset/qcom,mmcc-msm8960.h>
0021
0022 #include "common.h"
0023 #include "clk-regmap.h"
0024 #include "clk-pll.h"
0025 #include "clk-rcg.h"
0026 #include "clk-branch.h"
0027 #include "reset.h"
0028
0029 enum {
0030 P_PXO,
0031 P_PLL8,
0032 P_PLL2,
0033 P_PLL3,
0034 P_PLL15,
0035 P_HDMI_PLL,
0036 P_DSI1_PLL_DSICLK,
0037 P_DSI2_PLL_DSICLK,
0038 P_DSI1_PLL_BYTECLK,
0039 P_DSI2_PLL_BYTECLK,
0040 };
0041
0042 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n }
0043
0044 static const struct parent_map mmcc_pxo_pll8_pll2_map[] = {
0045 { P_PXO, 0 },
0046 { P_PLL8, 2 },
0047 { P_PLL2, 1 }
0048 };
0049
0050 static const char * const mmcc_pxo_pll8_pll2[] = {
0051 "pxo",
0052 "pll8_vote",
0053 "pll2",
0054 };
0055
0056 static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = {
0057 { P_PXO, 0 },
0058 { P_PLL8, 2 },
0059 { P_PLL2, 1 },
0060 { P_PLL3, 3 }
0061 };
0062
0063 static const char * const mmcc_pxo_pll8_pll2_pll15[] = {
0064 "pxo",
0065 "pll8_vote",
0066 "pll2",
0067 "pll15",
0068 };
0069
0070 static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = {
0071 { P_PXO, 0 },
0072 { P_PLL8, 2 },
0073 { P_PLL2, 1 },
0074 { P_PLL15, 3 }
0075 };
0076
0077 static const char * const mmcc_pxo_pll8_pll2_pll3[] = {
0078 "pxo",
0079 "pll8_vote",
0080 "pll2",
0081 "pll3",
0082 };
0083
0084 static const struct parent_map mmcc_pxo_dsi2_dsi1_map[] = {
0085 { P_PXO, 0 },
0086 { P_DSI2_PLL_DSICLK, 1 },
0087 { P_DSI1_PLL_DSICLK, 3 },
0088 };
0089
0090 static const char * const mmcc_pxo_dsi2_dsi1[] = {
0091 "pxo",
0092 "dsi2pll",
0093 "dsi1pll",
0094 };
0095
0096 static const struct parent_map mmcc_pxo_dsi1_dsi2_byte_map[] = {
0097 { P_PXO, 0 },
0098 { P_DSI1_PLL_BYTECLK, 1 },
0099 { P_DSI2_PLL_BYTECLK, 2 },
0100 };
0101
0102 static const char * const mmcc_pxo_dsi1_dsi2_byte[] = {
0103 "pxo",
0104 "dsi1pllbyte",
0105 "dsi2pllbyte",
0106 };
0107
0108 static struct clk_pll pll2 = {
0109 .l_reg = 0x320,
0110 .m_reg = 0x324,
0111 .n_reg = 0x328,
0112 .config_reg = 0x32c,
0113 .mode_reg = 0x31c,
0114 .status_reg = 0x334,
0115 .status_bit = 16,
0116 .clkr.hw.init = &(struct clk_init_data){
0117 .name = "pll2",
0118 .parent_names = (const char *[]){ "pxo" },
0119 .num_parents = 1,
0120 .ops = &clk_pll_ops,
0121 },
0122 };
0123
0124 static struct clk_pll pll15 = {
0125 .l_reg = 0x33c,
0126 .m_reg = 0x340,
0127 .n_reg = 0x344,
0128 .config_reg = 0x348,
0129 .mode_reg = 0x338,
0130 .status_reg = 0x350,
0131 .status_bit = 16,
0132 .clkr.hw.init = &(struct clk_init_data){
0133 .name = "pll15",
0134 .parent_names = (const char *[]){ "pxo" },
0135 .num_parents = 1,
0136 .ops = &clk_pll_ops,
0137 },
0138 };
0139
0140 static const struct pll_config pll15_config = {
0141 .l = 33,
0142 .m = 1,
0143 .n = 3,
0144 .vco_val = 0x2 << 16,
0145 .vco_mask = 0x3 << 16,
0146 .pre_div_val = 0x0,
0147 .pre_div_mask = BIT(19),
0148 .post_div_val = 0x0,
0149 .post_div_mask = 0x3 << 20,
0150 .mn_ena_mask = BIT(22),
0151 .main_output_mask = BIT(23),
0152 };
0153
0154 static struct freq_tbl clk_tbl_cam[] = {
0155 { 6000000, P_PLL8, 4, 1, 16 },
0156 { 8000000, P_PLL8, 4, 1, 12 },
0157 { 12000000, P_PLL8, 4, 1, 8 },
0158 { 16000000, P_PLL8, 4, 1, 6 },
0159 { 19200000, P_PLL8, 4, 1, 5 },
0160 { 24000000, P_PLL8, 4, 1, 4 },
0161 { 32000000, P_PLL8, 4, 1, 3 },
0162 { 48000000, P_PLL8, 4, 1, 2 },
0163 { 64000000, P_PLL8, 3, 1, 2 },
0164 { 96000000, P_PLL8, 4, 0, 0 },
0165 { 128000000, P_PLL8, 3, 0, 0 },
0166 { }
0167 };
0168
0169 static struct clk_rcg camclk0_src = {
0170 .ns_reg = 0x0148,
0171 .md_reg = 0x0144,
0172 .mn = {
0173 .mnctr_en_bit = 5,
0174 .mnctr_reset_bit = 8,
0175 .reset_in_cc = true,
0176 .mnctr_mode_shift = 6,
0177 .n_val_shift = 24,
0178 .m_val_shift = 8,
0179 .width = 8,
0180 },
0181 .p = {
0182 .pre_div_shift = 14,
0183 .pre_div_width = 2,
0184 },
0185 .s = {
0186 .src_sel_shift = 0,
0187 .parent_map = mmcc_pxo_pll8_pll2_map,
0188 },
0189 .freq_tbl = clk_tbl_cam,
0190 .clkr = {
0191 .enable_reg = 0x0140,
0192 .enable_mask = BIT(2),
0193 .hw.init = &(struct clk_init_data){
0194 .name = "camclk0_src",
0195 .parent_names = mmcc_pxo_pll8_pll2,
0196 .num_parents = 3,
0197 .ops = &clk_rcg_ops,
0198 },
0199 },
0200 };
0201
0202 static struct clk_branch camclk0_clk = {
0203 .halt_reg = 0x01e8,
0204 .halt_bit = 15,
0205 .clkr = {
0206 .enable_reg = 0x0140,
0207 .enable_mask = BIT(0),
0208 .hw.init = &(struct clk_init_data){
0209 .name = "camclk0_clk",
0210 .parent_names = (const char *[]){ "camclk0_src" },
0211 .num_parents = 1,
0212 .ops = &clk_branch_ops,
0213 },
0214 },
0215
0216 };
0217
0218 static struct clk_rcg camclk1_src = {
0219 .ns_reg = 0x015c,
0220 .md_reg = 0x0158,
0221 .mn = {
0222 .mnctr_en_bit = 5,
0223 .mnctr_reset_bit = 8,
0224 .reset_in_cc = true,
0225 .mnctr_mode_shift = 6,
0226 .n_val_shift = 24,
0227 .m_val_shift = 8,
0228 .width = 8,
0229 },
0230 .p = {
0231 .pre_div_shift = 14,
0232 .pre_div_width = 2,
0233 },
0234 .s = {
0235 .src_sel_shift = 0,
0236 .parent_map = mmcc_pxo_pll8_pll2_map,
0237 },
0238 .freq_tbl = clk_tbl_cam,
0239 .clkr = {
0240 .enable_reg = 0x0154,
0241 .enable_mask = BIT(2),
0242 .hw.init = &(struct clk_init_data){
0243 .name = "camclk1_src",
0244 .parent_names = mmcc_pxo_pll8_pll2,
0245 .num_parents = 3,
0246 .ops = &clk_rcg_ops,
0247 },
0248 },
0249 };
0250
0251 static struct clk_branch camclk1_clk = {
0252 .halt_reg = 0x01e8,
0253 .halt_bit = 16,
0254 .clkr = {
0255 .enable_reg = 0x0154,
0256 .enable_mask = BIT(0),
0257 .hw.init = &(struct clk_init_data){
0258 .name = "camclk1_clk",
0259 .parent_names = (const char *[]){ "camclk1_src" },
0260 .num_parents = 1,
0261 .ops = &clk_branch_ops,
0262 },
0263 },
0264
0265 };
0266
0267 static struct clk_rcg camclk2_src = {
0268 .ns_reg = 0x0228,
0269 .md_reg = 0x0224,
0270 .mn = {
0271 .mnctr_en_bit = 5,
0272 .mnctr_reset_bit = 8,
0273 .reset_in_cc = true,
0274 .mnctr_mode_shift = 6,
0275 .n_val_shift = 24,
0276 .m_val_shift = 8,
0277 .width = 8,
0278 },
0279 .p = {
0280 .pre_div_shift = 14,
0281 .pre_div_width = 2,
0282 },
0283 .s = {
0284 .src_sel_shift = 0,
0285 .parent_map = mmcc_pxo_pll8_pll2_map,
0286 },
0287 .freq_tbl = clk_tbl_cam,
0288 .clkr = {
0289 .enable_reg = 0x0220,
0290 .enable_mask = BIT(2),
0291 .hw.init = &(struct clk_init_data){
0292 .name = "camclk2_src",
0293 .parent_names = mmcc_pxo_pll8_pll2,
0294 .num_parents = 3,
0295 .ops = &clk_rcg_ops,
0296 },
0297 },
0298 };
0299
0300 static struct clk_branch camclk2_clk = {
0301 .halt_reg = 0x01e8,
0302 .halt_bit = 16,
0303 .clkr = {
0304 .enable_reg = 0x0220,
0305 .enable_mask = BIT(0),
0306 .hw.init = &(struct clk_init_data){
0307 .name = "camclk2_clk",
0308 .parent_names = (const char *[]){ "camclk2_src" },
0309 .num_parents = 1,
0310 .ops = &clk_branch_ops,
0311 },
0312 },
0313
0314 };
0315
0316 static struct freq_tbl clk_tbl_csi[] = {
0317 { 27000000, P_PXO, 1, 0, 0 },
0318 { 85330000, P_PLL8, 1, 2, 9 },
0319 { 177780000, P_PLL2, 1, 2, 9 },
0320 { }
0321 };
0322
0323 static struct clk_rcg csi0_src = {
0324 .ns_reg = 0x0048,
0325 .md_reg = 0x0044,
0326 .mn = {
0327 .mnctr_en_bit = 5,
0328 .mnctr_reset_bit = 7,
0329 .mnctr_mode_shift = 6,
0330 .n_val_shift = 24,
0331 .m_val_shift = 8,
0332 .width = 8,
0333 },
0334 .p = {
0335 .pre_div_shift = 14,
0336 .pre_div_width = 2,
0337 },
0338 .s = {
0339 .src_sel_shift = 0,
0340 .parent_map = mmcc_pxo_pll8_pll2_map,
0341 },
0342 .freq_tbl = clk_tbl_csi,
0343 .clkr = {
0344 .enable_reg = 0x0040,
0345 .enable_mask = BIT(2),
0346 .hw.init = &(struct clk_init_data){
0347 .name = "csi0_src",
0348 .parent_names = mmcc_pxo_pll8_pll2,
0349 .num_parents = 3,
0350 .ops = &clk_rcg_ops,
0351 },
0352 },
0353 };
0354
0355 static struct clk_branch csi0_clk = {
0356 .halt_reg = 0x01cc,
0357 .halt_bit = 13,
0358 .clkr = {
0359 .enable_reg = 0x0040,
0360 .enable_mask = BIT(0),
0361 .hw.init = &(struct clk_init_data){
0362 .parent_names = (const char *[]){ "csi0_src" },
0363 .num_parents = 1,
0364 .name = "csi0_clk",
0365 .ops = &clk_branch_ops,
0366 .flags = CLK_SET_RATE_PARENT,
0367 },
0368 },
0369 };
0370
0371 static struct clk_branch csi0_phy_clk = {
0372 .halt_reg = 0x01e8,
0373 .halt_bit = 9,
0374 .clkr = {
0375 .enable_reg = 0x0040,
0376 .enable_mask = BIT(8),
0377 .hw.init = &(struct clk_init_data){
0378 .parent_names = (const char *[]){ "csi0_src" },
0379 .num_parents = 1,
0380 .name = "csi0_phy_clk",
0381 .ops = &clk_branch_ops,
0382 .flags = CLK_SET_RATE_PARENT,
0383 },
0384 },
0385 };
0386
0387 static struct clk_rcg csi1_src = {
0388 .ns_reg = 0x0010,
0389 .md_reg = 0x0028,
0390 .mn = {
0391 .mnctr_en_bit = 5,
0392 .mnctr_reset_bit = 7,
0393 .mnctr_mode_shift = 6,
0394 .n_val_shift = 24,
0395 .m_val_shift = 8,
0396 .width = 8,
0397 },
0398 .p = {
0399 .pre_div_shift = 14,
0400 .pre_div_width = 2,
0401 },
0402 .s = {
0403 .src_sel_shift = 0,
0404 .parent_map = mmcc_pxo_pll8_pll2_map,
0405 },
0406 .freq_tbl = clk_tbl_csi,
0407 .clkr = {
0408 .enable_reg = 0x0024,
0409 .enable_mask = BIT(2),
0410 .hw.init = &(struct clk_init_data){
0411 .name = "csi1_src",
0412 .parent_names = mmcc_pxo_pll8_pll2,
0413 .num_parents = 3,
0414 .ops = &clk_rcg_ops,
0415 },
0416 },
0417 };
0418
0419 static struct clk_branch csi1_clk = {
0420 .halt_reg = 0x01cc,
0421 .halt_bit = 14,
0422 .clkr = {
0423 .enable_reg = 0x0024,
0424 .enable_mask = BIT(0),
0425 .hw.init = &(struct clk_init_data){
0426 .parent_names = (const char *[]){ "csi1_src" },
0427 .num_parents = 1,
0428 .name = "csi1_clk",
0429 .ops = &clk_branch_ops,
0430 .flags = CLK_SET_RATE_PARENT,
0431 },
0432 },
0433 };
0434
0435 static struct clk_branch csi1_phy_clk = {
0436 .halt_reg = 0x01e8,
0437 .halt_bit = 10,
0438 .clkr = {
0439 .enable_reg = 0x0024,
0440 .enable_mask = BIT(8),
0441 .hw.init = &(struct clk_init_data){
0442 .parent_names = (const char *[]){ "csi1_src" },
0443 .num_parents = 1,
0444 .name = "csi1_phy_clk",
0445 .ops = &clk_branch_ops,
0446 .flags = CLK_SET_RATE_PARENT,
0447 },
0448 },
0449 };
0450
0451 static struct clk_rcg csi2_src = {
0452 .ns_reg = 0x0234,
0453 .md_reg = 0x022c,
0454 .mn = {
0455 .mnctr_en_bit = 5,
0456 .mnctr_reset_bit = 7,
0457 .mnctr_mode_shift = 6,
0458 .n_val_shift = 24,
0459 .m_val_shift = 8,
0460 .width = 8,
0461 },
0462 .p = {
0463 .pre_div_shift = 14,
0464 .pre_div_width = 2,
0465 },
0466 .s = {
0467 .src_sel_shift = 0,
0468 .parent_map = mmcc_pxo_pll8_pll2_map,
0469 },
0470 .freq_tbl = clk_tbl_csi,
0471 .clkr = {
0472 .enable_reg = 0x022c,
0473 .enable_mask = BIT(2),
0474 .hw.init = &(struct clk_init_data){
0475 .name = "csi2_src",
0476 .parent_names = mmcc_pxo_pll8_pll2,
0477 .num_parents = 3,
0478 .ops = &clk_rcg_ops,
0479 },
0480 },
0481 };
0482
0483 static struct clk_branch csi2_clk = {
0484 .halt_reg = 0x01cc,
0485 .halt_bit = 29,
0486 .clkr = {
0487 .enable_reg = 0x022c,
0488 .enable_mask = BIT(0),
0489 .hw.init = &(struct clk_init_data){
0490 .parent_names = (const char *[]){ "csi2_src" },
0491 .num_parents = 1,
0492 .name = "csi2_clk",
0493 .ops = &clk_branch_ops,
0494 .flags = CLK_SET_RATE_PARENT,
0495 },
0496 },
0497 };
0498
0499 static struct clk_branch csi2_phy_clk = {
0500 .halt_reg = 0x01e8,
0501 .halt_bit = 29,
0502 .clkr = {
0503 .enable_reg = 0x022c,
0504 .enable_mask = BIT(8),
0505 .hw.init = &(struct clk_init_data){
0506 .parent_names = (const char *[]){ "csi2_src" },
0507 .num_parents = 1,
0508 .name = "csi2_phy_clk",
0509 .ops = &clk_branch_ops,
0510 .flags = CLK_SET_RATE_PARENT,
0511 },
0512 },
0513 };
0514
0515 struct clk_pix_rdi {
0516 u32 s_reg;
0517 u32 s_mask;
0518 u32 s2_reg;
0519 u32 s2_mask;
0520 struct clk_regmap clkr;
0521 };
0522
0523 #define to_clk_pix_rdi(_hw) \
0524 container_of(to_clk_regmap(_hw), struct clk_pix_rdi, clkr)
0525
0526 static int pix_rdi_set_parent(struct clk_hw *hw, u8 index)
0527 {
0528 int i;
0529 int ret = 0;
0530 u32 val;
0531 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
0532 int num_parents = clk_hw_get_num_parents(hw);
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542 for (i = 0; i < num_parents; i++) {
0543 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
0544 ret = clk_prepare_enable(p->clk);
0545 if (ret)
0546 goto err;
0547 }
0548
0549 if (index == 2)
0550 val = rdi->s2_mask;
0551 else
0552 val = 0;
0553 regmap_update_bits(rdi->clkr.regmap, rdi->s2_reg, rdi->s2_mask, val);
0554
0555
0556
0557
0558 udelay(1);
0559
0560 if (index == 1)
0561 val = rdi->s_mask;
0562 else
0563 val = 0;
0564 regmap_update_bits(rdi->clkr.regmap, rdi->s_reg, rdi->s_mask, val);
0565
0566
0567
0568
0569 udelay(1);
0570
0571 err:
0572 for (i--; i >= 0; i--) {
0573 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
0574 clk_disable_unprepare(p->clk);
0575 }
0576
0577 return ret;
0578 }
0579
0580 static u8 pix_rdi_get_parent(struct clk_hw *hw)
0581 {
0582 u32 val;
0583 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
0584
0585
0586 regmap_read(rdi->clkr.regmap, rdi->s2_reg, &val);
0587 if (val & rdi->s2_mask)
0588 return 2;
0589
0590 regmap_read(rdi->clkr.regmap, rdi->s_reg, &val);
0591 if (val & rdi->s_mask)
0592 return 1;
0593
0594 return 0;
0595 }
0596
0597 static const struct clk_ops clk_ops_pix_rdi = {
0598 .enable = clk_enable_regmap,
0599 .disable = clk_disable_regmap,
0600 .set_parent = pix_rdi_set_parent,
0601 .get_parent = pix_rdi_get_parent,
0602 .determine_rate = __clk_mux_determine_rate,
0603 };
0604
0605 static const char * const pix_rdi_parents[] = {
0606 "csi0_clk",
0607 "csi1_clk",
0608 "csi2_clk",
0609 };
0610
0611 static struct clk_pix_rdi csi_pix_clk = {
0612 .s_reg = 0x0058,
0613 .s_mask = BIT(25),
0614 .s2_reg = 0x0238,
0615 .s2_mask = BIT(13),
0616 .clkr = {
0617 .enable_reg = 0x0058,
0618 .enable_mask = BIT(26),
0619 .hw.init = &(struct clk_init_data){
0620 .name = "csi_pix_clk",
0621 .parent_names = pix_rdi_parents,
0622 .num_parents = 3,
0623 .ops = &clk_ops_pix_rdi,
0624 },
0625 },
0626 };
0627
0628 static struct clk_pix_rdi csi_pix1_clk = {
0629 .s_reg = 0x0238,
0630 .s_mask = BIT(8),
0631 .s2_reg = 0x0238,
0632 .s2_mask = BIT(9),
0633 .clkr = {
0634 .enable_reg = 0x0238,
0635 .enable_mask = BIT(10),
0636 .hw.init = &(struct clk_init_data){
0637 .name = "csi_pix1_clk",
0638 .parent_names = pix_rdi_parents,
0639 .num_parents = 3,
0640 .ops = &clk_ops_pix_rdi,
0641 },
0642 },
0643 };
0644
0645 static struct clk_pix_rdi csi_rdi_clk = {
0646 .s_reg = 0x0058,
0647 .s_mask = BIT(12),
0648 .s2_reg = 0x0238,
0649 .s2_mask = BIT(12),
0650 .clkr = {
0651 .enable_reg = 0x0058,
0652 .enable_mask = BIT(13),
0653 .hw.init = &(struct clk_init_data){
0654 .name = "csi_rdi_clk",
0655 .parent_names = pix_rdi_parents,
0656 .num_parents = 3,
0657 .ops = &clk_ops_pix_rdi,
0658 },
0659 },
0660 };
0661
0662 static struct clk_pix_rdi csi_rdi1_clk = {
0663 .s_reg = 0x0238,
0664 .s_mask = BIT(0),
0665 .s2_reg = 0x0238,
0666 .s2_mask = BIT(1),
0667 .clkr = {
0668 .enable_reg = 0x0238,
0669 .enable_mask = BIT(2),
0670 .hw.init = &(struct clk_init_data){
0671 .name = "csi_rdi1_clk",
0672 .parent_names = pix_rdi_parents,
0673 .num_parents = 3,
0674 .ops = &clk_ops_pix_rdi,
0675 },
0676 },
0677 };
0678
0679 static struct clk_pix_rdi csi_rdi2_clk = {
0680 .s_reg = 0x0238,
0681 .s_mask = BIT(4),
0682 .s2_reg = 0x0238,
0683 .s2_mask = BIT(5),
0684 .clkr = {
0685 .enable_reg = 0x0238,
0686 .enable_mask = BIT(6),
0687 .hw.init = &(struct clk_init_data){
0688 .name = "csi_rdi2_clk",
0689 .parent_names = pix_rdi_parents,
0690 .num_parents = 3,
0691 .ops = &clk_ops_pix_rdi,
0692 },
0693 },
0694 };
0695
0696 static struct freq_tbl clk_tbl_csiphytimer[] = {
0697 { 85330000, P_PLL8, 1, 2, 9 },
0698 { 177780000, P_PLL2, 1, 2, 9 },
0699 { }
0700 };
0701
0702 static struct clk_rcg csiphytimer_src = {
0703 .ns_reg = 0x0168,
0704 .md_reg = 0x0164,
0705 .mn = {
0706 .mnctr_en_bit = 5,
0707 .mnctr_reset_bit = 8,
0708 .reset_in_cc = true,
0709 .mnctr_mode_shift = 6,
0710 .n_val_shift = 24,
0711 .m_val_shift = 8,
0712 .width = 8,
0713 },
0714 .p = {
0715 .pre_div_shift = 14,
0716 .pre_div_width = 2,
0717 },
0718 .s = {
0719 .src_sel_shift = 0,
0720 .parent_map = mmcc_pxo_pll8_pll2_map,
0721 },
0722 .freq_tbl = clk_tbl_csiphytimer,
0723 .clkr = {
0724 .enable_reg = 0x0160,
0725 .enable_mask = BIT(2),
0726 .hw.init = &(struct clk_init_data){
0727 .name = "csiphytimer_src",
0728 .parent_names = mmcc_pxo_pll8_pll2,
0729 .num_parents = 3,
0730 .ops = &clk_rcg_ops,
0731 },
0732 },
0733 };
0734
0735 static const char * const csixphy_timer_src[] = { "csiphytimer_src" };
0736
0737 static struct clk_branch csiphy0_timer_clk = {
0738 .halt_reg = 0x01e8,
0739 .halt_bit = 17,
0740 .clkr = {
0741 .enable_reg = 0x0160,
0742 .enable_mask = BIT(0),
0743 .hw.init = &(struct clk_init_data){
0744 .parent_names = csixphy_timer_src,
0745 .num_parents = 1,
0746 .name = "csiphy0_timer_clk",
0747 .ops = &clk_branch_ops,
0748 .flags = CLK_SET_RATE_PARENT,
0749 },
0750 },
0751 };
0752
0753 static struct clk_branch csiphy1_timer_clk = {
0754 .halt_reg = 0x01e8,
0755 .halt_bit = 18,
0756 .clkr = {
0757 .enable_reg = 0x0160,
0758 .enable_mask = BIT(9),
0759 .hw.init = &(struct clk_init_data){
0760 .parent_names = csixphy_timer_src,
0761 .num_parents = 1,
0762 .name = "csiphy1_timer_clk",
0763 .ops = &clk_branch_ops,
0764 .flags = CLK_SET_RATE_PARENT,
0765 },
0766 },
0767 };
0768
0769 static struct clk_branch csiphy2_timer_clk = {
0770 .halt_reg = 0x01e8,
0771 .halt_bit = 30,
0772 .clkr = {
0773 .enable_reg = 0x0160,
0774 .enable_mask = BIT(11),
0775 .hw.init = &(struct clk_init_data){
0776 .parent_names = csixphy_timer_src,
0777 .num_parents = 1,
0778 .name = "csiphy2_timer_clk",
0779 .ops = &clk_branch_ops,
0780 .flags = CLK_SET_RATE_PARENT,
0781 },
0782 },
0783 };
0784
0785 static struct freq_tbl clk_tbl_gfx2d[] = {
0786 F_MN( 27000000, P_PXO, 1, 0),
0787 F_MN( 48000000, P_PLL8, 1, 8),
0788 F_MN( 54857000, P_PLL8, 1, 7),
0789 F_MN( 64000000, P_PLL8, 1, 6),
0790 F_MN( 76800000, P_PLL8, 1, 5),
0791 F_MN( 96000000, P_PLL8, 1, 4),
0792 F_MN(128000000, P_PLL8, 1, 3),
0793 F_MN(145455000, P_PLL2, 2, 11),
0794 F_MN(160000000, P_PLL2, 1, 5),
0795 F_MN(177778000, P_PLL2, 2, 9),
0796 F_MN(200000000, P_PLL2, 1, 4),
0797 F_MN(228571000, P_PLL2, 2, 7),
0798 { }
0799 };
0800
0801 static struct clk_dyn_rcg gfx2d0_src = {
0802 .ns_reg[0] = 0x0070,
0803 .ns_reg[1] = 0x0070,
0804 .md_reg[0] = 0x0064,
0805 .md_reg[1] = 0x0068,
0806 .bank_reg = 0x0060,
0807 .mn[0] = {
0808 .mnctr_en_bit = 8,
0809 .mnctr_reset_bit = 25,
0810 .mnctr_mode_shift = 9,
0811 .n_val_shift = 20,
0812 .m_val_shift = 4,
0813 .width = 4,
0814 },
0815 .mn[1] = {
0816 .mnctr_en_bit = 5,
0817 .mnctr_reset_bit = 24,
0818 .mnctr_mode_shift = 6,
0819 .n_val_shift = 16,
0820 .m_val_shift = 4,
0821 .width = 4,
0822 },
0823 .s[0] = {
0824 .src_sel_shift = 3,
0825 .parent_map = mmcc_pxo_pll8_pll2_map,
0826 },
0827 .s[1] = {
0828 .src_sel_shift = 0,
0829 .parent_map = mmcc_pxo_pll8_pll2_map,
0830 },
0831 .mux_sel_bit = 11,
0832 .freq_tbl = clk_tbl_gfx2d,
0833 .clkr = {
0834 .enable_reg = 0x0060,
0835 .enable_mask = BIT(2),
0836 .hw.init = &(struct clk_init_data){
0837 .name = "gfx2d0_src",
0838 .parent_names = mmcc_pxo_pll8_pll2,
0839 .num_parents = 3,
0840 .ops = &clk_dyn_rcg_ops,
0841 },
0842 },
0843 };
0844
0845 static struct clk_branch gfx2d0_clk = {
0846 .halt_reg = 0x01c8,
0847 .halt_bit = 9,
0848 .clkr = {
0849 .enable_reg = 0x0060,
0850 .enable_mask = BIT(0),
0851 .hw.init = &(struct clk_init_data){
0852 .name = "gfx2d0_clk",
0853 .parent_names = (const char *[]){ "gfx2d0_src" },
0854 .num_parents = 1,
0855 .ops = &clk_branch_ops,
0856 .flags = CLK_SET_RATE_PARENT,
0857 },
0858 },
0859 };
0860
0861 static struct clk_dyn_rcg gfx2d1_src = {
0862 .ns_reg[0] = 0x007c,
0863 .ns_reg[1] = 0x007c,
0864 .md_reg[0] = 0x0078,
0865 .md_reg[1] = 0x006c,
0866 .bank_reg = 0x0074,
0867 .mn[0] = {
0868 .mnctr_en_bit = 8,
0869 .mnctr_reset_bit = 25,
0870 .mnctr_mode_shift = 9,
0871 .n_val_shift = 20,
0872 .m_val_shift = 4,
0873 .width = 4,
0874 },
0875 .mn[1] = {
0876 .mnctr_en_bit = 5,
0877 .mnctr_reset_bit = 24,
0878 .mnctr_mode_shift = 6,
0879 .n_val_shift = 16,
0880 .m_val_shift = 4,
0881 .width = 4,
0882 },
0883 .s[0] = {
0884 .src_sel_shift = 3,
0885 .parent_map = mmcc_pxo_pll8_pll2_map,
0886 },
0887 .s[1] = {
0888 .src_sel_shift = 0,
0889 .parent_map = mmcc_pxo_pll8_pll2_map,
0890 },
0891 .mux_sel_bit = 11,
0892 .freq_tbl = clk_tbl_gfx2d,
0893 .clkr = {
0894 .enable_reg = 0x0074,
0895 .enable_mask = BIT(2),
0896 .hw.init = &(struct clk_init_data){
0897 .name = "gfx2d1_src",
0898 .parent_names = mmcc_pxo_pll8_pll2,
0899 .num_parents = 3,
0900 .ops = &clk_dyn_rcg_ops,
0901 },
0902 },
0903 };
0904
0905 static struct clk_branch gfx2d1_clk = {
0906 .halt_reg = 0x01c8,
0907 .halt_bit = 14,
0908 .clkr = {
0909 .enable_reg = 0x0074,
0910 .enable_mask = BIT(0),
0911 .hw.init = &(struct clk_init_data){
0912 .name = "gfx2d1_clk",
0913 .parent_names = (const char *[]){ "gfx2d1_src" },
0914 .num_parents = 1,
0915 .ops = &clk_branch_ops,
0916 .flags = CLK_SET_RATE_PARENT,
0917 },
0918 },
0919 };
0920
0921 static struct freq_tbl clk_tbl_gfx3d[] = {
0922 F_MN( 27000000, P_PXO, 1, 0),
0923 F_MN( 48000000, P_PLL8, 1, 8),
0924 F_MN( 54857000, P_PLL8, 1, 7),
0925 F_MN( 64000000, P_PLL8, 1, 6),
0926 F_MN( 76800000, P_PLL8, 1, 5),
0927 F_MN( 96000000, P_PLL8, 1, 4),
0928 F_MN(128000000, P_PLL8, 1, 3),
0929 F_MN(145455000, P_PLL2, 2, 11),
0930 F_MN(160000000, P_PLL2, 1, 5),
0931 F_MN(177778000, P_PLL2, 2, 9),
0932 F_MN(200000000, P_PLL2, 1, 4),
0933 F_MN(228571000, P_PLL2, 2, 7),
0934 F_MN(266667000, P_PLL2, 1, 3),
0935 F_MN(300000000, P_PLL3, 1, 4),
0936 F_MN(320000000, P_PLL2, 2, 5),
0937 F_MN(400000000, P_PLL2, 1, 2),
0938 { }
0939 };
0940
0941 static struct freq_tbl clk_tbl_gfx3d_8064[] = {
0942 F_MN( 27000000, P_PXO, 0, 0),
0943 F_MN( 48000000, P_PLL8, 1, 8),
0944 F_MN( 54857000, P_PLL8, 1, 7),
0945 F_MN( 64000000, P_PLL8, 1, 6),
0946 F_MN( 76800000, P_PLL8, 1, 5),
0947 F_MN( 96000000, P_PLL8, 1, 4),
0948 F_MN(128000000, P_PLL8, 1, 3),
0949 F_MN(145455000, P_PLL2, 2, 11),
0950 F_MN(160000000, P_PLL2, 1, 5),
0951 F_MN(177778000, P_PLL2, 2, 9),
0952 F_MN(192000000, P_PLL8, 1, 2),
0953 F_MN(200000000, P_PLL2, 1, 4),
0954 F_MN(228571000, P_PLL2, 2, 7),
0955 F_MN(266667000, P_PLL2, 1, 3),
0956 F_MN(320000000, P_PLL2, 2, 5),
0957 F_MN(400000000, P_PLL2, 1, 2),
0958 F_MN(450000000, P_PLL15, 1, 2),
0959 { }
0960 };
0961
0962 static struct clk_dyn_rcg gfx3d_src = {
0963 .ns_reg[0] = 0x008c,
0964 .ns_reg[1] = 0x008c,
0965 .md_reg[0] = 0x0084,
0966 .md_reg[1] = 0x0088,
0967 .bank_reg = 0x0080,
0968 .mn[0] = {
0969 .mnctr_en_bit = 8,
0970 .mnctr_reset_bit = 25,
0971 .mnctr_mode_shift = 9,
0972 .n_val_shift = 18,
0973 .m_val_shift = 4,
0974 .width = 4,
0975 },
0976 .mn[1] = {
0977 .mnctr_en_bit = 5,
0978 .mnctr_reset_bit = 24,
0979 .mnctr_mode_shift = 6,
0980 .n_val_shift = 14,
0981 .m_val_shift = 4,
0982 .width = 4,
0983 },
0984 .s[0] = {
0985 .src_sel_shift = 3,
0986 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
0987 },
0988 .s[1] = {
0989 .src_sel_shift = 0,
0990 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
0991 },
0992 .mux_sel_bit = 11,
0993 .freq_tbl = clk_tbl_gfx3d,
0994 .clkr = {
0995 .enable_reg = 0x0080,
0996 .enable_mask = BIT(2),
0997 .hw.init = &(struct clk_init_data){
0998 .name = "gfx3d_src",
0999 .parent_names = mmcc_pxo_pll8_pll2_pll3,
1000 .num_parents = 4,
1001 .ops = &clk_dyn_rcg_ops,
1002 },
1003 },
1004 };
1005
1006 static const struct clk_init_data gfx3d_8064_init = {
1007 .name = "gfx3d_src",
1008 .parent_names = mmcc_pxo_pll8_pll2_pll15,
1009 .num_parents = 4,
1010 .ops = &clk_dyn_rcg_ops,
1011 };
1012
1013 static struct clk_branch gfx3d_clk = {
1014 .halt_reg = 0x01c8,
1015 .halt_bit = 4,
1016 .clkr = {
1017 .enable_reg = 0x0080,
1018 .enable_mask = BIT(0),
1019 .hw.init = &(struct clk_init_data){
1020 .name = "gfx3d_clk",
1021 .parent_names = (const char *[]){ "gfx3d_src" },
1022 .num_parents = 1,
1023 .ops = &clk_branch_ops,
1024 .flags = CLK_SET_RATE_PARENT,
1025 },
1026 },
1027 };
1028
1029 static struct freq_tbl clk_tbl_vcap[] = {
1030 F_MN( 27000000, P_PXO, 0, 0),
1031 F_MN( 54860000, P_PLL8, 1, 7),
1032 F_MN( 64000000, P_PLL8, 1, 6),
1033 F_MN( 76800000, P_PLL8, 1, 5),
1034 F_MN(128000000, P_PLL8, 1, 3),
1035 F_MN(160000000, P_PLL2, 1, 5),
1036 F_MN(200000000, P_PLL2, 1, 4),
1037 { }
1038 };
1039
1040 static struct clk_dyn_rcg vcap_src = {
1041 .ns_reg[0] = 0x021c,
1042 .ns_reg[1] = 0x021c,
1043 .md_reg[0] = 0x01ec,
1044 .md_reg[1] = 0x0218,
1045 .bank_reg = 0x0178,
1046 .mn[0] = {
1047 .mnctr_en_bit = 8,
1048 .mnctr_reset_bit = 23,
1049 .mnctr_mode_shift = 9,
1050 .n_val_shift = 18,
1051 .m_val_shift = 4,
1052 .width = 4,
1053 },
1054 .mn[1] = {
1055 .mnctr_en_bit = 5,
1056 .mnctr_reset_bit = 22,
1057 .mnctr_mode_shift = 6,
1058 .n_val_shift = 14,
1059 .m_val_shift = 4,
1060 .width = 4,
1061 },
1062 .s[0] = {
1063 .src_sel_shift = 3,
1064 .parent_map = mmcc_pxo_pll8_pll2_map,
1065 },
1066 .s[1] = {
1067 .src_sel_shift = 0,
1068 .parent_map = mmcc_pxo_pll8_pll2_map,
1069 },
1070 .mux_sel_bit = 11,
1071 .freq_tbl = clk_tbl_vcap,
1072 .clkr = {
1073 .enable_reg = 0x0178,
1074 .enable_mask = BIT(2),
1075 .hw.init = &(struct clk_init_data){
1076 .name = "vcap_src",
1077 .parent_names = mmcc_pxo_pll8_pll2,
1078 .num_parents = 3,
1079 .ops = &clk_dyn_rcg_ops,
1080 },
1081 },
1082 };
1083
1084 static struct clk_branch vcap_clk = {
1085 .halt_reg = 0x0240,
1086 .halt_bit = 15,
1087 .clkr = {
1088 .enable_reg = 0x0178,
1089 .enable_mask = BIT(0),
1090 .hw.init = &(struct clk_init_data){
1091 .name = "vcap_clk",
1092 .parent_names = (const char *[]){ "vcap_src" },
1093 .num_parents = 1,
1094 .ops = &clk_branch_ops,
1095 .flags = CLK_SET_RATE_PARENT,
1096 },
1097 },
1098 };
1099
1100 static struct clk_branch vcap_npl_clk = {
1101 .halt_reg = 0x0240,
1102 .halt_bit = 25,
1103 .clkr = {
1104 .enable_reg = 0x0178,
1105 .enable_mask = BIT(13),
1106 .hw.init = &(struct clk_init_data){
1107 .name = "vcap_npl_clk",
1108 .parent_names = (const char *[]){ "vcap_src" },
1109 .num_parents = 1,
1110 .ops = &clk_branch_ops,
1111 .flags = CLK_SET_RATE_PARENT,
1112 },
1113 },
1114 };
1115
1116 static struct freq_tbl clk_tbl_ijpeg[] = {
1117 { 27000000, P_PXO, 1, 0, 0 },
1118 { 36570000, P_PLL8, 1, 2, 21 },
1119 { 54860000, P_PLL8, 7, 0, 0 },
1120 { 96000000, P_PLL8, 4, 0, 0 },
1121 { 109710000, P_PLL8, 1, 2, 7 },
1122 { 128000000, P_PLL8, 3, 0, 0 },
1123 { 153600000, P_PLL8, 1, 2, 5 },
1124 { 200000000, P_PLL2, 4, 0, 0 },
1125 { 228571000, P_PLL2, 1, 2, 7 },
1126 { 266667000, P_PLL2, 1, 1, 3 },
1127 { 320000000, P_PLL2, 1, 2, 5 },
1128 { }
1129 };
1130
1131 static struct clk_rcg ijpeg_src = {
1132 .ns_reg = 0x00a0,
1133 .md_reg = 0x009c,
1134 .mn = {
1135 .mnctr_en_bit = 5,
1136 .mnctr_reset_bit = 7,
1137 .mnctr_mode_shift = 6,
1138 .n_val_shift = 16,
1139 .m_val_shift = 8,
1140 .width = 8,
1141 },
1142 .p = {
1143 .pre_div_shift = 12,
1144 .pre_div_width = 2,
1145 },
1146 .s = {
1147 .src_sel_shift = 0,
1148 .parent_map = mmcc_pxo_pll8_pll2_map,
1149 },
1150 .freq_tbl = clk_tbl_ijpeg,
1151 .clkr = {
1152 .enable_reg = 0x0098,
1153 .enable_mask = BIT(2),
1154 .hw.init = &(struct clk_init_data){
1155 .name = "ijpeg_src",
1156 .parent_names = mmcc_pxo_pll8_pll2,
1157 .num_parents = 3,
1158 .ops = &clk_rcg_ops,
1159 },
1160 },
1161 };
1162
1163 static struct clk_branch ijpeg_clk = {
1164 .halt_reg = 0x01c8,
1165 .halt_bit = 24,
1166 .clkr = {
1167 .enable_reg = 0x0098,
1168 .enable_mask = BIT(0),
1169 .hw.init = &(struct clk_init_data){
1170 .name = "ijpeg_clk",
1171 .parent_names = (const char *[]){ "ijpeg_src" },
1172 .num_parents = 1,
1173 .ops = &clk_branch_ops,
1174 .flags = CLK_SET_RATE_PARENT,
1175 },
1176 },
1177 };
1178
1179 static struct freq_tbl clk_tbl_jpegd[] = {
1180 { 64000000, P_PLL8, 6 },
1181 { 76800000, P_PLL8, 5 },
1182 { 96000000, P_PLL8, 4 },
1183 { 160000000, P_PLL2, 5 },
1184 { 200000000, P_PLL2, 4 },
1185 { }
1186 };
1187
1188 static struct clk_rcg jpegd_src = {
1189 .ns_reg = 0x00ac,
1190 .p = {
1191 .pre_div_shift = 12,
1192 .pre_div_width = 4,
1193 },
1194 .s = {
1195 .src_sel_shift = 0,
1196 .parent_map = mmcc_pxo_pll8_pll2_map,
1197 },
1198 .freq_tbl = clk_tbl_jpegd,
1199 .clkr = {
1200 .enable_reg = 0x00a4,
1201 .enable_mask = BIT(2),
1202 .hw.init = &(struct clk_init_data){
1203 .name = "jpegd_src",
1204 .parent_names = mmcc_pxo_pll8_pll2,
1205 .num_parents = 3,
1206 .ops = &clk_rcg_ops,
1207 },
1208 },
1209 };
1210
1211 static struct clk_branch jpegd_clk = {
1212 .halt_reg = 0x01c8,
1213 .halt_bit = 19,
1214 .clkr = {
1215 .enable_reg = 0x00a4,
1216 .enable_mask = BIT(0),
1217 .hw.init = &(struct clk_init_data){
1218 .name = "jpegd_clk",
1219 .parent_names = (const char *[]){ "jpegd_src" },
1220 .num_parents = 1,
1221 .ops = &clk_branch_ops,
1222 .flags = CLK_SET_RATE_PARENT,
1223 },
1224 },
1225 };
1226
1227 static struct freq_tbl clk_tbl_mdp[] = {
1228 { 9600000, P_PLL8, 1, 1, 40 },
1229 { 13710000, P_PLL8, 1, 1, 28 },
1230 { 27000000, P_PXO, 1, 0, 0 },
1231 { 29540000, P_PLL8, 1, 1, 13 },
1232 { 34910000, P_PLL8, 1, 1, 11 },
1233 { 38400000, P_PLL8, 1, 1, 10 },
1234 { 59080000, P_PLL8, 1, 2, 13 },
1235 { 76800000, P_PLL8, 1, 1, 5 },
1236 { 85330000, P_PLL8, 1, 2, 9 },
1237 { 96000000, P_PLL8, 1, 1, 4 },
1238 { 128000000, P_PLL8, 1, 1, 3 },
1239 { 160000000, P_PLL2, 1, 1, 5 },
1240 { 177780000, P_PLL2, 1, 2, 9 },
1241 { 200000000, P_PLL2, 1, 1, 4 },
1242 { 228571000, P_PLL2, 1, 2, 7 },
1243 { 266667000, P_PLL2, 1, 1, 3 },
1244 { }
1245 };
1246
1247 static struct clk_dyn_rcg mdp_src = {
1248 .ns_reg[0] = 0x00d0,
1249 .ns_reg[1] = 0x00d0,
1250 .md_reg[0] = 0x00c4,
1251 .md_reg[1] = 0x00c8,
1252 .bank_reg = 0x00c0,
1253 .mn[0] = {
1254 .mnctr_en_bit = 8,
1255 .mnctr_reset_bit = 31,
1256 .mnctr_mode_shift = 9,
1257 .n_val_shift = 22,
1258 .m_val_shift = 8,
1259 .width = 8,
1260 },
1261 .mn[1] = {
1262 .mnctr_en_bit = 5,
1263 .mnctr_reset_bit = 30,
1264 .mnctr_mode_shift = 6,
1265 .n_val_shift = 14,
1266 .m_val_shift = 8,
1267 .width = 8,
1268 },
1269 .s[0] = {
1270 .src_sel_shift = 3,
1271 .parent_map = mmcc_pxo_pll8_pll2_map,
1272 },
1273 .s[1] = {
1274 .src_sel_shift = 0,
1275 .parent_map = mmcc_pxo_pll8_pll2_map,
1276 },
1277 .mux_sel_bit = 11,
1278 .freq_tbl = clk_tbl_mdp,
1279 .clkr = {
1280 .enable_reg = 0x00c0,
1281 .enable_mask = BIT(2),
1282 .hw.init = &(struct clk_init_data){
1283 .name = "mdp_src",
1284 .parent_names = mmcc_pxo_pll8_pll2,
1285 .num_parents = 3,
1286 .ops = &clk_dyn_rcg_ops,
1287 },
1288 },
1289 };
1290
1291 static struct clk_branch mdp_clk = {
1292 .halt_reg = 0x01d0,
1293 .halt_bit = 10,
1294 .clkr = {
1295 .enable_reg = 0x00c0,
1296 .enable_mask = BIT(0),
1297 .hw.init = &(struct clk_init_data){
1298 .name = "mdp_clk",
1299 .parent_names = (const char *[]){ "mdp_src" },
1300 .num_parents = 1,
1301 .ops = &clk_branch_ops,
1302 .flags = CLK_SET_RATE_PARENT,
1303 },
1304 },
1305 };
1306
1307 static struct clk_branch mdp_lut_clk = {
1308 .halt_reg = 0x01e8,
1309 .halt_bit = 13,
1310 .clkr = {
1311 .enable_reg = 0x016c,
1312 .enable_mask = BIT(0),
1313 .hw.init = &(struct clk_init_data){
1314 .parent_names = (const char *[]){ "mdp_src" },
1315 .num_parents = 1,
1316 .name = "mdp_lut_clk",
1317 .ops = &clk_branch_ops,
1318 .flags = CLK_SET_RATE_PARENT,
1319 },
1320 },
1321 };
1322
1323 static struct clk_branch mdp_vsync_clk = {
1324 .halt_reg = 0x01cc,
1325 .halt_bit = 22,
1326 .clkr = {
1327 .enable_reg = 0x0058,
1328 .enable_mask = BIT(6),
1329 .hw.init = &(struct clk_init_data){
1330 .name = "mdp_vsync_clk",
1331 .parent_names = (const char *[]){ "pxo" },
1332 .num_parents = 1,
1333 .ops = &clk_branch_ops
1334 },
1335 },
1336 };
1337
1338 static struct freq_tbl clk_tbl_rot[] = {
1339 { 27000000, P_PXO, 1 },
1340 { 29540000, P_PLL8, 13 },
1341 { 32000000, P_PLL8, 12 },
1342 { 38400000, P_PLL8, 10 },
1343 { 48000000, P_PLL8, 8 },
1344 { 54860000, P_PLL8, 7 },
1345 { 64000000, P_PLL8, 6 },
1346 { 76800000, P_PLL8, 5 },
1347 { 96000000, P_PLL8, 4 },
1348 { 100000000, P_PLL2, 8 },
1349 { 114290000, P_PLL2, 7 },
1350 { 133330000, P_PLL2, 6 },
1351 { 160000000, P_PLL2, 5 },
1352 { 200000000, P_PLL2, 4 },
1353 { }
1354 };
1355
1356 static struct clk_dyn_rcg rot_src = {
1357 .ns_reg[0] = 0x00e8,
1358 .ns_reg[1] = 0x00e8,
1359 .bank_reg = 0x00e8,
1360 .p[0] = {
1361 .pre_div_shift = 22,
1362 .pre_div_width = 4,
1363 },
1364 .p[1] = {
1365 .pre_div_shift = 26,
1366 .pre_div_width = 4,
1367 },
1368 .s[0] = {
1369 .src_sel_shift = 16,
1370 .parent_map = mmcc_pxo_pll8_pll2_map,
1371 },
1372 .s[1] = {
1373 .src_sel_shift = 19,
1374 .parent_map = mmcc_pxo_pll8_pll2_map,
1375 },
1376 .mux_sel_bit = 30,
1377 .freq_tbl = clk_tbl_rot,
1378 .clkr = {
1379 .enable_reg = 0x00e0,
1380 .enable_mask = BIT(2),
1381 .hw.init = &(struct clk_init_data){
1382 .name = "rot_src",
1383 .parent_names = mmcc_pxo_pll8_pll2,
1384 .num_parents = 3,
1385 .ops = &clk_dyn_rcg_ops,
1386 },
1387 },
1388 };
1389
1390 static struct clk_branch rot_clk = {
1391 .halt_reg = 0x01d0,
1392 .halt_bit = 15,
1393 .clkr = {
1394 .enable_reg = 0x00e0,
1395 .enable_mask = BIT(0),
1396 .hw.init = &(struct clk_init_data){
1397 .name = "rot_clk",
1398 .parent_names = (const char *[]){ "rot_src" },
1399 .num_parents = 1,
1400 .ops = &clk_branch_ops,
1401 .flags = CLK_SET_RATE_PARENT,
1402 },
1403 },
1404 };
1405
1406 static const struct parent_map mmcc_pxo_hdmi_map[] = {
1407 { P_PXO, 0 },
1408 { P_HDMI_PLL, 3 }
1409 };
1410
1411 static const char * const mmcc_pxo_hdmi[] = {
1412 "pxo",
1413 "hdmi_pll",
1414 };
1415
1416 static struct freq_tbl clk_tbl_tv[] = {
1417 { .src = P_HDMI_PLL, .pre_div = 1 },
1418 { }
1419 };
1420
1421 static struct clk_rcg tv_src = {
1422 .ns_reg = 0x00f4,
1423 .md_reg = 0x00f0,
1424 .mn = {
1425 .mnctr_en_bit = 5,
1426 .mnctr_reset_bit = 7,
1427 .mnctr_mode_shift = 6,
1428 .n_val_shift = 16,
1429 .m_val_shift = 8,
1430 .width = 8,
1431 },
1432 .p = {
1433 .pre_div_shift = 14,
1434 .pre_div_width = 2,
1435 },
1436 .s = {
1437 .src_sel_shift = 0,
1438 .parent_map = mmcc_pxo_hdmi_map,
1439 },
1440 .freq_tbl = clk_tbl_tv,
1441 .clkr = {
1442 .enable_reg = 0x00ec,
1443 .enable_mask = BIT(2),
1444 .hw.init = &(struct clk_init_data){
1445 .name = "tv_src",
1446 .parent_names = mmcc_pxo_hdmi,
1447 .num_parents = 2,
1448 .ops = &clk_rcg_bypass_ops,
1449 .flags = CLK_SET_RATE_PARENT,
1450 },
1451 },
1452 };
1453
1454 static const char * const tv_src_name[] = { "tv_src" };
1455
1456 static struct clk_branch tv_enc_clk = {
1457 .halt_reg = 0x01d4,
1458 .halt_bit = 9,
1459 .clkr = {
1460 .enable_reg = 0x00ec,
1461 .enable_mask = BIT(8),
1462 .hw.init = &(struct clk_init_data){
1463 .parent_names = tv_src_name,
1464 .num_parents = 1,
1465 .name = "tv_enc_clk",
1466 .ops = &clk_branch_ops,
1467 .flags = CLK_SET_RATE_PARENT,
1468 },
1469 },
1470 };
1471
1472 static struct clk_branch tv_dac_clk = {
1473 .halt_reg = 0x01d4,
1474 .halt_bit = 10,
1475 .clkr = {
1476 .enable_reg = 0x00ec,
1477 .enable_mask = BIT(10),
1478 .hw.init = &(struct clk_init_data){
1479 .parent_names = tv_src_name,
1480 .num_parents = 1,
1481 .name = "tv_dac_clk",
1482 .ops = &clk_branch_ops,
1483 .flags = CLK_SET_RATE_PARENT,
1484 },
1485 },
1486 };
1487
1488 static struct clk_branch mdp_tv_clk = {
1489 .halt_reg = 0x01d4,
1490 .halt_bit = 12,
1491 .clkr = {
1492 .enable_reg = 0x00ec,
1493 .enable_mask = BIT(0),
1494 .hw.init = &(struct clk_init_data){
1495 .parent_names = tv_src_name,
1496 .num_parents = 1,
1497 .name = "mdp_tv_clk",
1498 .ops = &clk_branch_ops,
1499 .flags = CLK_SET_RATE_PARENT,
1500 },
1501 },
1502 };
1503
1504 static struct clk_branch hdmi_tv_clk = {
1505 .halt_reg = 0x01d4,
1506 .halt_bit = 11,
1507 .clkr = {
1508 .enable_reg = 0x00ec,
1509 .enable_mask = BIT(12),
1510 .hw.init = &(struct clk_init_data){
1511 .parent_names = tv_src_name,
1512 .num_parents = 1,
1513 .name = "hdmi_tv_clk",
1514 .ops = &clk_branch_ops,
1515 .flags = CLK_SET_RATE_PARENT,
1516 },
1517 },
1518 };
1519
1520 static struct clk_branch rgb_tv_clk = {
1521 .halt_reg = 0x0240,
1522 .halt_bit = 27,
1523 .clkr = {
1524 .enable_reg = 0x0124,
1525 .enable_mask = BIT(14),
1526 .hw.init = &(struct clk_init_data){
1527 .parent_names = tv_src_name,
1528 .num_parents = 1,
1529 .name = "rgb_tv_clk",
1530 .ops = &clk_branch_ops,
1531 .flags = CLK_SET_RATE_PARENT,
1532 },
1533 },
1534 };
1535
1536 static struct clk_branch npl_tv_clk = {
1537 .halt_reg = 0x0240,
1538 .halt_bit = 26,
1539 .clkr = {
1540 .enable_reg = 0x0124,
1541 .enable_mask = BIT(16),
1542 .hw.init = &(struct clk_init_data){
1543 .parent_names = tv_src_name,
1544 .num_parents = 1,
1545 .name = "npl_tv_clk",
1546 .ops = &clk_branch_ops,
1547 .flags = CLK_SET_RATE_PARENT,
1548 },
1549 },
1550 };
1551
1552 static struct clk_branch hdmi_app_clk = {
1553 .halt_reg = 0x01cc,
1554 .halt_bit = 25,
1555 .clkr = {
1556 .enable_reg = 0x005c,
1557 .enable_mask = BIT(11),
1558 .hw.init = &(struct clk_init_data){
1559 .parent_names = (const char *[]){ "pxo" },
1560 .num_parents = 1,
1561 .name = "hdmi_app_clk",
1562 .ops = &clk_branch_ops,
1563 },
1564 },
1565 };
1566
1567 static struct freq_tbl clk_tbl_vcodec[] = {
1568 F_MN( 27000000, P_PXO, 1, 0),
1569 F_MN( 32000000, P_PLL8, 1, 12),
1570 F_MN( 48000000, P_PLL8, 1, 8),
1571 F_MN( 54860000, P_PLL8, 1, 7),
1572 F_MN( 96000000, P_PLL8, 1, 4),
1573 F_MN(133330000, P_PLL2, 1, 6),
1574 F_MN(200000000, P_PLL2, 1, 4),
1575 F_MN(228570000, P_PLL2, 2, 7),
1576 F_MN(266670000, P_PLL2, 1, 3),
1577 { }
1578 };
1579
1580 static struct clk_dyn_rcg vcodec_src = {
1581 .ns_reg[0] = 0x0100,
1582 .ns_reg[1] = 0x0100,
1583 .md_reg[0] = 0x00fc,
1584 .md_reg[1] = 0x0128,
1585 .bank_reg = 0x00f8,
1586 .mn[0] = {
1587 .mnctr_en_bit = 5,
1588 .mnctr_reset_bit = 31,
1589 .mnctr_mode_shift = 6,
1590 .n_val_shift = 11,
1591 .m_val_shift = 8,
1592 .width = 8,
1593 },
1594 .mn[1] = {
1595 .mnctr_en_bit = 10,
1596 .mnctr_reset_bit = 30,
1597 .mnctr_mode_shift = 11,
1598 .n_val_shift = 19,
1599 .m_val_shift = 8,
1600 .width = 8,
1601 },
1602 .s[0] = {
1603 .src_sel_shift = 27,
1604 .parent_map = mmcc_pxo_pll8_pll2_map,
1605 },
1606 .s[1] = {
1607 .src_sel_shift = 0,
1608 .parent_map = mmcc_pxo_pll8_pll2_map,
1609 },
1610 .mux_sel_bit = 13,
1611 .freq_tbl = clk_tbl_vcodec,
1612 .clkr = {
1613 .enable_reg = 0x00f8,
1614 .enable_mask = BIT(2),
1615 .hw.init = &(struct clk_init_data){
1616 .name = "vcodec_src",
1617 .parent_names = mmcc_pxo_pll8_pll2,
1618 .num_parents = 3,
1619 .ops = &clk_dyn_rcg_ops,
1620 },
1621 },
1622 };
1623
1624 static struct clk_branch vcodec_clk = {
1625 .halt_reg = 0x01d0,
1626 .halt_bit = 29,
1627 .clkr = {
1628 .enable_reg = 0x00f8,
1629 .enable_mask = BIT(0),
1630 .hw.init = &(struct clk_init_data){
1631 .name = "vcodec_clk",
1632 .parent_names = (const char *[]){ "vcodec_src" },
1633 .num_parents = 1,
1634 .ops = &clk_branch_ops,
1635 .flags = CLK_SET_RATE_PARENT,
1636 },
1637 },
1638 };
1639
1640 static struct freq_tbl clk_tbl_vpe[] = {
1641 { 27000000, P_PXO, 1 },
1642 { 34909000, P_PLL8, 11 },
1643 { 38400000, P_PLL8, 10 },
1644 { 64000000, P_PLL8, 6 },
1645 { 76800000, P_PLL8, 5 },
1646 { 96000000, P_PLL8, 4 },
1647 { 100000000, P_PLL2, 8 },
1648 { 160000000, P_PLL2, 5 },
1649 { }
1650 };
1651
1652 static struct clk_rcg vpe_src = {
1653 .ns_reg = 0x0118,
1654 .p = {
1655 .pre_div_shift = 12,
1656 .pre_div_width = 4,
1657 },
1658 .s = {
1659 .src_sel_shift = 0,
1660 .parent_map = mmcc_pxo_pll8_pll2_map,
1661 },
1662 .freq_tbl = clk_tbl_vpe,
1663 .clkr = {
1664 .enable_reg = 0x0110,
1665 .enable_mask = BIT(2),
1666 .hw.init = &(struct clk_init_data){
1667 .name = "vpe_src",
1668 .parent_names = mmcc_pxo_pll8_pll2,
1669 .num_parents = 3,
1670 .ops = &clk_rcg_ops,
1671 },
1672 },
1673 };
1674
1675 static struct clk_branch vpe_clk = {
1676 .halt_reg = 0x01c8,
1677 .halt_bit = 28,
1678 .clkr = {
1679 .enable_reg = 0x0110,
1680 .enable_mask = BIT(0),
1681 .hw.init = &(struct clk_init_data){
1682 .name = "vpe_clk",
1683 .parent_names = (const char *[]){ "vpe_src" },
1684 .num_parents = 1,
1685 .ops = &clk_branch_ops,
1686 .flags = CLK_SET_RATE_PARENT,
1687 },
1688 },
1689 };
1690
1691 static struct freq_tbl clk_tbl_vfe[] = {
1692 { 13960000, P_PLL8, 1, 2, 55 },
1693 { 27000000, P_PXO, 1, 0, 0 },
1694 { 36570000, P_PLL8, 1, 2, 21 },
1695 { 38400000, P_PLL8, 2, 1, 5 },
1696 { 45180000, P_PLL8, 1, 2, 17 },
1697 { 48000000, P_PLL8, 2, 1, 4 },
1698 { 54860000, P_PLL8, 1, 1, 7 },
1699 { 64000000, P_PLL8, 2, 1, 3 },
1700 { 76800000, P_PLL8, 1, 1, 5 },
1701 { 96000000, P_PLL8, 2, 1, 2 },
1702 { 109710000, P_PLL8, 1, 2, 7 },
1703 { 128000000, P_PLL8, 1, 1, 3 },
1704 { 153600000, P_PLL8, 1, 2, 5 },
1705 { 200000000, P_PLL2, 2, 1, 2 },
1706 { 228570000, P_PLL2, 1, 2, 7 },
1707 { 266667000, P_PLL2, 1, 1, 3 },
1708 { 320000000, P_PLL2, 1, 2, 5 },
1709 { }
1710 };
1711
1712 static struct clk_rcg vfe_src = {
1713 .ns_reg = 0x0108,
1714 .mn = {
1715 .mnctr_en_bit = 5,
1716 .mnctr_reset_bit = 7,
1717 .mnctr_mode_shift = 6,
1718 .n_val_shift = 16,
1719 .m_val_shift = 8,
1720 .width = 8,
1721 },
1722 .p = {
1723 .pre_div_shift = 10,
1724 .pre_div_width = 1,
1725 },
1726 .s = {
1727 .src_sel_shift = 0,
1728 .parent_map = mmcc_pxo_pll8_pll2_map,
1729 },
1730 .freq_tbl = clk_tbl_vfe,
1731 .clkr = {
1732 .enable_reg = 0x0104,
1733 .enable_mask = BIT(2),
1734 .hw.init = &(struct clk_init_data){
1735 .name = "vfe_src",
1736 .parent_names = mmcc_pxo_pll8_pll2,
1737 .num_parents = 3,
1738 .ops = &clk_rcg_ops,
1739 },
1740 },
1741 };
1742
1743 static struct clk_branch vfe_clk = {
1744 .halt_reg = 0x01cc,
1745 .halt_bit = 6,
1746 .clkr = {
1747 .enable_reg = 0x0104,
1748 .enable_mask = BIT(0),
1749 .hw.init = &(struct clk_init_data){
1750 .name = "vfe_clk",
1751 .parent_names = (const char *[]){ "vfe_src" },
1752 .num_parents = 1,
1753 .ops = &clk_branch_ops,
1754 .flags = CLK_SET_RATE_PARENT,
1755 },
1756 },
1757 };
1758
1759 static struct clk_branch vfe_csi_clk = {
1760 .halt_reg = 0x01cc,
1761 .halt_bit = 8,
1762 .clkr = {
1763 .enable_reg = 0x0104,
1764 .enable_mask = BIT(12),
1765 .hw.init = &(struct clk_init_data){
1766 .parent_names = (const char *[]){ "vfe_src" },
1767 .num_parents = 1,
1768 .name = "vfe_csi_clk",
1769 .ops = &clk_branch_ops,
1770 .flags = CLK_SET_RATE_PARENT,
1771 },
1772 },
1773 };
1774
1775 static struct clk_branch gmem_axi_clk = {
1776 .halt_reg = 0x01d8,
1777 .halt_bit = 6,
1778 .clkr = {
1779 .enable_reg = 0x0018,
1780 .enable_mask = BIT(24),
1781 .hw.init = &(struct clk_init_data){
1782 .name = "gmem_axi_clk",
1783 .ops = &clk_branch_ops,
1784 },
1785 },
1786 };
1787
1788 static struct clk_branch ijpeg_axi_clk = {
1789 .hwcg_reg = 0x0018,
1790 .hwcg_bit = 11,
1791 .halt_reg = 0x01d8,
1792 .halt_bit = 4,
1793 .clkr = {
1794 .enable_reg = 0x0018,
1795 .enable_mask = BIT(21),
1796 .hw.init = &(struct clk_init_data){
1797 .name = "ijpeg_axi_clk",
1798 .ops = &clk_branch_ops,
1799 },
1800 },
1801 };
1802
1803 static struct clk_branch mmss_imem_axi_clk = {
1804 .hwcg_reg = 0x0018,
1805 .hwcg_bit = 15,
1806 .halt_reg = 0x01d8,
1807 .halt_bit = 7,
1808 .clkr = {
1809 .enable_reg = 0x0018,
1810 .enable_mask = BIT(22),
1811 .hw.init = &(struct clk_init_data){
1812 .name = "mmss_imem_axi_clk",
1813 .ops = &clk_branch_ops,
1814 },
1815 },
1816 };
1817
1818 static struct clk_branch jpegd_axi_clk = {
1819 .halt_reg = 0x01d8,
1820 .halt_bit = 5,
1821 .clkr = {
1822 .enable_reg = 0x0018,
1823 .enable_mask = BIT(25),
1824 .hw.init = &(struct clk_init_data){
1825 .name = "jpegd_axi_clk",
1826 .ops = &clk_branch_ops,
1827 },
1828 },
1829 };
1830
1831 static struct clk_branch vcodec_axi_b_clk = {
1832 .hwcg_reg = 0x0114,
1833 .hwcg_bit = 22,
1834 .halt_reg = 0x01e8,
1835 .halt_bit = 25,
1836 .clkr = {
1837 .enable_reg = 0x0114,
1838 .enable_mask = BIT(23),
1839 .hw.init = &(struct clk_init_data){
1840 .name = "vcodec_axi_b_clk",
1841 .ops = &clk_branch_ops,
1842 },
1843 },
1844 };
1845
1846 static struct clk_branch vcodec_axi_a_clk = {
1847 .hwcg_reg = 0x0114,
1848 .hwcg_bit = 24,
1849 .halt_reg = 0x01e8,
1850 .halt_bit = 26,
1851 .clkr = {
1852 .enable_reg = 0x0114,
1853 .enable_mask = BIT(25),
1854 .hw.init = &(struct clk_init_data){
1855 .name = "vcodec_axi_a_clk",
1856 .ops = &clk_branch_ops,
1857 },
1858 },
1859 };
1860
1861 static struct clk_branch vcodec_axi_clk = {
1862 .hwcg_reg = 0x0018,
1863 .hwcg_bit = 13,
1864 .halt_reg = 0x01d8,
1865 .halt_bit = 3,
1866 .clkr = {
1867 .enable_reg = 0x0018,
1868 .enable_mask = BIT(19),
1869 .hw.init = &(struct clk_init_data){
1870 .name = "vcodec_axi_clk",
1871 .ops = &clk_branch_ops,
1872 },
1873 },
1874 };
1875
1876 static struct clk_branch vfe_axi_clk = {
1877 .halt_reg = 0x01d8,
1878 .halt_bit = 0,
1879 .clkr = {
1880 .enable_reg = 0x0018,
1881 .enable_mask = BIT(18),
1882 .hw.init = &(struct clk_init_data){
1883 .name = "vfe_axi_clk",
1884 .ops = &clk_branch_ops,
1885 },
1886 },
1887 };
1888
1889 static struct clk_branch mdp_axi_clk = {
1890 .hwcg_reg = 0x0018,
1891 .hwcg_bit = 16,
1892 .halt_reg = 0x01d8,
1893 .halt_bit = 8,
1894 .clkr = {
1895 .enable_reg = 0x0018,
1896 .enable_mask = BIT(23),
1897 .hw.init = &(struct clk_init_data){
1898 .name = "mdp_axi_clk",
1899 .ops = &clk_branch_ops,
1900 },
1901 },
1902 };
1903
1904 static struct clk_branch rot_axi_clk = {
1905 .hwcg_reg = 0x0020,
1906 .hwcg_bit = 25,
1907 .halt_reg = 0x01d8,
1908 .halt_bit = 2,
1909 .clkr = {
1910 .enable_reg = 0x0020,
1911 .enable_mask = BIT(24),
1912 .hw.init = &(struct clk_init_data){
1913 .name = "rot_axi_clk",
1914 .ops = &clk_branch_ops,
1915 },
1916 },
1917 };
1918
1919 static struct clk_branch vcap_axi_clk = {
1920 .halt_reg = 0x0240,
1921 .halt_bit = 20,
1922 .hwcg_reg = 0x0244,
1923 .hwcg_bit = 11,
1924 .clkr = {
1925 .enable_reg = 0x0244,
1926 .enable_mask = BIT(12),
1927 .hw.init = &(struct clk_init_data){
1928 .name = "vcap_axi_clk",
1929 .ops = &clk_branch_ops,
1930 },
1931 },
1932 };
1933
1934 static struct clk_branch vpe_axi_clk = {
1935 .hwcg_reg = 0x0020,
1936 .hwcg_bit = 27,
1937 .halt_reg = 0x01d8,
1938 .halt_bit = 1,
1939 .clkr = {
1940 .enable_reg = 0x0020,
1941 .enable_mask = BIT(26),
1942 .hw.init = &(struct clk_init_data){
1943 .name = "vpe_axi_clk",
1944 .ops = &clk_branch_ops,
1945 },
1946 },
1947 };
1948
1949 static struct clk_branch gfx3d_axi_clk = {
1950 .hwcg_reg = 0x0244,
1951 .hwcg_bit = 24,
1952 .halt_reg = 0x0240,
1953 .halt_bit = 30,
1954 .clkr = {
1955 .enable_reg = 0x0244,
1956 .enable_mask = BIT(25),
1957 .hw.init = &(struct clk_init_data){
1958 .name = "gfx3d_axi_clk",
1959 .ops = &clk_branch_ops,
1960 },
1961 },
1962 };
1963
1964 static struct clk_branch amp_ahb_clk = {
1965 .halt_reg = 0x01dc,
1966 .halt_bit = 18,
1967 .clkr = {
1968 .enable_reg = 0x0008,
1969 .enable_mask = BIT(24),
1970 .hw.init = &(struct clk_init_data){
1971 .name = "amp_ahb_clk",
1972 .ops = &clk_branch_ops,
1973 },
1974 },
1975 };
1976
1977 static struct clk_branch csi_ahb_clk = {
1978 .halt_reg = 0x01dc,
1979 .halt_bit = 16,
1980 .clkr = {
1981 .enable_reg = 0x0008,
1982 .enable_mask = BIT(7),
1983 .hw.init = &(struct clk_init_data){
1984 .name = "csi_ahb_clk",
1985 .ops = &clk_branch_ops,
1986 },
1987 },
1988 };
1989
1990 static struct clk_branch dsi_m_ahb_clk = {
1991 .halt_reg = 0x01dc,
1992 .halt_bit = 19,
1993 .clkr = {
1994 .enable_reg = 0x0008,
1995 .enable_mask = BIT(9),
1996 .hw.init = &(struct clk_init_data){
1997 .name = "dsi_m_ahb_clk",
1998 .ops = &clk_branch_ops,
1999 },
2000 },
2001 };
2002
2003 static struct clk_branch dsi_s_ahb_clk = {
2004 .hwcg_reg = 0x0038,
2005 .hwcg_bit = 20,
2006 .halt_reg = 0x01dc,
2007 .halt_bit = 21,
2008 .clkr = {
2009 .enable_reg = 0x0008,
2010 .enable_mask = BIT(18),
2011 .hw.init = &(struct clk_init_data){
2012 .name = "dsi_s_ahb_clk",
2013 .ops = &clk_branch_ops,
2014 },
2015 },
2016 };
2017
2018 static struct clk_branch dsi2_m_ahb_clk = {
2019 .halt_reg = 0x01d8,
2020 .halt_bit = 18,
2021 .clkr = {
2022 .enable_reg = 0x0008,
2023 .enable_mask = BIT(17),
2024 .hw.init = &(struct clk_init_data){
2025 .name = "dsi2_m_ahb_clk",
2026 .ops = &clk_branch_ops,
2027 },
2028 },
2029 };
2030
2031 static struct clk_branch dsi2_s_ahb_clk = {
2032 .hwcg_reg = 0x0038,
2033 .hwcg_bit = 15,
2034 .halt_reg = 0x01dc,
2035 .halt_bit = 20,
2036 .clkr = {
2037 .enable_reg = 0x0008,
2038 .enable_mask = BIT(22),
2039 .hw.init = &(struct clk_init_data){
2040 .name = "dsi2_s_ahb_clk",
2041 .ops = &clk_branch_ops,
2042 },
2043 },
2044 };
2045
2046 static struct clk_rcg dsi1_src = {
2047 .ns_reg = 0x0054,
2048 .md_reg = 0x0050,
2049 .mn = {
2050 .mnctr_en_bit = 5,
2051 .mnctr_reset_bit = 7,
2052 .mnctr_mode_shift = 6,
2053 .n_val_shift = 24,
2054 .m_val_shift = 8,
2055 .width = 8,
2056 },
2057 .p = {
2058 .pre_div_shift = 14,
2059 .pre_div_width = 2,
2060 },
2061 .s = {
2062 .src_sel_shift = 0,
2063 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2064 },
2065 .clkr = {
2066 .enable_reg = 0x004c,
2067 .enable_mask = BIT(2),
2068 .hw.init = &(struct clk_init_data){
2069 .name = "dsi1_src",
2070 .parent_names = mmcc_pxo_dsi2_dsi1,
2071 .num_parents = 3,
2072 .ops = &clk_rcg_bypass2_ops,
2073 .flags = CLK_SET_RATE_PARENT,
2074 },
2075 },
2076 };
2077
2078 static struct clk_branch dsi1_clk = {
2079 .halt_reg = 0x01d0,
2080 .halt_bit = 2,
2081 .clkr = {
2082 .enable_reg = 0x004c,
2083 .enable_mask = BIT(0),
2084 .hw.init = &(struct clk_init_data){
2085 .name = "dsi1_clk",
2086 .parent_names = (const char *[]){ "dsi1_src" },
2087 .num_parents = 1,
2088 .ops = &clk_branch_ops,
2089 .flags = CLK_SET_RATE_PARENT,
2090 },
2091 },
2092 };
2093
2094 static struct clk_rcg dsi2_src = {
2095 .ns_reg = 0x012c,
2096 .md_reg = 0x00a8,
2097 .mn = {
2098 .mnctr_en_bit = 5,
2099 .mnctr_reset_bit = 7,
2100 .mnctr_mode_shift = 6,
2101 .n_val_shift = 24,
2102 .m_val_shift = 8,
2103 .width = 8,
2104 },
2105 .p = {
2106 .pre_div_shift = 14,
2107 .pre_div_width = 2,
2108 },
2109 .s = {
2110 .src_sel_shift = 0,
2111 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2112 },
2113 .clkr = {
2114 .enable_reg = 0x003c,
2115 .enable_mask = BIT(2),
2116 .hw.init = &(struct clk_init_data){
2117 .name = "dsi2_src",
2118 .parent_names = mmcc_pxo_dsi2_dsi1,
2119 .num_parents = 3,
2120 .ops = &clk_rcg_bypass2_ops,
2121 .flags = CLK_SET_RATE_PARENT,
2122 },
2123 },
2124 };
2125
2126 static struct clk_branch dsi2_clk = {
2127 .halt_reg = 0x01d0,
2128 .halt_bit = 20,
2129 .clkr = {
2130 .enable_reg = 0x003c,
2131 .enable_mask = BIT(0),
2132 .hw.init = &(struct clk_init_data){
2133 .name = "dsi2_clk",
2134 .parent_names = (const char *[]){ "dsi2_src" },
2135 .num_parents = 1,
2136 .ops = &clk_branch_ops,
2137 .flags = CLK_SET_RATE_PARENT,
2138 },
2139 },
2140 };
2141
2142 static struct clk_rcg dsi1_byte_src = {
2143 .ns_reg = 0x00b0,
2144 .p = {
2145 .pre_div_shift = 12,
2146 .pre_div_width = 4,
2147 },
2148 .s = {
2149 .src_sel_shift = 0,
2150 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2151 },
2152 .clkr = {
2153 .enable_reg = 0x0090,
2154 .enable_mask = BIT(2),
2155 .hw.init = &(struct clk_init_data){
2156 .name = "dsi1_byte_src",
2157 .parent_names = mmcc_pxo_dsi1_dsi2_byte,
2158 .num_parents = 3,
2159 .ops = &clk_rcg_bypass2_ops,
2160 .flags = CLK_SET_RATE_PARENT,
2161 },
2162 },
2163 };
2164
2165 static struct clk_branch dsi1_byte_clk = {
2166 .halt_reg = 0x01cc,
2167 .halt_bit = 21,
2168 .clkr = {
2169 .enable_reg = 0x0090,
2170 .enable_mask = BIT(0),
2171 .hw.init = &(struct clk_init_data){
2172 .name = "dsi1_byte_clk",
2173 .parent_names = (const char *[]){ "dsi1_byte_src" },
2174 .num_parents = 1,
2175 .ops = &clk_branch_ops,
2176 .flags = CLK_SET_RATE_PARENT,
2177 },
2178 },
2179 };
2180
2181 static struct clk_rcg dsi2_byte_src = {
2182 .ns_reg = 0x012c,
2183 .p = {
2184 .pre_div_shift = 12,
2185 .pre_div_width = 4,
2186 },
2187 .s = {
2188 .src_sel_shift = 0,
2189 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2190 },
2191 .clkr = {
2192 .enable_reg = 0x0130,
2193 .enable_mask = BIT(2),
2194 .hw.init = &(struct clk_init_data){
2195 .name = "dsi2_byte_src",
2196 .parent_names = mmcc_pxo_dsi1_dsi2_byte,
2197 .num_parents = 3,
2198 .ops = &clk_rcg_bypass2_ops,
2199 .flags = CLK_SET_RATE_PARENT,
2200 },
2201 },
2202 };
2203
2204 static struct clk_branch dsi2_byte_clk = {
2205 .halt_reg = 0x01cc,
2206 .halt_bit = 20,
2207 .clkr = {
2208 .enable_reg = 0x00b4,
2209 .enable_mask = BIT(0),
2210 .hw.init = &(struct clk_init_data){
2211 .name = "dsi2_byte_clk",
2212 .parent_names = (const char *[]){ "dsi2_byte_src" },
2213 .num_parents = 1,
2214 .ops = &clk_branch_ops,
2215 .flags = CLK_SET_RATE_PARENT,
2216 },
2217 },
2218 };
2219
2220 static struct clk_rcg dsi1_esc_src = {
2221 .ns_reg = 0x0011c,
2222 .p = {
2223 .pre_div_shift = 12,
2224 .pre_div_width = 4,
2225 },
2226 .s = {
2227 .src_sel_shift = 0,
2228 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2229 },
2230 .clkr = {
2231 .enable_reg = 0x00cc,
2232 .enable_mask = BIT(2),
2233 .hw.init = &(struct clk_init_data){
2234 .name = "dsi1_esc_src",
2235 .parent_names = mmcc_pxo_dsi1_dsi2_byte,
2236 .num_parents = 3,
2237 .ops = &clk_rcg_esc_ops,
2238 },
2239 },
2240 };
2241
2242 static struct clk_branch dsi1_esc_clk = {
2243 .halt_reg = 0x01e8,
2244 .halt_bit = 1,
2245 .clkr = {
2246 .enable_reg = 0x00cc,
2247 .enable_mask = BIT(0),
2248 .hw.init = &(struct clk_init_data){
2249 .name = "dsi1_esc_clk",
2250 .parent_names = (const char *[]){ "dsi1_esc_src" },
2251 .num_parents = 1,
2252 .ops = &clk_branch_ops,
2253 .flags = CLK_SET_RATE_PARENT,
2254 },
2255 },
2256 };
2257
2258 static struct clk_rcg dsi2_esc_src = {
2259 .ns_reg = 0x0150,
2260 .p = {
2261 .pre_div_shift = 12,
2262 .pre_div_width = 4,
2263 },
2264 .s = {
2265 .src_sel_shift = 0,
2266 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2267 },
2268 .clkr = {
2269 .enable_reg = 0x013c,
2270 .enable_mask = BIT(2),
2271 .hw.init = &(struct clk_init_data){
2272 .name = "dsi2_esc_src",
2273 .parent_names = mmcc_pxo_dsi1_dsi2_byte,
2274 .num_parents = 3,
2275 .ops = &clk_rcg_esc_ops,
2276 },
2277 },
2278 };
2279
2280 static struct clk_branch dsi2_esc_clk = {
2281 .halt_reg = 0x01e8,
2282 .halt_bit = 3,
2283 .clkr = {
2284 .enable_reg = 0x013c,
2285 .enable_mask = BIT(0),
2286 .hw.init = &(struct clk_init_data){
2287 .name = "dsi2_esc_clk",
2288 .parent_names = (const char *[]){ "dsi2_esc_src" },
2289 .num_parents = 1,
2290 .ops = &clk_branch_ops,
2291 .flags = CLK_SET_RATE_PARENT,
2292 },
2293 },
2294 };
2295
2296 static struct clk_rcg dsi1_pixel_src = {
2297 .ns_reg = 0x0138,
2298 .md_reg = 0x0134,
2299 .mn = {
2300 .mnctr_en_bit = 5,
2301 .mnctr_reset_bit = 7,
2302 .mnctr_mode_shift = 6,
2303 .n_val_shift = 16,
2304 .m_val_shift = 8,
2305 .width = 8,
2306 },
2307 .p = {
2308 .pre_div_shift = 12,
2309 .pre_div_width = 4,
2310 },
2311 .s = {
2312 .src_sel_shift = 0,
2313 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2314 },
2315 .clkr = {
2316 .enable_reg = 0x0130,
2317 .enable_mask = BIT(2),
2318 .hw.init = &(struct clk_init_data){
2319 .name = "dsi1_pixel_src",
2320 .parent_names = mmcc_pxo_dsi2_dsi1,
2321 .num_parents = 3,
2322 .ops = &clk_rcg_pixel_ops,
2323 },
2324 },
2325 };
2326
2327 static struct clk_branch dsi1_pixel_clk = {
2328 .halt_reg = 0x01d0,
2329 .halt_bit = 6,
2330 .clkr = {
2331 .enable_reg = 0x0130,
2332 .enable_mask = BIT(0),
2333 .hw.init = &(struct clk_init_data){
2334 .name = "mdp_pclk1_clk",
2335 .parent_names = (const char *[]){ "dsi1_pixel_src" },
2336 .num_parents = 1,
2337 .ops = &clk_branch_ops,
2338 .flags = CLK_SET_RATE_PARENT,
2339 },
2340 },
2341 };
2342
2343 static struct clk_rcg dsi2_pixel_src = {
2344 .ns_reg = 0x00e4,
2345 .md_reg = 0x00b8,
2346 .mn = {
2347 .mnctr_en_bit = 5,
2348 .mnctr_reset_bit = 7,
2349 .mnctr_mode_shift = 6,
2350 .n_val_shift = 16,
2351 .m_val_shift = 8,
2352 .width = 8,
2353 },
2354 .p = {
2355 .pre_div_shift = 12,
2356 .pre_div_width = 4,
2357 },
2358 .s = {
2359 .src_sel_shift = 0,
2360 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2361 },
2362 .clkr = {
2363 .enable_reg = 0x0094,
2364 .enable_mask = BIT(2),
2365 .hw.init = &(struct clk_init_data){
2366 .name = "dsi2_pixel_src",
2367 .parent_names = mmcc_pxo_dsi2_dsi1,
2368 .num_parents = 3,
2369 .ops = &clk_rcg_pixel_ops,
2370 },
2371 },
2372 };
2373
2374 static struct clk_branch dsi2_pixel_clk = {
2375 .halt_reg = 0x01d0,
2376 .halt_bit = 19,
2377 .clkr = {
2378 .enable_reg = 0x0094,
2379 .enable_mask = BIT(0),
2380 .hw.init = &(struct clk_init_data){
2381 .name = "mdp_pclk2_clk",
2382 .parent_names = (const char *[]){ "dsi2_pixel_src" },
2383 .num_parents = 1,
2384 .ops = &clk_branch_ops,
2385 .flags = CLK_SET_RATE_PARENT,
2386 },
2387 },
2388 };
2389
2390 static struct clk_branch gfx2d0_ahb_clk = {
2391 .hwcg_reg = 0x0038,
2392 .hwcg_bit = 28,
2393 .halt_reg = 0x01dc,
2394 .halt_bit = 2,
2395 .clkr = {
2396 .enable_reg = 0x0008,
2397 .enable_mask = BIT(19),
2398 .hw.init = &(struct clk_init_data){
2399 .name = "gfx2d0_ahb_clk",
2400 .ops = &clk_branch_ops,
2401 },
2402 },
2403 };
2404
2405 static struct clk_branch gfx2d1_ahb_clk = {
2406 .hwcg_reg = 0x0038,
2407 .hwcg_bit = 29,
2408 .halt_reg = 0x01dc,
2409 .halt_bit = 3,
2410 .clkr = {
2411 .enable_reg = 0x0008,
2412 .enable_mask = BIT(2),
2413 .hw.init = &(struct clk_init_data){
2414 .name = "gfx2d1_ahb_clk",
2415 .ops = &clk_branch_ops,
2416 },
2417 },
2418 };
2419
2420 static struct clk_branch gfx3d_ahb_clk = {
2421 .hwcg_reg = 0x0038,
2422 .hwcg_bit = 27,
2423 .halt_reg = 0x01dc,
2424 .halt_bit = 4,
2425 .clkr = {
2426 .enable_reg = 0x0008,
2427 .enable_mask = BIT(3),
2428 .hw.init = &(struct clk_init_data){
2429 .name = "gfx3d_ahb_clk",
2430 .ops = &clk_branch_ops,
2431 },
2432 },
2433 };
2434
2435 static struct clk_branch hdmi_m_ahb_clk = {
2436 .hwcg_reg = 0x0038,
2437 .hwcg_bit = 21,
2438 .halt_reg = 0x01dc,
2439 .halt_bit = 5,
2440 .clkr = {
2441 .enable_reg = 0x0008,
2442 .enable_mask = BIT(14),
2443 .hw.init = &(struct clk_init_data){
2444 .name = "hdmi_m_ahb_clk",
2445 .ops = &clk_branch_ops,
2446 },
2447 },
2448 };
2449
2450 static struct clk_branch hdmi_s_ahb_clk = {
2451 .hwcg_reg = 0x0038,
2452 .hwcg_bit = 22,
2453 .halt_reg = 0x01dc,
2454 .halt_bit = 6,
2455 .clkr = {
2456 .enable_reg = 0x0008,
2457 .enable_mask = BIT(4),
2458 .hw.init = &(struct clk_init_data){
2459 .name = "hdmi_s_ahb_clk",
2460 .ops = &clk_branch_ops,
2461 },
2462 },
2463 };
2464
2465 static struct clk_branch ijpeg_ahb_clk = {
2466 .halt_reg = 0x01dc,
2467 .halt_bit = 9,
2468 .clkr = {
2469 .enable_reg = 0x0008,
2470 .enable_mask = BIT(5),
2471 .hw.init = &(struct clk_init_data){
2472 .name = "ijpeg_ahb_clk",
2473 .ops = &clk_branch_ops,
2474 },
2475 },
2476 };
2477
2478 static struct clk_branch mmss_imem_ahb_clk = {
2479 .hwcg_reg = 0x0038,
2480 .hwcg_bit = 12,
2481 .halt_reg = 0x01dc,
2482 .halt_bit = 10,
2483 .clkr = {
2484 .enable_reg = 0x0008,
2485 .enable_mask = BIT(6),
2486 .hw.init = &(struct clk_init_data){
2487 .name = "mmss_imem_ahb_clk",
2488 .ops = &clk_branch_ops,
2489 },
2490 },
2491 };
2492
2493 static struct clk_branch jpegd_ahb_clk = {
2494 .halt_reg = 0x01dc,
2495 .halt_bit = 7,
2496 .clkr = {
2497 .enable_reg = 0x0008,
2498 .enable_mask = BIT(21),
2499 .hw.init = &(struct clk_init_data){
2500 .name = "jpegd_ahb_clk",
2501 .ops = &clk_branch_ops,
2502 },
2503 },
2504 };
2505
2506 static struct clk_branch mdp_ahb_clk = {
2507 .halt_reg = 0x01dc,
2508 .halt_bit = 11,
2509 .clkr = {
2510 .enable_reg = 0x0008,
2511 .enable_mask = BIT(10),
2512 .hw.init = &(struct clk_init_data){
2513 .name = "mdp_ahb_clk",
2514 .ops = &clk_branch_ops,
2515 },
2516 },
2517 };
2518
2519 static struct clk_branch rot_ahb_clk = {
2520 .halt_reg = 0x01dc,
2521 .halt_bit = 13,
2522 .clkr = {
2523 .enable_reg = 0x0008,
2524 .enable_mask = BIT(12),
2525 .hw.init = &(struct clk_init_data){
2526 .name = "rot_ahb_clk",
2527 .ops = &clk_branch_ops,
2528 },
2529 },
2530 };
2531
2532 static struct clk_branch smmu_ahb_clk = {
2533 .hwcg_reg = 0x0008,
2534 .hwcg_bit = 26,
2535 .halt_reg = 0x01dc,
2536 .halt_bit = 22,
2537 .clkr = {
2538 .enable_reg = 0x0008,
2539 .enable_mask = BIT(15),
2540 .hw.init = &(struct clk_init_data){
2541 .name = "smmu_ahb_clk",
2542 .ops = &clk_branch_ops,
2543 },
2544 },
2545 };
2546
2547 static struct clk_branch tv_enc_ahb_clk = {
2548 .halt_reg = 0x01dc,
2549 .halt_bit = 23,
2550 .clkr = {
2551 .enable_reg = 0x0008,
2552 .enable_mask = BIT(25),
2553 .hw.init = &(struct clk_init_data){
2554 .name = "tv_enc_ahb_clk",
2555 .ops = &clk_branch_ops,
2556 },
2557 },
2558 };
2559
2560 static struct clk_branch vcap_ahb_clk = {
2561 .halt_reg = 0x0240,
2562 .halt_bit = 23,
2563 .clkr = {
2564 .enable_reg = 0x0248,
2565 .enable_mask = BIT(1),
2566 .hw.init = &(struct clk_init_data){
2567 .name = "vcap_ahb_clk",
2568 .ops = &clk_branch_ops,
2569 },
2570 },
2571 };
2572
2573 static struct clk_branch vcodec_ahb_clk = {
2574 .hwcg_reg = 0x0038,
2575 .hwcg_bit = 26,
2576 .halt_reg = 0x01dc,
2577 .halt_bit = 12,
2578 .clkr = {
2579 .enable_reg = 0x0008,
2580 .enable_mask = BIT(11),
2581 .hw.init = &(struct clk_init_data){
2582 .name = "vcodec_ahb_clk",
2583 .ops = &clk_branch_ops,
2584 },
2585 },
2586 };
2587
2588 static struct clk_branch vfe_ahb_clk = {
2589 .halt_reg = 0x01dc,
2590 .halt_bit = 14,
2591 .clkr = {
2592 .enable_reg = 0x0008,
2593 .enable_mask = BIT(13),
2594 .hw.init = &(struct clk_init_data){
2595 .name = "vfe_ahb_clk",
2596 .ops = &clk_branch_ops,
2597 },
2598 },
2599 };
2600
2601 static struct clk_branch vpe_ahb_clk = {
2602 .halt_reg = 0x01dc,
2603 .halt_bit = 15,
2604 .clkr = {
2605 .enable_reg = 0x0008,
2606 .enable_mask = BIT(16),
2607 .hw.init = &(struct clk_init_data){
2608 .name = "vpe_ahb_clk",
2609 .ops = &clk_branch_ops,
2610 },
2611 },
2612 };
2613
2614 static struct clk_regmap *mmcc_msm8960_clks[] = {
2615 [TV_ENC_AHB_CLK] = &tv_enc_ahb_clk.clkr,
2616 [AMP_AHB_CLK] = &_ahb_clk.clkr,
2617 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
2618 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
2619 [GFX2D0_AHB_CLK] = &gfx2d0_ahb_clk.clkr,
2620 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
2621 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
2622 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
2623 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
2624 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
2625 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
2626 [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
2627 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
2628 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
2629 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
2630 [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
2631 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
2632 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
2633 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
2634 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
2635 [GFX2D1_AHB_CLK] = &gfx2d1_ahb_clk.clkr,
2636 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
2637 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
2638 [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
2639 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
2640 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
2641 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
2642 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
2643 [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
2644 [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
2645 [ROT_AXI_CLK] = &rot_axi_clk.clkr,
2646 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
2647 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
2648 [CSI0_SRC] = &csi0_src.clkr,
2649 [CSI0_CLK] = &csi0_clk.clkr,
2650 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
2651 [CSI1_SRC] = &csi1_src.clkr,
2652 [CSI1_CLK] = &csi1_clk.clkr,
2653 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
2654 [CSI2_SRC] = &csi2_src.clkr,
2655 [CSI2_CLK] = &csi2_clk.clkr,
2656 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
2657 [DSI_SRC] = &dsi1_src.clkr,
2658 [DSI_CLK] = &dsi1_clk.clkr,
2659 [CSI_PIX_CLK] = &csi_pix_clk.clkr,
2660 [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
2661 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
2662 [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
2663 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
2664 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
2665 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
2666 [GFX2D0_SRC] = &gfx2d0_src.clkr,
2667 [GFX2D0_CLK] = &gfx2d0_clk.clkr,
2668 [GFX2D1_SRC] = &gfx2d1_src.clkr,
2669 [GFX2D1_CLK] = &gfx2d1_clk.clkr,
2670 [GFX3D_SRC] = &gfx3d_src.clkr,
2671 [GFX3D_CLK] = &gfx3d_clk.clkr,
2672 [IJPEG_SRC] = &ijpeg_src.clkr,
2673 [IJPEG_CLK] = &ijpeg_clk.clkr,
2674 [JPEGD_SRC] = &jpegd_src.clkr,
2675 [JPEGD_CLK] = &jpegd_clk.clkr,
2676 [MDP_SRC] = &mdp_src.clkr,
2677 [MDP_CLK] = &mdp_clk.clkr,
2678 [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
2679 [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr,
2680 [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr,
2681 [DSI2_SRC] = &dsi2_src.clkr,
2682 [DSI2_CLK] = &dsi2_clk.clkr,
2683 [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr,
2684 [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr,
2685 [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr,
2686 [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr,
2687 [DSI1_ESC_SRC] = &dsi1_esc_src.clkr,
2688 [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr,
2689 [DSI2_ESC_SRC] = &dsi2_esc_src.clkr,
2690 [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr,
2691 [ROT_SRC] = &rot_src.clkr,
2692 [ROT_CLK] = &rot_clk.clkr,
2693 [TV_ENC_CLK] = &tv_enc_clk.clkr,
2694 [TV_DAC_CLK] = &tv_dac_clk.clkr,
2695 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
2696 [MDP_TV_CLK] = &mdp_tv_clk.clkr,
2697 [TV_SRC] = &tv_src.clkr,
2698 [VCODEC_SRC] = &vcodec_src.clkr,
2699 [VCODEC_CLK] = &vcodec_clk.clkr,
2700 [VFE_SRC] = &vfe_src.clkr,
2701 [VFE_CLK] = &vfe_clk.clkr,
2702 [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
2703 [VPE_SRC] = &vpe_src.clkr,
2704 [VPE_CLK] = &vpe_clk.clkr,
2705 [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr,
2706 [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr,
2707 [CAMCLK0_SRC] = &camclk0_src.clkr,
2708 [CAMCLK0_CLK] = &camclk0_clk.clkr,
2709 [CAMCLK1_SRC] = &camclk1_src.clkr,
2710 [CAMCLK1_CLK] = &camclk1_clk.clkr,
2711 [CAMCLK2_SRC] = &camclk2_src.clkr,
2712 [CAMCLK2_CLK] = &camclk2_clk.clkr,
2713 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
2714 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
2715 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
2716 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
2717 [PLL2] = &pll2.clkr,
2718 };
2719
2720 static const struct qcom_reset_map mmcc_msm8960_resets[] = {
2721 [VPE_AXI_RESET] = { 0x0208, 15 },
2722 [IJPEG_AXI_RESET] = { 0x0208, 14 },
2723 [MPD_AXI_RESET] = { 0x0208, 13 },
2724 [VFE_AXI_RESET] = { 0x0208, 9 },
2725 [SP_AXI_RESET] = { 0x0208, 8 },
2726 [VCODEC_AXI_RESET] = { 0x0208, 7 },
2727 [ROT_AXI_RESET] = { 0x0208, 6 },
2728 [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
2729 [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
2730 [FAB_S3_AXI_RESET] = { 0x0208, 3 },
2731 [FAB_S2_AXI_RESET] = { 0x0208, 2 },
2732 [FAB_S1_AXI_RESET] = { 0x0208, 1 },
2733 [FAB_S0_AXI_RESET] = { 0x0208 },
2734 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
2735 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
2736 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
2737 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
2738 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
2739 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
2740 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
2741 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
2742 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
2743 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
2744 [SMMU_GFX2D0_AHB_RESET] = { 0x020c, 21 },
2745 [SMMU_GFX2D1_AHB_RESET] = { 0x020c, 20 },
2746 [APU_AHB_RESET] = { 0x020c, 18 },
2747 [CSI_AHB_RESET] = { 0x020c, 17 },
2748 [TV_ENC_AHB_RESET] = { 0x020c, 15 },
2749 [VPE_AHB_RESET] = { 0x020c, 14 },
2750 [FABRIC_AHB_RESET] = { 0x020c, 13 },
2751 [GFX2D0_AHB_RESET] = { 0x020c, 12 },
2752 [GFX2D1_AHB_RESET] = { 0x020c, 11 },
2753 [GFX3D_AHB_RESET] = { 0x020c, 10 },
2754 [HDMI_AHB_RESET] = { 0x020c, 9 },
2755 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
2756 [IJPEG_AHB_RESET] = { 0x020c, 7 },
2757 [DSI_M_AHB_RESET] = { 0x020c, 6 },
2758 [DSI_S_AHB_RESET] = { 0x020c, 5 },
2759 [JPEGD_AHB_RESET] = { 0x020c, 4 },
2760 [MDP_AHB_RESET] = { 0x020c, 3 },
2761 [ROT_AHB_RESET] = { 0x020c, 2 },
2762 [VCODEC_AHB_RESET] = { 0x020c, 1 },
2763 [VFE_AHB_RESET] = { 0x020c, 0 },
2764 [DSI2_M_AHB_RESET] = { 0x0210, 31 },
2765 [DSI2_S_AHB_RESET] = { 0x0210, 30 },
2766 [CSIPHY2_RESET] = { 0x0210, 29 },
2767 [CSI_PIX1_RESET] = { 0x0210, 28 },
2768 [CSIPHY0_RESET] = { 0x0210, 27 },
2769 [CSIPHY1_RESET] = { 0x0210, 26 },
2770 [DSI2_RESET] = { 0x0210, 25 },
2771 [VFE_CSI_RESET] = { 0x0210, 24 },
2772 [MDP_RESET] = { 0x0210, 21 },
2773 [AMP_RESET] = { 0x0210, 20 },
2774 [JPEGD_RESET] = { 0x0210, 19 },
2775 [CSI1_RESET] = { 0x0210, 18 },
2776 [VPE_RESET] = { 0x0210, 17 },
2777 [MMSS_FABRIC_RESET] = { 0x0210, 16 },
2778 [VFE_RESET] = { 0x0210, 15 },
2779 [GFX2D0_RESET] = { 0x0210, 14 },
2780 [GFX2D1_RESET] = { 0x0210, 13 },
2781 [GFX3D_RESET] = { 0x0210, 12 },
2782 [HDMI_RESET] = { 0x0210, 11 },
2783 [MMSS_IMEM_RESET] = { 0x0210, 10 },
2784 [IJPEG_RESET] = { 0x0210, 9 },
2785 [CSI0_RESET] = { 0x0210, 8 },
2786 [DSI_RESET] = { 0x0210, 7 },
2787 [VCODEC_RESET] = { 0x0210, 6 },
2788 [MDP_TV_RESET] = { 0x0210, 4 },
2789 [MDP_VSYNC_RESET] = { 0x0210, 3 },
2790 [ROT_RESET] = { 0x0210, 2 },
2791 [TV_HDMI_RESET] = { 0x0210, 1 },
2792 [TV_ENC_RESET] = { 0x0210 },
2793 [CSI2_RESET] = { 0x0214, 2 },
2794 [CSI_RDI1_RESET] = { 0x0214, 1 },
2795 [CSI_RDI2_RESET] = { 0x0214 },
2796 };
2797
2798 static struct clk_regmap *mmcc_apq8064_clks[] = {
2799 [AMP_AHB_CLK] = &_ahb_clk.clkr,
2800 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
2801 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
2802 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
2803 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
2804 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
2805 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
2806 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
2807 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
2808 [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
2809 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
2810 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
2811 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
2812 [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
2813 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
2814 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
2815 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
2816 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
2817 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
2818 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
2819 [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
2820 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
2821 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
2822 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
2823 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
2824 [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
2825 [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
2826 [ROT_AXI_CLK] = &rot_axi_clk.clkr,
2827 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
2828 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
2829 [CSI0_SRC] = &csi0_src.clkr,
2830 [CSI0_CLK] = &csi0_clk.clkr,
2831 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
2832 [CSI1_SRC] = &csi1_src.clkr,
2833 [CSI1_CLK] = &csi1_clk.clkr,
2834 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
2835 [CSI2_SRC] = &csi2_src.clkr,
2836 [CSI2_CLK] = &csi2_clk.clkr,
2837 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
2838 [DSI_SRC] = &dsi1_src.clkr,
2839 [DSI_CLK] = &dsi1_clk.clkr,
2840 [CSI_PIX_CLK] = &csi_pix_clk.clkr,
2841 [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
2842 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
2843 [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
2844 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
2845 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
2846 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
2847 [GFX3D_SRC] = &gfx3d_src.clkr,
2848 [GFX3D_CLK] = &gfx3d_clk.clkr,
2849 [IJPEG_SRC] = &ijpeg_src.clkr,
2850 [IJPEG_CLK] = &ijpeg_clk.clkr,
2851 [JPEGD_SRC] = &jpegd_src.clkr,
2852 [JPEGD_CLK] = &jpegd_clk.clkr,
2853 [MDP_SRC] = &mdp_src.clkr,
2854 [MDP_CLK] = &mdp_clk.clkr,
2855 [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
2856 [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr,
2857 [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr,
2858 [DSI2_SRC] = &dsi2_src.clkr,
2859 [DSI2_CLK] = &dsi2_clk.clkr,
2860 [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr,
2861 [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr,
2862 [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr,
2863 [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr,
2864 [DSI1_ESC_SRC] = &dsi1_esc_src.clkr,
2865 [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr,
2866 [DSI2_ESC_SRC] = &dsi2_esc_src.clkr,
2867 [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr,
2868 [ROT_SRC] = &rot_src.clkr,
2869 [ROT_CLK] = &rot_clk.clkr,
2870 [TV_DAC_CLK] = &tv_dac_clk.clkr,
2871 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
2872 [MDP_TV_CLK] = &mdp_tv_clk.clkr,
2873 [TV_SRC] = &tv_src.clkr,
2874 [VCODEC_SRC] = &vcodec_src.clkr,
2875 [VCODEC_CLK] = &vcodec_clk.clkr,
2876 [VFE_SRC] = &vfe_src.clkr,
2877 [VFE_CLK] = &vfe_clk.clkr,
2878 [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
2879 [VPE_SRC] = &vpe_src.clkr,
2880 [VPE_CLK] = &vpe_clk.clkr,
2881 [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr,
2882 [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr,
2883 [CAMCLK0_SRC] = &camclk0_src.clkr,
2884 [CAMCLK0_CLK] = &camclk0_clk.clkr,
2885 [CAMCLK1_SRC] = &camclk1_src.clkr,
2886 [CAMCLK1_CLK] = &camclk1_clk.clkr,
2887 [CAMCLK2_SRC] = &camclk2_src.clkr,
2888 [CAMCLK2_CLK] = &camclk2_clk.clkr,
2889 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
2890 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
2891 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
2892 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
2893 [PLL2] = &pll2.clkr,
2894 [RGB_TV_CLK] = &rgb_tv_clk.clkr,
2895 [NPL_TV_CLK] = &npl_tv_clk.clkr,
2896 [VCAP_AHB_CLK] = &vcap_ahb_clk.clkr,
2897 [VCAP_AXI_CLK] = &vcap_axi_clk.clkr,
2898 [VCAP_SRC] = &vcap_src.clkr,
2899 [VCAP_CLK] = &vcap_clk.clkr,
2900 [VCAP_NPL_CLK] = &vcap_npl_clk.clkr,
2901 [PLL15] = &pll15.clkr,
2902 };
2903
2904 static const struct qcom_reset_map mmcc_apq8064_resets[] = {
2905 [GFX3D_AXI_RESET] = { 0x0208, 17 },
2906 [VCAP_AXI_RESET] = { 0x0208, 16 },
2907 [VPE_AXI_RESET] = { 0x0208, 15 },
2908 [IJPEG_AXI_RESET] = { 0x0208, 14 },
2909 [MPD_AXI_RESET] = { 0x0208, 13 },
2910 [VFE_AXI_RESET] = { 0x0208, 9 },
2911 [SP_AXI_RESET] = { 0x0208, 8 },
2912 [VCODEC_AXI_RESET] = { 0x0208, 7 },
2913 [ROT_AXI_RESET] = { 0x0208, 6 },
2914 [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
2915 [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
2916 [FAB_S3_AXI_RESET] = { 0x0208, 3 },
2917 [FAB_S2_AXI_RESET] = { 0x0208, 2 },
2918 [FAB_S1_AXI_RESET] = { 0x0208, 1 },
2919 [FAB_S0_AXI_RESET] = { 0x0208 },
2920 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
2921 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
2922 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
2923 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
2924 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
2925 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
2926 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
2927 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
2928 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
2929 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
2930 [APU_AHB_RESET] = { 0x020c, 18 },
2931 [CSI_AHB_RESET] = { 0x020c, 17 },
2932 [TV_ENC_AHB_RESET] = { 0x020c, 15 },
2933 [VPE_AHB_RESET] = { 0x020c, 14 },
2934 [FABRIC_AHB_RESET] = { 0x020c, 13 },
2935 [GFX3D_AHB_RESET] = { 0x020c, 10 },
2936 [HDMI_AHB_RESET] = { 0x020c, 9 },
2937 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
2938 [IJPEG_AHB_RESET] = { 0x020c, 7 },
2939 [DSI_M_AHB_RESET] = { 0x020c, 6 },
2940 [DSI_S_AHB_RESET] = { 0x020c, 5 },
2941 [JPEGD_AHB_RESET] = { 0x020c, 4 },
2942 [MDP_AHB_RESET] = { 0x020c, 3 },
2943 [ROT_AHB_RESET] = { 0x020c, 2 },
2944 [VCODEC_AHB_RESET] = { 0x020c, 1 },
2945 [VFE_AHB_RESET] = { 0x020c, 0 },
2946 [SMMU_VCAP_AHB_RESET] = { 0x0200, 3 },
2947 [VCAP_AHB_RESET] = { 0x0200, 2 },
2948 [DSI2_M_AHB_RESET] = { 0x0200, 1 },
2949 [DSI2_S_AHB_RESET] = { 0x0200, 0 },
2950 [CSIPHY2_RESET] = { 0x0210, 31 },
2951 [CSI_PIX1_RESET] = { 0x0210, 30 },
2952 [CSIPHY0_RESET] = { 0x0210, 29 },
2953 [CSIPHY1_RESET] = { 0x0210, 28 },
2954 [CSI_RDI_RESET] = { 0x0210, 27 },
2955 [CSI_PIX_RESET] = { 0x0210, 26 },
2956 [DSI2_RESET] = { 0x0210, 25 },
2957 [VFE_CSI_RESET] = { 0x0210, 24 },
2958 [MDP_RESET] = { 0x0210, 21 },
2959 [AMP_RESET] = { 0x0210, 20 },
2960 [JPEGD_RESET] = { 0x0210, 19 },
2961 [CSI1_RESET] = { 0x0210, 18 },
2962 [VPE_RESET] = { 0x0210, 17 },
2963 [MMSS_FABRIC_RESET] = { 0x0210, 16 },
2964 [VFE_RESET] = { 0x0210, 15 },
2965 [GFX3D_RESET] = { 0x0210, 12 },
2966 [HDMI_RESET] = { 0x0210, 11 },
2967 [MMSS_IMEM_RESET] = { 0x0210, 10 },
2968 [IJPEG_RESET] = { 0x0210, 9 },
2969 [CSI0_RESET] = { 0x0210, 8 },
2970 [DSI_RESET] = { 0x0210, 7 },
2971 [VCODEC_RESET] = { 0x0210, 6 },
2972 [MDP_TV_RESET] = { 0x0210, 4 },
2973 [MDP_VSYNC_RESET] = { 0x0210, 3 },
2974 [ROT_RESET] = { 0x0210, 2 },
2975 [TV_HDMI_RESET] = { 0x0210, 1 },
2976 [VCAP_NPL_RESET] = { 0x0214, 4 },
2977 [VCAP_RESET] = { 0x0214, 3 },
2978 [CSI2_RESET] = { 0x0214, 2 },
2979 [CSI_RDI1_RESET] = { 0x0214, 1 },
2980 [CSI_RDI2_RESET] = { 0x0214 },
2981 };
2982
2983 static const struct regmap_config mmcc_msm8960_regmap_config = {
2984 .reg_bits = 32,
2985 .reg_stride = 4,
2986 .val_bits = 32,
2987 .max_register = 0x334,
2988 .fast_io = true,
2989 };
2990
2991 static const struct regmap_config mmcc_apq8064_regmap_config = {
2992 .reg_bits = 32,
2993 .reg_stride = 4,
2994 .val_bits = 32,
2995 .max_register = 0x350,
2996 .fast_io = true,
2997 };
2998
2999 static const struct qcom_cc_desc mmcc_msm8960_desc = {
3000 .config = &mmcc_msm8960_regmap_config,
3001 .clks = mmcc_msm8960_clks,
3002 .num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
3003 .resets = mmcc_msm8960_resets,
3004 .num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
3005 };
3006
3007 static const struct qcom_cc_desc mmcc_apq8064_desc = {
3008 .config = &mmcc_apq8064_regmap_config,
3009 .clks = mmcc_apq8064_clks,
3010 .num_clks = ARRAY_SIZE(mmcc_apq8064_clks),
3011 .resets = mmcc_apq8064_resets,
3012 .num_resets = ARRAY_SIZE(mmcc_apq8064_resets),
3013 };
3014
3015 static const struct of_device_id mmcc_msm8960_match_table[] = {
3016 { .compatible = "qcom,mmcc-msm8960", .data = &mmcc_msm8960_desc },
3017 { .compatible = "qcom,mmcc-apq8064", .data = &mmcc_apq8064_desc },
3018 { }
3019 };
3020 MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
3021
3022 static int mmcc_msm8960_probe(struct platform_device *pdev)
3023 {
3024 const struct of_device_id *match;
3025 struct regmap *regmap;
3026 bool is_8064;
3027 struct device *dev = &pdev->dev;
3028
3029 match = of_match_device(mmcc_msm8960_match_table, dev);
3030 if (!match)
3031 return -EINVAL;
3032
3033 is_8064 = of_device_is_compatible(dev->of_node, "qcom,mmcc-apq8064");
3034 if (is_8064) {
3035 gfx3d_src.freq_tbl = clk_tbl_gfx3d_8064;
3036 gfx3d_src.clkr.hw.init = &gfx3d_8064_init;
3037 gfx3d_src.s[0].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
3038 gfx3d_src.s[1].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
3039 }
3040
3041 regmap = qcom_cc_map(pdev, match->data);
3042 if (IS_ERR(regmap))
3043 return PTR_ERR(regmap);
3044
3045 clk_pll_configure_sr(&pll15, regmap, &pll15_config, false);
3046
3047 return qcom_cc_really_probe(pdev, match->data, regmap);
3048 }
3049
3050 static struct platform_driver mmcc_msm8960_driver = {
3051 .probe = mmcc_msm8960_probe,
3052 .driver = {
3053 .name = "mmcc-msm8960",
3054 .of_match_table = mmcc_msm8960_match_table,
3055 },
3056 };
3057
3058 module_platform_driver(mmcc_msm8960_driver);
3059
3060 MODULE_DESCRIPTION("QCOM MMCC MSM8960 Driver");
3061 MODULE_LICENSE("GPL v2");
3062 MODULE_ALIAS("platform:mmcc-msm8960");