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/module.h> 12 #include <linux/of.h> 13 #include <linux/of_device.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 }; 41 42 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n } 43 44 static const struct parent_map mmcc_pxo_pll8_pll2_map[] = { 45 { P_PXO, 0 }, 46 { P_PLL8, 2 }, 47 { P_PLL2, 1 } 48 }; 49 50 static const char * const mmcc_pxo_pll8_pll2[] = { 51 "pxo", 52 "pll8_vote", 53 "pll2", 54 }; 55 56 static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = { 57 { P_PXO, 0 }, 58 { P_PLL8, 2 }, 59 { P_PLL2, 1 }, 60 { P_PLL3, 3 } 61 }; 62 63 static const char * const mmcc_pxo_pll8_pll2_pll15[] = { 64 "pxo", 65 "pll8_vote", 66 "pll2", 67 "pll15", 68 }; 69 70 static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = { 71 { P_PXO, 0 }, 72 { P_PLL8, 2 }, 73 { P_PLL2, 1 }, 74 { P_PLL15, 3 } 75 }; 76 77 static const char * const mmcc_pxo_pll8_pll2_pll3[] = { 78 "pxo", 79 "pll8_vote", 80 "pll2", 81 "pll3", 82 }; 83 84 static const struct parent_map mmcc_pxo_dsi2_dsi1_map[] = { 85 { P_PXO, 0 }, 86 { P_DSI2_PLL_DSICLK, 1 }, 87 { P_DSI1_PLL_DSICLK, 3 }, 88 }; 89 90 static const char * const mmcc_pxo_dsi2_dsi1[] = { 91 "pxo", 92 "dsi2pll", 93 "dsi1pll", 94 }; 95 96 static const struct parent_map mmcc_pxo_dsi1_dsi2_byte_map[] = { 97 { P_PXO, 0 }, 98 { P_DSI1_PLL_BYTECLK, 1 }, 99 { P_DSI2_PLL_BYTECLK, 2 }, 100 }; 101 102 static const char * const mmcc_pxo_dsi1_dsi2_byte[] = { 103 "pxo", 104 "dsi1pllbyte", 105 "dsi2pllbyte", 106 }; 107 108 static struct clk_pll pll2 = { 109 .l_reg = 0x320, 110 .m_reg = 0x324, 111 .n_reg = 0x328, 112 .config_reg = 0x32c, 113 .mode_reg = 0x31c, 114 .status_reg = 0x334, 115 .status_bit = 16, 116 .clkr.hw.init = &(struct clk_init_data){ 117 .name = "pll2", 118 .parent_names = (const char *[]){ "pxo" }, 119 .num_parents = 1, 120 .ops = &clk_pll_ops, 121 }, 122 }; 123 124 static struct clk_pll pll15 = { 125 .l_reg = 0x33c, 126 .m_reg = 0x340, 127 .n_reg = 0x344, 128 .config_reg = 0x348, 129 .mode_reg = 0x338, 130 .status_reg = 0x350, 131 .status_bit = 16, 132 .clkr.hw.init = &(struct clk_init_data){ 133 .name = "pll15", 134 .parent_names = (const char *[]){ "pxo" }, 135 .num_parents = 1, 136 .ops = &clk_pll_ops, 137 }, 138 }; 139 140 static const struct pll_config pll15_config = { 141 .l = 33, 142 .m = 1, 143 .n = 3, 144 .vco_val = 0x2 << 16, 145 .vco_mask = 0x3 << 16, 146 .pre_div_val = 0x0, 147 .pre_div_mask = BIT(19), 148 .post_div_val = 0x0, 149 .post_div_mask = 0x3 << 20, 150 .mn_ena_mask = BIT(22), 151 .main_output_mask = BIT(23), 152 }; 153 154 static struct freq_tbl clk_tbl_cam[] = { 155 { 6000000, P_PLL8, 4, 1, 16 }, 156 { 8000000, P_PLL8, 4, 1, 12 }, 157 { 12000000, P_PLL8, 4, 1, 8 }, 158 { 16000000, P_PLL8, 4, 1, 6 }, 159 { 19200000, P_PLL8, 4, 1, 5 }, 160 { 24000000, P_PLL8, 4, 1, 4 }, 161 { 32000000, P_PLL8, 4, 1, 3 }, 162 { 48000000, P_PLL8, 4, 1, 2 }, 163 { 64000000, P_PLL8, 3, 1, 2 }, 164 { 96000000, P_PLL8, 4, 0, 0 }, 165 { 128000000, P_PLL8, 3, 0, 0 }, 166 { } 167 }; 168 169 static struct clk_rcg camclk0_src = { 170 .ns_reg = 0x0148, 171 .md_reg = 0x0144, 172 .mn = { 173 .mnctr_en_bit = 5, 174 .mnctr_reset_bit = 8, 175 .reset_in_cc = true, 176 .mnctr_mode_shift = 6, 177 .n_val_shift = 24, 178 .m_val_shift = 8, 179 .width = 8, 180 }, 181 .p = { 182 .pre_div_shift = 14, 183 .pre_div_width = 2, 184 }, 185 .s = { 186 .src_sel_shift = 0, 187 .parent_map = mmcc_pxo_pll8_pll2_map, 188 }, 189 .freq_tbl = clk_tbl_cam, 190 .clkr = { 191 .enable_reg = 0x0140, 192 .enable_mask = BIT(2), 193 .hw.init = &(struct clk_init_data){ 194 .name = "camclk0_src", 195 .parent_names = mmcc_pxo_pll8_pll2, 196 .num_parents = 3, 197 .ops = &clk_rcg_ops, 198 }, 199 }, 200 }; 201 202 static struct clk_branch camclk0_clk = { 203 .halt_reg = 0x01e8, 204 .halt_bit = 15, 205 .clkr = { 206 .enable_reg = 0x0140, 207 .enable_mask = BIT(0), 208 .hw.init = &(struct clk_init_data){ 209 .name = "camclk0_clk", 210 .parent_names = (const char *[]){ "camclk0_src" }, 211 .num_parents = 1, 212 .ops = &clk_branch_ops, 213 }, 214 }, 215 216 }; 217 218 static struct clk_rcg camclk1_src = { 219 .ns_reg = 0x015c, 220 .md_reg = 0x0158, 221 .mn = { 222 .mnctr_en_bit = 5, 223 .mnctr_reset_bit = 8, 224 .reset_in_cc = true, 225 .mnctr_mode_shift = 6, 226 .n_val_shift = 24, 227 .m_val_shift = 8, 228 .width = 8, 229 }, 230 .p = { 231 .pre_div_shift = 14, 232 .pre_div_width = 2, 233 }, 234 .s = { 235 .src_sel_shift = 0, 236 .parent_map = mmcc_pxo_pll8_pll2_map, 237 }, 238 .freq_tbl = clk_tbl_cam, 239 .clkr = { 240 .enable_reg = 0x0154, 241 .enable_mask = BIT(2), 242 .hw.init = &(struct clk_init_data){ 243 .name = "camclk1_src", 244 .parent_names = mmcc_pxo_pll8_pll2, 245 .num_parents = 3, 246 .ops = &clk_rcg_ops, 247 }, 248 }, 249 }; 250 251 static struct clk_branch camclk1_clk = { 252 .halt_reg = 0x01e8, 253 .halt_bit = 16, 254 .clkr = { 255 .enable_reg = 0x0154, 256 .enable_mask = BIT(0), 257 .hw.init = &(struct clk_init_data){ 258 .name = "camclk1_clk", 259 .parent_names = (const char *[]){ "camclk1_src" }, 260 .num_parents = 1, 261 .ops = &clk_branch_ops, 262 }, 263 }, 264 265 }; 266 267 static struct clk_rcg camclk2_src = { 268 .ns_reg = 0x0228, 269 .md_reg = 0x0224, 270 .mn = { 271 .mnctr_en_bit = 5, 272 .mnctr_reset_bit = 8, 273 .reset_in_cc = true, 274 .mnctr_mode_shift = 6, 275 .n_val_shift = 24, 276 .m_val_shift = 8, 277 .width = 8, 278 }, 279 .p = { 280 .pre_div_shift = 14, 281 .pre_div_width = 2, 282 }, 283 .s = { 284 .src_sel_shift = 0, 285 .parent_map = mmcc_pxo_pll8_pll2_map, 286 }, 287 .freq_tbl = clk_tbl_cam, 288 .clkr = { 289 .enable_reg = 0x0220, 290 .enable_mask = BIT(2), 291 .hw.init = &(struct clk_init_data){ 292 .name = "camclk2_src", 293 .parent_names = mmcc_pxo_pll8_pll2, 294 .num_parents = 3, 295 .ops = &clk_rcg_ops, 296 }, 297 }, 298 }; 299 300 static struct clk_branch camclk2_clk = { 301 .halt_reg = 0x01e8, 302 .halt_bit = 16, 303 .clkr = { 304 .enable_reg = 0x0220, 305 .enable_mask = BIT(0), 306 .hw.init = &(struct clk_init_data){ 307 .name = "camclk2_clk", 308 .parent_names = (const char *[]){ "camclk2_src" }, 309 .num_parents = 1, 310 .ops = &clk_branch_ops, 311 }, 312 }, 313 314 }; 315 316 static struct freq_tbl clk_tbl_csi[] = { 317 { 27000000, P_PXO, 1, 0, 0 }, 318 { 85330000, P_PLL8, 1, 2, 9 }, 319 { 177780000, P_PLL2, 1, 2, 9 }, 320 { } 321 }; 322 323 static struct clk_rcg csi0_src = { 324 .ns_reg = 0x0048, 325 .md_reg = 0x0044, 326 .mn = { 327 .mnctr_en_bit = 5, 328 .mnctr_reset_bit = 7, 329 .mnctr_mode_shift = 6, 330 .n_val_shift = 24, 331 .m_val_shift = 8, 332 .width = 8, 333 }, 334 .p = { 335 .pre_div_shift = 14, 336 .pre_div_width = 2, 337 }, 338 .s = { 339 .src_sel_shift = 0, 340 .parent_map = mmcc_pxo_pll8_pll2_map, 341 }, 342 .freq_tbl = clk_tbl_csi, 343 .clkr = { 344 .enable_reg = 0x0040, 345 .enable_mask = BIT(2), 346 .hw.init = &(struct clk_init_data){ 347 .name = "csi0_src", 348 .parent_names = mmcc_pxo_pll8_pll2, 349 .num_parents = 3, 350 .ops = &clk_rcg_ops, 351 }, 352 }, 353 }; 354 355 static struct clk_branch csi0_clk = { 356 .halt_reg = 0x01cc, 357 .halt_bit = 13, 358 .clkr = { 359 .enable_reg = 0x0040, 360 .enable_mask = BIT(0), 361 .hw.init = &(struct clk_init_data){ 362 .parent_names = (const char *[]){ "csi0_src" }, 363 .num_parents = 1, 364 .name = "csi0_clk", 365 .ops = &clk_branch_ops, 366 .flags = CLK_SET_RATE_PARENT, 367 }, 368 }, 369 }; 370 371 static struct clk_branch csi0_phy_clk = { 372 .halt_reg = 0x01e8, 373 .halt_bit = 9, 374 .clkr = { 375 .enable_reg = 0x0040, 376 .enable_mask = BIT(8), 377 .hw.init = &(struct clk_init_data){ 378 .parent_names = (const char *[]){ "csi0_src" }, 379 .num_parents = 1, 380 .name = "csi0_phy_clk", 381 .ops = &clk_branch_ops, 382 .flags = CLK_SET_RATE_PARENT, 383 }, 384 }, 385 }; 386 387 static struct clk_rcg csi1_src = { 388 .ns_reg = 0x0010, 389 .md_reg = 0x0028, 390 .mn = { 391 .mnctr_en_bit = 5, 392 .mnctr_reset_bit = 7, 393 .mnctr_mode_shift = 6, 394 .n_val_shift = 24, 395 .m_val_shift = 8, 396 .width = 8, 397 }, 398 .p = { 399 .pre_div_shift = 14, 400 .pre_div_width = 2, 401 }, 402 .s = { 403 .src_sel_shift = 0, 404 .parent_map = mmcc_pxo_pll8_pll2_map, 405 }, 406 .freq_tbl = clk_tbl_csi, 407 .clkr = { 408 .enable_reg = 0x0024, 409 .enable_mask = BIT(2), 410 .hw.init = &(struct clk_init_data){ 411 .name = "csi1_src", 412 .parent_names = mmcc_pxo_pll8_pll2, 413 .num_parents = 3, 414 .ops = &clk_rcg_ops, 415 }, 416 }, 417 }; 418 419 static struct clk_branch csi1_clk = { 420 .halt_reg = 0x01cc, 421 .halt_bit = 14, 422 .clkr = { 423 .enable_reg = 0x0024, 424 .enable_mask = BIT(0), 425 .hw.init = &(struct clk_init_data){ 426 .parent_names = (const char *[]){ "csi1_src" }, 427 .num_parents = 1, 428 .name = "csi1_clk", 429 .ops = &clk_branch_ops, 430 .flags = CLK_SET_RATE_PARENT, 431 }, 432 }, 433 }; 434 435 static struct clk_branch csi1_phy_clk = { 436 .halt_reg = 0x01e8, 437 .halt_bit = 10, 438 .clkr = { 439 .enable_reg = 0x0024, 440 .enable_mask = BIT(8), 441 .hw.init = &(struct clk_init_data){ 442 .parent_names = (const char *[]){ "csi1_src" }, 443 .num_parents = 1, 444 .name = "csi1_phy_clk", 445 .ops = &clk_branch_ops, 446 .flags = CLK_SET_RATE_PARENT, 447 }, 448 }, 449 }; 450 451 static struct clk_rcg csi2_src = { 452 .ns_reg = 0x0234, 453 .md_reg = 0x022c, 454 .mn = { 455 .mnctr_en_bit = 5, 456 .mnctr_reset_bit = 7, 457 .mnctr_mode_shift = 6, 458 .n_val_shift = 24, 459 .m_val_shift = 8, 460 .width = 8, 461 }, 462 .p = { 463 .pre_div_shift = 14, 464 .pre_div_width = 2, 465 }, 466 .s = { 467 .src_sel_shift = 0, 468 .parent_map = mmcc_pxo_pll8_pll2_map, 469 }, 470 .freq_tbl = clk_tbl_csi, 471 .clkr = { 472 .enable_reg = 0x022c, 473 .enable_mask = BIT(2), 474 .hw.init = &(struct clk_init_data){ 475 .name = "csi2_src", 476 .parent_names = mmcc_pxo_pll8_pll2, 477 .num_parents = 3, 478 .ops = &clk_rcg_ops, 479 }, 480 }, 481 }; 482 483 static struct clk_branch csi2_clk = { 484 .halt_reg = 0x01cc, 485 .halt_bit = 29, 486 .clkr = { 487 .enable_reg = 0x022c, 488 .enable_mask = BIT(0), 489 .hw.init = &(struct clk_init_data){ 490 .parent_names = (const char *[]){ "csi2_src" }, 491 .num_parents = 1, 492 .name = "csi2_clk", 493 .ops = &clk_branch_ops, 494 .flags = CLK_SET_RATE_PARENT, 495 }, 496 }, 497 }; 498 499 static struct clk_branch csi2_phy_clk = { 500 .halt_reg = 0x01e8, 501 .halt_bit = 29, 502 .clkr = { 503 .enable_reg = 0x022c, 504 .enable_mask = BIT(8), 505 .hw.init = &(struct clk_init_data){ 506 .parent_names = (const char *[]){ "csi2_src" }, 507 .num_parents = 1, 508 .name = "csi2_phy_clk", 509 .ops = &clk_branch_ops, 510 .flags = CLK_SET_RATE_PARENT, 511 }, 512 }, 513 }; 514 515 struct clk_pix_rdi { 516 u32 s_reg; 517 u32 s_mask; 518 u32 s2_reg; 519 u32 s2_mask; 520 struct clk_regmap clkr; 521 }; 522 523 #define to_clk_pix_rdi(_hw) \ 524 container_of(to_clk_regmap(_hw), struct clk_pix_rdi, clkr) 525 526 static int pix_rdi_set_parent(struct clk_hw *hw, u8 index) 527 { 528 int i; 529 int ret = 0; 530 u32 val; 531 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw); 532 int num_parents = clk_hw_get_num_parents(hw); 533 534 /* 535 * These clocks select three inputs via two muxes. One mux selects 536 * between csi0 and csi1 and the second mux selects between that mux's 537 * output and csi2. The source and destination selections for each 538 * mux must be clocking for the switch to succeed so just turn on 539 * all three sources because it's easier than figuring out what source 540 * needs to be on at what time. 541 */ 542 for (i = 0; i < num_parents; i++) { 543 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i); 544 ret = clk_prepare_enable(p->clk); 545 if (ret) 546 goto err; 547 } 548 549 if (index == 2) 550 val = rdi->s2_mask; 551 else 552 val = 0; 553 regmap_update_bits(rdi->clkr.regmap, rdi->s2_reg, rdi->s2_mask, val); 554 /* 555 * Wait at least 6 cycles of slowest clock 556 * for the glitch-free MUX to fully switch sources. 557 */ 558 udelay(1); 559 560 if (index == 1) 561 val = rdi->s_mask; 562 else 563 val = 0; 564 regmap_update_bits(rdi->clkr.regmap, rdi->s_reg, rdi->s_mask, val); 565 /* 566 * Wait at least 6 cycles of slowest clock 567 * for the glitch-free MUX to fully switch sources. 568 */ 569 udelay(1); 570 571 err: 572 for (i--; i >= 0; i--) { 573 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i); 574 clk_disable_unprepare(p->clk); 575 } 576 577 return ret; 578 } 579 580 static u8 pix_rdi_get_parent(struct clk_hw *hw) 581 { 582 u32 val; 583 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw); 584 585 586 regmap_read(rdi->clkr.regmap, rdi->s2_reg, &val); 587 if (val & rdi->s2_mask) 588 return 2; 589 590 regmap_read(rdi->clkr.regmap, rdi->s_reg, &val); 591 if (val & rdi->s_mask) 592 return 1; 593 594 return 0; 595 } 596 597 static const struct clk_ops clk_ops_pix_rdi = { 598 .enable = clk_enable_regmap, 599 .disable = clk_disable_regmap, 600 .set_parent = pix_rdi_set_parent, 601 .get_parent = pix_rdi_get_parent, 602 .determine_rate = __clk_mux_determine_rate, 603 }; 604 605 static const char * const pix_rdi_parents[] = { 606 "csi0_clk", 607 "csi1_clk", 608 "csi2_clk", 609 }; 610 611 static struct clk_pix_rdi csi_pix_clk = { 612 .s_reg = 0x0058, 613 .s_mask = BIT(25), 614 .s2_reg = 0x0238, 615 .s2_mask = BIT(13), 616 .clkr = { 617 .enable_reg = 0x0058, 618 .enable_mask = BIT(26), 619 .hw.init = &(struct clk_init_data){ 620 .name = "csi_pix_clk", 621 .parent_names = pix_rdi_parents, 622 .num_parents = 3, 623 .ops = &clk_ops_pix_rdi, 624 }, 625 }, 626 }; 627 628 static struct clk_pix_rdi csi_pix1_clk = { 629 .s_reg = 0x0238, 630 .s_mask = BIT(8), 631 .s2_reg = 0x0238, 632 .s2_mask = BIT(9), 633 .clkr = { 634 .enable_reg = 0x0238, 635 .enable_mask = BIT(10), 636 .hw.init = &(struct clk_init_data){ 637 .name = "csi_pix1_clk", 638 .parent_names = pix_rdi_parents, 639 .num_parents = 3, 640 .ops = &clk_ops_pix_rdi, 641 }, 642 }, 643 }; 644 645 static struct clk_pix_rdi csi_rdi_clk = { 646 .s_reg = 0x0058, 647 .s_mask = BIT(12), 648 .s2_reg = 0x0238, 649 .s2_mask = BIT(12), 650 .clkr = { 651 .enable_reg = 0x0058, 652 .enable_mask = BIT(13), 653 .hw.init = &(struct clk_init_data){ 654 .name = "csi_rdi_clk", 655 .parent_names = pix_rdi_parents, 656 .num_parents = 3, 657 .ops = &clk_ops_pix_rdi, 658 }, 659 }, 660 }; 661 662 static struct clk_pix_rdi csi_rdi1_clk = { 663 .s_reg = 0x0238, 664 .s_mask = BIT(0), 665 .s2_reg = 0x0238, 666 .s2_mask = BIT(1), 667 .clkr = { 668 .enable_reg = 0x0238, 669 .enable_mask = BIT(2), 670 .hw.init = &(struct clk_init_data){ 671 .name = "csi_rdi1_clk", 672 .parent_names = pix_rdi_parents, 673 .num_parents = 3, 674 .ops = &clk_ops_pix_rdi, 675 }, 676 }, 677 }; 678 679 static struct clk_pix_rdi csi_rdi2_clk = { 680 .s_reg = 0x0238, 681 .s_mask = BIT(4), 682 .s2_reg = 0x0238, 683 .s2_mask = BIT(5), 684 .clkr = { 685 .enable_reg = 0x0238, 686 .enable_mask = BIT(6), 687 .hw.init = &(struct clk_init_data){ 688 .name = "csi_rdi2_clk", 689 .parent_names = pix_rdi_parents, 690 .num_parents = 3, 691 .ops = &clk_ops_pix_rdi, 692 }, 693 }, 694 }; 695 696 static struct freq_tbl clk_tbl_csiphytimer[] = { 697 { 85330000, P_PLL8, 1, 2, 9 }, 698 { 177780000, P_PLL2, 1, 2, 9 }, 699 { } 700 }; 701 702 static struct clk_rcg csiphytimer_src = { 703 .ns_reg = 0x0168, 704 .md_reg = 0x0164, 705 .mn = { 706 .mnctr_en_bit = 5, 707 .mnctr_reset_bit = 8, 708 .reset_in_cc = true, 709 .mnctr_mode_shift = 6, 710 .n_val_shift = 24, 711 .m_val_shift = 8, 712 .width = 8, 713 }, 714 .p = { 715 .pre_div_shift = 14, 716 .pre_div_width = 2, 717 }, 718 .s = { 719 .src_sel_shift = 0, 720 .parent_map = mmcc_pxo_pll8_pll2_map, 721 }, 722 .freq_tbl = clk_tbl_csiphytimer, 723 .clkr = { 724 .enable_reg = 0x0160, 725 .enable_mask = BIT(2), 726 .hw.init = &(struct clk_init_data){ 727 .name = "csiphytimer_src", 728 .parent_names = mmcc_pxo_pll8_pll2, 729 .num_parents = 3, 730 .ops = &clk_rcg_ops, 731 }, 732 }, 733 }; 734 735 static const char * const csixphy_timer_src[] = { "csiphytimer_src" }; 736 737 static struct clk_branch csiphy0_timer_clk = { 738 .halt_reg = 0x01e8, 739 .halt_bit = 17, 740 .clkr = { 741 .enable_reg = 0x0160, 742 .enable_mask = BIT(0), 743 .hw.init = &(struct clk_init_data){ 744 .parent_names = csixphy_timer_src, 745 .num_parents = 1, 746 .name = "csiphy0_timer_clk", 747 .ops = &clk_branch_ops, 748 .flags = CLK_SET_RATE_PARENT, 749 }, 750 }, 751 }; 752 753 static struct clk_branch csiphy1_timer_clk = { 754 .halt_reg = 0x01e8, 755 .halt_bit = 18, 756 .clkr = { 757 .enable_reg = 0x0160, 758 .enable_mask = BIT(9), 759 .hw.init = &(struct clk_init_data){ 760 .parent_names = csixphy_timer_src, 761 .num_parents = 1, 762 .name = "csiphy1_timer_clk", 763 .ops = &clk_branch_ops, 764 .flags = CLK_SET_RATE_PARENT, 765 }, 766 }, 767 }; 768 769 static struct clk_branch csiphy2_timer_clk = { 770 .halt_reg = 0x01e8, 771 .halt_bit = 30, 772 .clkr = { 773 .enable_reg = 0x0160, 774 .enable_mask = BIT(11), 775 .hw.init = &(struct clk_init_data){ 776 .parent_names = csixphy_timer_src, 777 .num_parents = 1, 778 .name = "csiphy2_timer_clk", 779 .ops = &clk_branch_ops, 780 .flags = CLK_SET_RATE_PARENT, 781 }, 782 }, 783 }; 784 785 static struct freq_tbl clk_tbl_gfx2d[] = { 786 F_MN( 27000000, P_PXO, 1, 0), 787 F_MN( 48000000, P_PLL8, 1, 8), 788 F_MN( 54857000, P_PLL8, 1, 7), 789 F_MN( 64000000, P_PLL8, 1, 6), 790 F_MN( 76800000, P_PLL8, 1, 5), 791 F_MN( 96000000, P_PLL8, 1, 4), 792 F_MN(128000000, P_PLL8, 1, 3), 793 F_MN(145455000, P_PLL2, 2, 11), 794 F_MN(160000000, P_PLL2, 1, 5), 795 F_MN(177778000, P_PLL2, 2, 9), 796 F_MN(200000000, P_PLL2, 1, 4), 797 F_MN(228571000, P_PLL2, 2, 7), 798 { } 799 }; 800 801 static struct clk_dyn_rcg gfx2d0_src = { 802 .ns_reg[0] = 0x0070, 803 .ns_reg[1] = 0x0070, 804 .md_reg[0] = 0x0064, 805 .md_reg[1] = 0x0068, 806 .bank_reg = 0x0060, 807 .mn[0] = { 808 .mnctr_en_bit = 8, 809 .mnctr_reset_bit = 25, 810 .mnctr_mode_shift = 9, 811 .n_val_shift = 20, 812 .m_val_shift = 4, 813 .width = 4, 814 }, 815 .mn[1] = { 816 .mnctr_en_bit = 5, 817 .mnctr_reset_bit = 24, 818 .mnctr_mode_shift = 6, 819 .n_val_shift = 16, 820 .m_val_shift = 4, 821 .width = 4, 822 }, 823 .s[0] = { 824 .src_sel_shift = 3, 825 .parent_map = mmcc_pxo_pll8_pll2_map, 826 }, 827 .s[1] = { 828 .src_sel_shift = 0, 829 .parent_map = mmcc_pxo_pll8_pll2_map, 830 }, 831 .mux_sel_bit = 11, 832 .freq_tbl = clk_tbl_gfx2d, 833 .clkr = { 834 .enable_reg = 0x0060, 835 .enable_mask = BIT(2), 836 .hw.init = &(struct clk_init_data){ 837 .name = "gfx2d0_src", 838 .parent_names = mmcc_pxo_pll8_pll2, 839 .num_parents = 3, 840 .ops = &clk_dyn_rcg_ops, 841 }, 842 }, 843 }; 844 845 static struct clk_branch gfx2d0_clk = { 846 .halt_reg = 0x01c8, 847 .halt_bit = 9, 848 .clkr = { 849 .enable_reg = 0x0060, 850 .enable_mask = BIT(0), 851 .hw.init = &(struct clk_init_data){ 852 .name = "gfx2d0_clk", 853 .parent_names = (const char *[]){ "gfx2d0_src" }, 854 .num_parents = 1, 855 .ops = &clk_branch_ops, 856 .flags = CLK_SET_RATE_PARENT, 857 }, 858 }, 859 }; 860 861 static struct clk_dyn_rcg gfx2d1_src = { 862 .ns_reg[0] = 0x007c, 863 .ns_reg[1] = 0x007c, 864 .md_reg[0] = 0x0078, 865 .md_reg[1] = 0x006c, 866 .bank_reg = 0x0074, 867 .mn[0] = { 868 .mnctr_en_bit = 8, 869 .mnctr_reset_bit = 25, 870 .mnctr_mode_shift = 9, 871 .n_val_shift = 20, 872 .m_val_shift = 4, 873 .width = 4, 874 }, 875 .mn[1] = { 876 .mnctr_en_bit = 5, 877 .mnctr_reset_bit = 24, 878 .mnctr_mode_shift = 6, 879 .n_val_shift = 16, 880 .m_val_shift = 4, 881 .width = 4, 882 }, 883 .s[0] = { 884 .src_sel_shift = 3, 885 .parent_map = mmcc_pxo_pll8_pll2_map, 886 }, 887 .s[1] = { 888 .src_sel_shift = 0, 889 .parent_map = mmcc_pxo_pll8_pll2_map, 890 }, 891 .mux_sel_bit = 11, 892 .freq_tbl = clk_tbl_gfx2d, 893 .clkr = { 894 .enable_reg = 0x0074, 895 .enable_mask = BIT(2), 896 .hw.init = &(struct clk_init_data){ 897 .name = "gfx2d1_src", 898 .parent_names = mmcc_pxo_pll8_pll2, 899 .num_parents = 3, 900 .ops = &clk_dyn_rcg_ops, 901 }, 902 }, 903 }; 904 905 static struct clk_branch gfx2d1_clk = { 906 .halt_reg = 0x01c8, 907 .halt_bit = 14, 908 .clkr = { 909 .enable_reg = 0x0074, 910 .enable_mask = BIT(0), 911 .hw.init = &(struct clk_init_data){ 912 .name = "gfx2d1_clk", 913 .parent_names = (const char *[]){ "gfx2d1_src" }, 914 .num_parents = 1, 915 .ops = &clk_branch_ops, 916 .flags = CLK_SET_RATE_PARENT, 917 }, 918 }, 919 }; 920 921 static struct freq_tbl clk_tbl_gfx3d[] = { 922 F_MN( 27000000, P_PXO, 1, 0), 923 F_MN( 48000000, P_PLL8, 1, 8), 924 F_MN( 54857000, P_PLL8, 1, 7), 925 F_MN( 64000000, P_PLL8, 1, 6), 926 F_MN( 76800000, P_PLL8, 1, 5), 927 F_MN( 96000000, P_PLL8, 1, 4), 928 F_MN(128000000, P_PLL8, 1, 3), 929 F_MN(145455000, P_PLL2, 2, 11), 930 F_MN(160000000, P_PLL2, 1, 5), 931 F_MN(177778000, P_PLL2, 2, 9), 932 F_MN(200000000, P_PLL2, 1, 4), 933 F_MN(228571000, P_PLL2, 2, 7), 934 F_MN(266667000, P_PLL2, 1, 3), 935 F_MN(300000000, P_PLL3, 1, 4), 936 F_MN(320000000, P_PLL2, 2, 5), 937 F_MN(400000000, P_PLL2, 1, 2), 938 { } 939 }; 940 941 static struct freq_tbl clk_tbl_gfx3d_8064[] = { 942 F_MN( 27000000, P_PXO, 0, 0), 943 F_MN( 48000000, P_PLL8, 1, 8), 944 F_MN( 54857000, P_PLL8, 1, 7), 945 F_MN( 64000000, P_PLL8, 1, 6), 946 F_MN( 76800000, P_PLL8, 1, 5), 947 F_MN( 96000000, P_PLL8, 1, 4), 948 F_MN(128000000, P_PLL8, 1, 3), 949 F_MN(145455000, P_PLL2, 2, 11), 950 F_MN(160000000, P_PLL2, 1, 5), 951 F_MN(177778000, P_PLL2, 2, 9), 952 F_MN(192000000, P_PLL8, 1, 2), 953 F_MN(200000000, P_PLL2, 1, 4), 954 F_MN(228571000, P_PLL2, 2, 7), 955 F_MN(266667000, P_PLL2, 1, 3), 956 F_MN(320000000, P_PLL2, 2, 5), 957 F_MN(400000000, P_PLL2, 1, 2), 958 F_MN(450000000, P_PLL15, 1, 2), 959 { } 960 }; 961 962 static struct clk_dyn_rcg gfx3d_src = { 963 .ns_reg[0] = 0x008c, 964 .ns_reg[1] = 0x008c, 965 .md_reg[0] = 0x0084, 966 .md_reg[1] = 0x0088, 967 .bank_reg = 0x0080, 968 .mn[0] = { 969 .mnctr_en_bit = 8, 970 .mnctr_reset_bit = 25, 971 .mnctr_mode_shift = 9, 972 .n_val_shift = 18, 973 .m_val_shift = 4, 974 .width = 4, 975 }, 976 .mn[1] = { 977 .mnctr_en_bit = 5, 978 .mnctr_reset_bit = 24, 979 .mnctr_mode_shift = 6, 980 .n_val_shift = 14, 981 .m_val_shift = 4, 982 .width = 4, 983 }, 984 .s[0] = { 985 .src_sel_shift = 3, 986 .parent_map = mmcc_pxo_pll8_pll2_pll3_map, 987 }, 988 .s[1] = { 989 .src_sel_shift = 0, 990 .parent_map = mmcc_pxo_pll8_pll2_pll3_map, 991 }, 992 .mux_sel_bit = 11, 993 .freq_tbl = clk_tbl_gfx3d, 994 .clkr = { 995 .enable_reg = 0x0080, 996 .enable_mask = BIT(2), 997 .hw.init = &(struct clk_init_data){ 998 .name = "gfx3d_src", 999 .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"); 3063