1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (c) 2014, 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/platform_device.h> 10 #include <linux/module.h> 11 #include <linux/of.h> 12 #include <linux/of_platform.h> 13 #include <linux/clk-provider.h> 14 #include <linux/regmap.h> 15 #include <linux/reset-controller.h> 16 17 #include <dt-bindings/clock/qcom,gcc-ipq806x.h> 18 #include <dt-bindings/reset/qcom,gcc-ipq806x.h> 19 20 #include "common.h" 21 #include "clk-regmap.h" 22 #include "clk-pll.h" 23 #include "clk-rcg.h" 24 #include "clk-branch.h" 25 #include "clk-hfpll.h" 26 #include "reset.h" 27 28 static const struct clk_parent_data gcc_pxo[] = { 29 { .fw_name = "pxo", .name = "pxo" }, 30 }; 31 32 static struct clk_pll pll0 = { 33 .l_reg = 0x30c4, 34 .m_reg = 0x30c8, 35 .n_reg = 0x30cc, 36 .config_reg = 0x30d4, 37 .mode_reg = 0x30c0, 38 .status_reg = 0x30d8, 39 .status_bit = 16, 40 .clkr.hw.init = &(struct clk_init_data){ 41 .name = "pll0", 42 .parent_data = gcc_pxo, 43 .num_parents = 1, 44 .ops = &clk_pll_ops, 45 }, 46 }; 47 48 static struct clk_regmap pll0_vote = { 49 .enable_reg = 0x34c0, 50 .enable_mask = BIT(0), 51 .hw.init = &(struct clk_init_data){ 52 .name = "pll0_vote", 53 .parent_hws = (const struct clk_hw*[]){ 54 &pll0.clkr.hw, 55 }, 56 .num_parents = 1, 57 .ops = &clk_pll_vote_ops, 58 }, 59 }; 60 61 static struct clk_pll pll3 = { 62 .l_reg = 0x3164, 63 .m_reg = 0x3168, 64 .n_reg = 0x316c, 65 .config_reg = 0x3174, 66 .mode_reg = 0x3160, 67 .status_reg = 0x3178, 68 .status_bit = 16, 69 .clkr.hw.init = &(struct clk_init_data){ 70 .name = "pll3", 71 .parent_data = gcc_pxo, 72 .num_parents = 1, 73 .ops = &clk_pll_ops, 74 }, 75 }; 76 77 static struct clk_regmap pll4_vote = { 78 .enable_reg = 0x34c0, 79 .enable_mask = BIT(4), 80 .hw.init = &(struct clk_init_data){ 81 .name = "pll4_vote", 82 .parent_data = &(const struct clk_parent_data){ 83 .fw_name = "pll4", .name = "pll4", 84 }, 85 .num_parents = 1, 86 .ops = &clk_pll_vote_ops, 87 }, 88 }; 89 90 static struct clk_pll pll8 = { 91 .l_reg = 0x3144, 92 .m_reg = 0x3148, 93 .n_reg = 0x314c, 94 .config_reg = 0x3154, 95 .mode_reg = 0x3140, 96 .status_reg = 0x3158, 97 .status_bit = 16, 98 .clkr.hw.init = &(struct clk_init_data){ 99 .name = "pll8", 100 .parent_data = gcc_pxo, 101 .num_parents = 1, 102 .ops = &clk_pll_ops, 103 }, 104 }; 105 106 static struct clk_regmap pll8_vote = { 107 .enable_reg = 0x34c0, 108 .enable_mask = BIT(8), 109 .hw.init = &(struct clk_init_data){ 110 .name = "pll8_vote", 111 .parent_hws = (const struct clk_hw*[]){ 112 &pll8.clkr.hw, 113 }, 114 .num_parents = 1, 115 .ops = &clk_pll_vote_ops, 116 }, 117 }; 118 119 static struct hfpll_data hfpll0_data = { 120 .mode_reg = 0x3200, 121 .l_reg = 0x3208, 122 .m_reg = 0x320c, 123 .n_reg = 0x3210, 124 .config_reg = 0x3204, 125 .status_reg = 0x321c, 126 .config_val = 0x7845c665, 127 .droop_reg = 0x3214, 128 .droop_val = 0x0108c000, 129 .min_rate = 600000000UL, 130 .max_rate = 1800000000UL, 131 }; 132 133 static struct clk_hfpll hfpll0 = { 134 .d = &hfpll0_data, 135 .clkr.hw.init = &(struct clk_init_data){ 136 .parent_data = gcc_pxo, 137 .num_parents = 1, 138 .name = "hfpll0", 139 .ops = &clk_ops_hfpll, 140 .flags = CLK_IGNORE_UNUSED, 141 }, 142 .lock = __SPIN_LOCK_UNLOCKED(hfpll0.lock), 143 }; 144 145 static struct hfpll_data hfpll1_data = { 146 .mode_reg = 0x3240, 147 .l_reg = 0x3248, 148 .m_reg = 0x324c, 149 .n_reg = 0x3250, 150 .config_reg = 0x3244, 151 .status_reg = 0x325c, 152 .config_val = 0x7845c665, 153 .droop_reg = 0x3314, 154 .droop_val = 0x0108c000, 155 .min_rate = 600000000UL, 156 .max_rate = 1800000000UL, 157 }; 158 159 static struct clk_hfpll hfpll1 = { 160 .d = &hfpll1_data, 161 .clkr.hw.init = &(struct clk_init_data){ 162 .parent_data = gcc_pxo, 163 .num_parents = 1, 164 .name = "hfpll1", 165 .ops = &clk_ops_hfpll, 166 .flags = CLK_IGNORE_UNUSED, 167 }, 168 .lock = __SPIN_LOCK_UNLOCKED(hfpll1.lock), 169 }; 170 171 static struct hfpll_data hfpll_l2_data = { 172 .mode_reg = 0x3300, 173 .l_reg = 0x3308, 174 .m_reg = 0x330c, 175 .n_reg = 0x3310, 176 .config_reg = 0x3304, 177 .status_reg = 0x331c, 178 .config_val = 0x7845c665, 179 .droop_reg = 0x3314, 180 .droop_val = 0x0108c000, 181 .min_rate = 600000000UL, 182 .max_rate = 1800000000UL, 183 }; 184 185 static struct clk_hfpll hfpll_l2 = { 186 .d = &hfpll_l2_data, 187 .clkr.hw.init = &(struct clk_init_data){ 188 .parent_data = gcc_pxo, 189 .num_parents = 1, 190 .name = "hfpll_l2", 191 .ops = &clk_ops_hfpll, 192 .flags = CLK_IGNORE_UNUSED, 193 }, 194 .lock = __SPIN_LOCK_UNLOCKED(hfpll_l2.lock), 195 }; 196 197 static struct clk_pll pll14 = { 198 .l_reg = 0x31c4, 199 .m_reg = 0x31c8, 200 .n_reg = 0x31cc, 201 .config_reg = 0x31d4, 202 .mode_reg = 0x31c0, 203 .status_reg = 0x31d8, 204 .status_bit = 16, 205 .clkr.hw.init = &(struct clk_init_data){ 206 .name = "pll14", 207 .parent_data = gcc_pxo, 208 .num_parents = 1, 209 .ops = &clk_pll_ops, 210 }, 211 }; 212 213 static struct clk_regmap pll14_vote = { 214 .enable_reg = 0x34c0, 215 .enable_mask = BIT(14), 216 .hw.init = &(struct clk_init_data){ 217 .name = "pll14_vote", 218 .parent_hws = (const struct clk_hw*[]){ 219 &pll14.clkr.hw, 220 }, 221 .num_parents = 1, 222 .ops = &clk_pll_vote_ops, 223 }, 224 }; 225 226 #define NSS_PLL_RATE(f, _l, _m, _n, i) \ 227 { \ 228 .freq = f, \ 229 .l = _l, \ 230 .m = _m, \ 231 .n = _n, \ 232 .ibits = i, \ 233 } 234 235 static struct pll_freq_tbl pll18_freq_tbl[] = { 236 NSS_PLL_RATE(550000000, 44, 0, 1, 0x01495625), 237 NSS_PLL_RATE(600000000, 48, 0, 1, 0x01495625), 238 NSS_PLL_RATE(733000000, 58, 16, 25, 0x014b5625), 239 NSS_PLL_RATE(800000000, 64, 0, 1, 0x01495625), 240 }; 241 242 static struct clk_pll pll18 = { 243 .l_reg = 0x31a4, 244 .m_reg = 0x31a8, 245 .n_reg = 0x31ac, 246 .config_reg = 0x31b4, 247 .mode_reg = 0x31a0, 248 .status_reg = 0x31b8, 249 .status_bit = 16, 250 .post_div_shift = 16, 251 .post_div_width = 1, 252 .freq_tbl = pll18_freq_tbl, 253 .clkr.hw.init = &(struct clk_init_data){ 254 .name = "pll18", 255 .parent_data = gcc_pxo, 256 .num_parents = 1, 257 .ops = &clk_pll_ops, 258 }, 259 }; 260 261 static struct clk_pll pll11 = { 262 .l_reg = 0x3184, 263 .m_reg = 0x3188, 264 .n_reg = 0x318c, 265 .config_reg = 0x3194, 266 .mode_reg = 0x3180, 267 .status_reg = 0x3198, 268 .status_bit = 16, 269 .clkr.hw.init = &(struct clk_init_data){ 270 .name = "pll11", 271 .parent_data = &(const struct clk_parent_data){ 272 .fw_name = "pxo", 273 }, 274 .num_parents = 1, 275 .ops = &clk_pll_ops, 276 }, 277 }; 278 279 enum { 280 P_PXO, 281 P_PLL8, 282 P_PLL3, 283 P_PLL0, 284 P_CXO, 285 P_PLL14, 286 P_PLL18, 287 P_PLL11, 288 }; 289 290 static const struct parent_map gcc_pxo_pll8_map[] = { 291 { P_PXO, 0 }, 292 { P_PLL8, 3 } 293 }; 294 295 static const struct clk_parent_data gcc_pxo_pll8[] = { 296 { .fw_name = "pxo", .name = "pxo" }, 297 { .hw = &pll8_vote.hw }, 298 }; 299 300 static const struct parent_map gcc_pxo_pll8_cxo_map[] = { 301 { P_PXO, 0 }, 302 { P_PLL8, 3 }, 303 { P_CXO, 5 } 304 }; 305 306 static const struct clk_parent_data gcc_pxo_pll8_cxo[] = { 307 { .fw_name = "pxo", .name = "pxo" }, 308 { .hw = &pll8_vote.hw }, 309 { .fw_name = "cxo", .name = "cxo" }, 310 }; 311 312 static const struct parent_map gcc_pxo_pll3_map[] = { 313 { P_PXO, 0 }, 314 { P_PLL3, 1 } 315 }; 316 317 static const struct parent_map gcc_pxo_pll3_sata_map[] = { 318 { P_PXO, 0 }, 319 { P_PLL3, 6 } 320 }; 321 322 static const struct clk_parent_data gcc_pxo_pll3[] = { 323 { .fw_name = "pxo", .name = "pxo" }, 324 { .hw = &pll3.clkr.hw }, 325 }; 326 327 static const struct parent_map gcc_pxo_pll8_pll0_map[] = { 328 { P_PXO, 0 }, 329 { P_PLL8, 3 }, 330 { P_PLL0, 2 } 331 }; 332 333 static const struct clk_parent_data gcc_pxo_pll8_pll0[] = { 334 { .fw_name = "pxo", .name = "pxo" }, 335 { .hw = &pll8_vote.hw }, 336 { .hw = &pll0_vote.hw }, 337 }; 338 339 static const struct parent_map gcc_pxo_pll8_pll14_pll18_pll0_map[] = { 340 { P_PXO, 0 }, 341 { P_PLL8, 4 }, 342 { P_PLL0, 2 }, 343 { P_PLL14, 5 }, 344 { P_PLL18, 1 } 345 }; 346 347 static const struct clk_parent_data gcc_pxo_pll8_pll14_pll18_pll0[] = { 348 { .fw_name = "pxo", .name = "pxo" }, 349 { .hw = &pll8_vote.hw }, 350 { .hw = &pll0_vote.hw }, 351 { .hw = &pll14.clkr.hw }, 352 { .hw = &pll18.clkr.hw }, 353 }; 354 355 static const struct parent_map gcc_pxo_pll8_pll0_pll14_pll18_pll11_map[] = { 356 { P_PXO, 0 }, 357 { P_PLL8, 4 }, 358 { P_PLL0, 2 }, 359 { P_PLL14, 5 }, 360 { P_PLL18, 1 }, 361 { P_PLL11, 3 }, 362 }; 363 364 static const struct clk_parent_data gcc_pxo_pll8_pll0_pll14_pll18_pll11[] = { 365 { .fw_name = "pxo" }, 366 { .hw = &pll8_vote.hw }, 367 { .hw = &pll0_vote.hw }, 368 { .hw = &pll14.clkr.hw }, 369 { .hw = &pll18.clkr.hw }, 370 { .hw = &pll11.clkr.hw }, 371 372 }; 373 374 static const struct parent_map gcc_pxo_pll3_pll0_pll14_pll18_pll11_map[] = { 375 { P_PXO, 0 }, 376 { P_PLL3, 6 }, 377 { P_PLL0, 2 }, 378 { P_PLL14, 5 }, 379 { P_PLL18, 1 }, 380 { P_PLL11, 3 }, 381 }; 382 383 static const struct clk_parent_data gcc_pxo_pll3_pll0_pll14_pll18_pll11[] = { 384 { .fw_name = "pxo" }, 385 { .hw = &pll3.clkr.hw }, 386 { .hw = &pll0_vote.hw }, 387 { .hw = &pll14.clkr.hw }, 388 { .hw = &pll18.clkr.hw }, 389 { .hw = &pll11.clkr.hw }, 390 391 }; 392 393 static const struct freq_tbl clk_tbl_gsbi_uart[] = { 394 { 1843200, P_PLL8, 2, 6, 625 }, 395 { 3686400, P_PLL8, 2, 12, 625 }, 396 { 7372800, P_PLL8, 2, 24, 625 }, 397 { 14745600, P_PLL8, 2, 48, 625 }, 398 { 16000000, P_PLL8, 4, 1, 6 }, 399 { 24000000, P_PLL8, 4, 1, 4 }, 400 { 32000000, P_PLL8, 4, 1, 3 }, 401 { 40000000, P_PLL8, 1, 5, 48 }, 402 { 46400000, P_PLL8, 1, 29, 240 }, 403 { 48000000, P_PLL8, 4, 1, 2 }, 404 { 51200000, P_PLL8, 1, 2, 15 }, 405 { 56000000, P_PLL8, 1, 7, 48 }, 406 { 58982400, P_PLL8, 1, 96, 625 }, 407 { 64000000, P_PLL8, 2, 1, 3 }, 408 { } 409 }; 410 411 static struct clk_rcg gsbi1_uart_src = { 412 .ns_reg = 0x29d4, 413 .md_reg = 0x29d0, 414 .mn = { 415 .mnctr_en_bit = 8, 416 .mnctr_reset_bit = 7, 417 .mnctr_mode_shift = 5, 418 .n_val_shift = 16, 419 .m_val_shift = 16, 420 .width = 16, 421 }, 422 .p = { 423 .pre_div_shift = 3, 424 .pre_div_width = 2, 425 }, 426 .s = { 427 .src_sel_shift = 0, 428 .parent_map = gcc_pxo_pll8_map, 429 }, 430 .freq_tbl = clk_tbl_gsbi_uart, 431 .clkr = { 432 .enable_reg = 0x29d4, 433 .enable_mask = BIT(11), 434 .hw.init = &(struct clk_init_data){ 435 .name = "gsbi1_uart_src", 436 .parent_data = gcc_pxo_pll8, 437 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 438 .ops = &clk_rcg_ops, 439 .flags = CLK_SET_PARENT_GATE, 440 }, 441 }, 442 }; 443 444 static struct clk_branch gsbi1_uart_clk = { 445 .halt_reg = 0x2fcc, 446 .halt_bit = 12, 447 .clkr = { 448 .enable_reg = 0x29d4, 449 .enable_mask = BIT(9), 450 .hw.init = &(struct clk_init_data){ 451 .name = "gsbi1_uart_clk", 452 .parent_hws = (const struct clk_hw*[]){ 453 &gsbi1_uart_src.clkr.hw, 454 }, 455 .num_parents = 1, 456 .ops = &clk_branch_ops, 457 .flags = CLK_SET_RATE_PARENT, 458 }, 459 }, 460 }; 461 462 static struct clk_rcg gsbi2_uart_src = { 463 .ns_reg = 0x29f4, 464 .md_reg = 0x29f0, 465 .mn = { 466 .mnctr_en_bit = 8, 467 .mnctr_reset_bit = 7, 468 .mnctr_mode_shift = 5, 469 .n_val_shift = 16, 470 .m_val_shift = 16, 471 .width = 16, 472 }, 473 .p = { 474 .pre_div_shift = 3, 475 .pre_div_width = 2, 476 }, 477 .s = { 478 .src_sel_shift = 0, 479 .parent_map = gcc_pxo_pll8_map, 480 }, 481 .freq_tbl = clk_tbl_gsbi_uart, 482 .clkr = { 483 .enable_reg = 0x29f4, 484 .enable_mask = BIT(11), 485 .hw.init = &(struct clk_init_data){ 486 .name = "gsbi2_uart_src", 487 .parent_data = gcc_pxo_pll8, 488 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 489 .ops = &clk_rcg_ops, 490 .flags = CLK_SET_PARENT_GATE, 491 }, 492 }, 493 }; 494 495 static struct clk_branch gsbi2_uart_clk = { 496 .halt_reg = 0x2fcc, 497 .halt_bit = 8, 498 .clkr = { 499 .enable_reg = 0x29f4, 500 .enable_mask = BIT(9), 501 .hw.init = &(struct clk_init_data){ 502 .name = "gsbi2_uart_clk", 503 .parent_hws = (const struct clk_hw*[]){ 504 &gsbi2_uart_src.clkr.hw, 505 }, 506 .num_parents = 1, 507 .ops = &clk_branch_ops, 508 .flags = CLK_SET_RATE_PARENT, 509 }, 510 }, 511 }; 512 513 static struct clk_rcg gsbi4_uart_src = { 514 .ns_reg = 0x2a34, 515 .md_reg = 0x2a30, 516 .mn = { 517 .mnctr_en_bit = 8, 518 .mnctr_reset_bit = 7, 519 .mnctr_mode_shift = 5, 520 .n_val_shift = 16, 521 .m_val_shift = 16, 522 .width = 16, 523 }, 524 .p = { 525 .pre_div_shift = 3, 526 .pre_div_width = 2, 527 }, 528 .s = { 529 .src_sel_shift = 0, 530 .parent_map = gcc_pxo_pll8_map, 531 }, 532 .freq_tbl = clk_tbl_gsbi_uart, 533 .clkr = { 534 .enable_reg = 0x2a34, 535 .enable_mask = BIT(11), 536 .hw.init = &(struct clk_init_data){ 537 .name = "gsbi4_uart_src", 538 .parent_data = gcc_pxo_pll8, 539 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 540 .ops = &clk_rcg_ops, 541 .flags = CLK_SET_PARENT_GATE, 542 }, 543 }, 544 }; 545 546 static struct clk_branch gsbi4_uart_clk = { 547 .halt_reg = 0x2fd0, 548 .halt_bit = 26, 549 .clkr = { 550 .enable_reg = 0x2a34, 551 .enable_mask = BIT(9), 552 .hw.init = &(struct clk_init_data){ 553 .name = "gsbi4_uart_clk", 554 .parent_hws = (const struct clk_hw*[]){ 555 &gsbi4_uart_src.clkr.hw, 556 }, 557 .num_parents = 1, 558 .ops = &clk_branch_ops, 559 .flags = CLK_SET_RATE_PARENT, 560 }, 561 }, 562 }; 563 564 static struct clk_rcg gsbi5_uart_src = { 565 .ns_reg = 0x2a54, 566 .md_reg = 0x2a50, 567 .mn = { 568 .mnctr_en_bit = 8, 569 .mnctr_reset_bit = 7, 570 .mnctr_mode_shift = 5, 571 .n_val_shift = 16, 572 .m_val_shift = 16, 573 .width = 16, 574 }, 575 .p = { 576 .pre_div_shift = 3, 577 .pre_div_width = 2, 578 }, 579 .s = { 580 .src_sel_shift = 0, 581 .parent_map = gcc_pxo_pll8_map, 582 }, 583 .freq_tbl = clk_tbl_gsbi_uart, 584 .clkr = { 585 .enable_reg = 0x2a54, 586 .enable_mask = BIT(11), 587 .hw.init = &(struct clk_init_data){ 588 .name = "gsbi5_uart_src", 589 .parent_data = gcc_pxo_pll8, 590 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 591 .ops = &clk_rcg_ops, 592 .flags = CLK_SET_PARENT_GATE, 593 }, 594 }, 595 }; 596 597 static struct clk_branch gsbi5_uart_clk = { 598 .halt_reg = 0x2fd0, 599 .halt_bit = 22, 600 .clkr = { 601 .enable_reg = 0x2a54, 602 .enable_mask = BIT(9), 603 .hw.init = &(struct clk_init_data){ 604 .name = "gsbi5_uart_clk", 605 .parent_hws = (const struct clk_hw*[]){ 606 &gsbi5_uart_src.clkr.hw, 607 }, 608 .num_parents = 1, 609 .ops = &clk_branch_ops, 610 .flags = CLK_SET_RATE_PARENT, 611 }, 612 }, 613 }; 614 615 static struct clk_rcg gsbi6_uart_src = { 616 .ns_reg = 0x2a74, 617 .md_reg = 0x2a70, 618 .mn = { 619 .mnctr_en_bit = 8, 620 .mnctr_reset_bit = 7, 621 .mnctr_mode_shift = 5, 622 .n_val_shift = 16, 623 .m_val_shift = 16, 624 .width = 16, 625 }, 626 .p = { 627 .pre_div_shift = 3, 628 .pre_div_width = 2, 629 }, 630 .s = { 631 .src_sel_shift = 0, 632 .parent_map = gcc_pxo_pll8_map, 633 }, 634 .freq_tbl = clk_tbl_gsbi_uart, 635 .clkr = { 636 .enable_reg = 0x2a74, 637 .enable_mask = BIT(11), 638 .hw.init = &(struct clk_init_data){ 639 .name = "gsbi6_uart_src", 640 .parent_data = gcc_pxo_pll8, 641 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 642 .ops = &clk_rcg_ops, 643 .flags = CLK_SET_PARENT_GATE, 644 }, 645 }, 646 }; 647 648 static struct clk_branch gsbi6_uart_clk = { 649 .halt_reg = 0x2fd0, 650 .halt_bit = 18, 651 .clkr = { 652 .enable_reg = 0x2a74, 653 .enable_mask = BIT(9), 654 .hw.init = &(struct clk_init_data){ 655 .name = "gsbi6_uart_clk", 656 .parent_hws = (const struct clk_hw*[]){ 657 &gsbi6_uart_src.clkr.hw, 658 }, 659 .num_parents = 1, 660 .ops = &clk_branch_ops, 661 .flags = CLK_SET_RATE_PARENT, 662 }, 663 }, 664 }; 665 666 static struct clk_rcg gsbi7_uart_src = { 667 .ns_reg = 0x2a94, 668 .md_reg = 0x2a90, 669 .mn = { 670 .mnctr_en_bit = 8, 671 .mnctr_reset_bit = 7, 672 .mnctr_mode_shift = 5, 673 .n_val_shift = 16, 674 .m_val_shift = 16, 675 .width = 16, 676 }, 677 .p = { 678 .pre_div_shift = 3, 679 .pre_div_width = 2, 680 }, 681 .s = { 682 .src_sel_shift = 0, 683 .parent_map = gcc_pxo_pll8_map, 684 }, 685 .freq_tbl = clk_tbl_gsbi_uart, 686 .clkr = { 687 .enable_reg = 0x2a94, 688 .enable_mask = BIT(11), 689 .hw.init = &(struct clk_init_data){ 690 .name = "gsbi7_uart_src", 691 .parent_data = gcc_pxo_pll8, 692 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 693 .ops = &clk_rcg_ops, 694 .flags = CLK_SET_PARENT_GATE, 695 }, 696 }, 697 }; 698 699 static struct clk_branch gsbi7_uart_clk = { 700 .halt_reg = 0x2fd0, 701 .halt_bit = 14, 702 .clkr = { 703 .enable_reg = 0x2a94, 704 .enable_mask = BIT(9), 705 .hw.init = &(struct clk_init_data){ 706 .name = "gsbi7_uart_clk", 707 .parent_hws = (const struct clk_hw*[]){ 708 &gsbi7_uart_src.clkr.hw, 709 }, 710 .num_parents = 1, 711 .ops = &clk_branch_ops, 712 .flags = CLK_SET_RATE_PARENT, 713 }, 714 }, 715 }; 716 717 static const struct freq_tbl clk_tbl_gsbi_qup[] = { 718 { 1100000, P_PXO, 1, 2, 49 }, 719 { 5400000, P_PXO, 1, 1, 5 }, 720 { 10800000, P_PXO, 1, 2, 5 }, 721 { 15060000, P_PLL8, 1, 2, 51 }, 722 { 24000000, P_PLL8, 4, 1, 4 }, 723 { 25000000, P_PXO, 1, 0, 0 }, 724 { 25600000, P_PLL8, 1, 1, 15 }, 725 { 48000000, P_PLL8, 4, 1, 2 }, 726 { 51200000, P_PLL8, 1, 2, 15 }, 727 { } 728 }; 729 730 static struct clk_rcg gsbi1_qup_src = { 731 .ns_reg = 0x29cc, 732 .md_reg = 0x29c8, 733 .mn = { 734 .mnctr_en_bit = 8, 735 .mnctr_reset_bit = 7, 736 .mnctr_mode_shift = 5, 737 .n_val_shift = 16, 738 .m_val_shift = 16, 739 .width = 8, 740 }, 741 .p = { 742 .pre_div_shift = 3, 743 .pre_div_width = 2, 744 }, 745 .s = { 746 .src_sel_shift = 0, 747 .parent_map = gcc_pxo_pll8_map, 748 }, 749 .freq_tbl = clk_tbl_gsbi_qup, 750 .clkr = { 751 .enable_reg = 0x29cc, 752 .enable_mask = BIT(11), 753 .hw.init = &(struct clk_init_data){ 754 .name = "gsbi1_qup_src", 755 .parent_data = gcc_pxo_pll8, 756 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 757 .ops = &clk_rcg_ops, 758 .flags = CLK_SET_PARENT_GATE, 759 }, 760 }, 761 }; 762 763 static struct clk_branch gsbi1_qup_clk = { 764 .halt_reg = 0x2fcc, 765 .halt_bit = 11, 766 .clkr = { 767 .enable_reg = 0x29cc, 768 .enable_mask = BIT(9), 769 .hw.init = &(struct clk_init_data){ 770 .name = "gsbi1_qup_clk", 771 .parent_hws = (const struct clk_hw*[]){ 772 &gsbi1_qup_src.clkr.hw, 773 }, 774 .num_parents = 1, 775 .ops = &clk_branch_ops, 776 .flags = CLK_SET_RATE_PARENT, 777 }, 778 }, 779 }; 780 781 static struct clk_rcg gsbi2_qup_src = { 782 .ns_reg = 0x29ec, 783 .md_reg = 0x29e8, 784 .mn = { 785 .mnctr_en_bit = 8, 786 .mnctr_reset_bit = 7, 787 .mnctr_mode_shift = 5, 788 .n_val_shift = 16, 789 .m_val_shift = 16, 790 .width = 8, 791 }, 792 .p = { 793 .pre_div_shift = 3, 794 .pre_div_width = 2, 795 }, 796 .s = { 797 .src_sel_shift = 0, 798 .parent_map = gcc_pxo_pll8_map, 799 }, 800 .freq_tbl = clk_tbl_gsbi_qup, 801 .clkr = { 802 .enable_reg = 0x29ec, 803 .enable_mask = BIT(11), 804 .hw.init = &(struct clk_init_data){ 805 .name = "gsbi2_qup_src", 806 .parent_data = gcc_pxo_pll8, 807 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 808 .ops = &clk_rcg_ops, 809 .flags = CLK_SET_PARENT_GATE, 810 }, 811 }, 812 }; 813 814 static struct clk_branch gsbi2_qup_clk = { 815 .halt_reg = 0x2fcc, 816 .halt_bit = 6, 817 .clkr = { 818 .enable_reg = 0x29ec, 819 .enable_mask = BIT(9), 820 .hw.init = &(struct clk_init_data){ 821 .name = "gsbi2_qup_clk", 822 .parent_hws = (const struct clk_hw*[]){ 823 &gsbi2_qup_src.clkr.hw, 824 }, 825 .num_parents = 1, 826 .ops = &clk_branch_ops, 827 .flags = CLK_SET_RATE_PARENT, 828 }, 829 }, 830 }; 831 832 static struct clk_rcg gsbi4_qup_src = { 833 .ns_reg = 0x2a2c, 834 .md_reg = 0x2a28, 835 .mn = { 836 .mnctr_en_bit = 8, 837 .mnctr_reset_bit = 7, 838 .mnctr_mode_shift = 5, 839 .n_val_shift = 16, 840 .m_val_shift = 16, 841 .width = 8, 842 }, 843 .p = { 844 .pre_div_shift = 3, 845 .pre_div_width = 2, 846 }, 847 .s = { 848 .src_sel_shift = 0, 849 .parent_map = gcc_pxo_pll8_map, 850 }, 851 .freq_tbl = clk_tbl_gsbi_qup, 852 .clkr = { 853 .enable_reg = 0x2a2c, 854 .enable_mask = BIT(11), 855 .hw.init = &(struct clk_init_data){ 856 .name = "gsbi4_qup_src", 857 .parent_data = gcc_pxo_pll8, 858 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 859 .ops = &clk_rcg_ops, 860 .flags = CLK_SET_PARENT_GATE | CLK_IGNORE_UNUSED, 861 }, 862 }, 863 }; 864 865 static struct clk_branch gsbi4_qup_clk = { 866 .halt_reg = 0x2fd0, 867 .halt_bit = 24, 868 .clkr = { 869 .enable_reg = 0x2a2c, 870 .enable_mask = BIT(9), 871 .hw.init = &(struct clk_init_data){ 872 .name = "gsbi4_qup_clk", 873 .parent_hws = (const struct clk_hw*[]){ 874 &gsbi4_qup_src.clkr.hw, 875 }, 876 .num_parents = 1, 877 .ops = &clk_branch_ops, 878 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 879 }, 880 }, 881 }; 882 883 static struct clk_rcg gsbi5_qup_src = { 884 .ns_reg = 0x2a4c, 885 .md_reg = 0x2a48, 886 .mn = { 887 .mnctr_en_bit = 8, 888 .mnctr_reset_bit = 7, 889 .mnctr_mode_shift = 5, 890 .n_val_shift = 16, 891 .m_val_shift = 16, 892 .width = 8, 893 }, 894 .p = { 895 .pre_div_shift = 3, 896 .pre_div_width = 2, 897 }, 898 .s = { 899 .src_sel_shift = 0, 900 .parent_map = gcc_pxo_pll8_map, 901 }, 902 .freq_tbl = clk_tbl_gsbi_qup, 903 .clkr = { 904 .enable_reg = 0x2a4c, 905 .enable_mask = BIT(11), 906 .hw.init = &(struct clk_init_data){ 907 .name = "gsbi5_qup_src", 908 .parent_data = gcc_pxo_pll8, 909 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 910 .ops = &clk_rcg_ops, 911 .flags = CLK_SET_PARENT_GATE, 912 }, 913 }, 914 }; 915 916 static struct clk_branch gsbi5_qup_clk = { 917 .halt_reg = 0x2fd0, 918 .halt_bit = 20, 919 .clkr = { 920 .enable_reg = 0x2a4c, 921 .enable_mask = BIT(9), 922 .hw.init = &(struct clk_init_data){ 923 .name = "gsbi5_qup_clk", 924 .parent_hws = (const struct clk_hw*[]){ 925 &gsbi5_qup_src.clkr.hw, 926 }, 927 .num_parents = 1, 928 .ops = &clk_branch_ops, 929 .flags = CLK_SET_RATE_PARENT, 930 }, 931 }, 932 }; 933 934 static struct clk_rcg gsbi6_qup_src = { 935 .ns_reg = 0x2a6c, 936 .md_reg = 0x2a68, 937 .mn = { 938 .mnctr_en_bit = 8, 939 .mnctr_reset_bit = 7, 940 .mnctr_mode_shift = 5, 941 .n_val_shift = 16, 942 .m_val_shift = 16, 943 .width = 8, 944 }, 945 .p = { 946 .pre_div_shift = 3, 947 .pre_div_width = 2, 948 }, 949 .s = { 950 .src_sel_shift = 0, 951 .parent_map = gcc_pxo_pll8_map, 952 }, 953 .freq_tbl = clk_tbl_gsbi_qup, 954 .clkr = { 955 .enable_reg = 0x2a6c, 956 .enable_mask = BIT(11), 957 .hw.init = &(struct clk_init_data){ 958 .name = "gsbi6_qup_src", 959 .parent_data = gcc_pxo_pll8, 960 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 961 .ops = &clk_rcg_ops, 962 .flags = CLK_SET_PARENT_GATE | CLK_IGNORE_UNUSED, 963 }, 964 }, 965 }; 966 967 static struct clk_branch gsbi6_qup_clk = { 968 .halt_reg = 0x2fd0, 969 .halt_bit = 16, 970 .clkr = { 971 .enable_reg = 0x2a6c, 972 .enable_mask = BIT(9), 973 .hw.init = &(struct clk_init_data){ 974 .name = "gsbi6_qup_clk", 975 .parent_hws = (const struct clk_hw*[]){ 976 &gsbi6_qup_src.clkr.hw, 977 }, 978 .num_parents = 1, 979 .ops = &clk_branch_ops, 980 .flags = CLK_SET_RATE_PARENT, 981 }, 982 }, 983 }; 984 985 static struct clk_rcg gsbi7_qup_src = { 986 .ns_reg = 0x2a8c, 987 .md_reg = 0x2a88, 988 .mn = { 989 .mnctr_en_bit = 8, 990 .mnctr_reset_bit = 7, 991 .mnctr_mode_shift = 5, 992 .n_val_shift = 16, 993 .m_val_shift = 16, 994 .width = 8, 995 }, 996 .p = { 997 .pre_div_shift = 3, 998 .pre_div_width = 2, 999 }, 1000 .s = { 1001 .src_sel_shift = 0, 1002 .parent_map = gcc_pxo_pll8_map, 1003 }, 1004 .freq_tbl = clk_tbl_gsbi_qup, 1005 .clkr = { 1006 .enable_reg = 0x2a8c, 1007 .enable_mask = BIT(11), 1008 .hw.init = &(struct clk_init_data){ 1009 .name = "gsbi7_qup_src", 1010 .parent_data = gcc_pxo_pll8, 1011 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 1012 .ops = &clk_rcg_ops, 1013 .flags = CLK_SET_PARENT_GATE, 1014 }, 1015 }, 1016 }; 1017 1018 static struct clk_branch gsbi7_qup_clk = { 1019 .halt_reg = 0x2fd0, 1020 .halt_bit = 12, 1021 .clkr = { 1022 .enable_reg = 0x2a8c, 1023 .enable_mask = BIT(9), 1024 .hw.init = &(struct clk_init_data){ 1025 .name = "gsbi7_qup_clk", 1026 .parent_hws = (const struct clk_hw*[]){ 1027 &gsbi7_qup_src.clkr.hw, 1028 }, 1029 .num_parents = 1, 1030 .ops = &clk_branch_ops, 1031 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 1032 }, 1033 }, 1034 }; 1035 1036 static struct clk_branch gsbi1_h_clk = { 1037 .hwcg_reg = 0x29c0, 1038 .hwcg_bit = 6, 1039 .halt_reg = 0x2fcc, 1040 .halt_bit = 13, 1041 .clkr = { 1042 .enable_reg = 0x29c0, 1043 .enable_mask = BIT(4), 1044 .hw.init = &(struct clk_init_data){ 1045 .name = "gsbi1_h_clk", 1046 .ops = &clk_branch_ops, 1047 }, 1048 }, 1049 }; 1050 1051 static struct clk_branch gsbi2_h_clk = { 1052 .hwcg_reg = 0x29e0, 1053 .hwcg_bit = 6, 1054 .halt_reg = 0x2fcc, 1055 .halt_bit = 9, 1056 .clkr = { 1057 .enable_reg = 0x29e0, 1058 .enable_mask = BIT(4), 1059 .hw.init = &(struct clk_init_data){ 1060 .name = "gsbi2_h_clk", 1061 .ops = &clk_branch_ops, 1062 }, 1063 }, 1064 }; 1065 1066 static struct clk_branch gsbi4_h_clk = { 1067 .hwcg_reg = 0x2a20, 1068 .hwcg_bit = 6, 1069 .halt_reg = 0x2fd0, 1070 .halt_bit = 27, 1071 .clkr = { 1072 .enable_reg = 0x2a20, 1073 .enable_mask = BIT(4), 1074 .hw.init = &(struct clk_init_data){ 1075 .name = "gsbi4_h_clk", 1076 .ops = &clk_branch_ops, 1077 .flags = CLK_IGNORE_UNUSED, 1078 }, 1079 }, 1080 }; 1081 1082 static struct clk_branch gsbi5_h_clk = { 1083 .hwcg_reg = 0x2a40, 1084 .hwcg_bit = 6, 1085 .halt_reg = 0x2fd0, 1086 .halt_bit = 23, 1087 .clkr = { 1088 .enable_reg = 0x2a40, 1089 .enable_mask = BIT(4), 1090 .hw.init = &(struct clk_init_data){ 1091 .name = "gsbi5_h_clk", 1092 .ops = &clk_branch_ops, 1093 }, 1094 }, 1095 }; 1096 1097 static struct clk_branch gsbi6_h_clk = { 1098 .hwcg_reg = 0x2a60, 1099 .hwcg_bit = 6, 1100 .halt_reg = 0x2fd0, 1101 .halt_bit = 19, 1102 .clkr = { 1103 .enable_reg = 0x2a60, 1104 .enable_mask = BIT(4), 1105 .hw.init = &(struct clk_init_data){ 1106 .name = "gsbi6_h_clk", 1107 .ops = &clk_branch_ops, 1108 }, 1109 }, 1110 }; 1111 1112 static struct clk_branch gsbi7_h_clk = { 1113 .hwcg_reg = 0x2a80, 1114 .hwcg_bit = 6, 1115 .halt_reg = 0x2fd0, 1116 .halt_bit = 15, 1117 .clkr = { 1118 .enable_reg = 0x2a80, 1119 .enable_mask = BIT(4), 1120 .hw.init = &(struct clk_init_data){ 1121 .name = "gsbi7_h_clk", 1122 .ops = &clk_branch_ops, 1123 }, 1124 }, 1125 }; 1126 1127 static const struct freq_tbl clk_tbl_gp[] = { 1128 { 12500000, P_PXO, 2, 0, 0 }, 1129 { 25000000, P_PXO, 1, 0, 0 }, 1130 { 64000000, P_PLL8, 2, 1, 3 }, 1131 { 76800000, P_PLL8, 1, 1, 5 }, 1132 { 96000000, P_PLL8, 4, 0, 0 }, 1133 { 128000000, P_PLL8, 3, 0, 0 }, 1134 { 192000000, P_PLL8, 2, 0, 0 }, 1135 { } 1136 }; 1137 1138 static struct clk_rcg gp0_src = { 1139 .ns_reg = 0x2d24, 1140 .md_reg = 0x2d00, 1141 .mn = { 1142 .mnctr_en_bit = 8, 1143 .mnctr_reset_bit = 7, 1144 .mnctr_mode_shift = 5, 1145 .n_val_shift = 16, 1146 .m_val_shift = 16, 1147 .width = 8, 1148 }, 1149 .p = { 1150 .pre_div_shift = 3, 1151 .pre_div_width = 2, 1152 }, 1153 .s = { 1154 .src_sel_shift = 0, 1155 .parent_map = gcc_pxo_pll8_cxo_map, 1156 }, 1157 .freq_tbl = clk_tbl_gp, 1158 .clkr = { 1159 .enable_reg = 0x2d24, 1160 .enable_mask = BIT(11), 1161 .hw.init = &(struct clk_init_data){ 1162 .name = "gp0_src", 1163 .parent_data = gcc_pxo_pll8_cxo, 1164 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo), 1165 .ops = &clk_rcg_ops, 1166 .flags = CLK_SET_PARENT_GATE, 1167 }, 1168 } 1169 }; 1170 1171 static struct clk_branch gp0_clk = { 1172 .halt_reg = 0x2fd8, 1173 .halt_bit = 7, 1174 .clkr = { 1175 .enable_reg = 0x2d24, 1176 .enable_mask = BIT(9), 1177 .hw.init = &(struct clk_init_data){ 1178 .name = "gp0_clk", 1179 .parent_hws = (const struct clk_hw*[]){ 1180 &gp0_src.clkr.hw, 1181 }, 1182 .num_parents = 1, 1183 .ops = &clk_branch_ops, 1184 .flags = CLK_SET_RATE_PARENT, 1185 }, 1186 }, 1187 }; 1188 1189 static struct clk_rcg gp1_src = { 1190 .ns_reg = 0x2d44, 1191 .md_reg = 0x2d40, 1192 .mn = { 1193 .mnctr_en_bit = 8, 1194 .mnctr_reset_bit = 7, 1195 .mnctr_mode_shift = 5, 1196 .n_val_shift = 16, 1197 .m_val_shift = 16, 1198 .width = 8, 1199 }, 1200 .p = { 1201 .pre_div_shift = 3, 1202 .pre_div_width = 2, 1203 }, 1204 .s = { 1205 .src_sel_shift = 0, 1206 .parent_map = gcc_pxo_pll8_cxo_map, 1207 }, 1208 .freq_tbl = clk_tbl_gp, 1209 .clkr = { 1210 .enable_reg = 0x2d44, 1211 .enable_mask = BIT(11), 1212 .hw.init = &(struct clk_init_data){ 1213 .name = "gp1_src", 1214 .parent_data = gcc_pxo_pll8_cxo, 1215 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo), 1216 .ops = &clk_rcg_ops, 1217 .flags = CLK_SET_RATE_GATE, 1218 }, 1219 } 1220 }; 1221 1222 static struct clk_branch gp1_clk = { 1223 .halt_reg = 0x2fd8, 1224 .halt_bit = 6, 1225 .clkr = { 1226 .enable_reg = 0x2d44, 1227 .enable_mask = BIT(9), 1228 .hw.init = &(struct clk_init_data){ 1229 .name = "gp1_clk", 1230 .parent_hws = (const struct clk_hw*[]){ 1231 &gp1_src.clkr.hw, 1232 }, 1233 .num_parents = 1, 1234 .ops = &clk_branch_ops, 1235 .flags = CLK_SET_RATE_PARENT, 1236 }, 1237 }, 1238 }; 1239 1240 static struct clk_rcg gp2_src = { 1241 .ns_reg = 0x2d64, 1242 .md_reg = 0x2d60, 1243 .mn = { 1244 .mnctr_en_bit = 8, 1245 .mnctr_reset_bit = 7, 1246 .mnctr_mode_shift = 5, 1247 .n_val_shift = 16, 1248 .m_val_shift = 16, 1249 .width = 8, 1250 }, 1251 .p = { 1252 .pre_div_shift = 3, 1253 .pre_div_width = 2, 1254 }, 1255 .s = { 1256 .src_sel_shift = 0, 1257 .parent_map = gcc_pxo_pll8_cxo_map, 1258 }, 1259 .freq_tbl = clk_tbl_gp, 1260 .clkr = { 1261 .enable_reg = 0x2d64, 1262 .enable_mask = BIT(11), 1263 .hw.init = &(struct clk_init_data){ 1264 .name = "gp2_src", 1265 .parent_data = gcc_pxo_pll8_cxo, 1266 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo), 1267 .ops = &clk_rcg_ops, 1268 .flags = CLK_SET_RATE_GATE, 1269 }, 1270 } 1271 }; 1272 1273 static struct clk_branch gp2_clk = { 1274 .halt_reg = 0x2fd8, 1275 .halt_bit = 5, 1276 .clkr = { 1277 .enable_reg = 0x2d64, 1278 .enable_mask = BIT(9), 1279 .hw.init = &(struct clk_init_data){ 1280 .name = "gp2_clk", 1281 .parent_hws = (const struct clk_hw*[]){ 1282 &gp2_src.clkr.hw, 1283 }, 1284 .num_parents = 1, 1285 .ops = &clk_branch_ops, 1286 .flags = CLK_SET_RATE_PARENT, 1287 }, 1288 }, 1289 }; 1290 1291 static struct clk_branch pmem_clk = { 1292 .hwcg_reg = 0x25a0, 1293 .hwcg_bit = 6, 1294 .halt_reg = 0x2fc8, 1295 .halt_bit = 20, 1296 .clkr = { 1297 .enable_reg = 0x25a0, 1298 .enable_mask = BIT(4), 1299 .hw.init = &(struct clk_init_data){ 1300 .name = "pmem_clk", 1301 .ops = &clk_branch_ops, 1302 }, 1303 }, 1304 }; 1305 1306 static struct clk_rcg prng_src = { 1307 .ns_reg = 0x2e80, 1308 .p = { 1309 .pre_div_shift = 3, 1310 .pre_div_width = 4, 1311 }, 1312 .s = { 1313 .src_sel_shift = 0, 1314 .parent_map = gcc_pxo_pll8_map, 1315 }, 1316 .clkr = { 1317 .enable_reg = 0x2e80, 1318 .enable_mask = BIT(11), 1319 .hw.init = &(struct clk_init_data){ 1320 .name = "prng_src", 1321 .parent_data = gcc_pxo_pll8, 1322 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 1323 .ops = &clk_rcg_ops, 1324 }, 1325 }, 1326 }; 1327 1328 static struct clk_branch prng_clk = { 1329 .halt_reg = 0x2fd8, 1330 .halt_check = BRANCH_HALT_VOTED, 1331 .halt_bit = 10, 1332 .clkr = { 1333 .enable_reg = 0x3080, 1334 .enable_mask = BIT(10), 1335 .hw.init = &(struct clk_init_data){ 1336 .name = "prng_clk", 1337 .parent_hws = (const struct clk_hw*[]){ 1338 &prng_src.clkr.hw, 1339 }, 1340 .num_parents = 1, 1341 .ops = &clk_branch_ops, 1342 }, 1343 }, 1344 }; 1345 1346 static const struct freq_tbl clk_tbl_sdc[] = { 1347 { 200000, P_PXO, 2, 2, 125 }, 1348 { 400000, P_PLL8, 4, 1, 240 }, 1349 { 16000000, P_PLL8, 4, 1, 6 }, 1350 { 17070000, P_PLL8, 1, 2, 45 }, 1351 { 20210000, P_PLL8, 1, 1, 19 }, 1352 { 24000000, P_PLL8, 4, 1, 4 }, 1353 { 48000000, P_PLL8, 4, 1, 2 }, 1354 { 51200000, P_PLL8, 1, 2, 15 }, 1355 { 64000000, P_PLL8, 3, 1, 2 }, 1356 { 96000000, P_PLL8, 4, 0, 0 }, 1357 { 192000000, P_PLL8, 2, 0, 0 }, 1358 { } 1359 }; 1360 1361 static struct clk_rcg sdc1_src = { 1362 .ns_reg = 0x282c, 1363 .md_reg = 0x2828, 1364 .mn = { 1365 .mnctr_en_bit = 8, 1366 .mnctr_reset_bit = 7, 1367 .mnctr_mode_shift = 5, 1368 .n_val_shift = 16, 1369 .m_val_shift = 16, 1370 .width = 8, 1371 }, 1372 .p = { 1373 .pre_div_shift = 3, 1374 .pre_div_width = 2, 1375 }, 1376 .s = { 1377 .src_sel_shift = 0, 1378 .parent_map = gcc_pxo_pll8_map, 1379 }, 1380 .freq_tbl = clk_tbl_sdc, 1381 .clkr = { 1382 .enable_reg = 0x282c, 1383 .enable_mask = BIT(11), 1384 .hw.init = &(struct clk_init_data){ 1385 .name = "sdc1_src", 1386 .parent_data = gcc_pxo_pll8, 1387 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 1388 .ops = &clk_rcg_floor_ops, 1389 }, 1390 } 1391 }; 1392 1393 static struct clk_branch sdc1_clk = { 1394 .halt_reg = 0x2fc8, 1395 .halt_bit = 6, 1396 .clkr = { 1397 .enable_reg = 0x282c, 1398 .enable_mask = BIT(9), 1399 .hw.init = &(struct clk_init_data){ 1400 .name = "sdc1_clk", 1401 .parent_hws = (const struct clk_hw*[]){ 1402 &sdc1_src.clkr.hw, 1403 }, 1404 .num_parents = 1, 1405 .ops = &clk_branch_ops, 1406 .flags = CLK_SET_RATE_PARENT, 1407 }, 1408 }, 1409 }; 1410 1411 static struct clk_rcg sdc3_src = { 1412 .ns_reg = 0x286c, 1413 .md_reg = 0x2868, 1414 .mn = { 1415 .mnctr_en_bit = 8, 1416 .mnctr_reset_bit = 7, 1417 .mnctr_mode_shift = 5, 1418 .n_val_shift = 16, 1419 .m_val_shift = 16, 1420 .width = 8, 1421 }, 1422 .p = { 1423 .pre_div_shift = 3, 1424 .pre_div_width = 2, 1425 }, 1426 .s = { 1427 .src_sel_shift = 0, 1428 .parent_map = gcc_pxo_pll8_map, 1429 }, 1430 .freq_tbl = clk_tbl_sdc, 1431 .clkr = { 1432 .enable_reg = 0x286c, 1433 .enable_mask = BIT(11), 1434 .hw.init = &(struct clk_init_data){ 1435 .name = "sdc3_src", 1436 .parent_data = gcc_pxo_pll8, 1437 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 1438 .ops = &clk_rcg_ops, 1439 }, 1440 } 1441 }; 1442 1443 static struct clk_branch sdc3_clk = { 1444 .halt_reg = 0x2fc8, 1445 .halt_bit = 4, 1446 .clkr = { 1447 .enable_reg = 0x286c, 1448 .enable_mask = BIT(9), 1449 .hw.init = &(struct clk_init_data){ 1450 .name = "sdc3_clk", 1451 .parent_hws = (const struct clk_hw*[]){ 1452 &sdc3_src.clkr.hw, 1453 }, 1454 .num_parents = 1, 1455 .ops = &clk_branch_ops, 1456 .flags = CLK_SET_RATE_PARENT, 1457 }, 1458 }, 1459 }; 1460 1461 static struct clk_branch sdc1_h_clk = { 1462 .hwcg_reg = 0x2820, 1463 .hwcg_bit = 6, 1464 .halt_reg = 0x2fc8, 1465 .halt_bit = 11, 1466 .clkr = { 1467 .enable_reg = 0x2820, 1468 .enable_mask = BIT(4), 1469 .hw.init = &(struct clk_init_data){ 1470 .name = "sdc1_h_clk", 1471 .ops = &clk_branch_ops, 1472 }, 1473 }, 1474 }; 1475 1476 static struct clk_branch sdc3_h_clk = { 1477 .hwcg_reg = 0x2860, 1478 .hwcg_bit = 6, 1479 .halt_reg = 0x2fc8, 1480 .halt_bit = 9, 1481 .clkr = { 1482 .enable_reg = 0x2860, 1483 .enable_mask = BIT(4), 1484 .hw.init = &(struct clk_init_data){ 1485 .name = "sdc3_h_clk", 1486 .ops = &clk_branch_ops, 1487 }, 1488 }, 1489 }; 1490 1491 static const struct freq_tbl clk_tbl_tsif_ref[] = { 1492 { 105000, P_PXO, 1, 1, 256 }, 1493 { } 1494 }; 1495 1496 static struct clk_rcg tsif_ref_src = { 1497 .ns_reg = 0x2710, 1498 .md_reg = 0x270c, 1499 .mn = { 1500 .mnctr_en_bit = 8, 1501 .mnctr_reset_bit = 7, 1502 .mnctr_mode_shift = 5, 1503 .n_val_shift = 16, 1504 .m_val_shift = 16, 1505 .width = 16, 1506 }, 1507 .p = { 1508 .pre_div_shift = 3, 1509 .pre_div_width = 2, 1510 }, 1511 .s = { 1512 .src_sel_shift = 0, 1513 .parent_map = gcc_pxo_pll8_map, 1514 }, 1515 .freq_tbl = clk_tbl_tsif_ref, 1516 .clkr = { 1517 .enable_reg = 0x2710, 1518 .enable_mask = BIT(11), 1519 .hw.init = &(struct clk_init_data){ 1520 .name = "tsif_ref_src", 1521 .parent_data = gcc_pxo_pll8, 1522 .num_parents = ARRAY_SIZE(gcc_pxo_pll8), 1523 .ops = &clk_rcg_ops, 1524 }, 1525 } 1526 }; 1527 1528 static struct clk_branch tsif_ref_clk = { 1529 .halt_reg = 0x2fd4, 1530 .halt_bit = 5, 1531 .clkr = { 1532 .enable_reg = 0x2710, 1533 .enable_mask = BIT(9), 1534 .hw.init = &(struct clk_init_data){ 1535 .name = "tsif_ref_clk", 1536 .parent_hws = (const struct clk_hw*[]){ 1537 &tsif_ref_src.clkr.hw, 1538 }, 1539 .num_parents = 1, 1540 .ops = &clk_branch_ops, 1541 .flags = CLK_SET_RATE_PARENT, 1542 }, 1543 }, 1544 }; 1545 1546 static struct clk_branch tsif_h_clk = { 1547 .hwcg_reg = 0x2700, 1548 .hwcg_bit = 6, 1549 .halt_reg = 0x2fd4, 1550 .halt_bit = 7, 1551 .clkr = { 1552 .enable_reg = 0x2700, 1553 .enable_mask = BIT(4), 1554 .hw.init = &(struct clk_init_data){ 1555 .name = "tsif_h_clk", 1556 .ops = &clk_branch_ops, 1557 }, 1558 }, 1559 }; 1560 1561 static struct clk_branch dma_bam_h_clk = { 1562 .hwcg_reg = 0x25c0, 1563 .hwcg_bit = 6, 1564 .halt_reg = 0x2fc8, 1565 .halt_bit = 12, 1566 .clkr = { 1567 .enable_reg = 0x25c0, 1568 .enable_mask = BIT(4), 1569 .hw.init = &(struct clk_init_data){ 1570 .name = "dma_bam_h_clk", 1571 .ops = &clk_branch_ops, 1572 }, 1573 }, 1574 }; 1575 1576 static struct clk_branch adm0_clk = { 1577 .halt_reg = 0x2fdc, 1578 .halt_check = BRANCH_HALT_VOTED, 1579 .halt_bit = 12, 1580 .clkr = { 1581 .enable_reg = 0x3080, 1582 .enable_mask = BIT(2), 1583 .hw.init = &(struct clk_init_data){ 1584 .name = "adm0_clk", 1585 .ops = &clk_branch_ops, 1586 }, 1587 }, 1588 }; 1589 1590 static struct clk_branch adm0_pbus_clk = { 1591 .hwcg_reg = 0x2208, 1592 .hwcg_bit = 6, 1593 .halt_reg = 0x2fdc, 1594 .halt_check = BRANCH_HALT_VOTED, 1595 .halt_bit = 11, 1596 .clkr = { 1597 .enable_reg = 0x3080, 1598 .enable_mask = BIT(3), 1599 .hw.init = &(struct clk_init_data){ 1600 .name = "adm0_pbus_clk", 1601 .ops = &clk_branch_ops, 1602 }, 1603 }, 1604 }; 1605 1606 static struct clk_branch pmic_arb0_h_clk = { 1607 .halt_reg = 0x2fd8, 1608 .halt_check = BRANCH_HALT_VOTED, 1609 .halt_bit = 22, 1610 .clkr = { 1611 .enable_reg = 0x3080, 1612 .enable_mask = BIT(8), 1613 .hw.init = &(struct clk_init_data){ 1614 .name = "pmic_arb0_h_clk", 1615 .ops = &clk_branch_ops, 1616 }, 1617 }, 1618 }; 1619 1620 static struct clk_branch pmic_arb1_h_clk = { 1621 .halt_reg = 0x2fd8, 1622 .halt_check = BRANCH_HALT_VOTED, 1623 .halt_bit = 21, 1624 .clkr = { 1625 .enable_reg = 0x3080, 1626 .enable_mask = BIT(9), 1627 .hw.init = &(struct clk_init_data){ 1628 .name = "pmic_arb1_h_clk", 1629 .ops = &clk_branch_ops, 1630 }, 1631 }, 1632 }; 1633 1634 static struct clk_branch pmic_ssbi2_clk = { 1635 .halt_reg = 0x2fd8, 1636 .halt_check = BRANCH_HALT_VOTED, 1637 .halt_bit = 23, 1638 .clkr = { 1639 .enable_reg = 0x3080, 1640 .enable_mask = BIT(7), 1641 .hw.init = &(struct clk_init_data){ 1642 .name = "pmic_ssbi2_clk", 1643 .ops = &clk_branch_ops, 1644 }, 1645 }, 1646 }; 1647 1648 static struct clk_branch rpm_msg_ram_h_clk = { 1649 .hwcg_reg = 0x27e0, 1650 .hwcg_bit = 6, 1651 .halt_reg = 0x2fd8, 1652 .halt_check = BRANCH_HALT_VOTED, 1653 .halt_bit = 12, 1654 .clkr = { 1655 .enable_reg = 0x3080, 1656 .enable_mask = BIT(6), 1657 .hw.init = &(struct clk_init_data){ 1658 .name = "rpm_msg_ram_h_clk", 1659 .ops = &clk_branch_ops, 1660 }, 1661 }, 1662 }; 1663 1664 static const struct freq_tbl clk_tbl_pcie_ref[] = { 1665 { 100000000, P_PLL3, 12, 0, 0 }, 1666 { } 1667 }; 1668 1669 static struct clk_rcg pcie_ref_src = { 1670 .ns_reg = 0x3860, 1671 .p = { 1672 .pre_div_shift = 3, 1673 .pre_div_width = 4, 1674 }, 1675 .s = { 1676 .src_sel_shift = 0, 1677 .parent_map = gcc_pxo_pll3_map, 1678 }, 1679 .freq_tbl = clk_tbl_pcie_ref, 1680 .clkr = { 1681 .enable_reg = 0x3860, 1682 .enable_mask = BIT(11), 1683 .hw.init = &(struct clk_init_data){ 1684 .name = "pcie_ref_src", 1685 .parent_data = gcc_pxo_pll3, 1686 .num_parents = ARRAY_SIZE(gcc_pxo_pll3), 1687 .ops = &clk_rcg_ops, 1688 .flags = CLK_SET_RATE_GATE, 1689 }, 1690 }, 1691 }; 1692 1693 static struct clk_branch pcie_ref_src_clk = { 1694 .halt_reg = 0x2fdc, 1695 .halt_bit = 30, 1696 .clkr = { 1697 .enable_reg = 0x3860, 1698 .enable_mask = BIT(9), 1699 .hw.init = &(struct clk_init_data){ 1700 .name = "pcie_ref_src_clk", 1701 .parent_hws = (const struct clk_hw*[]){ 1702 &pcie_ref_src.clkr.hw, 1703 }, 1704 .num_parents = 1, 1705 .ops = &clk_branch_ops, 1706 .flags = CLK_SET_RATE_PARENT, 1707 }, 1708 }, 1709 }; 1710 1711 static struct clk_branch pcie_a_clk = { 1712 .halt_reg = 0x2fc0, 1713 .halt_bit = 13, 1714 .clkr = { 1715 .enable_reg = 0x22c0, 1716 .enable_mask = BIT(4), 1717 .hw.init = &(struct clk_init_data){ 1718 .name = "pcie_a_clk", 1719 .ops = &clk_branch_ops, 1720 }, 1721 }, 1722 }; 1723 1724 static struct clk_branch pcie_aux_clk = { 1725 .halt_reg = 0x2fdc, 1726 .halt_bit = 31, 1727 .clkr = { 1728 .enable_reg = 0x22c8, 1729 .enable_mask = BIT(4), 1730 .hw.init = &(struct clk_init_data){ 1731 .name = "pcie_aux_clk", 1732 .ops = &clk_branch_ops, 1733 }, 1734 }, 1735 }; 1736 1737 static struct clk_branch pcie_h_clk = { 1738 .halt_reg = 0x2fd4, 1739 .halt_bit = 8, 1740 .clkr = { 1741 .enable_reg = 0x22cc, 1742 .enable_mask = BIT(4), 1743 .hw.init = &(struct clk_init_data){ 1744 .name = "pcie_h_clk", 1745 .ops = &clk_branch_ops, 1746 }, 1747 }, 1748 }; 1749 1750 static struct clk_branch pcie_phy_clk = { 1751 .halt_reg = 0x2fdc, 1752 .halt_bit = 29, 1753 .clkr = { 1754 .enable_reg = 0x22d0, 1755 .enable_mask = BIT(4), 1756 .hw.init = &(struct clk_init_data){ 1757 .name = "pcie_phy_clk", 1758 .ops = &clk_branch_ops, 1759 }, 1760 }, 1761 }; 1762 1763 static struct clk_rcg pcie1_ref_src = { 1764 .ns_reg = 0x3aa0, 1765 .p = { 1766 .pre_div_shift = 3, 1767 .pre_div_width = 4, 1768 }, 1769 .s = { 1770 .src_sel_shift = 0, 1771 .parent_map = gcc_pxo_pll3_map, 1772 }, 1773 .freq_tbl = clk_tbl_pcie_ref, 1774 .clkr = { 1775 .enable_reg = 0x3aa0, 1776 .enable_mask = BIT(11), 1777 .hw.init = &(struct clk_init_data){ 1778 .name = "pcie1_ref_src", 1779 .parent_data = gcc_pxo_pll3, 1780 .num_parents = ARRAY_SIZE(gcc_pxo_pll3), 1781 .ops = &clk_rcg_ops, 1782 .flags = CLK_SET_RATE_GATE, 1783 }, 1784 }, 1785 }; 1786 1787 static struct clk_branch pcie1_ref_src_clk = { 1788 .halt_reg = 0x2fdc, 1789 .halt_bit = 27, 1790 .clkr = { 1791 .enable_reg = 0x3aa0, 1792 .enable_mask = BIT(9), 1793 .hw.init = &(struct clk_init_data){ 1794 .name = "pcie1_ref_src_clk", 1795 .parent_hws = (const struct clk_hw*[]){ 1796 &pcie1_ref_src.clkr.hw, 1797 }, 1798 .num_parents = 1, 1799 .ops = &clk_branch_ops, 1800 .flags = CLK_SET_RATE_PARENT, 1801 }, 1802 }, 1803 }; 1804 1805 static struct clk_branch pcie1_a_clk = { 1806 .halt_reg = 0x2fc0, 1807 .halt_bit = 10, 1808 .clkr = { 1809 .enable_reg = 0x3a80, 1810 .enable_mask = BIT(4), 1811 .hw.init = &(struct clk_init_data){ 1812 .name = "pcie1_a_clk", 1813 .ops = &clk_branch_ops, 1814 }, 1815 }, 1816 }; 1817 1818 static struct clk_branch pcie1_aux_clk = { 1819 .halt_reg = 0x2fdc, 1820 .halt_bit = 28, 1821 .clkr = { 1822 .enable_reg = 0x3a88, 1823 .enable_mask = BIT(4), 1824 .hw.init = &(struct clk_init_data){ 1825 .name = "pcie1_aux_clk", 1826 .ops = &clk_branch_ops, 1827 }, 1828 }, 1829 }; 1830 1831 static struct clk_branch pcie1_h_clk = { 1832 .halt_reg = 0x2fd4, 1833 .halt_bit = 9, 1834 .clkr = { 1835 .enable_reg = 0x3a8c, 1836 .enable_mask = BIT(4), 1837 .hw.init = &(struct clk_init_data){ 1838 .name = "pcie1_h_clk", 1839 .ops = &clk_branch_ops, 1840 }, 1841 }, 1842 }; 1843 1844 static struct clk_branch pcie1_phy_clk = { 1845 .halt_reg = 0x2fdc, 1846 .halt_bit = 26, 1847 .clkr = { 1848 .enable_reg = 0x3a90, 1849 .enable_mask = BIT(4), 1850 .hw.init = &(struct clk_init_data){ 1851 .name = "pcie1_phy_clk", 1852 .ops = &clk_branch_ops, 1853 }, 1854 }, 1855 }; 1856 1857 static struct clk_rcg pcie2_ref_src = { 1858 .ns_reg = 0x3ae0, 1859 .p = { 1860 .pre_div_shift = 3, 1861 .pre_div_width = 4, 1862 }, 1863 .s = { 1864 .src_sel_shift = 0, 1865 .parent_map = gcc_pxo_pll3_map, 1866 }, 1867 .freq_tbl = clk_tbl_pcie_ref, 1868 .clkr = { 1869 .enable_reg = 0x3ae0, 1870 .enable_mask = BIT(11), 1871 .hw.init = &(struct clk_init_data){ 1872 .name = "pcie2_ref_src", 1873 .parent_data = gcc_pxo_pll3, 1874 .num_parents = ARRAY_SIZE(gcc_pxo_pll3), 1875 .ops = &clk_rcg_ops, 1876 .flags = CLK_SET_RATE_GATE, 1877 }, 1878 }, 1879 }; 1880 1881 static struct clk_branch pcie2_ref_src_clk = { 1882 .halt_reg = 0x2fdc, 1883 .halt_bit = 24, 1884 .clkr = { 1885 .enable_reg = 0x3ae0, 1886 .enable_mask = BIT(9), 1887 .hw.init = &(struct clk_init_data){ 1888 .name = "pcie2_ref_src_clk", 1889 .parent_hws = (const struct clk_hw*[]){ 1890 &pcie2_ref_src.clkr.hw, 1891 }, 1892 .num_parents = 1, 1893 .ops = &clk_branch_ops, 1894 .flags = CLK_SET_RATE_PARENT, 1895 }, 1896 }, 1897 }; 1898 1899 static struct clk_branch pcie2_a_clk = { 1900 .halt_reg = 0x2fc0, 1901 .halt_bit = 9, 1902 .clkr = { 1903 .enable_reg = 0x3ac0, 1904 .enable_mask = BIT(4), 1905 .hw.init = &(struct clk_init_data){ 1906 .name = "pcie2_a_clk", 1907 .ops = &clk_branch_ops, 1908 }, 1909 }, 1910 }; 1911 1912 static struct clk_branch pcie2_aux_clk = { 1913 .halt_reg = 0x2fdc, 1914 .halt_bit = 25, 1915 .clkr = { 1916 .enable_reg = 0x3ac8, 1917 .enable_mask = BIT(4), 1918 .hw.init = &(struct clk_init_data){ 1919 .name = "pcie2_aux_clk", 1920 .ops = &clk_branch_ops, 1921 }, 1922 }, 1923 }; 1924 1925 static struct clk_branch pcie2_h_clk = { 1926 .halt_reg = 0x2fd4, 1927 .halt_bit = 10, 1928 .clkr = { 1929 .enable_reg = 0x3acc, 1930 .enable_mask = BIT(4), 1931 .hw.init = &(struct clk_init_data){ 1932 .name = "pcie2_h_clk", 1933 .ops = &clk_branch_ops, 1934 }, 1935 }, 1936 }; 1937 1938 static struct clk_branch pcie2_phy_clk = { 1939 .halt_reg = 0x2fdc, 1940 .halt_bit = 23, 1941 .clkr = { 1942 .enable_reg = 0x3ad0, 1943 .enable_mask = BIT(4), 1944 .hw.init = &(struct clk_init_data){ 1945 .name = "pcie2_phy_clk", 1946 .ops = &clk_branch_ops, 1947 }, 1948 }, 1949 }; 1950 1951 static const struct freq_tbl clk_tbl_sata_ref[] = { 1952 { 100000000, P_PLL3, 12, 0, 0 }, 1953 { } 1954 }; 1955 1956 static struct clk_rcg sata_ref_src = { 1957 .ns_reg = 0x2c08, 1958 .p = { 1959 .pre_div_shift = 3, 1960 .pre_div_width = 4, 1961 }, 1962 .s = { 1963 .src_sel_shift = 0, 1964 .parent_map = gcc_pxo_pll3_sata_map, 1965 }, 1966 .freq_tbl = clk_tbl_sata_ref, 1967 .clkr = { 1968 .enable_reg = 0x2c08, 1969 .enable_mask = BIT(7), 1970 .hw.init = &(struct clk_init_data){ 1971 .name = "sata_ref_src", 1972 .parent_data = gcc_pxo_pll3, 1973 .num_parents = ARRAY_SIZE(gcc_pxo_pll3), 1974 .ops = &clk_rcg_ops, 1975 .flags = CLK_SET_RATE_GATE, 1976 }, 1977 }, 1978 }; 1979 1980 static struct clk_branch sata_rxoob_clk = { 1981 .halt_reg = 0x2fdc, 1982 .halt_bit = 20, 1983 .clkr = { 1984 .enable_reg = 0x2c0c, 1985 .enable_mask = BIT(4), 1986 .hw.init = &(struct clk_init_data){ 1987 .name = "sata_rxoob_clk", 1988 .parent_hws = (const struct clk_hw*[]){ 1989 &sata_ref_src.clkr.hw, 1990 }, 1991 .num_parents = 1, 1992 .ops = &clk_branch_ops, 1993 .flags = CLK_SET_RATE_PARENT, 1994 }, 1995 }, 1996 }; 1997 1998 static struct clk_branch sata_pmalive_clk = { 1999 .halt_reg = 0x2fdc, 2000 .halt_bit = 19, 2001 .clkr = { 2002 .enable_reg = 0x2c10, 2003 .enable_mask = BIT(4), 2004 .hw.init = &(struct clk_init_data){ 2005 .name = "sata_pmalive_clk", 2006 .parent_hws = (const struct clk_hw*[]){ 2007 &sata_ref_src.clkr.hw, 2008 }, 2009 .num_parents = 1, 2010 .ops = &clk_branch_ops, 2011 .flags = CLK_SET_RATE_PARENT, 2012 }, 2013 }, 2014 }; 2015 2016 static struct clk_branch sata_phy_ref_clk = { 2017 .halt_reg = 0x2fdc, 2018 .halt_bit = 18, 2019 .clkr = { 2020 .enable_reg = 0x2c14, 2021 .enable_mask = BIT(4), 2022 .hw.init = &(struct clk_init_data){ 2023 .name = "sata_phy_ref_clk", 2024 .parent_data = gcc_pxo, 2025 .num_parents = 1, 2026 .ops = &clk_branch_ops, 2027 }, 2028 }, 2029 }; 2030 2031 static struct clk_branch sata_a_clk = { 2032 .halt_reg = 0x2fc0, 2033 .halt_bit = 12, 2034 .clkr = { 2035 .enable_reg = 0x2c20, 2036 .enable_mask = BIT(4), 2037 .hw.init = &(struct clk_init_data){ 2038 .name = "sata_a_clk", 2039 .ops = &clk_branch_ops, 2040 }, 2041 }, 2042 }; 2043 2044 static struct clk_branch sata_h_clk = { 2045 .halt_reg = 0x2fdc, 2046 .halt_bit = 21, 2047 .clkr = { 2048 .enable_reg = 0x2c00, 2049 .enable_mask = BIT(4), 2050 .hw.init = &(struct clk_init_data){ 2051 .name = "sata_h_clk", 2052 .ops = &clk_branch_ops, 2053 }, 2054 }, 2055 }; 2056 2057 static struct clk_branch sfab_sata_s_h_clk = { 2058 .halt_reg = 0x2fc4, 2059 .halt_bit = 14, 2060 .clkr = { 2061 .enable_reg = 0x2480, 2062 .enable_mask = BIT(4), 2063 .hw.init = &(struct clk_init_data){ 2064 .name = "sfab_sata_s_h_clk", 2065 .ops = &clk_branch_ops, 2066 }, 2067 }, 2068 }; 2069 2070 static struct clk_branch sata_phy_cfg_clk = { 2071 .halt_reg = 0x2fcc, 2072 .halt_bit = 14, 2073 .clkr = { 2074 .enable_reg = 0x2c40, 2075 .enable_mask = BIT(4), 2076 .hw.init = &(struct clk_init_data){ 2077 .name = "sata_phy_cfg_clk", 2078 .ops = &clk_branch_ops, 2079 }, 2080 }, 2081 }; 2082 2083 static const struct freq_tbl clk_tbl_usb30_master[] = { 2084 { 125000000, P_PLL0, 1, 5, 32 }, 2085 { } 2086 }; 2087 2088 static struct clk_rcg usb30_master_clk_src = { 2089 .ns_reg = 0x3b2c, 2090 .md_reg = 0x3b28, 2091 .mn = { 2092 .mnctr_en_bit = 8, 2093 .mnctr_reset_bit = 7, 2094 .mnctr_mode_shift = 5, 2095 .n_val_shift = 16, 2096 .m_val_shift = 16, 2097 .width = 8, 2098 }, 2099 .p = { 2100 .pre_div_shift = 3, 2101 .pre_div_width = 2, 2102 }, 2103 .s = { 2104 .src_sel_shift = 0, 2105 .parent_map = gcc_pxo_pll8_pll0_map, 2106 }, 2107 .freq_tbl = clk_tbl_usb30_master, 2108 .clkr = { 2109 .enable_reg = 0x3b2c, 2110 .enable_mask = BIT(11), 2111 .hw.init = &(struct clk_init_data){ 2112 .name = "usb30_master_ref_src", 2113 .parent_data = gcc_pxo_pll8_pll0, 2114 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0), 2115 .ops = &clk_rcg_ops, 2116 .flags = CLK_SET_RATE_GATE, 2117 }, 2118 }, 2119 }; 2120 2121 static struct clk_branch usb30_0_branch_clk = { 2122 .halt_reg = 0x2fc4, 2123 .halt_bit = 22, 2124 .clkr = { 2125 .enable_reg = 0x3b24, 2126 .enable_mask = BIT(4), 2127 .hw.init = &(struct clk_init_data){ 2128 .name = "usb30_0_branch_clk", 2129 .parent_hws = (const struct clk_hw*[]){ 2130 &usb30_master_clk_src.clkr.hw, 2131 }, 2132 .num_parents = 1, 2133 .ops = &clk_branch_ops, 2134 .flags = CLK_SET_RATE_PARENT, 2135 }, 2136 }, 2137 }; 2138 2139 static struct clk_branch usb30_1_branch_clk = { 2140 .halt_reg = 0x2fc4, 2141 .halt_bit = 17, 2142 .clkr = { 2143 .enable_reg = 0x3b34, 2144 .enable_mask = BIT(4), 2145 .hw.init = &(struct clk_init_data){ 2146 .name = "usb30_1_branch_clk", 2147 .parent_hws = (const struct clk_hw*[]){ 2148 &usb30_master_clk_src.clkr.hw, 2149 }, 2150 .num_parents = 1, 2151 .ops = &clk_branch_ops, 2152 .flags = CLK_SET_RATE_PARENT, 2153 }, 2154 }, 2155 }; 2156 2157 static const struct freq_tbl clk_tbl_usb30_utmi[] = { 2158 { 60000000, P_PLL8, 1, 5, 32 }, 2159 { } 2160 }; 2161 2162 static struct clk_rcg usb30_utmi_clk = { 2163 .ns_reg = 0x3b44, 2164 .md_reg = 0x3b40, 2165 .mn = { 2166 .mnctr_en_bit = 8, 2167 .mnctr_reset_bit = 7, 2168 .mnctr_mode_shift = 5, 2169 .n_val_shift = 16, 2170 .m_val_shift = 16, 2171 .width = 8, 2172 }, 2173 .p = { 2174 .pre_div_shift = 3, 2175 .pre_div_width = 2, 2176 }, 2177 .s = { 2178 .src_sel_shift = 0, 2179 .parent_map = gcc_pxo_pll8_pll0_map, 2180 }, 2181 .freq_tbl = clk_tbl_usb30_utmi, 2182 .clkr = { 2183 .enable_reg = 0x3b44, 2184 .enable_mask = BIT(11), 2185 .hw.init = &(struct clk_init_data){ 2186 .name = "usb30_utmi_clk", 2187 .parent_data = gcc_pxo_pll8_pll0, 2188 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0), 2189 .ops = &clk_rcg_ops, 2190 .flags = CLK_SET_RATE_GATE, 2191 }, 2192 }, 2193 }; 2194 2195 static struct clk_branch usb30_0_utmi_clk_ctl = { 2196 .halt_reg = 0x2fc4, 2197 .halt_bit = 21, 2198 .clkr = { 2199 .enable_reg = 0x3b48, 2200 .enable_mask = BIT(4), 2201 .hw.init = &(struct clk_init_data){ 2202 .name = "usb30_0_utmi_clk_ctl", 2203 .parent_hws = (const struct clk_hw*[]){ 2204 &usb30_utmi_clk.clkr.hw, 2205 }, 2206 .num_parents = 1, 2207 .ops = &clk_branch_ops, 2208 .flags = CLK_SET_RATE_PARENT, 2209 }, 2210 }, 2211 }; 2212 2213 static struct clk_branch usb30_1_utmi_clk_ctl = { 2214 .halt_reg = 0x2fc4, 2215 .halt_bit = 15, 2216 .clkr = { 2217 .enable_reg = 0x3b4c, 2218 .enable_mask = BIT(4), 2219 .hw.init = &(struct clk_init_data){ 2220 .name = "usb30_1_utmi_clk_ctl", 2221 .parent_hws = (const struct clk_hw*[]){ 2222 &usb30_utmi_clk.clkr.hw, 2223 }, 2224 .num_parents = 1, 2225 .ops = &clk_branch_ops, 2226 .flags = CLK_SET_RATE_PARENT, 2227 }, 2228 }, 2229 }; 2230 2231 static const struct freq_tbl clk_tbl_usb[] = { 2232 { 60000000, P_PLL8, 1, 5, 32 }, 2233 { } 2234 }; 2235 2236 static struct clk_rcg usb_hs1_xcvr_clk_src = { 2237 .ns_reg = 0x290C, 2238 .md_reg = 0x2908, 2239 .mn = { 2240 .mnctr_en_bit = 8, 2241 .mnctr_reset_bit = 7, 2242 .mnctr_mode_shift = 5, 2243 .n_val_shift = 16, 2244 .m_val_shift = 16, 2245 .width = 8, 2246 }, 2247 .p = { 2248 .pre_div_shift = 3, 2249 .pre_div_width = 2, 2250 }, 2251 .s = { 2252 .src_sel_shift = 0, 2253 .parent_map = gcc_pxo_pll8_pll0_map, 2254 }, 2255 .freq_tbl = clk_tbl_usb, 2256 .clkr = { 2257 .enable_reg = 0x2968, 2258 .enable_mask = BIT(11), 2259 .hw.init = &(struct clk_init_data){ 2260 .name = "usb_hs1_xcvr_src", 2261 .parent_data = gcc_pxo_pll8_pll0, 2262 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0), 2263 .ops = &clk_rcg_ops, 2264 .flags = CLK_SET_RATE_GATE, 2265 }, 2266 }, 2267 }; 2268 2269 static struct clk_branch usb_hs1_xcvr_clk = { 2270 .halt_reg = 0x2fcc, 2271 .halt_bit = 17, 2272 .clkr = { 2273 .enable_reg = 0x290c, 2274 .enable_mask = BIT(9), 2275 .hw.init = &(struct clk_init_data){ 2276 .name = "usb_hs1_xcvr_clk", 2277 .parent_hws = (const struct clk_hw*[]){ 2278 &usb_hs1_xcvr_clk_src.clkr.hw, 2279 }, 2280 .num_parents = 1, 2281 .ops = &clk_branch_ops, 2282 .flags = CLK_SET_RATE_PARENT, 2283 }, 2284 }, 2285 }; 2286 2287 static struct clk_branch usb_hs1_h_clk = { 2288 .hwcg_reg = 0x2900, 2289 .hwcg_bit = 6, 2290 .halt_reg = 0x2fc8, 2291 .halt_bit = 1, 2292 .clkr = { 2293 .enable_reg = 0x2900, 2294 .enable_mask = BIT(4), 2295 .hw.init = &(struct clk_init_data){ 2296 .name = "usb_hs1_h_clk", 2297 .ops = &clk_branch_ops, 2298 }, 2299 }, 2300 }; 2301 2302 static struct clk_rcg usb_fs1_xcvr_clk_src = { 2303 .ns_reg = 0x2968, 2304 .md_reg = 0x2964, 2305 .mn = { 2306 .mnctr_en_bit = 8, 2307 .mnctr_reset_bit = 7, 2308 .mnctr_mode_shift = 5, 2309 .n_val_shift = 16, 2310 .m_val_shift = 16, 2311 .width = 8, 2312 }, 2313 .p = { 2314 .pre_div_shift = 3, 2315 .pre_div_width = 2, 2316 }, 2317 .s = { 2318 .src_sel_shift = 0, 2319 .parent_map = gcc_pxo_pll8_pll0_map, 2320 }, 2321 .freq_tbl = clk_tbl_usb, 2322 .clkr = { 2323 .enable_reg = 0x2968, 2324 .enable_mask = BIT(11), 2325 .hw.init = &(struct clk_init_data){ 2326 .name = "usb_fs1_xcvr_src", 2327 .parent_data = gcc_pxo_pll8_pll0, 2328 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0), 2329 .ops = &clk_rcg_ops, 2330 .flags = CLK_SET_RATE_GATE, 2331 }, 2332 }, 2333 }; 2334 2335 static struct clk_branch usb_fs1_xcvr_clk = { 2336 .halt_reg = 0x2fcc, 2337 .halt_bit = 17, 2338 .clkr = { 2339 .enable_reg = 0x2968, 2340 .enable_mask = BIT(9), 2341 .hw.init = &(struct clk_init_data){ 2342 .name = "usb_fs1_xcvr_clk", 2343 .parent_hws = (const struct clk_hw*[]){ 2344 &usb_fs1_xcvr_clk_src.clkr.hw, 2345 }, 2346 .num_parents = 1, 2347 .ops = &clk_branch_ops, 2348 .flags = CLK_SET_RATE_PARENT, 2349 }, 2350 }, 2351 }; 2352 2353 static struct clk_branch usb_fs1_sys_clk = { 2354 .halt_reg = 0x2fcc, 2355 .halt_bit = 18, 2356 .clkr = { 2357 .enable_reg = 0x296c, 2358 .enable_mask = BIT(4), 2359 .hw.init = &(struct clk_init_data){ 2360 .name = "usb_fs1_sys_clk", 2361 .parent_hws = (const struct clk_hw*[]){ 2362 &usb_fs1_xcvr_clk_src.clkr.hw, 2363 }, 2364 .num_parents = 1, 2365 .ops = &clk_branch_ops, 2366 .flags = CLK_SET_RATE_PARENT, 2367 }, 2368 }, 2369 }; 2370 2371 static struct clk_branch usb_fs1_h_clk = { 2372 .halt_reg = 0x2fcc, 2373 .halt_bit = 19, 2374 .clkr = { 2375 .enable_reg = 0x2960, 2376 .enable_mask = BIT(4), 2377 .hw.init = &(struct clk_init_data){ 2378 .name = "usb_fs1_h_clk", 2379 .ops = &clk_branch_ops, 2380 }, 2381 }, 2382 }; 2383 2384 static struct clk_branch ebi2_clk = { 2385 .hwcg_reg = 0x3b00, 2386 .hwcg_bit = 6, 2387 .halt_reg = 0x2fcc, 2388 .halt_bit = 1, 2389 .clkr = { 2390 .enable_reg = 0x3b00, 2391 .enable_mask = BIT(4), 2392 .hw.init = &(struct clk_init_data){ 2393 .name = "ebi2_clk", 2394 .ops = &clk_branch_ops, 2395 }, 2396 }, 2397 }; 2398 2399 static struct clk_branch ebi2_aon_clk = { 2400 .halt_reg = 0x2fcc, 2401 .halt_bit = 0, 2402 .clkr = { 2403 .enable_reg = 0x3b00, 2404 .enable_mask = BIT(8), 2405 .hw.init = &(struct clk_init_data){ 2406 .name = "ebi2_always_on_clk", 2407 .ops = &clk_branch_ops, 2408 }, 2409 }, 2410 }; 2411 2412 static const struct freq_tbl clk_tbl_gmac[] = { 2413 { 133000000, P_PLL0, 1, 50, 301 }, 2414 { 266000000, P_PLL0, 1, 127, 382 }, 2415 { } 2416 }; 2417 2418 static struct clk_dyn_rcg gmac_core1_src = { 2419 .ns_reg[0] = 0x3cac, 2420 .ns_reg[1] = 0x3cb0, 2421 .md_reg[0] = 0x3ca4, 2422 .md_reg[1] = 0x3ca8, 2423 .bank_reg = 0x3ca0, 2424 .mn[0] = { 2425 .mnctr_en_bit = 8, 2426 .mnctr_reset_bit = 7, 2427 .mnctr_mode_shift = 5, 2428 .n_val_shift = 16, 2429 .m_val_shift = 16, 2430 .width = 8, 2431 }, 2432 .mn[1] = { 2433 .mnctr_en_bit = 8, 2434 .mnctr_reset_bit = 7, 2435 .mnctr_mode_shift = 5, 2436 .n_val_shift = 16, 2437 .m_val_shift = 16, 2438 .width = 8, 2439 }, 2440 .s[0] = { 2441 .src_sel_shift = 0, 2442 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2443 }, 2444 .s[1] = { 2445 .src_sel_shift = 0, 2446 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2447 }, 2448 .p[0] = { 2449 .pre_div_shift = 3, 2450 .pre_div_width = 2, 2451 }, 2452 .p[1] = { 2453 .pre_div_shift = 3, 2454 .pre_div_width = 2, 2455 }, 2456 .mux_sel_bit = 0, 2457 .freq_tbl = clk_tbl_gmac, 2458 .clkr = { 2459 .enable_reg = 0x3ca0, 2460 .enable_mask = BIT(1), 2461 .hw.init = &(struct clk_init_data){ 2462 .name = "gmac_core1_src", 2463 .parent_data = gcc_pxo_pll8_pll14_pll18_pll0, 2464 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0), 2465 .ops = &clk_dyn_rcg_ops, 2466 }, 2467 }, 2468 }; 2469 2470 static struct clk_branch gmac_core1_clk = { 2471 .halt_reg = 0x3c20, 2472 .halt_bit = 4, 2473 .hwcg_reg = 0x3cb4, 2474 .hwcg_bit = 6, 2475 .clkr = { 2476 .enable_reg = 0x3cb4, 2477 .enable_mask = BIT(4), 2478 .hw.init = &(struct clk_init_data){ 2479 .name = "gmac_core1_clk", 2480 .parent_hws = (const struct clk_hw*[]){ 2481 &gmac_core1_src.clkr.hw, 2482 }, 2483 .num_parents = 1, 2484 .ops = &clk_branch_ops, 2485 .flags = CLK_SET_RATE_PARENT, 2486 }, 2487 }, 2488 }; 2489 2490 static struct clk_dyn_rcg gmac_core2_src = { 2491 .ns_reg[0] = 0x3ccc, 2492 .ns_reg[1] = 0x3cd0, 2493 .md_reg[0] = 0x3cc4, 2494 .md_reg[1] = 0x3cc8, 2495 .bank_reg = 0x3ca0, 2496 .mn[0] = { 2497 .mnctr_en_bit = 8, 2498 .mnctr_reset_bit = 7, 2499 .mnctr_mode_shift = 5, 2500 .n_val_shift = 16, 2501 .m_val_shift = 16, 2502 .width = 8, 2503 }, 2504 .mn[1] = { 2505 .mnctr_en_bit = 8, 2506 .mnctr_reset_bit = 7, 2507 .mnctr_mode_shift = 5, 2508 .n_val_shift = 16, 2509 .m_val_shift = 16, 2510 .width = 8, 2511 }, 2512 .s[0] = { 2513 .src_sel_shift = 0, 2514 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2515 }, 2516 .s[1] = { 2517 .src_sel_shift = 0, 2518 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2519 }, 2520 .p[0] = { 2521 .pre_div_shift = 3, 2522 .pre_div_width = 2, 2523 }, 2524 .p[1] = { 2525 .pre_div_shift = 3, 2526 .pre_div_width = 2, 2527 }, 2528 .mux_sel_bit = 0, 2529 .freq_tbl = clk_tbl_gmac, 2530 .clkr = { 2531 .enable_reg = 0x3cc0, 2532 .enable_mask = BIT(1), 2533 .hw.init = &(struct clk_init_data){ 2534 .name = "gmac_core2_src", 2535 .parent_data = gcc_pxo_pll8_pll14_pll18_pll0, 2536 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0), 2537 .ops = &clk_dyn_rcg_ops, 2538 }, 2539 }, 2540 }; 2541 2542 static struct clk_branch gmac_core2_clk = { 2543 .halt_reg = 0x3c20, 2544 .halt_bit = 5, 2545 .hwcg_reg = 0x3cd4, 2546 .hwcg_bit = 6, 2547 .clkr = { 2548 .enable_reg = 0x3cd4, 2549 .enable_mask = BIT(4), 2550 .hw.init = &(struct clk_init_data){ 2551 .name = "gmac_core2_clk", 2552 .parent_hws = (const struct clk_hw*[]){ 2553 &gmac_core2_src.clkr.hw, 2554 }, 2555 .num_parents = 1, 2556 .ops = &clk_branch_ops, 2557 .flags = CLK_SET_RATE_PARENT, 2558 }, 2559 }, 2560 }; 2561 2562 static struct clk_dyn_rcg gmac_core3_src = { 2563 .ns_reg[0] = 0x3cec, 2564 .ns_reg[1] = 0x3cf0, 2565 .md_reg[0] = 0x3ce4, 2566 .md_reg[1] = 0x3ce8, 2567 .bank_reg = 0x3ce0, 2568 .mn[0] = { 2569 .mnctr_en_bit = 8, 2570 .mnctr_reset_bit = 7, 2571 .mnctr_mode_shift = 5, 2572 .n_val_shift = 16, 2573 .m_val_shift = 16, 2574 .width = 8, 2575 }, 2576 .mn[1] = { 2577 .mnctr_en_bit = 8, 2578 .mnctr_reset_bit = 7, 2579 .mnctr_mode_shift = 5, 2580 .n_val_shift = 16, 2581 .m_val_shift = 16, 2582 .width = 8, 2583 }, 2584 .s[0] = { 2585 .src_sel_shift = 0, 2586 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2587 }, 2588 .s[1] = { 2589 .src_sel_shift = 0, 2590 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2591 }, 2592 .p[0] = { 2593 .pre_div_shift = 3, 2594 .pre_div_width = 2, 2595 }, 2596 .p[1] = { 2597 .pre_div_shift = 3, 2598 .pre_div_width = 2, 2599 }, 2600 .mux_sel_bit = 0, 2601 .freq_tbl = clk_tbl_gmac, 2602 .clkr = { 2603 .enable_reg = 0x3ce0, 2604 .enable_mask = BIT(1), 2605 .hw.init = &(struct clk_init_data){ 2606 .name = "gmac_core3_src", 2607 .parent_data = gcc_pxo_pll8_pll14_pll18_pll0, 2608 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0), 2609 .ops = &clk_dyn_rcg_ops, 2610 }, 2611 }, 2612 }; 2613 2614 static struct clk_branch gmac_core3_clk = { 2615 .halt_reg = 0x3c20, 2616 .halt_bit = 6, 2617 .hwcg_reg = 0x3cf4, 2618 .hwcg_bit = 6, 2619 .clkr = { 2620 .enable_reg = 0x3cf4, 2621 .enable_mask = BIT(4), 2622 .hw.init = &(struct clk_init_data){ 2623 .name = "gmac_core3_clk", 2624 .parent_hws = (const struct clk_hw*[]){ 2625 &gmac_core3_src.clkr.hw, 2626 }, 2627 .num_parents = 1, 2628 .ops = &clk_branch_ops, 2629 .flags = CLK_SET_RATE_PARENT, 2630 }, 2631 }, 2632 }; 2633 2634 static struct clk_dyn_rcg gmac_core4_src = { 2635 .ns_reg[0] = 0x3d0c, 2636 .ns_reg[1] = 0x3d10, 2637 .md_reg[0] = 0x3d04, 2638 .md_reg[1] = 0x3d08, 2639 .bank_reg = 0x3d00, 2640 .mn[0] = { 2641 .mnctr_en_bit = 8, 2642 .mnctr_reset_bit = 7, 2643 .mnctr_mode_shift = 5, 2644 .n_val_shift = 16, 2645 .m_val_shift = 16, 2646 .width = 8, 2647 }, 2648 .mn[1] = { 2649 .mnctr_en_bit = 8, 2650 .mnctr_reset_bit = 7, 2651 .mnctr_mode_shift = 5, 2652 .n_val_shift = 16, 2653 .m_val_shift = 16, 2654 .width = 8, 2655 }, 2656 .s[0] = { 2657 .src_sel_shift = 0, 2658 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2659 }, 2660 .s[1] = { 2661 .src_sel_shift = 0, 2662 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2663 }, 2664 .p[0] = { 2665 .pre_div_shift = 3, 2666 .pre_div_width = 2, 2667 }, 2668 .p[1] = { 2669 .pre_div_shift = 3, 2670 .pre_div_width = 2, 2671 }, 2672 .mux_sel_bit = 0, 2673 .freq_tbl = clk_tbl_gmac, 2674 .clkr = { 2675 .enable_reg = 0x3d00, 2676 .enable_mask = BIT(1), 2677 .hw.init = &(struct clk_init_data){ 2678 .name = "gmac_core4_src", 2679 .parent_data = gcc_pxo_pll8_pll14_pll18_pll0, 2680 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0), 2681 .ops = &clk_dyn_rcg_ops, 2682 }, 2683 }, 2684 }; 2685 2686 static struct clk_branch gmac_core4_clk = { 2687 .halt_reg = 0x3c20, 2688 .halt_bit = 7, 2689 .hwcg_reg = 0x3d14, 2690 .hwcg_bit = 6, 2691 .clkr = { 2692 .enable_reg = 0x3d14, 2693 .enable_mask = BIT(4), 2694 .hw.init = &(struct clk_init_data){ 2695 .name = "gmac_core4_clk", 2696 .parent_hws = (const struct clk_hw*[]){ 2697 &gmac_core4_src.clkr.hw, 2698 }, 2699 .num_parents = 1, 2700 .ops = &clk_branch_ops, 2701 .flags = CLK_SET_RATE_PARENT, 2702 }, 2703 }, 2704 }; 2705 2706 static const struct freq_tbl clk_tbl_nss_tcm[] = { 2707 { 266000000, P_PLL0, 3, 0, 0 }, 2708 { 400000000, P_PLL0, 2, 0, 0 }, 2709 { } 2710 }; 2711 2712 static struct clk_dyn_rcg nss_tcm_src = { 2713 .ns_reg[0] = 0x3dc4, 2714 .ns_reg[1] = 0x3dc8, 2715 .bank_reg = 0x3dc0, 2716 .s[0] = { 2717 .src_sel_shift = 0, 2718 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2719 }, 2720 .s[1] = { 2721 .src_sel_shift = 0, 2722 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2723 }, 2724 .p[0] = { 2725 .pre_div_shift = 3, 2726 .pre_div_width = 4, 2727 }, 2728 .p[1] = { 2729 .pre_div_shift = 3, 2730 .pre_div_width = 4, 2731 }, 2732 .mux_sel_bit = 0, 2733 .freq_tbl = clk_tbl_nss_tcm, 2734 .clkr = { 2735 .enable_reg = 0x3dc0, 2736 .enable_mask = BIT(1), 2737 .hw.init = &(struct clk_init_data){ 2738 .name = "nss_tcm_src", 2739 .parent_data = gcc_pxo_pll8_pll14_pll18_pll0, 2740 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0), 2741 .ops = &clk_dyn_rcg_ops, 2742 }, 2743 }, 2744 }; 2745 2746 static struct clk_branch nss_tcm_clk = { 2747 .halt_reg = 0x3c20, 2748 .halt_bit = 14, 2749 .clkr = { 2750 .enable_reg = 0x3dd0, 2751 .enable_mask = BIT(6) | BIT(4), 2752 .hw.init = &(struct clk_init_data){ 2753 .name = "nss_tcm_clk", 2754 .parent_hws = (const struct clk_hw*[]){ 2755 &nss_tcm_src.clkr.hw, 2756 }, 2757 .num_parents = 1, 2758 .ops = &clk_branch_ops, 2759 .flags = CLK_SET_RATE_PARENT, 2760 }, 2761 }, 2762 }; 2763 2764 static const struct freq_tbl clk_tbl_nss_ipq8064[] = { 2765 { 110000000, P_PLL18, 1, 1, 5 }, 2766 { 275000000, P_PLL18, 2, 0, 0 }, 2767 { 550000000, P_PLL18, 1, 0, 0 }, 2768 { 733000000, P_PLL18, 1, 0, 0 }, 2769 { } 2770 }; 2771 2772 static const struct freq_tbl clk_tbl_nss_ipq8065[] = { 2773 { 110000000, P_PLL18, 1, 1, 5 }, 2774 { 275000000, P_PLL18, 2, 0, 0 }, 2775 { 600000000, P_PLL18, 1, 0, 0 }, 2776 { 800000000, P_PLL18, 1, 0, 0 }, 2777 { } 2778 }; 2779 2780 static struct clk_dyn_rcg ubi32_core1_src_clk = { 2781 .ns_reg[0] = 0x3d2c, 2782 .ns_reg[1] = 0x3d30, 2783 .md_reg[0] = 0x3d24, 2784 .md_reg[1] = 0x3d28, 2785 .bank_reg = 0x3d20, 2786 .mn[0] = { 2787 .mnctr_en_bit = 8, 2788 .mnctr_reset_bit = 7, 2789 .mnctr_mode_shift = 5, 2790 .n_val_shift = 16, 2791 .m_val_shift = 16, 2792 .width = 8, 2793 }, 2794 .mn[1] = { 2795 .mnctr_en_bit = 8, 2796 .mnctr_reset_bit = 7, 2797 .mnctr_mode_shift = 5, 2798 .n_val_shift = 16, 2799 .m_val_shift = 16, 2800 .width = 8, 2801 }, 2802 .s[0] = { 2803 .src_sel_shift = 0, 2804 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2805 }, 2806 .s[1] = { 2807 .src_sel_shift = 0, 2808 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2809 }, 2810 .p[0] = { 2811 .pre_div_shift = 3, 2812 .pre_div_width = 2, 2813 }, 2814 .p[1] = { 2815 .pre_div_shift = 3, 2816 .pre_div_width = 2, 2817 }, 2818 .mux_sel_bit = 0, 2819 /* nss freq table is selected based on the SoC compatible */ 2820 .clkr = { 2821 .enable_reg = 0x3d20, 2822 .enable_mask = BIT(1), 2823 .hw.init = &(struct clk_init_data){ 2824 .name = "ubi32_core1_src_clk", 2825 .parent_data = gcc_pxo_pll8_pll14_pll18_pll0, 2826 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0), 2827 .ops = &clk_dyn_rcg_ops, 2828 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, 2829 }, 2830 }, 2831 }; 2832 2833 static struct clk_dyn_rcg ubi32_core2_src_clk = { 2834 .ns_reg[0] = 0x3d4c, 2835 .ns_reg[1] = 0x3d50, 2836 .md_reg[0] = 0x3d44, 2837 .md_reg[1] = 0x3d48, 2838 .bank_reg = 0x3d40, 2839 .mn[0] = { 2840 .mnctr_en_bit = 8, 2841 .mnctr_reset_bit = 7, 2842 .mnctr_mode_shift = 5, 2843 .n_val_shift = 16, 2844 .m_val_shift = 16, 2845 .width = 8, 2846 }, 2847 .mn[1] = { 2848 .mnctr_en_bit = 8, 2849 .mnctr_reset_bit = 7, 2850 .mnctr_mode_shift = 5, 2851 .n_val_shift = 16, 2852 .m_val_shift = 16, 2853 .width = 8, 2854 }, 2855 .s[0] = { 2856 .src_sel_shift = 0, 2857 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2858 }, 2859 .s[1] = { 2860 .src_sel_shift = 0, 2861 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map, 2862 }, 2863 .p[0] = { 2864 .pre_div_shift = 3, 2865 .pre_div_width = 2, 2866 }, 2867 .p[1] = { 2868 .pre_div_shift = 3, 2869 .pre_div_width = 2, 2870 }, 2871 .mux_sel_bit = 0, 2872 /* nss freq table is selected based on the SoC compatible */ 2873 .clkr = { 2874 .enable_reg = 0x3d40, 2875 .enable_mask = BIT(1), 2876 .hw.init = &(struct clk_init_data){ 2877 .name = "ubi32_core2_src_clk", 2878 .parent_data = gcc_pxo_pll8_pll14_pll18_pll0, 2879 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0), 2880 .ops = &clk_dyn_rcg_ops, 2881 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, 2882 }, 2883 }, 2884 }; 2885 2886 static const struct freq_tbl clk_tbl_ce5_core[] = { 2887 { 150000000, P_PLL3, 8, 1, 1 }, 2888 { 213200000, P_PLL11, 5, 1, 1 }, 2889 { } 2890 }; 2891 2892 static struct clk_dyn_rcg ce5_core_src = { 2893 .ns_reg[0] = 0x36C4, 2894 .ns_reg[1] = 0x36C8, 2895 .bank_reg = 0x36C0, 2896 .s[0] = { 2897 .src_sel_shift = 0, 2898 .parent_map = gcc_pxo_pll3_pll0_pll14_pll18_pll11_map, 2899 }, 2900 .s[1] = { 2901 .src_sel_shift = 0, 2902 .parent_map = gcc_pxo_pll3_pll0_pll14_pll18_pll11_map, 2903 }, 2904 .p[0] = { 2905 .pre_div_shift = 3, 2906 .pre_div_width = 4, 2907 }, 2908 .p[1] = { 2909 .pre_div_shift = 3, 2910 .pre_div_width = 4, 2911 }, 2912 .mux_sel_bit = 0, 2913 .freq_tbl = clk_tbl_ce5_core, 2914 .clkr = { 2915 .enable_reg = 0x36C0, 2916 .enable_mask = BIT(1), 2917 .hw.init = &(struct clk_init_data){ 2918 .name = "ce5_core_src", 2919 .parent_data = gcc_pxo_pll3_pll0_pll14_pll18_pll11, 2920 .num_parents = ARRAY_SIZE(gcc_pxo_pll3_pll0_pll14_pll18_pll11), 2921 .ops = &clk_dyn_rcg_ops, 2922 }, 2923 }, 2924 }; 2925 2926 static struct clk_branch ce5_core_clk = { 2927 .halt_reg = 0x2FDC, 2928 .halt_bit = 5, 2929 .hwcg_reg = 0x36CC, 2930 .hwcg_bit = 6, 2931 .clkr = { 2932 .enable_reg = 0x36CC, 2933 .enable_mask = BIT(4), 2934 .hw.init = &(struct clk_init_data){ 2935 .name = "ce5_core_clk", 2936 .parent_hws = (const struct clk_hw*[]){ 2937 &ce5_core_src.clkr.hw, 2938 }, 2939 .num_parents = 1, 2940 .ops = &clk_branch_ops, 2941 .flags = CLK_SET_RATE_PARENT, 2942 }, 2943 }, 2944 }; 2945 2946 static const struct freq_tbl clk_tbl_ce5_a_clk[] = { 2947 { 160000000, P_PLL0, 5, 1, 1 }, 2948 { 213200000, P_PLL11, 5, 1, 1 }, 2949 { } 2950 }; 2951 2952 static struct clk_dyn_rcg ce5_a_clk_src = { 2953 .ns_reg[0] = 0x3d84, 2954 .ns_reg[1] = 0x3d88, 2955 .bank_reg = 0x3d80, 2956 .s[0] = { 2957 .src_sel_shift = 0, 2958 .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map, 2959 }, 2960 .s[1] = { 2961 .src_sel_shift = 0, 2962 .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map, 2963 }, 2964 .p[0] = { 2965 .pre_div_shift = 3, 2966 .pre_div_width = 4, 2967 }, 2968 .p[1] = { 2969 .pre_div_shift = 3, 2970 .pre_div_width = 4, 2971 }, 2972 .mux_sel_bit = 0, 2973 .freq_tbl = clk_tbl_ce5_a_clk, 2974 .clkr = { 2975 .enable_reg = 0x3d80, 2976 .enable_mask = BIT(1), 2977 .hw.init = &(struct clk_init_data){ 2978 .name = "ce5_a_clk_src", 2979 .parent_data = gcc_pxo_pll8_pll0_pll14_pll18_pll11, 2980 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0_pll14_pll18_pll11), 2981 .ops = &clk_dyn_rcg_ops, 2982 }, 2983 }, 2984 }; 2985 2986 static struct clk_branch ce5_a_clk = { 2987 .halt_reg = 0x3c20, 2988 .halt_bit = 12, 2989 .hwcg_reg = 0x3d8c, 2990 .hwcg_bit = 6, 2991 .clkr = { 2992 .enable_reg = 0x3d8c, 2993 .enable_mask = BIT(4), 2994 .hw.init = &(struct clk_init_data){ 2995 .name = "ce5_a_clk", 2996 .parent_hws = (const struct clk_hw*[]){ 2997 &ce5_a_clk_src.clkr.hw, 2998 }, 2999 .num_parents = 1, 3000 .ops = &clk_branch_ops, 3001 .flags = CLK_SET_RATE_PARENT, 3002 }, 3003 }, 3004 }; 3005 3006 static const struct freq_tbl clk_tbl_ce5_h_clk[] = { 3007 { 160000000, P_PLL0, 5, 1, 1 }, 3008 { 213200000, P_PLL11, 5, 1, 1 }, 3009 { } 3010 }; 3011 3012 static struct clk_dyn_rcg ce5_h_clk_src = { 3013 .ns_reg[0] = 0x3c64, 3014 .ns_reg[1] = 0x3c68, 3015 .bank_reg = 0x3c60, 3016 .s[0] = { 3017 .src_sel_shift = 0, 3018 .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map, 3019 }, 3020 .s[1] = { 3021 .src_sel_shift = 0, 3022 .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map, 3023 }, 3024 .p[0] = { 3025 .pre_div_shift = 3, 3026 .pre_div_width = 4, 3027 }, 3028 .p[1] = { 3029 .pre_div_shift = 3, 3030 .pre_div_width = 4, 3031 }, 3032 .mux_sel_bit = 0, 3033 .freq_tbl = clk_tbl_ce5_h_clk, 3034 .clkr = { 3035 .enable_reg = 0x3c60, 3036 .enable_mask = BIT(1), 3037 .hw.init = &(struct clk_init_data){ 3038 .name = "ce5_h_clk_src", 3039 .parent_data = gcc_pxo_pll8_pll0_pll14_pll18_pll11, 3040 .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0_pll14_pll18_pll11), 3041 .ops = &clk_dyn_rcg_ops, 3042 }, 3043 }, 3044 }; 3045 3046 static struct clk_branch ce5_h_clk = { 3047 .halt_reg = 0x3c20, 3048 .halt_bit = 11, 3049 .hwcg_reg = 0x3c6c, 3050 .hwcg_bit = 6, 3051 .clkr = { 3052 .enable_reg = 0x3c6c, 3053 .enable_mask = BIT(4), 3054 .hw.init = &(struct clk_init_data){ 3055 .name = "ce5_h_clk", 3056 .parent_hws = (const struct clk_hw*[]){ 3057 &ce5_h_clk_src.clkr.hw, 3058 }, 3059 .num_parents = 1, 3060 .ops = &clk_branch_ops, 3061 .flags = CLK_SET_RATE_PARENT, 3062 }, 3063 }, 3064 }; 3065 3066 static struct clk_regmap *gcc_ipq806x_clks[] = { 3067 [PLL0] = &pll0.clkr, 3068 [PLL0_VOTE] = &pll0_vote, 3069 [PLL3] = &pll3.clkr, 3070 [PLL4_VOTE] = &pll4_vote, 3071 [PLL8] = &pll8.clkr, 3072 [PLL8_VOTE] = &pll8_vote, 3073 [PLL11] = &pll11.clkr, 3074 [PLL14] = &pll14.clkr, 3075 [PLL14_VOTE] = &pll14_vote, 3076 [PLL18] = &pll18.clkr, 3077 [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr, 3078 [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr, 3079 [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr, 3080 [GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr, 3081 [GSBI4_UART_SRC] = &gsbi4_uart_src.clkr, 3082 [GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr, 3083 [GSBI5_UART_SRC] = &gsbi5_uart_src.clkr, 3084 [GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr, 3085 [GSBI6_UART_SRC] = &gsbi6_uart_src.clkr, 3086 [GSBI6_UART_CLK] = &gsbi6_uart_clk.clkr, 3087 [GSBI7_UART_SRC] = &gsbi7_uart_src.clkr, 3088 [GSBI7_UART_CLK] = &gsbi7_uart_clk.clkr, 3089 [GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr, 3090 [GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr, 3091 [GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr, 3092 [GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr, 3093 [GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr, 3094 [GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr, 3095 [GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr, 3096 [GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr, 3097 [GSBI6_QUP_SRC] = &gsbi6_qup_src.clkr, 3098 [GSBI6_QUP_CLK] = &gsbi6_qup_clk.clkr, 3099 [GSBI7_QUP_SRC] = &gsbi7_qup_src.clkr, 3100 [GSBI7_QUP_CLK] = &gsbi7_qup_clk.clkr, 3101 [GP0_SRC] = &gp0_src.clkr, 3102 [GP0_CLK] = &gp0_clk.clkr, 3103 [GP1_SRC] = &gp1_src.clkr, 3104 [GP1_CLK] = &gp1_clk.clkr, 3105 [GP2_SRC] = &gp2_src.clkr, 3106 [GP2_CLK] = &gp2_clk.clkr, 3107 [PMEM_A_CLK] = &pmem_clk.clkr, 3108 [PRNG_SRC] = &prng_src.clkr, 3109 [PRNG_CLK] = &prng_clk.clkr, 3110 [SDC1_SRC] = &sdc1_src.clkr, 3111 [SDC1_CLK] = &sdc1_clk.clkr, 3112 [SDC3_SRC] = &sdc3_src.clkr, 3113 [SDC3_CLK] = &sdc3_clk.clkr, 3114 [TSIF_REF_SRC] = &tsif_ref_src.clkr, 3115 [TSIF_REF_CLK] = &tsif_ref_clk.clkr, 3116 [DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr, 3117 [GSBI1_H_CLK] = &gsbi1_h_clk.clkr, 3118 [GSBI2_H_CLK] = &gsbi2_h_clk.clkr, 3119 [GSBI4_H_CLK] = &gsbi4_h_clk.clkr, 3120 [GSBI5_H_CLK] = &gsbi5_h_clk.clkr, 3121 [GSBI6_H_CLK] = &gsbi6_h_clk.clkr, 3122 [GSBI7_H_CLK] = &gsbi7_h_clk.clkr, 3123 [TSIF_H_CLK] = &tsif_h_clk.clkr, 3124 [SDC1_H_CLK] = &sdc1_h_clk.clkr, 3125 [SDC3_H_CLK] = &sdc3_h_clk.clkr, 3126 [ADM0_CLK] = &adm0_clk.clkr, 3127 [ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr, 3128 [PCIE_A_CLK] = &pcie_a_clk.clkr, 3129 [PCIE_AUX_CLK] = &pcie_aux_clk.clkr, 3130 [PCIE_H_CLK] = &pcie_h_clk.clkr, 3131 [PCIE_PHY_CLK] = &pcie_phy_clk.clkr, 3132 [SFAB_SATA_S_H_CLK] = &sfab_sata_s_h_clk.clkr, 3133 [PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr, 3134 [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr, 3135 [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr, 3136 [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr, 3137 [SATA_H_CLK] = &sata_h_clk.clkr, 3138 [SATA_CLK_SRC] = &sata_ref_src.clkr, 3139 [SATA_RXOOB_CLK] = &sata_rxoob_clk.clkr, 3140 [SATA_PMALIVE_CLK] = &sata_pmalive_clk.clkr, 3141 [SATA_PHY_REF_CLK] = &sata_phy_ref_clk.clkr, 3142 [SATA_A_CLK] = &sata_a_clk.clkr, 3143 [SATA_PHY_CFG_CLK] = &sata_phy_cfg_clk.clkr, 3144 [PCIE_ALT_REF_SRC] = &pcie_ref_src.clkr, 3145 [PCIE_ALT_REF_CLK] = &pcie_ref_src_clk.clkr, 3146 [PCIE_1_A_CLK] = &pcie1_a_clk.clkr, 3147 [PCIE_1_AUX_CLK] = &pcie1_aux_clk.clkr, 3148 [PCIE_1_H_CLK] = &pcie1_h_clk.clkr, 3149 [PCIE_1_PHY_CLK] = &pcie1_phy_clk.clkr, 3150 [PCIE_1_ALT_REF_SRC] = &pcie1_ref_src.clkr, 3151 [PCIE_1_ALT_REF_CLK] = &pcie1_ref_src_clk.clkr, 3152 [PCIE_2_A_CLK] = &pcie2_a_clk.clkr, 3153 [PCIE_2_AUX_CLK] = &pcie2_aux_clk.clkr, 3154 [PCIE_2_H_CLK] = &pcie2_h_clk.clkr, 3155 [PCIE_2_PHY_CLK] = &pcie2_phy_clk.clkr, 3156 [PCIE_2_ALT_REF_SRC] = &pcie2_ref_src.clkr, 3157 [PCIE_2_ALT_REF_CLK] = &pcie2_ref_src_clk.clkr, 3158 [USB30_MASTER_SRC] = &usb30_master_clk_src.clkr, 3159 [USB30_0_MASTER_CLK] = &usb30_0_branch_clk.clkr, 3160 [USB30_1_MASTER_CLK] = &usb30_1_branch_clk.clkr, 3161 [USB30_UTMI_SRC] = &usb30_utmi_clk.clkr, 3162 [USB30_0_UTMI_CLK] = &usb30_0_utmi_clk_ctl.clkr, 3163 [USB30_1_UTMI_CLK] = &usb30_1_utmi_clk_ctl.clkr, 3164 [USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr, 3165 [USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_clk_src.clkr, 3166 [USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr, 3167 [USB_FS1_H_CLK] = &usb_fs1_h_clk.clkr, 3168 [USB_FS1_XCVR_SRC] = &usb_fs1_xcvr_clk_src.clkr, 3169 [USB_FS1_XCVR_CLK] = &usb_fs1_xcvr_clk.clkr, 3170 [USB_FS1_SYSTEM_CLK] = &usb_fs1_sys_clk.clkr, 3171 [EBI2_CLK] = &ebi2_clk.clkr, 3172 [EBI2_AON_CLK] = &ebi2_aon_clk.clkr, 3173 [GMAC_CORE1_CLK_SRC] = &gmac_core1_src.clkr, 3174 [GMAC_CORE1_CLK] = &gmac_core1_clk.clkr, 3175 [GMAC_CORE2_CLK_SRC] = &gmac_core2_src.clkr, 3176 [GMAC_CORE2_CLK] = &gmac_core2_clk.clkr, 3177 [GMAC_CORE3_CLK_SRC] = &gmac_core3_src.clkr, 3178 [GMAC_CORE3_CLK] = &gmac_core3_clk.clkr, 3179 [GMAC_CORE4_CLK_SRC] = &gmac_core4_src.clkr, 3180 [GMAC_CORE4_CLK] = &gmac_core4_clk.clkr, 3181 [UBI32_CORE1_CLK_SRC] = &ubi32_core1_src_clk.clkr, 3182 [UBI32_CORE2_CLK_SRC] = &ubi32_core2_src_clk.clkr, 3183 [NSSTCM_CLK_SRC] = &nss_tcm_src.clkr, 3184 [NSSTCM_CLK] = &nss_tcm_clk.clkr, 3185 [PLL9] = &hfpll0.clkr, 3186 [PLL10] = &hfpll1.clkr, 3187 [PLL12] = &hfpll_l2.clkr, 3188 [CE5_A_CLK_SRC] = &ce5_a_clk_src.clkr, 3189 [CE5_A_CLK] = &ce5_a_clk.clkr, 3190 [CE5_H_CLK_SRC] = &ce5_h_clk_src.clkr, 3191 [CE5_H_CLK] = &ce5_h_clk.clkr, 3192 [CE5_CORE_CLK_SRC] = &ce5_core_src.clkr, 3193 [CE5_CORE_CLK] = &ce5_core_clk.clkr, 3194 }; 3195 3196 static const struct qcom_reset_map gcc_ipq806x_resets[] = { 3197 [QDSS_STM_RESET] = { 0x2060, 6 }, 3198 [AFAB_SMPSS_S_RESET] = { 0x20b8, 2 }, 3199 [AFAB_SMPSS_M1_RESET] = { 0x20b8, 1 }, 3200 [AFAB_SMPSS_M0_RESET] = { 0x20b8, 0 }, 3201 [AFAB_EBI1_CH0_RESET] = { 0x20c0, 7 }, 3202 [AFAB_EBI1_CH1_RESET] = { 0x20c4, 7 }, 3203 [SFAB_ADM0_M0_RESET] = { 0x21e0, 7 }, 3204 [SFAB_ADM0_M1_RESET] = { 0x21e4, 7 }, 3205 [SFAB_ADM0_M2_RESET] = { 0x21e8, 7 }, 3206 [ADM0_C2_RESET] = { 0x220c, 4 }, 3207 [ADM0_C1_RESET] = { 0x220c, 3 }, 3208 [ADM0_C0_RESET] = { 0x220c, 2 }, 3209 [ADM0_PBUS_RESET] = { 0x220c, 1 }, 3210 [ADM0_RESET] = { 0x220c, 0 }, 3211 [QDSS_CLKS_SW_RESET] = { 0x2260, 5 }, 3212 [QDSS_POR_RESET] = { 0x2260, 4 }, 3213 [QDSS_TSCTR_RESET] = { 0x2260, 3 }, 3214 [QDSS_HRESET_RESET] = { 0x2260, 2 }, 3215 [QDSS_AXI_RESET] = { 0x2260, 1 }, 3216 [QDSS_DBG_RESET] = { 0x2260, 0 }, 3217 [SFAB_PCIE_M_RESET] = { 0x22d8, 1 }, 3218 [SFAB_PCIE_S_RESET] = { 0x22d8, 0 }, 3219 [PCIE_EXT_RESET] = { 0x22dc, 6 }, 3220 [PCIE_PHY_RESET] = { 0x22dc, 5 }, 3221 [PCIE_PCI_RESET] = { 0x22dc, 4 }, 3222 [PCIE_POR_RESET] = { 0x22dc, 3 }, 3223 [PCIE_HCLK_RESET] = { 0x22dc, 2 }, 3224 [PCIE_ACLK_RESET] = { 0x22dc, 0 }, 3225 [SFAB_LPASS_RESET] = { 0x23a0, 7 }, 3226 [SFAB_AFAB_M_RESET] = { 0x23e0, 7 }, 3227 [AFAB_SFAB_M0_RESET] = { 0x2420, 7 }, 3228 [AFAB_SFAB_M1_RESET] = { 0x2424, 7 }, 3229 [SFAB_SATA_S_RESET] = { 0x2480, 7 }, 3230 [SFAB_DFAB_M_RESET] = { 0x2500, 7 }, 3231 [DFAB_SFAB_M_RESET] = { 0x2520, 7 }, 3232 [DFAB_SWAY0_RESET] = { 0x2540, 7 }, 3233 [DFAB_SWAY1_RESET] = { 0x2544, 7 }, 3234 [DFAB_ARB0_RESET] = { 0x2560, 7 }, 3235 [DFAB_ARB1_RESET] = { 0x2564, 7 }, 3236 [PPSS_PROC_RESET] = { 0x2594, 1 }, 3237 [PPSS_RESET] = { 0x2594, 0 }, 3238 [DMA_BAM_RESET] = { 0x25c0, 7 }, 3239 [SPS_TIC_H_RESET] = { 0x2600, 7 }, 3240 [SFAB_CFPB_M_RESET] = { 0x2680, 7 }, 3241 [SFAB_CFPB_S_RESET] = { 0x26c0, 7 }, 3242 [TSIF_H_RESET] = { 0x2700, 7 }, 3243 [CE1_H_RESET] = { 0x2720, 7 }, 3244 [CE1_CORE_RESET] = { 0x2724, 7 }, 3245 [CE1_SLEEP_RESET] = { 0x2728, 7 }, 3246 [CE2_H_RESET] = { 0x2740, 7 }, 3247 [CE2_CORE_RESET] = { 0x2744, 7 }, 3248 [SFAB_SFPB_M_RESET] = { 0x2780, 7 }, 3249 [SFAB_SFPB_S_RESET] = { 0x27a0, 7 }, 3250 [RPM_PROC_RESET] = { 0x27c0, 7 }, 3251 [PMIC_SSBI2_RESET] = { 0x280c, 12 }, 3252 [SDC1_RESET] = { 0x2830, 0 }, 3253 [SDC2_RESET] = { 0x2850, 0 }, 3254 [SDC3_RESET] = { 0x2870, 0 }, 3255 [SDC4_RESET] = { 0x2890, 0 }, 3256 [USB_HS1_RESET] = { 0x2910, 0 }, 3257 [USB_HSIC_RESET] = { 0x2934, 0 }, 3258 [USB_FS1_XCVR_RESET] = { 0x2974, 1 }, 3259 [USB_FS1_RESET] = { 0x2974, 0 }, 3260 [GSBI1_RESET] = { 0x29dc, 0 }, 3261 [GSBI2_RESET] = { 0x29fc, 0 }, 3262 [GSBI3_RESET] = { 0x2a1c, 0 }, 3263 [GSBI4_RESET] = { 0x2a3c, 0 }, 3264 [GSBI5_RESET] = { 0x2a5c, 0 }, 3265 [GSBI6_RESET] = { 0x2a7c, 0 }, 3266 [GSBI7_RESET] = { 0x2a9c, 0 }, 3267 [SPDM_RESET] = { 0x2b6c, 0 }, 3268 [SEC_CTRL_RESET] = { 0x2b80, 7 }, 3269 [TLMM_H_RESET] = { 0x2ba0, 7 }, 3270 [SFAB_SATA_M_RESET] = { 0x2c18, 0 }, 3271 [SATA_RESET] = { 0x2c1c, 0 }, 3272 [TSSC_RESET] = { 0x2ca0, 7 }, 3273 [PDM_RESET] = { 0x2cc0, 12 }, 3274 [MPM_H_RESET] = { 0x2da0, 7 }, 3275 [MPM_RESET] = { 0x2da4, 0 }, 3276 [SFAB_SMPSS_S_RESET] = { 0x2e00, 7 }, 3277 [PRNG_RESET] = { 0x2e80, 12 }, 3278 [SFAB_CE3_M_RESET] = { 0x36c8, 1 }, 3279 [SFAB_CE3_S_RESET] = { 0x36c8, 0 }, 3280 [CE3_SLEEP_RESET] = { 0x36d0, 7 }, 3281 [PCIE_1_M_RESET] = { 0x3a98, 1 }, 3282 [PCIE_1_S_RESET] = { 0x3a98, 0 }, 3283 [PCIE_1_EXT_RESET] = { 0x3a9c, 6 }, 3284 [PCIE_1_PHY_RESET] = { 0x3a9c, 5 }, 3285 [PCIE_1_PCI_RESET] = { 0x3a9c, 4 }, 3286 [PCIE_1_POR_RESET] = { 0x3a9c, 3 }, 3287 [PCIE_1_HCLK_RESET] = { 0x3a9c, 2 }, 3288 [PCIE_1_ACLK_RESET] = { 0x3a9c, 0 }, 3289 [PCIE_2_M_RESET] = { 0x3ad8, 1 }, 3290 [PCIE_2_S_RESET] = { 0x3ad8, 0 }, 3291 [PCIE_2_EXT_RESET] = { 0x3adc, 6 }, 3292 [PCIE_2_PHY_RESET] = { 0x3adc, 5 }, 3293 [PCIE_2_PCI_RESET] = { 0x3adc, 4 }, 3294 [PCIE_2_POR_RESET] = { 0x3adc, 3 }, 3295 [PCIE_2_HCLK_RESET] = { 0x3adc, 2 }, 3296 [PCIE_2_ACLK_RESET] = { 0x3adc, 0 }, 3297 [SFAB_USB30_S_RESET] = { 0x3b54, 1 }, 3298 [SFAB_USB30_M_RESET] = { 0x3b54, 0 }, 3299 [USB30_0_PORT2_HS_PHY_RESET] = { 0x3b50, 5 }, 3300 [USB30_0_MASTER_RESET] = { 0x3b50, 4 }, 3301 [USB30_0_SLEEP_RESET] = { 0x3b50, 3 }, 3302 [USB30_0_UTMI_PHY_RESET] = { 0x3b50, 2 }, 3303 [USB30_0_POWERON_RESET] = { 0x3b50, 1 }, 3304 [USB30_0_PHY_RESET] = { 0x3b50, 0 }, 3305 [USB30_1_MASTER_RESET] = { 0x3b58, 4 }, 3306 [USB30_1_SLEEP_RESET] = { 0x3b58, 3 }, 3307 [USB30_1_UTMI_PHY_RESET] = { 0x3b58, 2 }, 3308 [USB30_1_POWERON_RESET] = { 0x3b58, 1 }, 3309 [USB30_1_PHY_RESET] = { 0x3b58, 0 }, 3310 [NSSFB0_RESET] = { 0x3b60, 6 }, 3311 [NSSFB1_RESET] = { 0x3b60, 7 }, 3312 [UBI32_CORE1_CLKRST_CLAMP_RESET] = { 0x3d3c, 3}, 3313 [UBI32_CORE1_CLAMP_RESET] = { 0x3d3c, 2 }, 3314 [UBI32_CORE1_AHB_RESET] = { 0x3d3c, 1 }, 3315 [UBI32_CORE1_AXI_RESET] = { 0x3d3c, 0 }, 3316 [UBI32_CORE2_CLKRST_CLAMP_RESET] = { 0x3d5c, 3 }, 3317 [UBI32_CORE2_CLAMP_RESET] = { 0x3d5c, 2 }, 3318 [UBI32_CORE2_AHB_RESET] = { 0x3d5c, 1 }, 3319 [UBI32_CORE2_AXI_RESET] = { 0x3d5c, 0 }, 3320 [GMAC_CORE1_RESET] = { 0x3cbc, 0 }, 3321 [GMAC_CORE2_RESET] = { 0x3cdc, 0 }, 3322 [GMAC_CORE3_RESET] = { 0x3cfc, 0 }, 3323 [GMAC_CORE4_RESET] = { 0x3d1c, 0 }, 3324 [GMAC_AHB_RESET] = { 0x3e24, 0 }, 3325 [CRYPTO_ENG1_RESET] = { 0x3e00, 0}, 3326 [CRYPTO_ENG2_RESET] = { 0x3e04, 0}, 3327 [CRYPTO_ENG3_RESET] = { 0x3e08, 0}, 3328 [CRYPTO_ENG4_RESET] = { 0x3e0c, 0}, 3329 [CRYPTO_AHB_RESET] = { 0x3e10, 0}, 3330 [NSS_CH0_RST_RX_CLK_N_RESET] = { 0x3b60, 0 }, 3331 [NSS_CH0_RST_TX_CLK_N_RESET] = { 0x3b60, 1 }, 3332 [NSS_CH0_RST_RX_125M_N_RESET] = { 0x3b60, 2 }, 3333 [NSS_CH0_HW_RST_RX_125M_N_RESET] = { 0x3b60, 3 }, 3334 [NSS_CH0_RST_TX_125M_N_RESET] = { 0x3b60, 4 }, 3335 [NSS_CH1_RST_RX_CLK_N_RESET] = { 0x3b60, 5 }, 3336 [NSS_CH1_RST_TX_CLK_N_RESET] = { 0x3b60, 6 }, 3337 [NSS_CH1_RST_RX_125M_N_RESET] = { 0x3b60, 7 }, 3338 [NSS_CH1_HW_RST_RX_125M_N_RESET] = { 0x3b60, 8 }, 3339 [NSS_CH1_RST_TX_125M_N_RESET] = { 0x3b60, 9 }, 3340 [NSS_CH2_RST_RX_CLK_N_RESET] = { 0x3b60, 10 }, 3341 [NSS_CH2_RST_TX_CLK_N_RESET] = { 0x3b60, 11 }, 3342 [NSS_CH2_RST_RX_125M_N_RESET] = { 0x3b60, 12 }, 3343 [NSS_CH2_HW_RST_RX_125M_N_RESET] = { 0x3b60, 13 }, 3344 [NSS_CH2_RST_TX_125M_N_RESET] = { 0x3b60, 14 }, 3345 [NSS_CH3_RST_RX_CLK_N_RESET] = { 0x3b60, 15 }, 3346 [NSS_CH3_RST_TX_CLK_N_RESET] = { 0x3b60, 16 }, 3347 [NSS_CH3_RST_RX_125M_N_RESET] = { 0x3b60, 17 }, 3348 [NSS_CH3_HW_RST_RX_125M_N_RESET] = { 0x3b60, 18 }, 3349 [NSS_CH3_RST_TX_125M_N_RESET] = { 0x3b60, 19 }, 3350 [NSS_RST_RX_250M_125M_N_RESET] = { 0x3b60, 20 }, 3351 [NSS_RST_TX_250M_125M_N_RESET] = { 0x3b60, 21 }, 3352 [NSS_QSGMII_TXPI_RST_N_RESET] = { 0x3b60, 22 }, 3353 [NSS_QSGMII_CDR_RST_N_RESET] = { 0x3b60, 23 }, 3354 [NSS_SGMII2_CDR_RST_N_RESET] = { 0x3b60, 24 }, 3355 [NSS_SGMII3_CDR_RST_N_RESET] = { 0x3b60, 25 }, 3356 [NSS_CAL_PRBS_RST_N_RESET] = { 0x3b60, 26 }, 3357 [NSS_LCKDT_RST_N_RESET] = { 0x3b60, 27 }, 3358 [NSS_SRDS_N_RESET] = { 0x3b60, 28 }, 3359 }; 3360 3361 static const struct regmap_config gcc_ipq806x_regmap_config = { 3362 .reg_bits = 32, 3363 .reg_stride = 4, 3364 .val_bits = 32, 3365 .max_register = 0x3e40, 3366 .fast_io = true, 3367 }; 3368 3369 static const struct qcom_cc_desc gcc_ipq806x_desc = { 3370 .config = &gcc_ipq806x_regmap_config, 3371 .clks = gcc_ipq806x_clks, 3372 .num_clks = ARRAY_SIZE(gcc_ipq806x_clks), 3373 .resets = gcc_ipq806x_resets, 3374 .num_resets = ARRAY_SIZE(gcc_ipq806x_resets), 3375 }; 3376 3377 static const struct of_device_id gcc_ipq806x_match_table[] = { 3378 { .compatible = "qcom,gcc-ipq8064" }, 3379 { } 3380 }; 3381 MODULE_DEVICE_TABLE(of, gcc_ipq806x_match_table); 3382 3383 static int gcc_ipq806x_probe(struct platform_device *pdev) 3384 { 3385 struct device *dev = &pdev->dev; 3386 struct regmap *regmap; 3387 int ret; 3388 3389 ret = qcom_cc_register_board_clk(dev, "cxo_board", "cxo", 25000000); 3390 if (ret) 3391 return ret; 3392 3393 ret = qcom_cc_register_board_clk(dev, "pxo_board", "pxo", 25000000); 3394 if (ret) 3395 return ret; 3396 3397 if (of_machine_is_compatible("qcom,ipq8065")) { 3398 ubi32_core1_src_clk.freq_tbl = clk_tbl_nss_ipq8065; 3399 ubi32_core2_src_clk.freq_tbl = clk_tbl_nss_ipq8065; 3400 } else { 3401 ubi32_core1_src_clk.freq_tbl = clk_tbl_nss_ipq8064; 3402 ubi32_core2_src_clk.freq_tbl = clk_tbl_nss_ipq8064; 3403 } 3404 3405 ret = qcom_cc_probe(pdev, &gcc_ipq806x_desc); 3406 if (ret) 3407 return ret; 3408 3409 regmap = dev_get_regmap(dev, NULL); 3410 if (!regmap) 3411 return -ENODEV; 3412 3413 /* Setup PLL18 static bits */ 3414 regmap_update_bits(regmap, 0x31a4, 0xffffffc0, 0x40000400); 3415 regmap_write(regmap, 0x31b0, 0x3080); 3416 3417 /* Set GMAC footswitch sleep/wakeup values */ 3418 regmap_write(regmap, 0x3cb8, 8); 3419 regmap_write(regmap, 0x3cd8, 8); 3420 regmap_write(regmap, 0x3cf8, 8); 3421 regmap_write(regmap, 0x3d18, 8); 3422 3423 return of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); 3424 } 3425 3426 static struct platform_driver gcc_ipq806x_driver = { 3427 .probe = gcc_ipq806x_probe, 3428 .driver = { 3429 .name = "gcc-ipq806x", 3430 .of_match_table = gcc_ipq806x_match_table, 3431 }, 3432 }; 3433 3434 static int __init gcc_ipq806x_init(void) 3435 { 3436 return platform_driver_register(&gcc_ipq806x_driver); 3437 } 3438 core_initcall(gcc_ipq806x_init); 3439 3440 static void __exit gcc_ipq806x_exit(void) 3441 { 3442 platform_driver_unregister(&gcc_ipq806x_driver); 3443 } 3444 module_exit(gcc_ipq806x_exit); 3445 3446 MODULE_DESCRIPTION("QCOM GCC IPQ806x Driver"); 3447 MODULE_LICENSE("GPL v2"); 3448 MODULE_ALIAS("platform:gcc-ipq806x"); 3449