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