1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (c) 2013, The Linux Foundation. All rights reserved. 4 */ 5 6 #include <linux/kernel.h> 7 #include <linux/bitops.h> 8 #include <linux/err.h> 9 #include <linux/delay.h> 10 #include <linux/platform_device.h> 11 #include <linux/property.h> 12 #include <linux/module.h> 13 #include <linux/of.h> 14 #include <linux/clk.h> 15 #include <linux/clk-provider.h> 16 #include <linux/regmap.h> 17 #include <linux/reset-controller.h> 18 19 #include <dt-bindings/clock/qcom,mmcc-msm8960.h> 20 #include <dt-bindings/reset/qcom,mmcc-msm8960.h> 21 22 #include "common.h" 23 #include "clk-regmap.h" 24 #include "clk-pll.h" 25 #include "clk-rcg.h" 26 #include "clk-branch.h" 27 #include "reset.h" 28 29 enum { 30 P_PXO, 31 P_PLL8, 32 P_PLL2, 33 P_PLL3, 34 P_PLL15, 35 P_HDMI_PLL, 36 P_DSI1_PLL_DSICLK, 37 P_DSI2_PLL_DSICLK, 38 P_DSI1_PLL_BYTECLK, 39 P_DSI2_PLL_BYTECLK, 40 P_LVDS_PLL, 41 }; 42 43 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n } 44 45 static struct clk_pll pll2 = { 46 .l_reg = 0x320, 47 .m_reg = 0x324, 48 .n_reg = 0x328, 49 .config_reg = 0x32c, 50 .mode_reg = 0x31c, 51 .status_reg = 0x334, 52 .status_bit = 16, 53 .clkr.hw.init = &(struct clk_init_data){ 54 .name = "pll2", 55 .parent_data = (const struct clk_parent_data[]){ 56 { .fw_name = "pxo", .name = "pxo_board" }, 57 }, 58 .num_parents = 1, 59 .ops = &clk_pll_ops, 60 }, 61 }; 62 63 static struct clk_pll pll15 = { 64 .l_reg = 0x33c, 65 .m_reg = 0x340, 66 .n_reg = 0x344, 67 .config_reg = 0x348, 68 .mode_reg = 0x338, 69 .status_reg = 0x350, 70 .status_bit = 16, 71 .clkr.hw.init = &(struct clk_init_data){ 72 .name = "pll15", 73 .parent_data = (const struct clk_parent_data[]){ 74 { .fw_name = "pxo", .name = "pxo_board" }, 75 }, 76 .num_parents = 1, 77 .ops = &clk_pll_ops, 78 }, 79 }; 80 81 static const struct pll_config pll15_config = { 82 .l = 33, 83 .m = 1, 84 .n = 3, 85 .vco_val = 0x2 << 16, 86 .vco_mask = 0x3 << 16, 87 .pre_div_val = 0x0, 88 .pre_div_mask = BIT(19), 89 .post_div_val = 0x0, 90 .post_div_mask = 0x3 << 20, 91 .mn_ena_mask = BIT(22), 92 .main_output_mask = BIT(23), 93 }; 94 95 static const struct parent_map mmcc_pxo_pll8_pll2_map[] = { 96 { P_PXO, 0 }, 97 { P_PLL8, 2 }, 98 { P_PLL2, 1 } 99 }; 100 101 static const struct clk_parent_data mmcc_pxo_pll8_pll2[] = { 102 { .fw_name = "pxo", .name = "pxo_board" }, 103 { .fw_name = "pll8_vote", .name = "pll8_vote" }, 104 { .hw = &pll2.clkr.hw }, 105 }; 106 107 static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = { 108 { P_PXO, 0 }, 109 { P_PLL8, 2 }, 110 { P_PLL2, 1 }, 111 { P_PLL3, 3 } 112 }; 113 114 static const struct clk_parent_data mmcc_pxo_pll8_pll2_pll15[] = { 115 { .fw_name = "pxo", .name = "pxo_board" }, 116 { .fw_name = "pll8_vote", .name = "pll8_vote" }, 117 { .hw = &pll2.clkr.hw }, 118 { .hw = &pll15.clkr.hw }, 119 }; 120 121 static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = { 122 { P_PXO, 0 }, 123 { P_PLL8, 2 }, 124 { P_PLL2, 1 }, 125 { P_PLL15, 3 } 126 }; 127 128 static const struct clk_parent_data mmcc_pxo_pll8_pll2_pll3[] = { 129 { .fw_name = "pxo", .name = "pxo_board" }, 130 { .fw_name = "pll8_vote", .name = "pll8_vote" }, 131 { .hw = &pll2.clkr.hw }, 132 { .fw_name = "pll3", .name = "pll3" }, 133 }; 134 135 static const struct parent_map mmcc_pxo_dsi2_dsi1_map[] = { 136 { P_PXO, 0 }, 137 { P_DSI2_PLL_DSICLK, 1 }, 138 { P_DSI1_PLL_DSICLK, 3 }, 139 }; 140 141 static const struct clk_parent_data mmcc_pxo_dsi2_dsi1[] = { 142 { .fw_name = "pxo", .name = "pxo_board" }, 143 { .fw_name = "dsi2pll", .name = "dsi2pll" }, 144 { .fw_name = "dsi1pll", .name = "dsi1pll" }, 145 }; 146 147 static const struct parent_map mmcc_pxo_dsi2_dsi1_lvds_map[] = { 148 { P_PXO, 0 }, 149 { P_DSI2_PLL_DSICLK, 1 }, 150 { P_LVDS_PLL, 2 }, 151 { P_DSI1_PLL_DSICLK, 3 }, 152 }; 153 154 static const struct clk_parent_data mmcc_pxo_dsi2_dsi1_lvds[] = { 155 { .fw_name = "pxo", .name = "pxo_board" }, 156 { .fw_name = "dsi2pll", .name = "dsi2pll" }, 157 { .fw_name = "lvdspll", .name = "mpd4_lvds_pll" }, 158 { .fw_name = "dsi1pll", .name = "dsi1pll" }, 159 }; 160 161 static const struct parent_map mmcc_pxo_dsi1_dsi2_byte_map[] = { 162 { P_PXO, 0 }, 163 { P_DSI1_PLL_BYTECLK, 1 }, 164 { P_DSI2_PLL_BYTECLK, 2 }, 165 }; 166 167 static const struct clk_parent_data mmcc_pxo_dsi1_dsi2_byte[] = { 168 { .fw_name = "pxo", .name = "pxo_board" }, 169 { .fw_name = "dsi1pllbyte", .name = "dsi1pllbyte" }, 170 { .fw_name = "dsi2pllbyte", .name = "dsi2pllbyte" }, 171 }; 172 173 static const struct freq_tbl clk_tbl_cam[] = { 174 { 6000000, P_PLL8, 4, 1, 16 }, 175 { 8000000, P_PLL8, 4, 1, 12 }, 176 { 12000000, P_PLL8, 4, 1, 8 }, 177 { 16000000, P_PLL8, 4, 1, 6 }, 178 { 19200000, P_PLL8, 4, 1, 5 }, 179 { 24000000, P_PLL8, 4, 1, 4 }, 180 { 32000000, P_PLL8, 4, 1, 3 }, 181 { 48000000, P_PLL8, 4, 1, 2 }, 182 { 64000000, P_PLL8, 3, 1, 2 }, 183 { 96000000, P_PLL8, 4, 0, 0 }, 184 { 128000000, P_PLL8, 3, 0, 0 }, 185 { } 186 }; 187 188 static struct clk_rcg camclk0_src = { 189 .ns_reg = 0x0148, 190 .md_reg = 0x0144, 191 .mn = { 192 .mnctr_en_bit = 5, 193 .mnctr_reset_bit = 8, 194 .reset_in_cc = true, 195 .mnctr_mode_shift = 6, 196 .n_val_shift = 24, 197 .m_val_shift = 8, 198 .width = 8, 199 }, 200 .p = { 201 .pre_div_shift = 14, 202 .pre_div_width = 2, 203 }, 204 .s = { 205 .src_sel_shift = 0, 206 .parent_map = mmcc_pxo_pll8_pll2_map, 207 }, 208 .freq_tbl = clk_tbl_cam, 209 .clkr = { 210 .enable_reg = 0x0140, 211 .enable_mask = BIT(2), 212 .hw.init = &(struct clk_init_data){ 213 .name = "camclk0_src", 214 .parent_data = mmcc_pxo_pll8_pll2, 215 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 216 .ops = &clk_rcg_ops, 217 }, 218 }, 219 }; 220 221 static struct clk_branch camclk0_clk = { 222 .halt_reg = 0x01e8, 223 .halt_bit = 15, 224 .clkr = { 225 .enable_reg = 0x0140, 226 .enable_mask = BIT(0), 227 .hw.init = &(struct clk_init_data){ 228 .name = "camclk0_clk", 229 .parent_hws = (const struct clk_hw*[]){ 230 &camclk0_src.clkr.hw 231 }, 232 .num_parents = 1, 233 .ops = &clk_branch_ops, 234 }, 235 }, 236 237 }; 238 239 static struct clk_rcg camclk1_src = { 240 .ns_reg = 0x015c, 241 .md_reg = 0x0158, 242 .mn = { 243 .mnctr_en_bit = 5, 244 .mnctr_reset_bit = 8, 245 .reset_in_cc = true, 246 .mnctr_mode_shift = 6, 247 .n_val_shift = 24, 248 .m_val_shift = 8, 249 .width = 8, 250 }, 251 .p = { 252 .pre_div_shift = 14, 253 .pre_div_width = 2, 254 }, 255 .s = { 256 .src_sel_shift = 0, 257 .parent_map = mmcc_pxo_pll8_pll2_map, 258 }, 259 .freq_tbl = clk_tbl_cam, 260 .clkr = { 261 .enable_reg = 0x0154, 262 .enable_mask = BIT(2), 263 .hw.init = &(struct clk_init_data){ 264 .name = "camclk1_src", 265 .parent_data = mmcc_pxo_pll8_pll2, 266 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 267 .ops = &clk_rcg_ops, 268 }, 269 }, 270 }; 271 272 static struct clk_branch camclk1_clk = { 273 .halt_reg = 0x01e8, 274 .halt_bit = 16, 275 .clkr = { 276 .enable_reg = 0x0154, 277 .enable_mask = BIT(0), 278 .hw.init = &(struct clk_init_data){ 279 .name = "camclk1_clk", 280 .parent_hws = (const struct clk_hw*[]){ 281 &camclk1_src.clkr.hw 282 }, 283 .num_parents = 1, 284 .ops = &clk_branch_ops, 285 }, 286 }, 287 288 }; 289 290 static struct clk_rcg camclk2_src = { 291 .ns_reg = 0x0228, 292 .md_reg = 0x0224, 293 .mn = { 294 .mnctr_en_bit = 5, 295 .mnctr_reset_bit = 8, 296 .reset_in_cc = true, 297 .mnctr_mode_shift = 6, 298 .n_val_shift = 24, 299 .m_val_shift = 8, 300 .width = 8, 301 }, 302 .p = { 303 .pre_div_shift = 14, 304 .pre_div_width = 2, 305 }, 306 .s = { 307 .src_sel_shift = 0, 308 .parent_map = mmcc_pxo_pll8_pll2_map, 309 }, 310 .freq_tbl = clk_tbl_cam, 311 .clkr = { 312 .enable_reg = 0x0220, 313 .enable_mask = BIT(2), 314 .hw.init = &(struct clk_init_data){ 315 .name = "camclk2_src", 316 .parent_data = mmcc_pxo_pll8_pll2, 317 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 318 .ops = &clk_rcg_ops, 319 }, 320 }, 321 }; 322 323 static struct clk_branch camclk2_clk = { 324 .halt_reg = 0x01e8, 325 .halt_bit = 16, 326 .clkr = { 327 .enable_reg = 0x0220, 328 .enable_mask = BIT(0), 329 .hw.init = &(struct clk_init_data){ 330 .name = "camclk2_clk", 331 .parent_hws = (const struct clk_hw*[]){ 332 &camclk2_src.clkr.hw 333 }, 334 .num_parents = 1, 335 .ops = &clk_branch_ops, 336 }, 337 }, 338 339 }; 340 341 static const struct freq_tbl clk_tbl_csi[] = { 342 { 27000000, P_PXO, 1, 0, 0 }, 343 { 85330000, P_PLL8, 1, 2, 9 }, 344 { 177780000, P_PLL2, 1, 2, 9 }, 345 { } 346 }; 347 348 static struct clk_rcg csi0_src = { 349 .ns_reg = 0x0048, 350 .md_reg = 0x0044, 351 .mn = { 352 .mnctr_en_bit = 5, 353 .mnctr_reset_bit = 7, 354 .mnctr_mode_shift = 6, 355 .n_val_shift = 24, 356 .m_val_shift = 8, 357 .width = 8, 358 }, 359 .p = { 360 .pre_div_shift = 14, 361 .pre_div_width = 2, 362 }, 363 .s = { 364 .src_sel_shift = 0, 365 .parent_map = mmcc_pxo_pll8_pll2_map, 366 }, 367 .freq_tbl = clk_tbl_csi, 368 .clkr = { 369 .enable_reg = 0x0040, 370 .enable_mask = BIT(2), 371 .hw.init = &(struct clk_init_data){ 372 .name = "csi0_src", 373 .parent_data = mmcc_pxo_pll8_pll2, 374 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 375 .ops = &clk_rcg_ops, 376 }, 377 }, 378 }; 379 380 static struct clk_branch csi0_clk = { 381 .halt_reg = 0x01cc, 382 .halt_bit = 13, 383 .clkr = { 384 .enable_reg = 0x0040, 385 .enable_mask = BIT(0), 386 .hw.init = &(struct clk_init_data){ 387 .parent_hws = (const struct clk_hw*[]){ 388 &csi0_src.clkr.hw 389 }, 390 .num_parents = 1, 391 .name = "csi0_clk", 392 .ops = &clk_branch_ops, 393 .flags = CLK_SET_RATE_PARENT, 394 }, 395 }, 396 }; 397 398 static struct clk_branch csi0_phy_clk = { 399 .halt_reg = 0x01e8, 400 .halt_bit = 9, 401 .clkr = { 402 .enable_reg = 0x0040, 403 .enable_mask = BIT(8), 404 .hw.init = &(struct clk_init_data){ 405 .parent_hws = (const struct clk_hw*[]){ 406 &csi0_src.clkr.hw 407 }, 408 .num_parents = 1, 409 .name = "csi0_phy_clk", 410 .ops = &clk_branch_ops, 411 .flags = CLK_SET_RATE_PARENT, 412 }, 413 }, 414 }; 415 416 static struct clk_rcg csi1_src = { 417 .ns_reg = 0x0010, 418 .md_reg = 0x0028, 419 .mn = { 420 .mnctr_en_bit = 5, 421 .mnctr_reset_bit = 7, 422 .mnctr_mode_shift = 6, 423 .n_val_shift = 24, 424 .m_val_shift = 8, 425 .width = 8, 426 }, 427 .p = { 428 .pre_div_shift = 14, 429 .pre_div_width = 2, 430 }, 431 .s = { 432 .src_sel_shift = 0, 433 .parent_map = mmcc_pxo_pll8_pll2_map, 434 }, 435 .freq_tbl = clk_tbl_csi, 436 .clkr = { 437 .enable_reg = 0x0024, 438 .enable_mask = BIT(2), 439 .hw.init = &(struct clk_init_data){ 440 .name = "csi1_src", 441 .parent_data = mmcc_pxo_pll8_pll2, 442 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 443 .ops = &clk_rcg_ops, 444 }, 445 }, 446 }; 447 448 static struct clk_branch csi1_clk = { 449 .halt_reg = 0x01cc, 450 .halt_bit = 14, 451 .clkr = { 452 .enable_reg = 0x0024, 453 .enable_mask = BIT(0), 454 .hw.init = &(struct clk_init_data){ 455 .parent_hws = (const struct clk_hw*[]){ 456 &csi1_src.clkr.hw 457 }, 458 .num_parents = 1, 459 .name = "csi1_clk", 460 .ops = &clk_branch_ops, 461 .flags = CLK_SET_RATE_PARENT, 462 }, 463 }, 464 }; 465 466 static struct clk_branch csi1_phy_clk = { 467 .halt_reg = 0x01e8, 468 .halt_bit = 10, 469 .clkr = { 470 .enable_reg = 0x0024, 471 .enable_mask = BIT(8), 472 .hw.init = &(struct clk_init_data){ 473 .parent_hws = (const struct clk_hw*[]){ 474 &csi1_src.clkr.hw 475 }, 476 .num_parents = 1, 477 .name = "csi1_phy_clk", 478 .ops = &clk_branch_ops, 479 .flags = CLK_SET_RATE_PARENT, 480 }, 481 }, 482 }; 483 484 static struct clk_rcg csi2_src = { 485 .ns_reg = 0x0234, 486 .md_reg = 0x022c, 487 .mn = { 488 .mnctr_en_bit = 5, 489 .mnctr_reset_bit = 7, 490 .mnctr_mode_shift = 6, 491 .n_val_shift = 24, 492 .m_val_shift = 8, 493 .width = 8, 494 }, 495 .p = { 496 .pre_div_shift = 14, 497 .pre_div_width = 2, 498 }, 499 .s = { 500 .src_sel_shift = 0, 501 .parent_map = mmcc_pxo_pll8_pll2_map, 502 }, 503 .freq_tbl = clk_tbl_csi, 504 .clkr = { 505 .enable_reg = 0x022c, 506 .enable_mask = BIT(2), 507 .hw.init = &(struct clk_init_data){ 508 .name = "csi2_src", 509 .parent_data = mmcc_pxo_pll8_pll2, 510 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 511 .ops = &clk_rcg_ops, 512 }, 513 }, 514 }; 515 516 static struct clk_branch csi2_clk = { 517 .halt_reg = 0x01cc, 518 .halt_bit = 29, 519 .clkr = { 520 .enable_reg = 0x022c, 521 .enable_mask = BIT(0), 522 .hw.init = &(struct clk_init_data){ 523 .parent_hws = (const struct clk_hw*[]){ 524 &csi2_src.clkr.hw 525 }, 526 .num_parents = 1, 527 .name = "csi2_clk", 528 .ops = &clk_branch_ops, 529 .flags = CLK_SET_RATE_PARENT, 530 }, 531 }, 532 }; 533 534 static struct clk_branch csi2_phy_clk = { 535 .halt_reg = 0x01e8, 536 .halt_bit = 29, 537 .clkr = { 538 .enable_reg = 0x022c, 539 .enable_mask = BIT(8), 540 .hw.init = &(struct clk_init_data){ 541 .parent_hws = (const struct clk_hw*[]){ 542 &csi2_src.clkr.hw 543 }, 544 .num_parents = 1, 545 .name = "csi2_phy_clk", 546 .ops = &clk_branch_ops, 547 .flags = CLK_SET_RATE_PARENT, 548 }, 549 }, 550 }; 551 552 struct clk_pix_rdi { 553 u32 s_reg; 554 u32 s_mask; 555 u32 s2_reg; 556 u32 s2_mask; 557 struct clk_regmap clkr; 558 }; 559 560 #define to_clk_pix_rdi(_hw) \ 561 container_of(to_clk_regmap(_hw), struct clk_pix_rdi, clkr) 562 563 static int pix_rdi_set_parent(struct clk_hw *hw, u8 index) 564 { 565 int i; 566 int ret = 0; 567 u32 val; 568 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw); 569 int num_parents = clk_hw_get_num_parents(hw); 570 571 /* 572 * These clocks select three inputs via two muxes. One mux selects 573 * between csi0 and csi1 and the second mux selects between that mux's 574 * output and csi2. The source and destination selections for each 575 * mux must be clocking for the switch to succeed so just turn on 576 * all three sources because it's easier than figuring out what source 577 * needs to be on at what time. 578 */ 579 for (i = 0; i < num_parents; i++) { 580 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i); 581 ret = clk_prepare_enable(p->clk); 582 if (ret) 583 goto err; 584 } 585 586 if (index == 2) 587 val = rdi->s2_mask; 588 else 589 val = 0; 590 regmap_update_bits(rdi->clkr.regmap, rdi->s2_reg, rdi->s2_mask, val); 591 /* 592 * Wait at least 6 cycles of slowest clock 593 * for the glitch-free MUX to fully switch sources. 594 */ 595 udelay(1); 596 597 if (index == 1) 598 val = rdi->s_mask; 599 else 600 val = 0; 601 regmap_update_bits(rdi->clkr.regmap, rdi->s_reg, rdi->s_mask, val); 602 /* 603 * Wait at least 6 cycles of slowest clock 604 * for the glitch-free MUX to fully switch sources. 605 */ 606 udelay(1); 607 608 err: 609 for (i--; i >= 0; i--) { 610 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i); 611 clk_disable_unprepare(p->clk); 612 } 613 614 return ret; 615 } 616 617 static u8 pix_rdi_get_parent(struct clk_hw *hw) 618 { 619 u32 val; 620 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw); 621 622 623 regmap_read(rdi->clkr.regmap, rdi->s2_reg, &val); 624 if (val & rdi->s2_mask) 625 return 2; 626 627 regmap_read(rdi->clkr.regmap, rdi->s_reg, &val); 628 if (val & rdi->s_mask) 629 return 1; 630 631 return 0; 632 } 633 634 static const struct clk_ops clk_ops_pix_rdi = { 635 .enable = clk_enable_regmap, 636 .disable = clk_disable_regmap, 637 .set_parent = pix_rdi_set_parent, 638 .get_parent = pix_rdi_get_parent, 639 .determine_rate = __clk_mux_determine_rate, 640 }; 641 642 static const struct clk_hw *pix_rdi_parents[] = { 643 &csi0_clk.clkr.hw, 644 &csi1_clk.clkr.hw, 645 &csi2_clk.clkr.hw, 646 }; 647 648 static struct clk_pix_rdi csi_pix_clk = { 649 .s_reg = 0x0058, 650 .s_mask = BIT(25), 651 .s2_reg = 0x0238, 652 .s2_mask = BIT(13), 653 .clkr = { 654 .enable_reg = 0x0058, 655 .enable_mask = BIT(26), 656 .hw.init = &(struct clk_init_data){ 657 .name = "csi_pix_clk", 658 .parent_hws = pix_rdi_parents, 659 .num_parents = ARRAY_SIZE(pix_rdi_parents), 660 .ops = &clk_ops_pix_rdi, 661 }, 662 }, 663 }; 664 665 static struct clk_pix_rdi csi_pix1_clk = { 666 .s_reg = 0x0238, 667 .s_mask = BIT(8), 668 .s2_reg = 0x0238, 669 .s2_mask = BIT(9), 670 .clkr = { 671 .enable_reg = 0x0238, 672 .enable_mask = BIT(10), 673 .hw.init = &(struct clk_init_data){ 674 .name = "csi_pix1_clk", 675 .parent_hws = pix_rdi_parents, 676 .num_parents = ARRAY_SIZE(pix_rdi_parents), 677 .ops = &clk_ops_pix_rdi, 678 }, 679 }, 680 }; 681 682 static struct clk_pix_rdi csi_rdi_clk = { 683 .s_reg = 0x0058, 684 .s_mask = BIT(12), 685 .s2_reg = 0x0238, 686 .s2_mask = BIT(12), 687 .clkr = { 688 .enable_reg = 0x0058, 689 .enable_mask = BIT(13), 690 .hw.init = &(struct clk_init_data){ 691 .name = "csi_rdi_clk", 692 .parent_hws = pix_rdi_parents, 693 .num_parents = ARRAY_SIZE(pix_rdi_parents), 694 .ops = &clk_ops_pix_rdi, 695 }, 696 }, 697 }; 698 699 static struct clk_pix_rdi csi_rdi1_clk = { 700 .s_reg = 0x0238, 701 .s_mask = BIT(0), 702 .s2_reg = 0x0238, 703 .s2_mask = BIT(1), 704 .clkr = { 705 .enable_reg = 0x0238, 706 .enable_mask = BIT(2), 707 .hw.init = &(struct clk_init_data){ 708 .name = "csi_rdi1_clk", 709 .parent_hws = pix_rdi_parents, 710 .num_parents = ARRAY_SIZE(pix_rdi_parents), 711 .ops = &clk_ops_pix_rdi, 712 }, 713 }, 714 }; 715 716 static struct clk_pix_rdi csi_rdi2_clk = { 717 .s_reg = 0x0238, 718 .s_mask = BIT(4), 719 .s2_reg = 0x0238, 720 .s2_mask = BIT(5), 721 .clkr = { 722 .enable_reg = 0x0238, 723 .enable_mask = BIT(6), 724 .hw.init = &(struct clk_init_data){ 725 .name = "csi_rdi2_clk", 726 .parent_hws = pix_rdi_parents, 727 .num_parents = ARRAY_SIZE(pix_rdi_parents), 728 .ops = &clk_ops_pix_rdi, 729 }, 730 }, 731 }; 732 733 static const struct freq_tbl clk_tbl_csiphytimer[] = { 734 { 85330000, P_PLL8, 1, 2, 9 }, 735 { 177780000, P_PLL2, 1, 2, 9 }, 736 { } 737 }; 738 739 static struct clk_rcg csiphytimer_src = { 740 .ns_reg = 0x0168, 741 .md_reg = 0x0164, 742 .mn = { 743 .mnctr_en_bit = 5, 744 .mnctr_reset_bit = 8, 745 .reset_in_cc = true, 746 .mnctr_mode_shift = 6, 747 .n_val_shift = 24, 748 .m_val_shift = 8, 749 .width = 8, 750 }, 751 .p = { 752 .pre_div_shift = 14, 753 .pre_div_width = 2, 754 }, 755 .s = { 756 .src_sel_shift = 0, 757 .parent_map = mmcc_pxo_pll8_pll2_map, 758 }, 759 .freq_tbl = clk_tbl_csiphytimer, 760 .clkr = { 761 .enable_reg = 0x0160, 762 .enable_mask = BIT(2), 763 .hw.init = &(struct clk_init_data){ 764 .name = "csiphytimer_src", 765 .parent_data = mmcc_pxo_pll8_pll2, 766 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 767 .ops = &clk_rcg_ops, 768 }, 769 }, 770 }; 771 772 static struct clk_branch csiphy0_timer_clk = { 773 .halt_reg = 0x01e8, 774 .halt_bit = 17, 775 .clkr = { 776 .enable_reg = 0x0160, 777 .enable_mask = BIT(0), 778 .hw.init = &(struct clk_init_data){ 779 .parent_hws = (const struct clk_hw*[]){ 780 &csiphytimer_src.clkr.hw, 781 }, 782 .num_parents = 1, 783 .name = "csiphy0_timer_clk", 784 .ops = &clk_branch_ops, 785 .flags = CLK_SET_RATE_PARENT, 786 }, 787 }, 788 }; 789 790 static struct clk_branch csiphy1_timer_clk = { 791 .halt_reg = 0x01e8, 792 .halt_bit = 18, 793 .clkr = { 794 .enable_reg = 0x0160, 795 .enable_mask = BIT(9), 796 .hw.init = &(struct clk_init_data){ 797 .parent_hws = (const struct clk_hw*[]){ 798 &csiphytimer_src.clkr.hw, 799 }, 800 .num_parents = 1, 801 .name = "csiphy1_timer_clk", 802 .ops = &clk_branch_ops, 803 .flags = CLK_SET_RATE_PARENT, 804 }, 805 }, 806 }; 807 808 static struct clk_branch csiphy2_timer_clk = { 809 .halt_reg = 0x01e8, 810 .halt_bit = 30, 811 .clkr = { 812 .enable_reg = 0x0160, 813 .enable_mask = BIT(11), 814 .hw.init = &(struct clk_init_data){ 815 .parent_hws = (const struct clk_hw*[]){ 816 &csiphytimer_src.clkr.hw, 817 }, 818 .num_parents = 1, 819 .name = "csiphy2_timer_clk", 820 .ops = &clk_branch_ops, 821 .flags = CLK_SET_RATE_PARENT, 822 }, 823 }, 824 }; 825 826 static const struct freq_tbl clk_tbl_gfx2d[] = { 827 F_MN( 27000000, P_PXO, 1, 0), 828 F_MN( 48000000, P_PLL8, 1, 8), 829 F_MN( 54857000, P_PLL8, 1, 7), 830 F_MN( 64000000, P_PLL8, 1, 6), 831 F_MN( 76800000, P_PLL8, 1, 5), 832 F_MN( 96000000, P_PLL8, 1, 4), 833 F_MN(128000000, P_PLL8, 1, 3), 834 F_MN(145455000, P_PLL2, 2, 11), 835 F_MN(160000000, P_PLL2, 1, 5), 836 F_MN(177778000, P_PLL2, 2, 9), 837 F_MN(200000000, P_PLL2, 1, 4), 838 F_MN(228571000, P_PLL2, 2, 7), 839 { } 840 }; 841 842 static struct clk_dyn_rcg gfx2d0_src = { 843 .ns_reg[0] = 0x0070, 844 .ns_reg[1] = 0x0070, 845 .md_reg[0] = 0x0064, 846 .md_reg[1] = 0x0068, 847 .bank_reg = 0x0060, 848 .mn[0] = { 849 .mnctr_en_bit = 8, 850 .mnctr_reset_bit = 25, 851 .mnctr_mode_shift = 9, 852 .n_val_shift = 20, 853 .m_val_shift = 4, 854 .width = 4, 855 }, 856 .mn[1] = { 857 .mnctr_en_bit = 5, 858 .mnctr_reset_bit = 24, 859 .mnctr_mode_shift = 6, 860 .n_val_shift = 16, 861 .m_val_shift = 4, 862 .width = 4, 863 }, 864 .s[0] = { 865 .src_sel_shift = 3, 866 .parent_map = mmcc_pxo_pll8_pll2_map, 867 }, 868 .s[1] = { 869 .src_sel_shift = 0, 870 .parent_map = mmcc_pxo_pll8_pll2_map, 871 }, 872 .mux_sel_bit = 11, 873 .freq_tbl = clk_tbl_gfx2d, 874 .clkr = { 875 .enable_reg = 0x0060, 876 .enable_mask = BIT(2), 877 .hw.init = &(struct clk_init_data){ 878 .name = "gfx2d0_src", 879 .parent_data = mmcc_pxo_pll8_pll2, 880 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 881 .ops = &clk_dyn_rcg_ops, 882 }, 883 }, 884 }; 885 886 static struct clk_branch gfx2d0_clk = { 887 .halt_reg = 0x01c8, 888 .halt_bit = 9, 889 .clkr = { 890 .enable_reg = 0x0060, 891 .enable_mask = BIT(0), 892 .hw.init = &(struct clk_init_data){ 893 .name = "gfx2d0_clk", 894 .parent_hws = (const struct clk_hw*[]){ 895 &gfx2d0_src.clkr.hw 896 }, 897 .num_parents = 1, 898 .ops = &clk_branch_ops, 899 .flags = CLK_SET_RATE_PARENT, 900 }, 901 }, 902 }; 903 904 static struct clk_dyn_rcg gfx2d1_src = { 905 .ns_reg[0] = 0x007c, 906 .ns_reg[1] = 0x007c, 907 .md_reg[0] = 0x0078, 908 .md_reg[1] = 0x006c, 909 .bank_reg = 0x0074, 910 .mn[0] = { 911 .mnctr_en_bit = 8, 912 .mnctr_reset_bit = 25, 913 .mnctr_mode_shift = 9, 914 .n_val_shift = 20, 915 .m_val_shift = 4, 916 .width = 4, 917 }, 918 .mn[1] = { 919 .mnctr_en_bit = 5, 920 .mnctr_reset_bit = 24, 921 .mnctr_mode_shift = 6, 922 .n_val_shift = 16, 923 .m_val_shift = 4, 924 .width = 4, 925 }, 926 .s[0] = { 927 .src_sel_shift = 3, 928 .parent_map = mmcc_pxo_pll8_pll2_map, 929 }, 930 .s[1] = { 931 .src_sel_shift = 0, 932 .parent_map = mmcc_pxo_pll8_pll2_map, 933 }, 934 .mux_sel_bit = 11, 935 .freq_tbl = clk_tbl_gfx2d, 936 .clkr = { 937 .enable_reg = 0x0074, 938 .enable_mask = BIT(2), 939 .hw.init = &(struct clk_init_data){ 940 .name = "gfx2d1_src", 941 .parent_data = mmcc_pxo_pll8_pll2, 942 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 943 .ops = &clk_dyn_rcg_ops, 944 }, 945 }, 946 }; 947 948 static struct clk_branch gfx2d1_clk = { 949 .halt_reg = 0x01c8, 950 .halt_bit = 14, 951 .clkr = { 952 .enable_reg = 0x0074, 953 .enable_mask = BIT(0), 954 .hw.init = &(struct clk_init_data){ 955 .name = "gfx2d1_clk", 956 .parent_hws = (const struct clk_hw*[]){ 957 &gfx2d1_src.clkr.hw 958 }, 959 .num_parents = 1, 960 .ops = &clk_branch_ops, 961 .flags = CLK_SET_RATE_PARENT, 962 }, 963 }, 964 }; 965 966 static const struct freq_tbl clk_tbl_gfx3d[] = { 967 F_MN( 27000000, P_PXO, 1, 0), 968 F_MN( 48000000, P_PLL8, 1, 8), 969 F_MN( 54857000, P_PLL8, 1, 7), 970 F_MN( 64000000, P_PLL8, 1, 6), 971 F_MN( 76800000, P_PLL8, 1, 5), 972 F_MN( 96000000, P_PLL8, 1, 4), 973 F_MN(128000000, P_PLL8, 1, 3), 974 F_MN(145455000, P_PLL2, 2, 11), 975 F_MN(160000000, P_PLL2, 1, 5), 976 F_MN(177778000, P_PLL2, 2, 9), 977 F_MN(200000000, P_PLL2, 1, 4), 978 F_MN(228571000, P_PLL2, 2, 7), 979 F_MN(266667000, P_PLL2, 1, 3), 980 F_MN(300000000, P_PLL3, 1, 4), 981 F_MN(320000000, P_PLL2, 2, 5), 982 F_MN(400000000, P_PLL2, 1, 2), 983 { } 984 }; 985 986 static const struct freq_tbl clk_tbl_gfx3d_8064[] = { 987 F_MN( 27000000, P_PXO, 0, 0), 988 F_MN( 48000000, P_PLL8, 1, 8), 989 F_MN( 54857000, P_PLL8, 1, 7), 990 F_MN( 64000000, P_PLL8, 1, 6), 991 F_MN( 76800000, P_PLL8, 1, 5), 992 F_MN( 96000000, P_PLL8, 1, 4), 993 F_MN(128000000, P_PLL8, 1, 3), 994 F_MN(145455000, P_PLL2, 2, 11), 995 F_MN(160000000, P_PLL2, 1, 5), 996 F_MN(177778000, P_PLL2, 2, 9), 997 F_MN(192000000, P_PLL8, 1, 2), 998 F_MN(200000000, P_PLL2, 1, 4), 999 F_MN(228571000, P_PLL2, 2, 7), 1000 F_MN(266667000, P_PLL2, 1, 3), 1001 F_MN(320000000, P_PLL2, 2, 5), 1002 F_MN(400000000, P_PLL2, 1, 2), 1003 F_MN(450000000, P_PLL15, 1, 2), 1004 { } 1005 }; 1006 1007 static struct clk_dyn_rcg gfx3d_src = { 1008 .ns_reg[0] = 0x008c, 1009 .ns_reg[1] = 0x008c, 1010 .md_reg[0] = 0x0084, 1011 .md_reg[1] = 0x0088, 1012 .bank_reg = 0x0080, 1013 .mn[0] = { 1014 .mnctr_en_bit = 8, 1015 .mnctr_reset_bit = 25, 1016 .mnctr_mode_shift = 9, 1017 .n_val_shift = 18, 1018 .m_val_shift = 4, 1019 .width = 4, 1020 }, 1021 .mn[1] = { 1022 .mnctr_en_bit = 5, 1023 .mnctr_reset_bit = 24, 1024 .mnctr_mode_shift = 6, 1025 .n_val_shift = 14, 1026 .m_val_shift = 4, 1027 .width = 4, 1028 }, 1029 .s[0] = { 1030 .src_sel_shift = 3, 1031 .parent_map = mmcc_pxo_pll8_pll2_pll3_map, 1032 }, 1033 .s[1] = { 1034 .src_sel_shift = 0, 1035 .parent_map = mmcc_pxo_pll8_pll2_pll3_map, 1036 }, 1037 .mux_sel_bit = 11, 1038 .freq_tbl = clk_tbl_gfx3d, 1039 .clkr = { 1040 .enable_reg = 0x0080, 1041 .enable_mask = BIT(2), 1042 .hw.init = &(struct clk_init_data){ 1043 .name = "gfx3d_src", 1044 .parent_data = mmcc_pxo_pll8_pll2_pll3, 1045 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2_pll3), 1046 .ops = &clk_dyn_rcg_ops, 1047 }, 1048 }, 1049 }; 1050 1051 static const struct clk_init_data gfx3d_8064_init = { 1052 .name = "gfx3d_src", 1053 .parent_data = mmcc_pxo_pll8_pll2_pll15, 1054 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2_pll15), 1055 .ops = &clk_dyn_rcg_ops, 1056 }; 1057 1058 static struct clk_branch gfx3d_clk = { 1059 .halt_reg = 0x01c8, 1060 .halt_bit = 4, 1061 .clkr = { 1062 .enable_reg = 0x0080, 1063 .enable_mask = BIT(0), 1064 .hw.init = &(struct clk_init_data){ 1065 .name = "gfx3d_clk", 1066 .parent_hws = (const struct clk_hw*[]){ 1067 &gfx3d_src.clkr.hw 1068 }, 1069 .num_parents = 1, 1070 .ops = &clk_branch_ops, 1071 .flags = CLK_SET_RATE_PARENT, 1072 }, 1073 }, 1074 }; 1075 1076 static const struct freq_tbl clk_tbl_vcap[] = { 1077 F_MN( 27000000, P_PXO, 0, 0), 1078 F_MN( 54860000, P_PLL8, 1, 7), 1079 F_MN( 64000000, P_PLL8, 1, 6), 1080 F_MN( 76800000, P_PLL8, 1, 5), 1081 F_MN(128000000, P_PLL8, 1, 3), 1082 F_MN(160000000, P_PLL2, 1, 5), 1083 F_MN(200000000, P_PLL2, 1, 4), 1084 { } 1085 }; 1086 1087 static struct clk_dyn_rcg vcap_src = { 1088 .ns_reg[0] = 0x021c, 1089 .ns_reg[1] = 0x021c, 1090 .md_reg[0] = 0x01ec, 1091 .md_reg[1] = 0x0218, 1092 .bank_reg = 0x0178, 1093 .mn[0] = { 1094 .mnctr_en_bit = 8, 1095 .mnctr_reset_bit = 23, 1096 .mnctr_mode_shift = 9, 1097 .n_val_shift = 18, 1098 .m_val_shift = 4, 1099 .width = 4, 1100 }, 1101 .mn[1] = { 1102 .mnctr_en_bit = 5, 1103 .mnctr_reset_bit = 22, 1104 .mnctr_mode_shift = 6, 1105 .n_val_shift = 14, 1106 .m_val_shift = 4, 1107 .width = 4, 1108 }, 1109 .s[0] = { 1110 .src_sel_shift = 3, 1111 .parent_map = mmcc_pxo_pll8_pll2_map, 1112 }, 1113 .s[1] = { 1114 .src_sel_shift = 0, 1115 .parent_map = mmcc_pxo_pll8_pll2_map, 1116 }, 1117 .mux_sel_bit = 11, 1118 .freq_tbl = clk_tbl_vcap, 1119 .clkr = { 1120 .enable_reg = 0x0178, 1121 .enable_mask = BIT(2), 1122 .hw.init = &(struct clk_init_data){ 1123 .name = "vcap_src", 1124 .parent_data = mmcc_pxo_pll8_pll2, 1125 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 1126 .ops = &clk_dyn_rcg_ops, 1127 }, 1128 }, 1129 }; 1130 1131 static struct clk_branch vcap_clk = { 1132 .halt_reg = 0x0240, 1133 .halt_bit = 15, 1134 .clkr = { 1135 .enable_reg = 0x0178, 1136 .enable_mask = BIT(0), 1137 .hw.init = &(struct clk_init_data){ 1138 .name = "vcap_clk", 1139 .parent_hws = (const struct clk_hw*[]){ 1140 &vcap_src.clkr.hw 1141 }, 1142 .num_parents = 1, 1143 .ops = &clk_branch_ops, 1144 .flags = CLK_SET_RATE_PARENT, 1145 }, 1146 }, 1147 }; 1148 1149 static struct clk_branch vcap_npl_clk = { 1150 .halt_reg = 0x0240, 1151 .halt_bit = 25, 1152 .clkr = { 1153 .enable_reg = 0x0178, 1154 .enable_mask = BIT(13), 1155 .hw.init = &(struct clk_init_data){ 1156 .name = "vcap_npl_clk", 1157 .parent_hws = (const struct clk_hw*[]){ 1158 &vcap_src.clkr.hw 1159 }, 1160 .num_parents = 1, 1161 .ops = &clk_branch_ops, 1162 .flags = CLK_SET_RATE_PARENT, 1163 }, 1164 }, 1165 }; 1166 1167 static const struct freq_tbl clk_tbl_ijpeg[] = { 1168 { 27000000, P_PXO, 1, 0, 0 }, 1169 { 36570000, P_PLL8, 1, 2, 21 }, 1170 { 54860000, P_PLL8, 7, 0, 0 }, 1171 { 96000000, P_PLL8, 4, 0, 0 }, 1172 { 109710000, P_PLL8, 1, 2, 7 }, 1173 { 128000000, P_PLL8, 3, 0, 0 }, 1174 { 153600000, P_PLL8, 1, 2, 5 }, 1175 { 200000000, P_PLL2, 4, 0, 0 }, 1176 { 228571000, P_PLL2, 1, 2, 7 }, 1177 { 266667000, P_PLL2, 1, 1, 3 }, 1178 { 320000000, P_PLL2, 1, 2, 5 }, 1179 { } 1180 }; 1181 1182 static struct clk_rcg ijpeg_src = { 1183 .ns_reg = 0x00a0, 1184 .md_reg = 0x009c, 1185 .mn = { 1186 .mnctr_en_bit = 5, 1187 .mnctr_reset_bit = 7, 1188 .mnctr_mode_shift = 6, 1189 .n_val_shift = 16, 1190 .m_val_shift = 8, 1191 .width = 8, 1192 }, 1193 .p = { 1194 .pre_div_shift = 12, 1195 .pre_div_width = 2, 1196 }, 1197 .s = { 1198 .src_sel_shift = 0, 1199 .parent_map = mmcc_pxo_pll8_pll2_map, 1200 }, 1201 .freq_tbl = clk_tbl_ijpeg, 1202 .clkr = { 1203 .enable_reg = 0x0098, 1204 .enable_mask = BIT(2), 1205 .hw.init = &(struct clk_init_data){ 1206 .name = "ijpeg_src", 1207 .parent_data = mmcc_pxo_pll8_pll2, 1208 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 1209 .ops = &clk_rcg_ops, 1210 }, 1211 }, 1212 }; 1213 1214 static struct clk_branch ijpeg_clk = { 1215 .halt_reg = 0x01c8, 1216 .halt_bit = 24, 1217 .clkr = { 1218 .enable_reg = 0x0098, 1219 .enable_mask = BIT(0), 1220 .hw.init = &(struct clk_init_data){ 1221 .name = "ijpeg_clk", 1222 .parent_hws = (const struct clk_hw*[]){ 1223 &ijpeg_src.clkr.hw 1224 }, 1225 .num_parents = 1, 1226 .ops = &clk_branch_ops, 1227 .flags = CLK_SET_RATE_PARENT, 1228 }, 1229 }, 1230 }; 1231 1232 static const struct freq_tbl clk_tbl_jpegd[] = { 1233 { 64000000, P_PLL8, 6 }, 1234 { 76800000, P_PLL8, 5 }, 1235 { 96000000, P_PLL8, 4 }, 1236 { 160000000, P_PLL2, 5 }, 1237 { 200000000, P_PLL2, 4 }, 1238 { } 1239 }; 1240 1241 static struct clk_rcg jpegd_src = { 1242 .ns_reg = 0x00ac, 1243 .p = { 1244 .pre_div_shift = 12, 1245 .pre_div_width = 4, 1246 }, 1247 .s = { 1248 .src_sel_shift = 0, 1249 .parent_map = mmcc_pxo_pll8_pll2_map, 1250 }, 1251 .freq_tbl = clk_tbl_jpegd, 1252 .clkr = { 1253 .enable_reg = 0x00a4, 1254 .enable_mask = BIT(2), 1255 .hw.init = &(struct clk_init_data){ 1256 .name = "jpegd_src", 1257 .parent_data = mmcc_pxo_pll8_pll2, 1258 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 1259 .ops = &clk_rcg_ops, 1260 }, 1261 }, 1262 }; 1263 1264 static struct clk_branch jpegd_clk = { 1265 .halt_reg = 0x01c8, 1266 .halt_bit = 19, 1267 .clkr = { 1268 .enable_reg = 0x00a4, 1269 .enable_mask = BIT(0), 1270 .hw.init = &(struct clk_init_data){ 1271 .name = "jpegd_clk", 1272 .parent_hws = (const struct clk_hw*[]){ 1273 &jpegd_src.clkr.hw 1274 }, 1275 .num_parents = 1, 1276 .ops = &clk_branch_ops, 1277 .flags = CLK_SET_RATE_PARENT, 1278 }, 1279 }, 1280 }; 1281 1282 static const struct freq_tbl clk_tbl_mdp[] = { 1283 { 9600000, P_PLL8, 1, 1, 40 }, 1284 { 13710000, P_PLL8, 1, 1, 28 }, 1285 { 27000000, P_PXO, 1, 0, 0 }, 1286 { 29540000, P_PLL8, 1, 1, 13 }, 1287 { 34910000, P_PLL8, 1, 1, 11 }, 1288 { 38400000, P_PLL8, 1, 1, 10 }, 1289 { 59080000, P_PLL8, 1, 2, 13 }, 1290 { 76800000, P_PLL8, 1, 1, 5 }, 1291 { 85330000, P_PLL8, 1, 2, 9 }, 1292 { 96000000, P_PLL8, 1, 1, 4 }, 1293 { 128000000, P_PLL8, 1, 1, 3 }, 1294 { 160000000, P_PLL2, 1, 1, 5 }, 1295 { 177780000, P_PLL2, 1, 2, 9 }, 1296 { 200000000, P_PLL2, 1, 1, 4 }, 1297 { 228571000, P_PLL2, 1, 2, 7 }, 1298 { 266667000, P_PLL2, 1, 1, 3 }, 1299 { } 1300 }; 1301 1302 static struct clk_dyn_rcg mdp_src = { 1303 .ns_reg[0] = 0x00d0, 1304 .ns_reg[1] = 0x00d0, 1305 .md_reg[0] = 0x00c4, 1306 .md_reg[1] = 0x00c8, 1307 .bank_reg = 0x00c0, 1308 .mn[0] = { 1309 .mnctr_en_bit = 8, 1310 .mnctr_reset_bit = 31, 1311 .mnctr_mode_shift = 9, 1312 .n_val_shift = 22, 1313 .m_val_shift = 8, 1314 .width = 8, 1315 }, 1316 .mn[1] = { 1317 .mnctr_en_bit = 5, 1318 .mnctr_reset_bit = 30, 1319 .mnctr_mode_shift = 6, 1320 .n_val_shift = 14, 1321 .m_val_shift = 8, 1322 .width = 8, 1323 }, 1324 .s[0] = { 1325 .src_sel_shift = 3, 1326 .parent_map = mmcc_pxo_pll8_pll2_map, 1327 }, 1328 .s[1] = { 1329 .src_sel_shift = 0, 1330 .parent_map = mmcc_pxo_pll8_pll2_map, 1331 }, 1332 .mux_sel_bit = 11, 1333 .freq_tbl = clk_tbl_mdp, 1334 .clkr = { 1335 .enable_reg = 0x00c0, 1336 .enable_mask = BIT(2), 1337 .hw.init = &(struct clk_init_data){ 1338 .name = "mdp_src", 1339 .parent_data = mmcc_pxo_pll8_pll2, 1340 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 1341 .ops = &clk_dyn_rcg_ops, 1342 }, 1343 }, 1344 }; 1345 1346 static struct clk_branch mdp_clk = { 1347 .halt_reg = 0x01d0, 1348 .halt_bit = 10, 1349 .clkr = { 1350 .enable_reg = 0x00c0, 1351 .enable_mask = BIT(0), 1352 .hw.init = &(struct clk_init_data){ 1353 .name = "mdp_clk", 1354 .parent_hws = (const struct clk_hw*[]){ 1355 &mdp_src.clkr.hw 1356 }, 1357 .num_parents = 1, 1358 .ops = &clk_branch_ops, 1359 .flags = CLK_SET_RATE_PARENT, 1360 }, 1361 }, 1362 }; 1363 1364 static struct clk_branch mdp_lut_clk = { 1365 .halt_reg = 0x01e8, 1366 .halt_bit = 13, 1367 .clkr = { 1368 .enable_reg = 0x016c, 1369 .enable_mask = BIT(0), 1370 .hw.init = &(struct clk_init_data){ 1371 .parent_hws = (const struct clk_hw*[]){ 1372 &mdp_src.clkr.hw 1373 }, 1374 .num_parents = 1, 1375 .name = "mdp_lut_clk", 1376 .ops = &clk_branch_ops, 1377 .flags = CLK_SET_RATE_PARENT, 1378 }, 1379 }, 1380 }; 1381 1382 static struct clk_branch mdp_vsync_clk = { 1383 .halt_reg = 0x01cc, 1384 .halt_bit = 22, 1385 .clkr = { 1386 .enable_reg = 0x0058, 1387 .enable_mask = BIT(6), 1388 .hw.init = &(struct clk_init_data){ 1389 .name = "mdp_vsync_clk", 1390 .parent_data = (const struct clk_parent_data[]){ 1391 { .fw_name = "pxo", .name = "pxo_board" }, 1392 }, 1393 .num_parents = 1, 1394 .ops = &clk_branch_ops 1395 }, 1396 }, 1397 }; 1398 1399 static const struct freq_tbl clk_tbl_rot[] = { 1400 { 27000000, P_PXO, 1 }, 1401 { 29540000, P_PLL8, 13 }, 1402 { 32000000, P_PLL8, 12 }, 1403 { 38400000, P_PLL8, 10 }, 1404 { 48000000, P_PLL8, 8 }, 1405 { 54860000, P_PLL8, 7 }, 1406 { 64000000, P_PLL8, 6 }, 1407 { 76800000, P_PLL8, 5 }, 1408 { 96000000, P_PLL8, 4 }, 1409 { 100000000, P_PLL2, 8 }, 1410 { 114290000, P_PLL2, 7 }, 1411 { 133330000, P_PLL2, 6 }, 1412 { 160000000, P_PLL2, 5 }, 1413 { 200000000, P_PLL2, 4 }, 1414 { } 1415 }; 1416 1417 static struct clk_dyn_rcg rot_src = { 1418 .ns_reg[0] = 0x00e8, 1419 .ns_reg[1] = 0x00e8, 1420 .bank_reg = 0x00e8, 1421 .p[0] = { 1422 .pre_div_shift = 22, 1423 .pre_div_width = 4, 1424 }, 1425 .p[1] = { 1426 .pre_div_shift = 26, 1427 .pre_div_width = 4, 1428 }, 1429 .s[0] = { 1430 .src_sel_shift = 16, 1431 .parent_map = mmcc_pxo_pll8_pll2_map, 1432 }, 1433 .s[1] = { 1434 .src_sel_shift = 19, 1435 .parent_map = mmcc_pxo_pll8_pll2_map, 1436 }, 1437 .mux_sel_bit = 30, 1438 .freq_tbl = clk_tbl_rot, 1439 .clkr = { 1440 .enable_reg = 0x00e0, 1441 .enable_mask = BIT(2), 1442 .hw.init = &(struct clk_init_data){ 1443 .name = "rot_src", 1444 .parent_data = mmcc_pxo_pll8_pll2, 1445 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 1446 .ops = &clk_dyn_rcg_ops, 1447 }, 1448 }, 1449 }; 1450 1451 static struct clk_branch rot_clk = { 1452 .halt_reg = 0x01d0, 1453 .halt_bit = 15, 1454 .clkr = { 1455 .enable_reg = 0x00e0, 1456 .enable_mask = BIT(0), 1457 .hw.init = &(struct clk_init_data){ 1458 .name = "rot_clk", 1459 .parent_hws = (const struct clk_hw*[]){ 1460 &rot_src.clkr.hw 1461 }, 1462 .num_parents = 1, 1463 .ops = &clk_branch_ops, 1464 .flags = CLK_SET_RATE_PARENT, 1465 }, 1466 }, 1467 }; 1468 1469 static const struct parent_map mmcc_pxo_hdmi_map[] = { 1470 { P_PXO, 0 }, 1471 { P_HDMI_PLL, 3 } 1472 }; 1473 1474 static const struct clk_parent_data mmcc_pxo_hdmi[] = { 1475 { .fw_name = "pxo", .name = "pxo_board" }, 1476 { .fw_name = "hdmipll", .name = "hdmi_pll" }, 1477 }; 1478 1479 static const struct freq_tbl clk_tbl_tv[] = { 1480 { .src = P_HDMI_PLL, .pre_div = 1 }, 1481 { } 1482 }; 1483 1484 static struct clk_rcg tv_src = { 1485 .ns_reg = 0x00f4, 1486 .md_reg = 0x00f0, 1487 .mn = { 1488 .mnctr_en_bit = 5, 1489 .mnctr_reset_bit = 7, 1490 .mnctr_mode_shift = 6, 1491 .n_val_shift = 16, 1492 .m_val_shift = 8, 1493 .width = 8, 1494 }, 1495 .p = { 1496 .pre_div_shift = 14, 1497 .pre_div_width = 2, 1498 }, 1499 .s = { 1500 .src_sel_shift = 0, 1501 .parent_map = mmcc_pxo_hdmi_map, 1502 }, 1503 .freq_tbl = clk_tbl_tv, 1504 .clkr = { 1505 .enable_reg = 0x00ec, 1506 .enable_mask = BIT(2), 1507 .hw.init = &(struct clk_init_data){ 1508 .name = "tv_src", 1509 .parent_data = mmcc_pxo_hdmi, 1510 .num_parents = ARRAY_SIZE(mmcc_pxo_hdmi), 1511 .ops = &clk_rcg_bypass_ops, 1512 .flags = CLK_SET_RATE_PARENT, 1513 }, 1514 }, 1515 }; 1516 1517 static struct clk_branch tv_enc_clk = { 1518 .halt_reg = 0x01d4, 1519 .halt_bit = 9, 1520 .clkr = { 1521 .enable_reg = 0x00ec, 1522 .enable_mask = BIT(8), 1523 .hw.init = &(struct clk_init_data){ 1524 .parent_hws = (const struct clk_hw*[]){ 1525 &tv_src.clkr.hw, 1526 }, 1527 .num_parents = 1, 1528 .name = "tv_enc_clk", 1529 .ops = &clk_branch_ops, 1530 .flags = CLK_SET_RATE_PARENT, 1531 }, 1532 }, 1533 }; 1534 1535 static struct clk_branch tv_dac_clk = { 1536 .halt_reg = 0x01d4, 1537 .halt_bit = 10, 1538 .clkr = { 1539 .enable_reg = 0x00ec, 1540 .enable_mask = BIT(10), 1541 .hw.init = &(struct clk_init_data){ 1542 .parent_hws = (const struct clk_hw*[]){ 1543 &tv_src.clkr.hw, 1544 }, 1545 .num_parents = 1, 1546 .name = "tv_dac_clk", 1547 .ops = &clk_branch_ops, 1548 .flags = CLK_SET_RATE_PARENT, 1549 }, 1550 }, 1551 }; 1552 1553 static struct clk_branch mdp_tv_clk = { 1554 .halt_reg = 0x01d4, 1555 .halt_bit = 12, 1556 .clkr = { 1557 .enable_reg = 0x00ec, 1558 .enable_mask = BIT(0), 1559 .hw.init = &(struct clk_init_data){ 1560 .parent_hws = (const struct clk_hw*[]){ 1561 &tv_src.clkr.hw, 1562 }, 1563 .num_parents = 1, 1564 .name = "mdp_tv_clk", 1565 .ops = &clk_branch_ops, 1566 .flags = CLK_SET_RATE_PARENT, 1567 }, 1568 }, 1569 }; 1570 1571 static struct clk_branch hdmi_tv_clk = { 1572 .halt_reg = 0x01d4, 1573 .halt_bit = 11, 1574 .clkr = { 1575 .enable_reg = 0x00ec, 1576 .enable_mask = BIT(12), 1577 .hw.init = &(struct clk_init_data){ 1578 .parent_hws = (const struct clk_hw*[]){ 1579 &tv_src.clkr.hw, 1580 }, 1581 .num_parents = 1, 1582 .name = "hdmi_tv_clk", 1583 .ops = &clk_branch_ops, 1584 .flags = CLK_SET_RATE_PARENT, 1585 }, 1586 }, 1587 }; 1588 1589 static struct clk_branch rgb_tv_clk = { 1590 .halt_reg = 0x0240, 1591 .halt_bit = 27, 1592 .clkr = { 1593 .enable_reg = 0x0124, 1594 .enable_mask = BIT(14), 1595 .hw.init = &(struct clk_init_data){ 1596 .parent_hws = (const struct clk_hw*[]){ 1597 &tv_src.clkr.hw, 1598 }, 1599 .num_parents = 1, 1600 .name = "rgb_tv_clk", 1601 .ops = &clk_branch_ops, 1602 .flags = CLK_SET_RATE_PARENT, 1603 }, 1604 }, 1605 }; 1606 1607 static struct clk_branch npl_tv_clk = { 1608 .halt_reg = 0x0240, 1609 .halt_bit = 26, 1610 .clkr = { 1611 .enable_reg = 0x0124, 1612 .enable_mask = BIT(16), 1613 .hw.init = &(struct clk_init_data){ 1614 .parent_hws = (const struct clk_hw*[]){ 1615 &tv_src.clkr.hw, 1616 }, 1617 .num_parents = 1, 1618 .name = "npl_tv_clk", 1619 .ops = &clk_branch_ops, 1620 .flags = CLK_SET_RATE_PARENT, 1621 }, 1622 }, 1623 }; 1624 1625 static struct clk_branch hdmi_app_clk = { 1626 .halt_reg = 0x01cc, 1627 .halt_bit = 25, 1628 .clkr = { 1629 .enable_reg = 0x005c, 1630 .enable_mask = BIT(11), 1631 .hw.init = &(struct clk_init_data){ 1632 .parent_data = (const struct clk_parent_data[]){ 1633 { .fw_name = "pxo", .name = "pxo_board" }, 1634 }, 1635 .num_parents = 1, 1636 .name = "hdmi_app_clk", 1637 .ops = &clk_branch_ops, 1638 }, 1639 }, 1640 }; 1641 1642 static const struct freq_tbl clk_tbl_vcodec[] = { 1643 F_MN( 27000000, P_PXO, 1, 0), 1644 F_MN( 32000000, P_PLL8, 1, 12), 1645 F_MN( 48000000, P_PLL8, 1, 8), 1646 F_MN( 54860000, P_PLL8, 1, 7), 1647 F_MN( 96000000, P_PLL8, 1, 4), 1648 F_MN(133330000, P_PLL2, 1, 6), 1649 F_MN(200000000, P_PLL2, 1, 4), 1650 F_MN(228570000, P_PLL2, 2, 7), 1651 F_MN(266670000, P_PLL2, 1, 3), 1652 { } 1653 }; 1654 1655 static struct clk_dyn_rcg vcodec_src = { 1656 .ns_reg[0] = 0x0100, 1657 .ns_reg[1] = 0x0100, 1658 .md_reg[0] = 0x00fc, 1659 .md_reg[1] = 0x0128, 1660 .bank_reg = 0x00f8, 1661 .mn[0] = { 1662 .mnctr_en_bit = 5, 1663 .mnctr_reset_bit = 31, 1664 .mnctr_mode_shift = 6, 1665 .n_val_shift = 11, 1666 .m_val_shift = 8, 1667 .width = 8, 1668 }, 1669 .mn[1] = { 1670 .mnctr_en_bit = 10, 1671 .mnctr_reset_bit = 30, 1672 .mnctr_mode_shift = 11, 1673 .n_val_shift = 19, 1674 .m_val_shift = 8, 1675 .width = 8, 1676 }, 1677 .s[0] = { 1678 .src_sel_shift = 27, 1679 .parent_map = mmcc_pxo_pll8_pll2_map, 1680 }, 1681 .s[1] = { 1682 .src_sel_shift = 0, 1683 .parent_map = mmcc_pxo_pll8_pll2_map, 1684 }, 1685 .mux_sel_bit = 13, 1686 .freq_tbl = clk_tbl_vcodec, 1687 .clkr = { 1688 .enable_reg = 0x00f8, 1689 .enable_mask = BIT(2), 1690 .hw.init = &(struct clk_init_data){ 1691 .name = "vcodec_src", 1692 .parent_data = mmcc_pxo_pll8_pll2, 1693 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 1694 .ops = &clk_dyn_rcg_ops, 1695 }, 1696 }, 1697 }; 1698 1699 static struct clk_branch vcodec_clk = { 1700 .halt_reg = 0x01d0, 1701 .halt_bit = 29, 1702 .clkr = { 1703 .enable_reg = 0x00f8, 1704 .enable_mask = BIT(0), 1705 .hw.init = &(struct clk_init_data){ 1706 .name = "vcodec_clk", 1707 .parent_hws = (const struct clk_hw*[]){ 1708 &vcodec_src.clkr.hw 1709 }, 1710 .num_parents = 1, 1711 .ops = &clk_branch_ops, 1712 .flags = CLK_SET_RATE_PARENT, 1713 }, 1714 }, 1715 }; 1716 1717 static const struct freq_tbl clk_tbl_vpe[] = { 1718 { 27000000, P_PXO, 1 }, 1719 { 34909000, P_PLL8, 11 }, 1720 { 38400000, P_PLL8, 10 }, 1721 { 64000000, P_PLL8, 6 }, 1722 { 76800000, P_PLL8, 5 }, 1723 { 96000000, P_PLL8, 4 }, 1724 { 100000000, P_PLL2, 8 }, 1725 { 160000000, P_PLL2, 5 }, 1726 { } 1727 }; 1728 1729 static struct clk_rcg vpe_src = { 1730 .ns_reg = 0x0118, 1731 .p = { 1732 .pre_div_shift = 12, 1733 .pre_div_width = 4, 1734 }, 1735 .s = { 1736 .src_sel_shift = 0, 1737 .parent_map = mmcc_pxo_pll8_pll2_map, 1738 }, 1739 .freq_tbl = clk_tbl_vpe, 1740 .clkr = { 1741 .enable_reg = 0x0110, 1742 .enable_mask = BIT(2), 1743 .hw.init = &(struct clk_init_data){ 1744 .name = "vpe_src", 1745 .parent_data = mmcc_pxo_pll8_pll2, 1746 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 1747 .ops = &clk_rcg_ops, 1748 }, 1749 }, 1750 }; 1751 1752 static struct clk_branch vpe_clk = { 1753 .halt_reg = 0x01c8, 1754 .halt_bit = 28, 1755 .clkr = { 1756 .enable_reg = 0x0110, 1757 .enable_mask = BIT(0), 1758 .hw.init = &(struct clk_init_data){ 1759 .name = "vpe_clk", 1760 .parent_hws = (const struct clk_hw*[]){ 1761 &vpe_src.clkr.hw 1762 }, 1763 .num_parents = 1, 1764 .ops = &clk_branch_ops, 1765 .flags = CLK_SET_RATE_PARENT, 1766 }, 1767 }, 1768 }; 1769 1770 static const struct freq_tbl clk_tbl_vfe[] = { 1771 { 13960000, P_PLL8, 1, 2, 55 }, 1772 { 27000000, P_PXO, 1, 0, 0 }, 1773 { 36570000, P_PLL8, 1, 2, 21 }, 1774 { 38400000, P_PLL8, 2, 1, 5 }, 1775 { 45180000, P_PLL8, 1, 2, 17 }, 1776 { 48000000, P_PLL8, 2, 1, 4 }, 1777 { 54860000, P_PLL8, 1, 1, 7 }, 1778 { 64000000, P_PLL8, 2, 1, 3 }, 1779 { 76800000, P_PLL8, 1, 1, 5 }, 1780 { 96000000, P_PLL8, 2, 1, 2 }, 1781 { 109710000, P_PLL8, 1, 2, 7 }, 1782 { 128000000, P_PLL8, 1, 1, 3 }, 1783 { 153600000, P_PLL8, 1, 2, 5 }, 1784 { 200000000, P_PLL2, 2, 1, 2 }, 1785 { 228570000, P_PLL2, 1, 2, 7 }, 1786 { 266667000, P_PLL2, 1, 1, 3 }, 1787 { 320000000, P_PLL2, 1, 2, 5 }, 1788 { } 1789 }; 1790 1791 static struct clk_rcg vfe_src = { 1792 .ns_reg = 0x0108, 1793 .mn = { 1794 .mnctr_en_bit = 5, 1795 .mnctr_reset_bit = 7, 1796 .mnctr_mode_shift = 6, 1797 .n_val_shift = 16, 1798 .m_val_shift = 8, 1799 .width = 8, 1800 }, 1801 .p = { 1802 .pre_div_shift = 10, 1803 .pre_div_width = 1, 1804 }, 1805 .s = { 1806 .src_sel_shift = 0, 1807 .parent_map = mmcc_pxo_pll8_pll2_map, 1808 }, 1809 .freq_tbl = clk_tbl_vfe, 1810 .clkr = { 1811 .enable_reg = 0x0104, 1812 .enable_mask = BIT(2), 1813 .hw.init = &(struct clk_init_data){ 1814 .name = "vfe_src", 1815 .parent_data = mmcc_pxo_pll8_pll2, 1816 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2), 1817 .ops = &clk_rcg_ops, 1818 }, 1819 }, 1820 }; 1821 1822 static struct clk_branch vfe_clk = { 1823 .halt_reg = 0x01cc, 1824 .halt_bit = 6, 1825 .clkr = { 1826 .enable_reg = 0x0104, 1827 .enable_mask = BIT(0), 1828 .hw.init = &(struct clk_init_data){ 1829 .name = "vfe_clk", 1830 .parent_hws = (const struct clk_hw*[]){ 1831 &vfe_src.clkr.hw 1832 }, 1833 .num_parents = 1, 1834 .ops = &clk_branch_ops, 1835 .flags = CLK_SET_RATE_PARENT, 1836 }, 1837 }, 1838 }; 1839 1840 static struct clk_branch vfe_csi_clk = { 1841 .halt_reg = 0x01cc, 1842 .halt_bit = 8, 1843 .clkr = { 1844 .enable_reg = 0x0104, 1845 .enable_mask = BIT(12), 1846 .hw.init = &(struct clk_init_data){ 1847 .parent_hws = (const struct clk_hw*[]){ 1848 &vfe_src.clkr.hw 1849 }, 1850 .num_parents = 1, 1851 .name = "vfe_csi_clk", 1852 .ops = &clk_branch_ops, 1853 .flags = CLK_SET_RATE_PARENT, 1854 }, 1855 }, 1856 }; 1857 1858 static struct clk_branch gmem_axi_clk = { 1859 .halt_reg = 0x01d8, 1860 .halt_bit = 6, 1861 .clkr = { 1862 .enable_reg = 0x0018, 1863 .enable_mask = BIT(24), 1864 .hw.init = &(struct clk_init_data){ 1865 .name = "gmem_axi_clk", 1866 .ops = &clk_branch_ops, 1867 }, 1868 }, 1869 }; 1870 1871 static struct clk_branch ijpeg_axi_clk = { 1872 .hwcg_reg = 0x0018, 1873 .hwcg_bit = 11, 1874 .halt_reg = 0x01d8, 1875 .halt_bit = 4, 1876 .clkr = { 1877 .enable_reg = 0x0018, 1878 .enable_mask = BIT(21), 1879 .hw.init = &(struct clk_init_data){ 1880 .name = "ijpeg_axi_clk", 1881 .ops = &clk_branch_ops, 1882 }, 1883 }, 1884 }; 1885 1886 static struct clk_branch mmss_imem_axi_clk = { 1887 .hwcg_reg = 0x0018, 1888 .hwcg_bit = 15, 1889 .halt_reg = 0x01d8, 1890 .halt_bit = 7, 1891 .clkr = { 1892 .enable_reg = 0x0018, 1893 .enable_mask = BIT(22), 1894 .hw.init = &(struct clk_init_data){ 1895 .name = "mmss_imem_axi_clk", 1896 .ops = &clk_branch_ops, 1897 }, 1898 }, 1899 }; 1900 1901 static struct clk_branch jpegd_axi_clk = { 1902 .halt_reg = 0x01d8, 1903 .halt_bit = 5, 1904 .clkr = { 1905 .enable_reg = 0x0018, 1906 .enable_mask = BIT(25), 1907 .hw.init = &(struct clk_init_data){ 1908 .name = "jpegd_axi_clk", 1909 .ops = &clk_branch_ops, 1910 }, 1911 }, 1912 }; 1913 1914 static struct clk_branch vcodec_axi_b_clk = { 1915 .hwcg_reg = 0x0114, 1916 .hwcg_bit = 22, 1917 .halt_reg = 0x01e8, 1918 .halt_bit = 25, 1919 .clkr = { 1920 .enable_reg = 0x0114, 1921 .enable_mask = BIT(23), 1922 .hw.init = &(struct clk_init_data){ 1923 .name = "vcodec_axi_b_clk", 1924 .ops = &clk_branch_ops, 1925 }, 1926 }, 1927 }; 1928 1929 static struct clk_branch vcodec_axi_a_clk = { 1930 .hwcg_reg = 0x0114, 1931 .hwcg_bit = 24, 1932 .halt_reg = 0x01e8, 1933 .halt_bit = 26, 1934 .clkr = { 1935 .enable_reg = 0x0114, 1936 .enable_mask = BIT(25), 1937 .hw.init = &(struct clk_init_data){ 1938 .name = "vcodec_axi_a_clk", 1939 .ops = &clk_branch_ops, 1940 }, 1941 }, 1942 }; 1943 1944 static struct clk_branch vcodec_axi_clk = { 1945 .hwcg_reg = 0x0018, 1946 .hwcg_bit = 13, 1947 .halt_reg = 0x01d8, 1948 .halt_bit = 3, 1949 .clkr = { 1950 .enable_reg = 0x0018, 1951 .enable_mask = BIT(19), 1952 .hw.init = &(struct clk_init_data){ 1953 .name = "vcodec_axi_clk", 1954 .ops = &clk_branch_ops, 1955 }, 1956 }, 1957 }; 1958 1959 static struct clk_branch vfe_axi_clk = { 1960 .halt_reg = 0x01d8, 1961 .halt_bit = 0, 1962 .clkr = { 1963 .enable_reg = 0x0018, 1964 .enable_mask = BIT(18), 1965 .hw.init = &(struct clk_init_data){ 1966 .name = "vfe_axi_clk", 1967 .ops = &clk_branch_ops, 1968 }, 1969 }, 1970 }; 1971 1972 static struct clk_branch mdp_axi_clk = { 1973 .hwcg_reg = 0x0018, 1974 .hwcg_bit = 16, 1975 .halt_reg = 0x01d8, 1976 .halt_bit = 8, 1977 .clkr = { 1978 .enable_reg = 0x0018, 1979 .enable_mask = BIT(23), 1980 .hw.init = &(struct clk_init_data){ 1981 .name = "mdp_axi_clk", 1982 .ops = &clk_branch_ops, 1983 }, 1984 }, 1985 }; 1986 1987 static struct clk_branch rot_axi_clk = { 1988 .hwcg_reg = 0x0020, 1989 .hwcg_bit = 25, 1990 .halt_reg = 0x01d8, 1991 .halt_bit = 2, 1992 .clkr = { 1993 .enable_reg = 0x0020, 1994 .enable_mask = BIT(24), 1995 .hw.init = &(struct clk_init_data){ 1996 .name = "rot_axi_clk", 1997 .ops = &clk_branch_ops, 1998 }, 1999 }, 2000 }; 2001 2002 static struct clk_branch vcap_axi_clk = { 2003 .halt_reg = 0x0240, 2004 .halt_bit = 20, 2005 .hwcg_reg = 0x0244, 2006 .hwcg_bit = 11, 2007 .clkr = { 2008 .enable_reg = 0x0244, 2009 .enable_mask = BIT(12), 2010 .hw.init = &(struct clk_init_data){ 2011 .name = "vcap_axi_clk", 2012 .ops = &clk_branch_ops, 2013 }, 2014 }, 2015 }; 2016 2017 static struct clk_branch vpe_axi_clk = { 2018 .hwcg_reg = 0x0020, 2019 .hwcg_bit = 27, 2020 .halt_reg = 0x01d8, 2021 .halt_bit = 1, 2022 .clkr = { 2023 .enable_reg = 0x0020, 2024 .enable_mask = BIT(26), 2025 .hw.init = &(struct clk_init_data){ 2026 .name = "vpe_axi_clk", 2027 .ops = &clk_branch_ops, 2028 }, 2029 }, 2030 }; 2031 2032 static struct clk_branch gfx3d_axi_clk = { 2033 .hwcg_reg = 0x0244, 2034 .hwcg_bit = 24, 2035 .halt_reg = 0x0240, 2036 .halt_bit = 30, 2037 .clkr = { 2038 .enable_reg = 0x0244, 2039 .enable_mask = BIT(25), 2040 .hw.init = &(struct clk_init_data){ 2041 .name = "gfx3d_axi_clk", 2042 .ops = &clk_branch_ops, 2043 }, 2044 }, 2045 }; 2046 2047 static struct clk_branch amp_ahb_clk = { 2048 .halt_reg = 0x01dc, 2049 .halt_bit = 18, 2050 .clkr = { 2051 .enable_reg = 0x0008, 2052 .enable_mask = BIT(24), 2053 .hw.init = &(struct clk_init_data){ 2054 .name = "amp_ahb_clk", 2055 .ops = &clk_branch_ops, 2056 }, 2057 }, 2058 }; 2059 2060 static struct clk_branch csi_ahb_clk = { 2061 .halt_reg = 0x01dc, 2062 .halt_bit = 16, 2063 .clkr = { 2064 .enable_reg = 0x0008, 2065 .enable_mask = BIT(7), 2066 .hw.init = &(struct clk_init_data){ 2067 .name = "csi_ahb_clk", 2068 .ops = &clk_branch_ops, 2069 }, 2070 }, 2071 }; 2072 2073 static struct clk_branch dsi_m_ahb_clk = { 2074 .halt_reg = 0x01dc, 2075 .halt_bit = 19, 2076 .clkr = { 2077 .enable_reg = 0x0008, 2078 .enable_mask = BIT(9), 2079 .hw.init = &(struct clk_init_data){ 2080 .name = "dsi_m_ahb_clk", 2081 .ops = &clk_branch_ops, 2082 }, 2083 }, 2084 }; 2085 2086 static struct clk_branch dsi_s_ahb_clk = { 2087 .hwcg_reg = 0x0038, 2088 .hwcg_bit = 20, 2089 .halt_reg = 0x01dc, 2090 .halt_bit = 21, 2091 .clkr = { 2092 .enable_reg = 0x0008, 2093 .enable_mask = BIT(18), 2094 .hw.init = &(struct clk_init_data){ 2095 .name = "dsi_s_ahb_clk", 2096 .ops = &clk_branch_ops, 2097 }, 2098 }, 2099 }; 2100 2101 static struct clk_branch dsi2_m_ahb_clk = { 2102 .halt_reg = 0x01d8, 2103 .halt_bit = 18, 2104 .clkr = { 2105 .enable_reg = 0x0008, 2106 .enable_mask = BIT(17), 2107 .hw.init = &(struct clk_init_data){ 2108 .name = "dsi2_m_ahb_clk", 2109 .ops = &clk_branch_ops, 2110 }, 2111 }, 2112 }; 2113 2114 static struct clk_branch dsi2_s_ahb_clk = { 2115 .hwcg_reg = 0x0038, 2116 .hwcg_bit = 15, 2117 .halt_reg = 0x01dc, 2118 .halt_bit = 20, 2119 .clkr = { 2120 .enable_reg = 0x0008, 2121 .enable_mask = BIT(22), 2122 .hw.init = &(struct clk_init_data){ 2123 .name = "dsi2_s_ahb_clk", 2124 .ops = &clk_branch_ops, 2125 }, 2126 }, 2127 }; 2128 2129 static struct clk_rcg dsi1_src = { 2130 .ns_reg = 0x0054, 2131 .md_reg = 0x0050, 2132 .mn = { 2133 .mnctr_en_bit = 5, 2134 .mnctr_reset_bit = 7, 2135 .mnctr_mode_shift = 6, 2136 .n_val_shift = 24, 2137 .m_val_shift = 8, 2138 .width = 8, 2139 }, 2140 .p = { 2141 .pre_div_shift = 14, 2142 .pre_div_width = 2, 2143 }, 2144 .s = { 2145 .src_sel_shift = 0, 2146 .parent_map = mmcc_pxo_dsi2_dsi1_map, 2147 }, 2148 .clkr = { 2149 .enable_reg = 0x004c, 2150 .enable_mask = BIT(2), 2151 .hw.init = &(struct clk_init_data){ 2152 .name = "dsi1_src", 2153 .parent_data = mmcc_pxo_dsi2_dsi1, 2154 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1), 2155 .ops = &clk_rcg_bypass2_ops, 2156 .flags = CLK_SET_RATE_PARENT, 2157 }, 2158 }, 2159 }; 2160 2161 static struct clk_branch dsi1_clk = { 2162 .halt_reg = 0x01d0, 2163 .halt_bit = 2, 2164 .clkr = { 2165 .enable_reg = 0x004c, 2166 .enable_mask = BIT(0), 2167 .hw.init = &(struct clk_init_data){ 2168 .name = "dsi1_clk", 2169 .parent_hws = (const struct clk_hw*[]){ 2170 &dsi1_src.clkr.hw 2171 }, 2172 .num_parents = 1, 2173 .ops = &clk_branch_ops, 2174 .flags = CLK_SET_RATE_PARENT, 2175 }, 2176 }, 2177 }; 2178 2179 static struct clk_rcg dsi2_src = { 2180 .ns_reg = 0x012c, 2181 .md_reg = 0x00a8, 2182 .mn = { 2183 .mnctr_en_bit = 5, 2184 .mnctr_reset_bit = 7, 2185 .mnctr_mode_shift = 6, 2186 .n_val_shift = 24, 2187 .m_val_shift = 8, 2188 .width = 8, 2189 }, 2190 .p = { 2191 .pre_div_shift = 14, 2192 .pre_div_width = 2, 2193 }, 2194 .s = { 2195 .src_sel_shift = 0, 2196 .parent_map = mmcc_pxo_dsi2_dsi1_map, 2197 }, 2198 .clkr = { 2199 .enable_reg = 0x003c, 2200 .enable_mask = BIT(2), 2201 .hw.init = &(struct clk_init_data){ 2202 .name = "dsi2_src", 2203 .parent_data = mmcc_pxo_dsi2_dsi1, 2204 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1), 2205 .ops = &clk_rcg_bypass2_ops, 2206 .flags = CLK_SET_RATE_PARENT, 2207 }, 2208 }, 2209 }; 2210 2211 static struct clk_branch dsi2_clk = { 2212 .halt_reg = 0x01d0, 2213 .halt_bit = 20, 2214 .clkr = { 2215 .enable_reg = 0x003c, 2216 .enable_mask = BIT(0), 2217 .hw.init = &(struct clk_init_data){ 2218 .name = "dsi2_clk", 2219 .parent_hws = (const struct clk_hw*[]){ 2220 &dsi2_src.clkr.hw 2221 }, 2222 .num_parents = 1, 2223 .ops = &clk_branch_ops, 2224 .flags = CLK_SET_RATE_PARENT, 2225 }, 2226 }, 2227 }; 2228 2229 static struct clk_rcg dsi1_byte_src = { 2230 .ns_reg = 0x00b0, 2231 .p = { 2232 .pre_div_shift = 12, 2233 .pre_div_width = 4, 2234 }, 2235 .s = { 2236 .src_sel_shift = 0, 2237 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map, 2238 }, 2239 .clkr = { 2240 .enable_reg = 0x0090, 2241 .enable_mask = BIT(2), 2242 .hw.init = &(struct clk_init_data){ 2243 .name = "dsi1_byte_src", 2244 .parent_data = mmcc_pxo_dsi1_dsi2_byte, 2245 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte), 2246 .ops = &clk_rcg_bypass2_ops, 2247 .flags = CLK_SET_RATE_PARENT, 2248 }, 2249 }, 2250 }; 2251 2252 static struct clk_branch dsi1_byte_clk = { 2253 .halt_reg = 0x01cc, 2254 .halt_bit = 21, 2255 .clkr = { 2256 .enable_reg = 0x0090, 2257 .enable_mask = BIT(0), 2258 .hw.init = &(struct clk_init_data){ 2259 .name = "dsi1_byte_clk", 2260 .parent_hws = (const struct clk_hw*[]){ 2261 &dsi1_byte_src.clkr.hw 2262 }, 2263 .num_parents = 1, 2264 .ops = &clk_branch_ops, 2265 .flags = CLK_SET_RATE_PARENT, 2266 }, 2267 }, 2268 }; 2269 2270 static struct clk_rcg dsi2_byte_src = { 2271 .ns_reg = 0x012c, 2272 .p = { 2273 .pre_div_shift = 12, 2274 .pre_div_width = 4, 2275 }, 2276 .s = { 2277 .src_sel_shift = 0, 2278 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map, 2279 }, 2280 .clkr = { 2281 .enable_reg = 0x0130, 2282 .enable_mask = BIT(2), 2283 .hw.init = &(struct clk_init_data){ 2284 .name = "dsi2_byte_src", 2285 .parent_data = mmcc_pxo_dsi1_dsi2_byte, 2286 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte), 2287 .ops = &clk_rcg_bypass2_ops, 2288 .flags = CLK_SET_RATE_PARENT, 2289 }, 2290 }, 2291 }; 2292 2293 static struct clk_branch dsi2_byte_clk = { 2294 .halt_reg = 0x01cc, 2295 .halt_bit = 20, 2296 .clkr = { 2297 .enable_reg = 0x00b4, 2298 .enable_mask = BIT(0), 2299 .hw.init = &(struct clk_init_data){ 2300 .name = "dsi2_byte_clk", 2301 .parent_hws = (const struct clk_hw*[]){ 2302 &dsi2_byte_src.clkr.hw 2303 }, 2304 .num_parents = 1, 2305 .ops = &clk_branch_ops, 2306 .flags = CLK_SET_RATE_PARENT, 2307 }, 2308 }, 2309 }; 2310 2311 static struct clk_rcg dsi1_esc_src = { 2312 .ns_reg = 0x0011c, 2313 .p = { 2314 .pre_div_shift = 12, 2315 .pre_div_width = 4, 2316 }, 2317 .s = { 2318 .src_sel_shift = 0, 2319 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map, 2320 }, 2321 .clkr = { 2322 .enable_reg = 0x00cc, 2323 .enable_mask = BIT(2), 2324 .hw.init = &(struct clk_init_data){ 2325 .name = "dsi1_esc_src", 2326 .parent_data = mmcc_pxo_dsi1_dsi2_byte, 2327 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte), 2328 .ops = &clk_rcg_esc_ops, 2329 }, 2330 }, 2331 }; 2332 2333 static struct clk_branch dsi1_esc_clk = { 2334 .halt_reg = 0x01e8, 2335 .halt_bit = 1, 2336 .clkr = { 2337 .enable_reg = 0x00cc, 2338 .enable_mask = BIT(0), 2339 .hw.init = &(struct clk_init_data){ 2340 .name = "dsi1_esc_clk", 2341 .parent_hws = (const struct clk_hw*[]){ 2342 &dsi1_esc_src.clkr.hw 2343 }, 2344 .num_parents = 1, 2345 .ops = &clk_branch_ops, 2346 .flags = CLK_SET_RATE_PARENT, 2347 }, 2348 }, 2349 }; 2350 2351 static struct clk_rcg dsi2_esc_src = { 2352 .ns_reg = 0x0150, 2353 .p = { 2354 .pre_div_shift = 12, 2355 .pre_div_width = 4, 2356 }, 2357 .s = { 2358 .src_sel_shift = 0, 2359 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map, 2360 }, 2361 .clkr = { 2362 .enable_reg = 0x013c, 2363 .enable_mask = BIT(2), 2364 .hw.init = &(struct clk_init_data){ 2365 .name = "dsi2_esc_src", 2366 .parent_data = mmcc_pxo_dsi1_dsi2_byte, 2367 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte), 2368 .ops = &clk_rcg_esc_ops, 2369 }, 2370 }, 2371 }; 2372 2373 static struct clk_branch dsi2_esc_clk = { 2374 .halt_reg = 0x01e8, 2375 .halt_bit = 3, 2376 .clkr = { 2377 .enable_reg = 0x013c, 2378 .enable_mask = BIT(0), 2379 .hw.init = &(struct clk_init_data){ 2380 .name = "dsi2_esc_clk", 2381 .parent_hws = (const struct clk_hw*[]){ 2382 &dsi2_esc_src.clkr.hw 2383 }, 2384 .num_parents = 1, 2385 .ops = &clk_branch_ops, 2386 .flags = CLK_SET_RATE_PARENT, 2387 }, 2388 }, 2389 }; 2390 2391 static struct clk_rcg dsi1_pixel_src = { 2392 .ns_reg = 0x0138, 2393 .md_reg = 0x0134, 2394 .mn = { 2395 .mnctr_en_bit = 5, 2396 .mnctr_reset_bit = 7, 2397 .mnctr_mode_shift = 6, 2398 .n_val_shift = 16, 2399 .m_val_shift = 8, 2400 .width = 8, 2401 }, 2402 .p = { 2403 .pre_div_shift = 12, 2404 .pre_div_width = 4, 2405 }, 2406 .s = { 2407 .src_sel_shift = 0, 2408 .parent_map = mmcc_pxo_dsi2_dsi1_map, 2409 }, 2410 .clkr = { 2411 .enable_reg = 0x0130, 2412 .enable_mask = BIT(2), 2413 .hw.init = &(struct clk_init_data){ 2414 .name = "dsi1_pixel_src", 2415 .parent_data = mmcc_pxo_dsi2_dsi1, 2416 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1), 2417 .ops = &clk_rcg_pixel_ops, 2418 }, 2419 }, 2420 }; 2421 2422 static struct clk_branch dsi1_pixel_clk = { 2423 .halt_reg = 0x01d0, 2424 .halt_bit = 6, 2425 .clkr = { 2426 .enable_reg = 0x0130, 2427 .enable_mask = BIT(0), 2428 .hw.init = &(struct clk_init_data){ 2429 .name = "mdp_pclk1_clk", 2430 .parent_hws = (const struct clk_hw*[]){ 2431 &dsi1_pixel_src.clkr.hw 2432 }, 2433 .num_parents = 1, 2434 .ops = &clk_branch_ops, 2435 .flags = CLK_SET_RATE_PARENT, 2436 }, 2437 }, 2438 }; 2439 2440 static struct clk_rcg dsi2_pixel_src = { 2441 .ns_reg = 0x00e4, 2442 .md_reg = 0x00b8, 2443 .mn = { 2444 .mnctr_en_bit = 5, 2445 .mnctr_reset_bit = 7, 2446 .mnctr_mode_shift = 6, 2447 .n_val_shift = 16, 2448 .m_val_shift = 8, 2449 .width = 8, 2450 }, 2451 .p = { 2452 .pre_div_shift = 12, 2453 .pre_div_width = 4, 2454 }, 2455 .s = { 2456 .src_sel_shift = 0, 2457 .parent_map = mmcc_pxo_dsi2_dsi1_lvds_map, 2458 }, 2459 .clkr = { 2460 .enable_reg = 0x0094, 2461 .enable_mask = BIT(2), 2462 .hw.init = &(struct clk_init_data){ 2463 .name = "dsi2_pixel_src", 2464 .parent_data = mmcc_pxo_dsi2_dsi1_lvds, 2465 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1_lvds), 2466 .ops = &clk_rcg_pixel_ops, 2467 }, 2468 }, 2469 }; 2470 2471 static struct clk_branch dsi2_pixel_lvds_src = { 2472 .clkr = { 2473 .enable_reg = 0x0094, 2474 .enable_mask = BIT(0), 2475 .hw.init = &(struct clk_init_data){ 2476 .name = "dsi2_pixel_lvds_src", 2477 .parent_hws = (const struct clk_hw*[]){ 2478 &dsi2_pixel_src.clkr.hw 2479 }, 2480 .num_parents = 1, 2481 .ops = &clk_branch_simple_ops, 2482 .flags = CLK_SET_RATE_PARENT, 2483 }, 2484 }, 2485 }; 2486 2487 static struct clk_branch dsi2_pixel_clk = { 2488 .halt_reg = 0x01d0, 2489 .halt_bit = 19, 2490 .clkr = { 2491 .enable_reg = 0x0094, 2492 .enable_mask = 0, 2493 .hw.init = &(struct clk_init_data){ 2494 .name = "mdp_pclk2_clk", 2495 .parent_hws = (const struct clk_hw*[]){ 2496 &dsi2_pixel_src.clkr.hw 2497 }, 2498 .num_parents = 1, 2499 .ops = &clk_branch_ops, 2500 .flags = CLK_SET_RATE_PARENT, 2501 }, 2502 }, 2503 }; 2504 2505 static struct clk_branch lvds_clk = { 2506 .halt_reg = 0x024c, 2507 .halt_bit = 6, 2508 .clkr = { 2509 .enable_reg = 0x0264, 2510 .enable_mask = BIT(1), 2511 .hw.init = &(struct clk_init_data){ 2512 .name = "mdp_lvds_clk", 2513 .parent_hws = (const struct clk_hw*[]){ 2514 &dsi2_pixel_lvds_src.clkr.hw 2515 }, 2516 .num_parents = 1, 2517 .ops = &clk_branch_ops, 2518 .flags = CLK_SET_RATE_PARENT, 2519 }, 2520 }, 2521 }; 2522 2523 static struct clk_branch gfx2d0_ahb_clk = { 2524 .hwcg_reg = 0x0038, 2525 .hwcg_bit = 28, 2526 .halt_reg = 0x01dc, 2527 .halt_bit = 2, 2528 .clkr = { 2529 .enable_reg = 0x0008, 2530 .enable_mask = BIT(19), 2531 .hw.init = &(struct clk_init_data){ 2532 .name = "gfx2d0_ahb_clk", 2533 .ops = &clk_branch_ops, 2534 }, 2535 }, 2536 }; 2537 2538 static struct clk_branch gfx2d1_ahb_clk = { 2539 .hwcg_reg = 0x0038, 2540 .hwcg_bit = 29, 2541 .halt_reg = 0x01dc, 2542 .halt_bit = 3, 2543 .clkr = { 2544 .enable_reg = 0x0008, 2545 .enable_mask = BIT(2), 2546 .hw.init = &(struct clk_init_data){ 2547 .name = "gfx2d1_ahb_clk", 2548 .ops = &clk_branch_ops, 2549 }, 2550 }, 2551 }; 2552 2553 static struct clk_branch gfx3d_ahb_clk = { 2554 .hwcg_reg = 0x0038, 2555 .hwcg_bit = 27, 2556 .halt_reg = 0x01dc, 2557 .halt_bit = 4, 2558 .clkr = { 2559 .enable_reg = 0x0008, 2560 .enable_mask = BIT(3), 2561 .hw.init = &(struct clk_init_data){ 2562 .name = "gfx3d_ahb_clk", 2563 .ops = &clk_branch_ops, 2564 }, 2565 }, 2566 }; 2567 2568 static struct clk_branch hdmi_m_ahb_clk = { 2569 .hwcg_reg = 0x0038, 2570 .hwcg_bit = 21, 2571 .halt_reg = 0x01dc, 2572 .halt_bit = 5, 2573 .clkr = { 2574 .enable_reg = 0x0008, 2575 .enable_mask = BIT(14), 2576 .hw.init = &(struct clk_init_data){ 2577 .name = "hdmi_m_ahb_clk", 2578 .ops = &clk_branch_ops, 2579 }, 2580 }, 2581 }; 2582 2583 static struct clk_branch hdmi_s_ahb_clk = { 2584 .hwcg_reg = 0x0038, 2585 .hwcg_bit = 22, 2586 .halt_reg = 0x01dc, 2587 .halt_bit = 6, 2588 .clkr = { 2589 .enable_reg = 0x0008, 2590 .enable_mask = BIT(4), 2591 .hw.init = &(struct clk_init_data){ 2592 .name = "hdmi_s_ahb_clk", 2593 .ops = &clk_branch_ops, 2594 }, 2595 }, 2596 }; 2597 2598 static struct clk_branch ijpeg_ahb_clk = { 2599 .halt_reg = 0x01dc, 2600 .halt_bit = 9, 2601 .clkr = { 2602 .enable_reg = 0x0008, 2603 .enable_mask = BIT(5), 2604 .hw.init = &(struct clk_init_data){ 2605 .name = "ijpeg_ahb_clk", 2606 .ops = &clk_branch_ops, 2607 }, 2608 }, 2609 }; 2610 2611 static struct clk_branch mmss_imem_ahb_clk = { 2612 .hwcg_reg = 0x0038, 2613 .hwcg_bit = 12, 2614 .halt_reg = 0x01dc, 2615 .halt_bit = 10, 2616 .clkr = { 2617 .enable_reg = 0x0008, 2618 .enable_mask = BIT(6), 2619 .hw.init = &(struct clk_init_data){ 2620 .name = "mmss_imem_ahb_clk", 2621 .ops = &clk_branch_ops, 2622 }, 2623 }, 2624 }; 2625 2626 static struct clk_branch jpegd_ahb_clk = { 2627 .halt_reg = 0x01dc, 2628 .halt_bit = 7, 2629 .clkr = { 2630 .enable_reg = 0x0008, 2631 .enable_mask = BIT(21), 2632 .hw.init = &(struct clk_init_data){ 2633 .name = "jpegd_ahb_clk", 2634 .ops = &clk_branch_ops, 2635 }, 2636 }, 2637 }; 2638 2639 static struct clk_branch mdp_ahb_clk = { 2640 .halt_reg = 0x01dc, 2641 .halt_bit = 11, 2642 .clkr = { 2643 .enable_reg = 0x0008, 2644 .enable_mask = BIT(10), 2645 .hw.init = &(struct clk_init_data){ 2646 .name = "mdp_ahb_clk", 2647 .ops = &clk_branch_ops, 2648 }, 2649 }, 2650 }; 2651 2652 static struct clk_branch rot_ahb_clk = { 2653 .halt_reg = 0x01dc, 2654 .halt_bit = 13, 2655 .clkr = { 2656 .enable_reg = 0x0008, 2657 .enable_mask = BIT(12), 2658 .hw.init = &(struct clk_init_data){ 2659 .name = "rot_ahb_clk", 2660 .ops = &clk_branch_ops, 2661 }, 2662 }, 2663 }; 2664 2665 static struct clk_branch smmu_ahb_clk = { 2666 .hwcg_reg = 0x0008, 2667 .hwcg_bit = 26, 2668 .halt_reg = 0x01dc, 2669 .halt_bit = 22, 2670 .clkr = { 2671 .enable_reg = 0x0008, 2672 .enable_mask = BIT(15), 2673 .hw.init = &(struct clk_init_data){ 2674 .name = "smmu_ahb_clk", 2675 .ops = &clk_branch_ops, 2676 }, 2677 }, 2678 }; 2679 2680 static struct clk_branch tv_enc_ahb_clk = { 2681 .halt_reg = 0x01dc, 2682 .halt_bit = 23, 2683 .clkr = { 2684 .enable_reg = 0x0008, 2685 .enable_mask = BIT(25), 2686 .hw.init = &(struct clk_init_data){ 2687 .name = "tv_enc_ahb_clk", 2688 .ops = &clk_branch_ops, 2689 }, 2690 }, 2691 }; 2692 2693 static struct clk_branch vcap_ahb_clk = { 2694 .halt_reg = 0x0240, 2695 .halt_bit = 23, 2696 .clkr = { 2697 .enable_reg = 0x0248, 2698 .enable_mask = BIT(1), 2699 .hw.init = &(struct clk_init_data){ 2700 .name = "vcap_ahb_clk", 2701 .ops = &clk_branch_ops, 2702 }, 2703 }, 2704 }; 2705 2706 static struct clk_branch vcodec_ahb_clk = { 2707 .hwcg_reg = 0x0038, 2708 .hwcg_bit = 26, 2709 .halt_reg = 0x01dc, 2710 .halt_bit = 12, 2711 .clkr = { 2712 .enable_reg = 0x0008, 2713 .enable_mask = BIT(11), 2714 .hw.init = &(struct clk_init_data){ 2715 .name = "vcodec_ahb_clk", 2716 .ops = &clk_branch_ops, 2717 }, 2718 }, 2719 }; 2720 2721 static struct clk_branch vfe_ahb_clk = { 2722 .halt_reg = 0x01dc, 2723 .halt_bit = 14, 2724 .clkr = { 2725 .enable_reg = 0x0008, 2726 .enable_mask = BIT(13), 2727 .hw.init = &(struct clk_init_data){ 2728 .name = "vfe_ahb_clk", 2729 .ops = &clk_branch_ops, 2730 }, 2731 }, 2732 }; 2733 2734 static struct clk_branch vpe_ahb_clk = { 2735 .halt_reg = 0x01dc, 2736 .halt_bit = 15, 2737 .clkr = { 2738 .enable_reg = 0x0008, 2739 .enable_mask = BIT(16), 2740 .hw.init = &(struct clk_init_data){ 2741 .name = "vpe_ahb_clk", 2742 .ops = &clk_branch_ops, 2743 }, 2744 }, 2745 }; 2746 2747 static struct clk_regmap *mmcc_msm8960_clks[] = { 2748 [TV_ENC_AHB_CLK] = &tv_enc_ahb_clk.clkr, 2749 [AMP_AHB_CLK] = &_ahb_clk.clkr, 2750 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr, 2751 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr, 2752 [GFX2D0_AHB_CLK] = &gfx2d0_ahb_clk.clkr, 2753 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr, 2754 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr, 2755 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr, 2756 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr, 2757 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr, 2758 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr, 2759 [ROT_AHB_CLK] = &rot_ahb_clk.clkr, 2760 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr, 2761 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr, 2762 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr, 2763 [CSI_AHB_CLK] = &csi_ahb_clk.clkr, 2764 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr, 2765 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr, 2766 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr, 2767 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr, 2768 [GFX2D1_AHB_CLK] = &gfx2d1_ahb_clk.clkr, 2769 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr, 2770 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr, 2771 [MDP_AXI_CLK] = &mdp_axi_clk.clkr, 2772 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr, 2773 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr, 2774 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr, 2775 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr, 2776 [VFE_AXI_CLK] = &vfe_axi_clk.clkr, 2777 [VPE_AXI_CLK] = &vpe_axi_clk.clkr, 2778 [ROT_AXI_CLK] = &rot_axi_clk.clkr, 2779 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr, 2780 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr, 2781 [CSI0_SRC] = &csi0_src.clkr, 2782 [CSI0_CLK] = &csi0_clk.clkr, 2783 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr, 2784 [CSI1_SRC] = &csi1_src.clkr, 2785 [CSI1_CLK] = &csi1_clk.clkr, 2786 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr, 2787 [CSI2_SRC] = &csi2_src.clkr, 2788 [CSI2_CLK] = &csi2_clk.clkr, 2789 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr, 2790 [DSI_SRC] = &dsi1_src.clkr, 2791 [DSI_CLK] = &dsi1_clk.clkr, 2792 [CSI_PIX_CLK] = &csi_pix_clk.clkr, 2793 [CSI_RDI_CLK] = &csi_rdi_clk.clkr, 2794 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr, 2795 [HDMI_APP_CLK] = &hdmi_app_clk.clkr, 2796 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr, 2797 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr, 2798 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr, 2799 [GFX2D0_SRC] = &gfx2d0_src.clkr, 2800 [GFX2D0_CLK] = &gfx2d0_clk.clkr, 2801 [GFX2D1_SRC] = &gfx2d1_src.clkr, 2802 [GFX2D1_CLK] = &gfx2d1_clk.clkr, 2803 [GFX3D_SRC] = &gfx3d_src.clkr, 2804 [GFX3D_CLK] = &gfx3d_clk.clkr, 2805 [IJPEG_SRC] = &ijpeg_src.clkr, 2806 [IJPEG_CLK] = &ijpeg_clk.clkr, 2807 [JPEGD_SRC] = &jpegd_src.clkr, 2808 [JPEGD_CLK] = &jpegd_clk.clkr, 2809 [MDP_SRC] = &mdp_src.clkr, 2810 [MDP_CLK] = &mdp_clk.clkr, 2811 [MDP_LUT_CLK] = &mdp_lut_clk.clkr, 2812 [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr, 2813 [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr, 2814 [DSI2_SRC] = &dsi2_src.clkr, 2815 [DSI2_CLK] = &dsi2_clk.clkr, 2816 [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr, 2817 [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr, 2818 [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr, 2819 [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr, 2820 [DSI1_ESC_SRC] = &dsi1_esc_src.clkr, 2821 [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr, 2822 [DSI2_ESC_SRC] = &dsi2_esc_src.clkr, 2823 [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr, 2824 [ROT_SRC] = &rot_src.clkr, 2825 [ROT_CLK] = &rot_clk.clkr, 2826 [TV_ENC_CLK] = &tv_enc_clk.clkr, 2827 [TV_DAC_CLK] = &tv_dac_clk.clkr, 2828 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr, 2829 [MDP_TV_CLK] = &mdp_tv_clk.clkr, 2830 [TV_SRC] = &tv_src.clkr, 2831 [VCODEC_SRC] = &vcodec_src.clkr, 2832 [VCODEC_CLK] = &vcodec_clk.clkr, 2833 [VFE_SRC] = &vfe_src.clkr, 2834 [VFE_CLK] = &vfe_clk.clkr, 2835 [VFE_CSI_CLK] = &vfe_csi_clk.clkr, 2836 [VPE_SRC] = &vpe_src.clkr, 2837 [VPE_CLK] = &vpe_clk.clkr, 2838 [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr, 2839 [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr, 2840 [CAMCLK0_SRC] = &camclk0_src.clkr, 2841 [CAMCLK0_CLK] = &camclk0_clk.clkr, 2842 [CAMCLK1_SRC] = &camclk1_src.clkr, 2843 [CAMCLK1_CLK] = &camclk1_clk.clkr, 2844 [CAMCLK2_SRC] = &camclk2_src.clkr, 2845 [CAMCLK2_CLK] = &camclk2_clk.clkr, 2846 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr, 2847 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr, 2848 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr, 2849 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr, 2850 [PLL2] = &pll2.clkr, 2851 [DSI2_PIXEL_LVDS_SRC] = &dsi2_pixel_lvds_src.clkr, 2852 [LVDS_CLK] = &lvds_clk.clkr, 2853 }; 2854 2855 static const struct qcom_reset_map mmcc_msm8960_resets[] = { 2856 [VPE_AXI_RESET] = { 0x0208, 15 }, 2857 [IJPEG_AXI_RESET] = { 0x0208, 14 }, 2858 [MPD_AXI_RESET] = { 0x0208, 13 }, 2859 [VFE_AXI_RESET] = { 0x0208, 9 }, 2860 [SP_AXI_RESET] = { 0x0208, 8 }, 2861 [VCODEC_AXI_RESET] = { 0x0208, 7 }, 2862 [ROT_AXI_RESET] = { 0x0208, 6 }, 2863 [VCODEC_AXI_A_RESET] = { 0x0208, 5 }, 2864 [VCODEC_AXI_B_RESET] = { 0x0208, 4 }, 2865 [FAB_S3_AXI_RESET] = { 0x0208, 3 }, 2866 [FAB_S2_AXI_RESET] = { 0x0208, 2 }, 2867 [FAB_S1_AXI_RESET] = { 0x0208, 1 }, 2868 [FAB_S0_AXI_RESET] = { 0x0208 }, 2869 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 }, 2870 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 }, 2871 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 }, 2872 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 }, 2873 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 }, 2874 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 }, 2875 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 }, 2876 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 }, 2877 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 }, 2878 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 }, 2879 [SMMU_GFX2D0_AHB_RESET] = { 0x020c, 21 }, 2880 [SMMU_GFX2D1_AHB_RESET] = { 0x020c, 20 }, 2881 [APU_AHB_RESET] = { 0x020c, 18 }, 2882 [CSI_AHB_RESET] = { 0x020c, 17 }, 2883 [TV_ENC_AHB_RESET] = { 0x020c, 15 }, 2884 [VPE_AHB_RESET] = { 0x020c, 14 }, 2885 [FABRIC_AHB_RESET] = { 0x020c, 13 }, 2886 [GFX2D0_AHB_RESET] = { 0x020c, 12 }, 2887 [GFX2D1_AHB_RESET] = { 0x020c, 11 }, 2888 [GFX3D_AHB_RESET] = { 0x020c, 10 }, 2889 [HDMI_AHB_RESET] = { 0x020c, 9 }, 2890 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 }, 2891 [IJPEG_AHB_RESET] = { 0x020c, 7 }, 2892 [DSI_M_AHB_RESET] = { 0x020c, 6 }, 2893 [DSI_S_AHB_RESET] = { 0x020c, 5 }, 2894 [JPEGD_AHB_RESET] = { 0x020c, 4 }, 2895 [MDP_AHB_RESET] = { 0x020c, 3 }, 2896 [ROT_AHB_RESET] = { 0x020c, 2 }, 2897 [VCODEC_AHB_RESET] = { 0x020c, 1 }, 2898 [VFE_AHB_RESET] = { 0x020c, 0 }, 2899 [DSI2_M_AHB_RESET] = { 0x0210, 31 }, 2900 [DSI2_S_AHB_RESET] = { 0x0210, 30 }, 2901 [CSIPHY2_RESET] = { 0x0210, 29 }, 2902 [CSI_PIX1_RESET] = { 0x0210, 28 }, 2903 [CSIPHY0_RESET] = { 0x0210, 27 }, 2904 [CSIPHY1_RESET] = { 0x0210, 26 }, 2905 [DSI2_RESET] = { 0x0210, 25 }, 2906 [VFE_CSI_RESET] = { 0x0210, 24 }, 2907 [MDP_RESET] = { 0x0210, 21 }, 2908 [AMP_RESET] = { 0x0210, 20 }, 2909 [JPEGD_RESET] = { 0x0210, 19 }, 2910 [CSI1_RESET] = { 0x0210, 18 }, 2911 [VPE_RESET] = { 0x0210, 17 }, 2912 [MMSS_FABRIC_RESET] = { 0x0210, 16 }, 2913 [VFE_RESET] = { 0x0210, 15 }, 2914 [GFX2D0_RESET] = { 0x0210, 14 }, 2915 [GFX2D1_RESET] = { 0x0210, 13 }, 2916 [GFX3D_RESET] = { 0x0210, 12 }, 2917 [HDMI_RESET] = { 0x0210, 11 }, 2918 [MMSS_IMEM_RESET] = { 0x0210, 10 }, 2919 [IJPEG_RESET] = { 0x0210, 9 }, 2920 [CSI0_RESET] = { 0x0210, 8 }, 2921 [DSI_RESET] = { 0x0210, 7 }, 2922 [VCODEC_RESET] = { 0x0210, 6 }, 2923 [MDP_TV_RESET] = { 0x0210, 4 }, 2924 [MDP_VSYNC_RESET] = { 0x0210, 3 }, 2925 [ROT_RESET] = { 0x0210, 2 }, 2926 [TV_HDMI_RESET] = { 0x0210, 1 }, 2927 [TV_ENC_RESET] = { 0x0210 }, 2928 [CSI2_RESET] = { 0x0214, 2 }, 2929 [CSI_RDI1_RESET] = { 0x0214, 1 }, 2930 [CSI_RDI2_RESET] = { 0x0214 }, 2931 }; 2932 2933 static struct clk_regmap *mmcc_apq8064_clks[] = { 2934 [AMP_AHB_CLK] = &_ahb_clk.clkr, 2935 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr, 2936 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr, 2937 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr, 2938 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr, 2939 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr, 2940 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr, 2941 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr, 2942 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr, 2943 [ROT_AHB_CLK] = &rot_ahb_clk.clkr, 2944 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr, 2945 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr, 2946 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr, 2947 [CSI_AHB_CLK] = &csi_ahb_clk.clkr, 2948 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr, 2949 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr, 2950 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr, 2951 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr, 2952 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr, 2953 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr, 2954 [MDP_AXI_CLK] = &mdp_axi_clk.clkr, 2955 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr, 2956 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr, 2957 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr, 2958 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr, 2959 [VFE_AXI_CLK] = &vfe_axi_clk.clkr, 2960 [VPE_AXI_CLK] = &vpe_axi_clk.clkr, 2961 [ROT_AXI_CLK] = &rot_axi_clk.clkr, 2962 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr, 2963 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr, 2964 [CSI0_SRC] = &csi0_src.clkr, 2965 [CSI0_CLK] = &csi0_clk.clkr, 2966 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr, 2967 [CSI1_SRC] = &csi1_src.clkr, 2968 [CSI1_CLK] = &csi1_clk.clkr, 2969 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr, 2970 [CSI2_SRC] = &csi2_src.clkr, 2971 [CSI2_CLK] = &csi2_clk.clkr, 2972 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr, 2973 [DSI_SRC] = &dsi1_src.clkr, 2974 [DSI_CLK] = &dsi1_clk.clkr, 2975 [CSI_PIX_CLK] = &csi_pix_clk.clkr, 2976 [CSI_RDI_CLK] = &csi_rdi_clk.clkr, 2977 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr, 2978 [HDMI_APP_CLK] = &hdmi_app_clk.clkr, 2979 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr, 2980 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr, 2981 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr, 2982 [GFX3D_SRC] = &gfx3d_src.clkr, 2983 [GFX3D_CLK] = &gfx3d_clk.clkr, 2984 [IJPEG_SRC] = &ijpeg_src.clkr, 2985 [IJPEG_CLK] = &ijpeg_clk.clkr, 2986 [JPEGD_SRC] = &jpegd_src.clkr, 2987 [JPEGD_CLK] = &jpegd_clk.clkr, 2988 [MDP_SRC] = &mdp_src.clkr, 2989 [MDP_CLK] = &mdp_clk.clkr, 2990 [MDP_LUT_CLK] = &mdp_lut_clk.clkr, 2991 [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr, 2992 [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr, 2993 [DSI2_SRC] = &dsi2_src.clkr, 2994 [DSI2_CLK] = &dsi2_clk.clkr, 2995 [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr, 2996 [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr, 2997 [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr, 2998 [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr, 2999 [DSI1_ESC_SRC] = &dsi1_esc_src.clkr, 3000 [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr, 3001 [DSI2_ESC_SRC] = &dsi2_esc_src.clkr, 3002 [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr, 3003 [ROT_SRC] = &rot_src.clkr, 3004 [ROT_CLK] = &rot_clk.clkr, 3005 [TV_DAC_CLK] = &tv_dac_clk.clkr, 3006 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr, 3007 [MDP_TV_CLK] = &mdp_tv_clk.clkr, 3008 [TV_SRC] = &tv_src.clkr, 3009 [VCODEC_SRC] = &vcodec_src.clkr, 3010 [VCODEC_CLK] = &vcodec_clk.clkr, 3011 [VFE_SRC] = &vfe_src.clkr, 3012 [VFE_CLK] = &vfe_clk.clkr, 3013 [VFE_CSI_CLK] = &vfe_csi_clk.clkr, 3014 [VPE_SRC] = &vpe_src.clkr, 3015 [VPE_CLK] = &vpe_clk.clkr, 3016 [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr, 3017 [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr, 3018 [CAMCLK0_SRC] = &camclk0_src.clkr, 3019 [CAMCLK0_CLK] = &camclk0_clk.clkr, 3020 [CAMCLK1_SRC] = &camclk1_src.clkr, 3021 [CAMCLK1_CLK] = &camclk1_clk.clkr, 3022 [CAMCLK2_SRC] = &camclk2_src.clkr, 3023 [CAMCLK2_CLK] = &camclk2_clk.clkr, 3024 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr, 3025 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr, 3026 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr, 3027 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr, 3028 [PLL2] = &pll2.clkr, 3029 [RGB_TV_CLK] = &rgb_tv_clk.clkr, 3030 [NPL_TV_CLK] = &npl_tv_clk.clkr, 3031 [VCAP_AHB_CLK] = &vcap_ahb_clk.clkr, 3032 [VCAP_AXI_CLK] = &vcap_axi_clk.clkr, 3033 [VCAP_SRC] = &vcap_src.clkr, 3034 [VCAP_CLK] = &vcap_clk.clkr, 3035 [VCAP_NPL_CLK] = &vcap_npl_clk.clkr, 3036 [PLL15] = &pll15.clkr, 3037 [DSI2_PIXEL_LVDS_SRC] = &dsi2_pixel_lvds_src.clkr, 3038 [LVDS_CLK] = &lvds_clk.clkr, 3039 }; 3040 3041 static const struct qcom_reset_map mmcc_apq8064_resets[] = { 3042 [GFX3D_AXI_RESET] = { 0x0208, 17 }, 3043 [VCAP_AXI_RESET] = { 0x0208, 16 }, 3044 [VPE_AXI_RESET] = { 0x0208, 15 }, 3045 [IJPEG_AXI_RESET] = { 0x0208, 14 }, 3046 [MPD_AXI_RESET] = { 0x0208, 13 }, 3047 [VFE_AXI_RESET] = { 0x0208, 9 }, 3048 [SP_AXI_RESET] = { 0x0208, 8 }, 3049 [VCODEC_AXI_RESET] = { 0x0208, 7 }, 3050 [ROT_AXI_RESET] = { 0x0208, 6 }, 3051 [VCODEC_AXI_A_RESET] = { 0x0208, 5 }, 3052 [VCODEC_AXI_B_RESET] = { 0x0208, 4 }, 3053 [FAB_S3_AXI_RESET] = { 0x0208, 3 }, 3054 [FAB_S2_AXI_RESET] = { 0x0208, 2 }, 3055 [FAB_S1_AXI_RESET] = { 0x0208, 1 }, 3056 [FAB_S0_AXI_RESET] = { 0x0208 }, 3057 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 }, 3058 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 }, 3059 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 }, 3060 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 }, 3061 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 }, 3062 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 }, 3063 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 }, 3064 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 }, 3065 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 }, 3066 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 }, 3067 [APU_AHB_RESET] = { 0x020c, 18 }, 3068 [CSI_AHB_RESET] = { 0x020c, 17 }, 3069 [TV_ENC_AHB_RESET] = { 0x020c, 15 }, 3070 [VPE_AHB_RESET] = { 0x020c, 14 }, 3071 [FABRIC_AHB_RESET] = { 0x020c, 13 }, 3072 [GFX3D_AHB_RESET] = { 0x020c, 10 }, 3073 [HDMI_AHB_RESET] = { 0x020c, 9 }, 3074 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 }, 3075 [IJPEG_AHB_RESET] = { 0x020c, 7 }, 3076 [DSI_M_AHB_RESET] = { 0x020c, 6 }, 3077 [DSI_S_AHB_RESET] = { 0x020c, 5 }, 3078 [JPEGD_AHB_RESET] = { 0x020c, 4 }, 3079 [MDP_AHB_RESET] = { 0x020c, 3 }, 3080 [ROT_AHB_RESET] = { 0x020c, 2 }, 3081 [VCODEC_AHB_RESET] = { 0x020c, 1 }, 3082 [VFE_AHB_RESET] = { 0x020c, 0 }, 3083 [SMMU_VCAP_AHB_RESET] = { 0x0200, 3 }, 3084 [VCAP_AHB_RESET] = { 0x0200, 2 }, 3085 [DSI2_M_AHB_RESET] = { 0x0200, 1 }, 3086 [DSI2_S_AHB_RESET] = { 0x0200, 0 }, 3087 [CSIPHY2_RESET] = { 0x0210, 31 }, 3088 [CSI_PIX1_RESET] = { 0x0210, 30 }, 3089 [CSIPHY0_RESET] = { 0x0210, 29 }, 3090 [CSIPHY1_RESET] = { 0x0210, 28 }, 3091 [CSI_RDI_RESET] = { 0x0210, 27 }, 3092 [CSI_PIX_RESET] = { 0x0210, 26 }, 3093 [DSI2_RESET] = { 0x0210, 25 }, 3094 [VFE_CSI_RESET] = { 0x0210, 24 }, 3095 [MDP_RESET] = { 0x0210, 21 }, 3096 [AMP_RESET] = { 0x0210, 20 }, 3097 [JPEGD_RESET] = { 0x0210, 19 }, 3098 [CSI1_RESET] = { 0x0210, 18 }, 3099 [VPE_RESET] = { 0x0210, 17 }, 3100 [MMSS_FABRIC_RESET] = { 0x0210, 16 }, 3101 [VFE_RESET] = { 0x0210, 15 }, 3102 [GFX3D_RESET] = { 0x0210, 12 }, 3103 [HDMI_RESET] = { 0x0210, 11 }, 3104 [MMSS_IMEM_RESET] = { 0x0210, 10 }, 3105 [IJPEG_RESET] = { 0x0210, 9 }, 3106 [CSI0_RESET] = { 0x0210, 8 }, 3107 [DSI_RESET] = { 0x0210, 7 }, 3108 [VCODEC_RESET] = { 0x0210, 6 }, 3109 [MDP_TV_RESET] = { 0x0210, 4 }, 3110 [MDP_VSYNC_RESET] = { 0x0210, 3 }, 3111 [ROT_RESET] = { 0x0210, 2 }, 3112 [TV_HDMI_RESET] = { 0x0210, 1 }, 3113 [VCAP_NPL_RESET] = { 0x0214, 4 }, 3114 [VCAP_RESET] = { 0x0214, 3 }, 3115 [CSI2_RESET] = { 0x0214, 2 }, 3116 [CSI_RDI1_RESET] = { 0x0214, 1 }, 3117 [CSI_RDI2_RESET] = { 0x0214 }, 3118 }; 3119 3120 static const struct regmap_config mmcc_msm8960_regmap_config = { 3121 .reg_bits = 32, 3122 .reg_stride = 4, 3123 .val_bits = 32, 3124 .max_register = 0x334, 3125 .fast_io = true, 3126 }; 3127 3128 static const struct regmap_config mmcc_apq8064_regmap_config = { 3129 .reg_bits = 32, 3130 .reg_stride = 4, 3131 .val_bits = 32, 3132 .max_register = 0x350, 3133 .fast_io = true, 3134 }; 3135 3136 static const struct qcom_cc_desc mmcc_msm8960_desc = { 3137 .config = &mmcc_msm8960_regmap_config, 3138 .clks = mmcc_msm8960_clks, 3139 .num_clks = ARRAY_SIZE(mmcc_msm8960_clks), 3140 .resets = mmcc_msm8960_resets, 3141 .num_resets = ARRAY_SIZE(mmcc_msm8960_resets), 3142 }; 3143 3144 static const struct qcom_cc_desc mmcc_apq8064_desc = { 3145 .config = &mmcc_apq8064_regmap_config, 3146 .clks = mmcc_apq8064_clks, 3147 .num_clks = ARRAY_SIZE(mmcc_apq8064_clks), 3148 .resets = mmcc_apq8064_resets, 3149 .num_resets = ARRAY_SIZE(mmcc_apq8064_resets), 3150 }; 3151 3152 static const struct of_device_id mmcc_msm8960_match_table[] = { 3153 { .compatible = "qcom,mmcc-msm8960", .data = &mmcc_msm8960_desc }, 3154 { .compatible = "qcom,mmcc-apq8064", .data = &mmcc_apq8064_desc }, 3155 { } 3156 }; 3157 MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table); 3158 3159 static int mmcc_msm8960_probe(struct platform_device *pdev) 3160 { 3161 struct regmap *regmap; 3162 struct device *dev = &pdev->dev; 3163 const struct qcom_cc_desc *desc = device_get_match_data(dev); 3164 3165 if (desc == &mmcc_apq8064_desc) { 3166 gfx3d_src.freq_tbl = clk_tbl_gfx3d_8064; 3167 gfx3d_src.clkr.hw.init = &gfx3d_8064_init; 3168 gfx3d_src.s[0].parent_map = mmcc_pxo_pll8_pll2_pll15_map; 3169 gfx3d_src.s[1].parent_map = mmcc_pxo_pll8_pll2_pll15_map; 3170 } 3171 3172 regmap = qcom_cc_map(pdev, desc); 3173 if (IS_ERR(regmap)) 3174 return PTR_ERR(regmap); 3175 3176 clk_pll_configure_sr(&pll15, regmap, &pll15_config, false); 3177 3178 return qcom_cc_really_probe(&pdev->dev, desc, regmap); 3179 } 3180 3181 static struct platform_driver mmcc_msm8960_driver = { 3182 .probe = mmcc_msm8960_probe, 3183 .driver = { 3184 .name = "mmcc-msm8960", 3185 .of_match_table = mmcc_msm8960_match_table, 3186 }, 3187 }; 3188 3189 module_platform_driver(mmcc_msm8960_driver); 3190 3191 MODULE_DESCRIPTION("QCOM MMCC MSM8960 Driver"); 3192 MODULE_LICENSE("GPL v2"); 3193 MODULE_ALIAS("platform:mmcc-msm8960"); 3194