gcc-mdm9615.c (36475B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. 4 * Copyright (c) BayLibre, SAS. 5 * Author : Neil Armstrong <narmstrong@baylibre.com> 6 */ 7 8#include <linux/kernel.h> 9#include <linux/bitops.h> 10#include <linux/err.h> 11#include <linux/platform_device.h> 12#include <linux/module.h> 13#include <linux/of.h> 14#include <linux/of_device.h> 15#include <linux/clk-provider.h> 16#include <linux/regmap.h> 17#include <linux/reset-controller.h> 18 19#include <dt-bindings/clock/qcom,gcc-mdm9615.h> 20#include <dt-bindings/reset/qcom,gcc-mdm9615.h> 21 22#include "common.h" 23#include "clk-regmap.h" 24#include "clk-pll.h" 25#include "clk-rcg.h" 26#include "clk-branch.h" 27#include "reset.h" 28 29static struct clk_fixed_factor cxo = { 30 .mult = 1, 31 .div = 1, 32 .hw.init = &(struct clk_init_data){ 33 .name = "cxo", 34 .parent_names = (const char *[]){ "cxo_board" }, 35 .num_parents = 1, 36 .ops = &clk_fixed_factor_ops, 37 }, 38}; 39 40static struct clk_pll pll0 = { 41 .l_reg = 0x30c4, 42 .m_reg = 0x30c8, 43 .n_reg = 0x30cc, 44 .config_reg = 0x30d4, 45 .mode_reg = 0x30c0, 46 .status_reg = 0x30d8, 47 .status_bit = 16, 48 .clkr.hw.init = &(struct clk_init_data){ 49 .name = "pll0", 50 .parent_names = (const char *[]){ "cxo" }, 51 .num_parents = 1, 52 .ops = &clk_pll_ops, 53 }, 54}; 55 56static struct clk_regmap pll0_vote = { 57 .enable_reg = 0x34c0, 58 .enable_mask = BIT(0), 59 .hw.init = &(struct clk_init_data){ 60 .name = "pll0_vote", 61 .parent_names = (const char *[]){ "pll8" }, 62 .num_parents = 1, 63 .ops = &clk_pll_vote_ops, 64 }, 65}; 66 67static struct clk_regmap pll4_vote = { 68 .enable_reg = 0x34c0, 69 .enable_mask = BIT(4), 70 .hw.init = &(struct clk_init_data){ 71 .name = "pll4_vote", 72 .parent_names = (const char *[]){ "pll4" }, 73 .num_parents = 1, 74 .ops = &clk_pll_vote_ops, 75 }, 76}; 77 78static struct clk_pll pll8 = { 79 .l_reg = 0x3144, 80 .m_reg = 0x3148, 81 .n_reg = 0x314c, 82 .config_reg = 0x3154, 83 .mode_reg = 0x3140, 84 .status_reg = 0x3158, 85 .status_bit = 16, 86 .clkr.hw.init = &(struct clk_init_data){ 87 .name = "pll8", 88 .parent_names = (const char *[]){ "cxo" }, 89 .num_parents = 1, 90 .ops = &clk_pll_ops, 91 }, 92}; 93 94static struct clk_regmap pll8_vote = { 95 .enable_reg = 0x34c0, 96 .enable_mask = BIT(8), 97 .hw.init = &(struct clk_init_data){ 98 .name = "pll8_vote", 99 .parent_names = (const char *[]){ "pll8" }, 100 .num_parents = 1, 101 .ops = &clk_pll_vote_ops, 102 }, 103}; 104 105static struct clk_pll pll14 = { 106 .l_reg = 0x31c4, 107 .m_reg = 0x31c8, 108 .n_reg = 0x31cc, 109 .config_reg = 0x31d4, 110 .mode_reg = 0x31c0, 111 .status_reg = 0x31d8, 112 .status_bit = 16, 113 .clkr.hw.init = &(struct clk_init_data){ 114 .name = "pll14", 115 .parent_names = (const char *[]){ "cxo" }, 116 .num_parents = 1, 117 .ops = &clk_pll_ops, 118 }, 119}; 120 121static struct clk_regmap pll14_vote = { 122 .enable_reg = 0x34c0, 123 .enable_mask = BIT(11), 124 .hw.init = &(struct clk_init_data){ 125 .name = "pll14_vote", 126 .parent_names = (const char *[]){ "pll14" }, 127 .num_parents = 1, 128 .ops = &clk_pll_vote_ops, 129 }, 130}; 131 132enum { 133 P_CXO, 134 P_PLL8, 135 P_PLL14, 136}; 137 138static const struct parent_map gcc_cxo_pll8_map[] = { 139 { P_CXO, 0 }, 140 { P_PLL8, 3 } 141}; 142 143static const char * const gcc_cxo_pll8[] = { 144 "cxo", 145 "pll8_vote", 146}; 147 148static const struct parent_map gcc_cxo_pll14_map[] = { 149 { P_CXO, 0 }, 150 { P_PLL14, 4 } 151}; 152 153static const char * const gcc_cxo_pll14[] = { 154 "cxo", 155 "pll14_vote", 156}; 157 158static const struct parent_map gcc_cxo_map[] = { 159 { P_CXO, 0 }, 160}; 161 162static const char * const gcc_cxo[] = { 163 "cxo", 164}; 165 166static struct freq_tbl clk_tbl_gsbi_uart[] = { 167 { 1843200, P_PLL8, 2, 6, 625 }, 168 { 3686400, P_PLL8, 2, 12, 625 }, 169 { 7372800, P_PLL8, 2, 24, 625 }, 170 { 14745600, P_PLL8, 2, 48, 625 }, 171 { 16000000, P_PLL8, 4, 1, 6 }, 172 { 24000000, P_PLL8, 4, 1, 4 }, 173 { 32000000, P_PLL8, 4, 1, 3 }, 174 { 40000000, P_PLL8, 1, 5, 48 }, 175 { 46400000, P_PLL8, 1, 29, 240 }, 176 { 48000000, P_PLL8, 4, 1, 2 }, 177 { 51200000, P_PLL8, 1, 2, 15 }, 178 { 56000000, P_PLL8, 1, 7, 48 }, 179 { 58982400, P_PLL8, 1, 96, 625 }, 180 { 64000000, P_PLL8, 2, 1, 3 }, 181 { } 182}; 183 184static struct clk_rcg gsbi1_uart_src = { 185 .ns_reg = 0x29d4, 186 .md_reg = 0x29d0, 187 .mn = { 188 .mnctr_en_bit = 8, 189 .mnctr_reset_bit = 7, 190 .mnctr_mode_shift = 5, 191 .n_val_shift = 16, 192 .m_val_shift = 16, 193 .width = 16, 194 }, 195 .p = { 196 .pre_div_shift = 3, 197 .pre_div_width = 2, 198 }, 199 .s = { 200 .src_sel_shift = 0, 201 .parent_map = gcc_cxo_pll8_map, 202 }, 203 .freq_tbl = clk_tbl_gsbi_uart, 204 .clkr = { 205 .enable_reg = 0x29d4, 206 .enable_mask = BIT(11), 207 .hw.init = &(struct clk_init_data){ 208 .name = "gsbi1_uart_src", 209 .parent_names = gcc_cxo_pll8, 210 .num_parents = 2, 211 .ops = &clk_rcg_ops, 212 .flags = CLK_SET_PARENT_GATE, 213 }, 214 }, 215}; 216 217static struct clk_branch gsbi1_uart_clk = { 218 .halt_reg = 0x2fcc, 219 .halt_bit = 10, 220 .clkr = { 221 .enable_reg = 0x29d4, 222 .enable_mask = BIT(9), 223 .hw.init = &(struct clk_init_data){ 224 .name = "gsbi1_uart_clk", 225 .parent_names = (const char *[]){ 226 "gsbi1_uart_src", 227 }, 228 .num_parents = 1, 229 .ops = &clk_branch_ops, 230 .flags = CLK_SET_RATE_PARENT, 231 }, 232 }, 233}; 234 235static struct clk_rcg gsbi2_uart_src = { 236 .ns_reg = 0x29f4, 237 .md_reg = 0x29f0, 238 .mn = { 239 .mnctr_en_bit = 8, 240 .mnctr_reset_bit = 7, 241 .mnctr_mode_shift = 5, 242 .n_val_shift = 16, 243 .m_val_shift = 16, 244 .width = 16, 245 }, 246 .p = { 247 .pre_div_shift = 3, 248 .pre_div_width = 2, 249 }, 250 .s = { 251 .src_sel_shift = 0, 252 .parent_map = gcc_cxo_pll8_map, 253 }, 254 .freq_tbl = clk_tbl_gsbi_uart, 255 .clkr = { 256 .enable_reg = 0x29f4, 257 .enable_mask = BIT(11), 258 .hw.init = &(struct clk_init_data){ 259 .name = "gsbi2_uart_src", 260 .parent_names = gcc_cxo_pll8, 261 .num_parents = 2, 262 .ops = &clk_rcg_ops, 263 .flags = CLK_SET_PARENT_GATE, 264 }, 265 }, 266}; 267 268static struct clk_branch gsbi2_uart_clk = { 269 .halt_reg = 0x2fcc, 270 .halt_bit = 6, 271 .clkr = { 272 .enable_reg = 0x29f4, 273 .enable_mask = BIT(9), 274 .hw.init = &(struct clk_init_data){ 275 .name = "gsbi2_uart_clk", 276 .parent_names = (const char *[]){ 277 "gsbi2_uart_src", 278 }, 279 .num_parents = 1, 280 .ops = &clk_branch_ops, 281 .flags = CLK_SET_RATE_PARENT, 282 }, 283 }, 284}; 285 286static struct clk_rcg gsbi3_uart_src = { 287 .ns_reg = 0x2a14, 288 .md_reg = 0x2a10, 289 .mn = { 290 .mnctr_en_bit = 8, 291 .mnctr_reset_bit = 7, 292 .mnctr_mode_shift = 5, 293 .n_val_shift = 16, 294 .m_val_shift = 16, 295 .width = 16, 296 }, 297 .p = { 298 .pre_div_shift = 3, 299 .pre_div_width = 2, 300 }, 301 .s = { 302 .src_sel_shift = 0, 303 .parent_map = gcc_cxo_pll8_map, 304 }, 305 .freq_tbl = clk_tbl_gsbi_uart, 306 .clkr = { 307 .enable_reg = 0x2a14, 308 .enable_mask = BIT(11), 309 .hw.init = &(struct clk_init_data){ 310 .name = "gsbi3_uart_src", 311 .parent_names = gcc_cxo_pll8, 312 .num_parents = 2, 313 .ops = &clk_rcg_ops, 314 .flags = CLK_SET_PARENT_GATE, 315 }, 316 }, 317}; 318 319static struct clk_branch gsbi3_uart_clk = { 320 .halt_reg = 0x2fcc, 321 .halt_bit = 2, 322 .clkr = { 323 .enable_reg = 0x2a14, 324 .enable_mask = BIT(9), 325 .hw.init = &(struct clk_init_data){ 326 .name = "gsbi3_uart_clk", 327 .parent_names = (const char *[]){ 328 "gsbi3_uart_src", 329 }, 330 .num_parents = 1, 331 .ops = &clk_branch_ops, 332 .flags = CLK_SET_RATE_PARENT, 333 }, 334 }, 335}; 336 337static struct clk_rcg gsbi4_uart_src = { 338 .ns_reg = 0x2a34, 339 .md_reg = 0x2a30, 340 .mn = { 341 .mnctr_en_bit = 8, 342 .mnctr_reset_bit = 7, 343 .mnctr_mode_shift = 5, 344 .n_val_shift = 16, 345 .m_val_shift = 16, 346 .width = 16, 347 }, 348 .p = { 349 .pre_div_shift = 3, 350 .pre_div_width = 2, 351 }, 352 .s = { 353 .src_sel_shift = 0, 354 .parent_map = gcc_cxo_pll8_map, 355 }, 356 .freq_tbl = clk_tbl_gsbi_uart, 357 .clkr = { 358 .enable_reg = 0x2a34, 359 .enable_mask = BIT(11), 360 .hw.init = &(struct clk_init_data){ 361 .name = "gsbi4_uart_src", 362 .parent_names = gcc_cxo_pll8, 363 .num_parents = 2, 364 .ops = &clk_rcg_ops, 365 .flags = CLK_SET_PARENT_GATE, 366 }, 367 }, 368}; 369 370static struct clk_branch gsbi4_uart_clk = { 371 .halt_reg = 0x2fd0, 372 .halt_bit = 26, 373 .clkr = { 374 .enable_reg = 0x2a34, 375 .enable_mask = BIT(9), 376 .hw.init = &(struct clk_init_data){ 377 .name = "gsbi4_uart_clk", 378 .parent_names = (const char *[]){ 379 "gsbi4_uart_src", 380 }, 381 .num_parents = 1, 382 .ops = &clk_branch_ops, 383 .flags = CLK_SET_RATE_PARENT, 384 }, 385 }, 386}; 387 388static struct clk_rcg gsbi5_uart_src = { 389 .ns_reg = 0x2a54, 390 .md_reg = 0x2a50, 391 .mn = { 392 .mnctr_en_bit = 8, 393 .mnctr_reset_bit = 7, 394 .mnctr_mode_shift = 5, 395 .n_val_shift = 16, 396 .m_val_shift = 16, 397 .width = 16, 398 }, 399 .p = { 400 .pre_div_shift = 3, 401 .pre_div_width = 2, 402 }, 403 .s = { 404 .src_sel_shift = 0, 405 .parent_map = gcc_cxo_pll8_map, 406 }, 407 .freq_tbl = clk_tbl_gsbi_uart, 408 .clkr = { 409 .enable_reg = 0x2a54, 410 .enable_mask = BIT(11), 411 .hw.init = &(struct clk_init_data){ 412 .name = "gsbi5_uart_src", 413 .parent_names = gcc_cxo_pll8, 414 .num_parents = 2, 415 .ops = &clk_rcg_ops, 416 .flags = CLK_SET_PARENT_GATE, 417 }, 418 }, 419}; 420 421static struct clk_branch gsbi5_uart_clk = { 422 .halt_reg = 0x2fd0, 423 .halt_bit = 22, 424 .clkr = { 425 .enable_reg = 0x2a54, 426 .enable_mask = BIT(9), 427 .hw.init = &(struct clk_init_data){ 428 .name = "gsbi5_uart_clk", 429 .parent_names = (const char *[]){ 430 "gsbi5_uart_src", 431 }, 432 .num_parents = 1, 433 .ops = &clk_branch_ops, 434 .flags = CLK_SET_RATE_PARENT, 435 }, 436 }, 437}; 438 439static struct freq_tbl clk_tbl_gsbi_qup[] = { 440 { 960000, P_CXO, 4, 1, 5 }, 441 { 4800000, P_CXO, 4, 0, 1 }, 442 { 9600000, P_CXO, 2, 0, 1 }, 443 { 15060000, P_PLL8, 1, 2, 51 }, 444 { 24000000, P_PLL8, 4, 1, 4 }, 445 { 25600000, P_PLL8, 1, 1, 15 }, 446 { 48000000, P_PLL8, 4, 1, 2 }, 447 { 51200000, P_PLL8, 1, 2, 15 }, 448 { } 449}; 450 451static struct clk_rcg gsbi1_qup_src = { 452 .ns_reg = 0x29cc, 453 .md_reg = 0x29c8, 454 .mn = { 455 .mnctr_en_bit = 8, 456 .mnctr_reset_bit = 7, 457 .mnctr_mode_shift = 5, 458 .n_val_shift = 16, 459 .m_val_shift = 16, 460 .width = 8, 461 }, 462 .p = { 463 .pre_div_shift = 3, 464 .pre_div_width = 2, 465 }, 466 .s = { 467 .src_sel_shift = 0, 468 .parent_map = gcc_cxo_pll8_map, 469 }, 470 .freq_tbl = clk_tbl_gsbi_qup, 471 .clkr = { 472 .enable_reg = 0x29cc, 473 .enable_mask = BIT(11), 474 .hw.init = &(struct clk_init_data){ 475 .name = "gsbi1_qup_src", 476 .parent_names = gcc_cxo_pll8, 477 .num_parents = 2, 478 .ops = &clk_rcg_ops, 479 .flags = CLK_SET_PARENT_GATE, 480 }, 481 }, 482}; 483 484static struct clk_branch gsbi1_qup_clk = { 485 .halt_reg = 0x2fcc, 486 .halt_bit = 9, 487 .clkr = { 488 .enable_reg = 0x29cc, 489 .enable_mask = BIT(9), 490 .hw.init = &(struct clk_init_data){ 491 .name = "gsbi1_qup_clk", 492 .parent_names = (const char *[]){ "gsbi1_qup_src" }, 493 .num_parents = 1, 494 .ops = &clk_branch_ops, 495 .flags = CLK_SET_RATE_PARENT, 496 }, 497 }, 498}; 499 500static struct clk_rcg gsbi2_qup_src = { 501 .ns_reg = 0x29ec, 502 .md_reg = 0x29e8, 503 .mn = { 504 .mnctr_en_bit = 8, 505 .mnctr_reset_bit = 7, 506 .mnctr_mode_shift = 5, 507 .n_val_shift = 16, 508 .m_val_shift = 16, 509 .width = 8, 510 }, 511 .p = { 512 .pre_div_shift = 3, 513 .pre_div_width = 2, 514 }, 515 .s = { 516 .src_sel_shift = 0, 517 .parent_map = gcc_cxo_pll8_map, 518 }, 519 .freq_tbl = clk_tbl_gsbi_qup, 520 .clkr = { 521 .enable_reg = 0x29ec, 522 .enable_mask = BIT(11), 523 .hw.init = &(struct clk_init_data){ 524 .name = "gsbi2_qup_src", 525 .parent_names = gcc_cxo_pll8, 526 .num_parents = 2, 527 .ops = &clk_rcg_ops, 528 .flags = CLK_SET_PARENT_GATE, 529 }, 530 }, 531}; 532 533static struct clk_branch gsbi2_qup_clk = { 534 .halt_reg = 0x2fcc, 535 .halt_bit = 4, 536 .clkr = { 537 .enable_reg = 0x29ec, 538 .enable_mask = BIT(9), 539 .hw.init = &(struct clk_init_data){ 540 .name = "gsbi2_qup_clk", 541 .parent_names = (const char *[]){ "gsbi2_qup_src" }, 542 .num_parents = 1, 543 .ops = &clk_branch_ops, 544 .flags = CLK_SET_RATE_PARENT, 545 }, 546 }, 547}; 548 549static struct clk_rcg gsbi3_qup_src = { 550 .ns_reg = 0x2a0c, 551 .md_reg = 0x2a08, 552 .mn = { 553 .mnctr_en_bit = 8, 554 .mnctr_reset_bit = 7, 555 .mnctr_mode_shift = 5, 556 .n_val_shift = 16, 557 .m_val_shift = 16, 558 .width = 8, 559 }, 560 .p = { 561 .pre_div_shift = 3, 562 .pre_div_width = 2, 563 }, 564 .s = { 565 .src_sel_shift = 0, 566 .parent_map = gcc_cxo_pll8_map, 567 }, 568 .freq_tbl = clk_tbl_gsbi_qup, 569 .clkr = { 570 .enable_reg = 0x2a0c, 571 .enable_mask = BIT(11), 572 .hw.init = &(struct clk_init_data){ 573 .name = "gsbi3_qup_src", 574 .parent_names = gcc_cxo_pll8, 575 .num_parents = 2, 576 .ops = &clk_rcg_ops, 577 .flags = CLK_SET_PARENT_GATE, 578 }, 579 }, 580}; 581 582static struct clk_branch gsbi3_qup_clk = { 583 .halt_reg = 0x2fcc, 584 .halt_bit = 0, 585 .clkr = { 586 .enable_reg = 0x2a0c, 587 .enable_mask = BIT(9), 588 .hw.init = &(struct clk_init_data){ 589 .name = "gsbi3_qup_clk", 590 .parent_names = (const char *[]){ "gsbi3_qup_src" }, 591 .num_parents = 1, 592 .ops = &clk_branch_ops, 593 .flags = CLK_SET_RATE_PARENT, 594 }, 595 }, 596}; 597 598static struct clk_rcg gsbi4_qup_src = { 599 .ns_reg = 0x2a2c, 600 .md_reg = 0x2a28, 601 .mn = { 602 .mnctr_en_bit = 8, 603 .mnctr_reset_bit = 7, 604 .mnctr_mode_shift = 5, 605 .n_val_shift = 16, 606 .m_val_shift = 16, 607 .width = 8, 608 }, 609 .p = { 610 .pre_div_shift = 3, 611 .pre_div_width = 2, 612 }, 613 .s = { 614 .src_sel_shift = 0, 615 .parent_map = gcc_cxo_pll8_map, 616 }, 617 .freq_tbl = clk_tbl_gsbi_qup, 618 .clkr = { 619 .enable_reg = 0x2a2c, 620 .enable_mask = BIT(11), 621 .hw.init = &(struct clk_init_data){ 622 .name = "gsbi4_qup_src", 623 .parent_names = gcc_cxo_pll8, 624 .num_parents = 2, 625 .ops = &clk_rcg_ops, 626 .flags = CLK_SET_PARENT_GATE, 627 }, 628 }, 629}; 630 631static struct clk_branch gsbi4_qup_clk = { 632 .halt_reg = 0x2fd0, 633 .halt_bit = 24, 634 .clkr = { 635 .enable_reg = 0x2a2c, 636 .enable_mask = BIT(9), 637 .hw.init = &(struct clk_init_data){ 638 .name = "gsbi4_qup_clk", 639 .parent_names = (const char *[]){ "gsbi4_qup_src" }, 640 .num_parents = 1, 641 .ops = &clk_branch_ops, 642 .flags = CLK_SET_RATE_PARENT, 643 }, 644 }, 645}; 646 647static struct clk_rcg gsbi5_qup_src = { 648 .ns_reg = 0x2a4c, 649 .md_reg = 0x2a48, 650 .mn = { 651 .mnctr_en_bit = 8, 652 .mnctr_reset_bit = 7, 653 .mnctr_mode_shift = 5, 654 .n_val_shift = 16, 655 .m_val_shift = 16, 656 .width = 8, 657 }, 658 .p = { 659 .pre_div_shift = 3, 660 .pre_div_width = 2, 661 }, 662 .s = { 663 .src_sel_shift = 0, 664 .parent_map = gcc_cxo_pll8_map, 665 }, 666 .freq_tbl = clk_tbl_gsbi_qup, 667 .clkr = { 668 .enable_reg = 0x2a4c, 669 .enable_mask = BIT(11), 670 .hw.init = &(struct clk_init_data){ 671 .name = "gsbi5_qup_src", 672 .parent_names = gcc_cxo_pll8, 673 .num_parents = 2, 674 .ops = &clk_rcg_ops, 675 .flags = CLK_SET_PARENT_GATE, 676 }, 677 }, 678}; 679 680static struct clk_branch gsbi5_qup_clk = { 681 .halt_reg = 0x2fd0, 682 .halt_bit = 20, 683 .clkr = { 684 .enable_reg = 0x2a4c, 685 .enable_mask = BIT(9), 686 .hw.init = &(struct clk_init_data){ 687 .name = "gsbi5_qup_clk", 688 .parent_names = (const char *[]){ "gsbi5_qup_src" }, 689 .num_parents = 1, 690 .ops = &clk_branch_ops, 691 .flags = CLK_SET_RATE_PARENT, 692 }, 693 }, 694}; 695 696static const struct freq_tbl clk_tbl_gp[] = { 697 { 9600000, P_CXO, 2, 0, 0 }, 698 { 19200000, P_CXO, 1, 0, 0 }, 699 { } 700}; 701 702static struct clk_rcg gp0_src = { 703 .ns_reg = 0x2d24, 704 .md_reg = 0x2d00, 705 .mn = { 706 .mnctr_en_bit = 8, 707 .mnctr_reset_bit = 7, 708 .mnctr_mode_shift = 5, 709 .n_val_shift = 16, 710 .m_val_shift = 16, 711 .width = 8, 712 }, 713 .p = { 714 .pre_div_shift = 3, 715 .pre_div_width = 2, 716 }, 717 .s = { 718 .src_sel_shift = 0, 719 .parent_map = gcc_cxo_map, 720 }, 721 .freq_tbl = clk_tbl_gp, 722 .clkr = { 723 .enable_reg = 0x2d24, 724 .enable_mask = BIT(11), 725 .hw.init = &(struct clk_init_data){ 726 .name = "gp0_src", 727 .parent_names = gcc_cxo, 728 .num_parents = 1, 729 .ops = &clk_rcg_ops, 730 .flags = CLK_SET_PARENT_GATE, 731 }, 732 } 733}; 734 735static struct clk_branch gp0_clk = { 736 .halt_reg = 0x2fd8, 737 .halt_bit = 7, 738 .clkr = { 739 .enable_reg = 0x2d24, 740 .enable_mask = BIT(9), 741 .hw.init = &(struct clk_init_data){ 742 .name = "gp0_clk", 743 .parent_names = (const char *[]){ "gp0_src" }, 744 .num_parents = 1, 745 .ops = &clk_branch_ops, 746 .flags = CLK_SET_RATE_PARENT, 747 }, 748 }, 749}; 750 751static struct clk_rcg gp1_src = { 752 .ns_reg = 0x2d44, 753 .md_reg = 0x2d40, 754 .mn = { 755 .mnctr_en_bit = 8, 756 .mnctr_reset_bit = 7, 757 .mnctr_mode_shift = 5, 758 .n_val_shift = 16, 759 .m_val_shift = 16, 760 .width = 8, 761 }, 762 .p = { 763 .pre_div_shift = 3, 764 .pre_div_width = 2, 765 }, 766 .s = { 767 .src_sel_shift = 0, 768 .parent_map = gcc_cxo_map, 769 }, 770 .freq_tbl = clk_tbl_gp, 771 .clkr = { 772 .enable_reg = 0x2d44, 773 .enable_mask = BIT(11), 774 .hw.init = &(struct clk_init_data){ 775 .name = "gp1_src", 776 .parent_names = gcc_cxo, 777 .num_parents = 1, 778 .ops = &clk_rcg_ops, 779 .flags = CLK_SET_RATE_GATE, 780 }, 781 } 782}; 783 784static struct clk_branch gp1_clk = { 785 .halt_reg = 0x2fd8, 786 .halt_bit = 6, 787 .clkr = { 788 .enable_reg = 0x2d44, 789 .enable_mask = BIT(9), 790 .hw.init = &(struct clk_init_data){ 791 .name = "gp1_clk", 792 .parent_names = (const char *[]){ "gp1_src" }, 793 .num_parents = 1, 794 .ops = &clk_branch_ops, 795 .flags = CLK_SET_RATE_PARENT, 796 }, 797 }, 798}; 799 800static struct clk_rcg gp2_src = { 801 .ns_reg = 0x2d64, 802 .md_reg = 0x2d60, 803 .mn = { 804 .mnctr_en_bit = 8, 805 .mnctr_reset_bit = 7, 806 .mnctr_mode_shift = 5, 807 .n_val_shift = 16, 808 .m_val_shift = 16, 809 .width = 8, 810 }, 811 .p = { 812 .pre_div_shift = 3, 813 .pre_div_width = 2, 814 }, 815 .s = { 816 .src_sel_shift = 0, 817 .parent_map = gcc_cxo_map, 818 }, 819 .freq_tbl = clk_tbl_gp, 820 .clkr = { 821 .enable_reg = 0x2d64, 822 .enable_mask = BIT(11), 823 .hw.init = &(struct clk_init_data){ 824 .name = "gp2_src", 825 .parent_names = gcc_cxo, 826 .num_parents = 1, 827 .ops = &clk_rcg_ops, 828 .flags = CLK_SET_RATE_GATE, 829 }, 830 } 831}; 832 833static struct clk_branch gp2_clk = { 834 .halt_reg = 0x2fd8, 835 .halt_bit = 5, 836 .clkr = { 837 .enable_reg = 0x2d64, 838 .enable_mask = BIT(9), 839 .hw.init = &(struct clk_init_data){ 840 .name = "gp2_clk", 841 .parent_names = (const char *[]){ "gp2_src" }, 842 .num_parents = 1, 843 .ops = &clk_branch_ops, 844 .flags = CLK_SET_RATE_PARENT, 845 }, 846 }, 847}; 848 849static struct clk_branch pmem_clk = { 850 .hwcg_reg = 0x25a0, 851 .hwcg_bit = 6, 852 .halt_reg = 0x2fc8, 853 .halt_bit = 20, 854 .clkr = { 855 .enable_reg = 0x25a0, 856 .enable_mask = BIT(4), 857 .hw.init = &(struct clk_init_data){ 858 .name = "pmem_clk", 859 .ops = &clk_branch_ops, 860 }, 861 }, 862}; 863 864static struct clk_rcg prng_src = { 865 .ns_reg = 0x2e80, 866 .p = { 867 .pre_div_shift = 3, 868 .pre_div_width = 4, 869 }, 870 .s = { 871 .src_sel_shift = 0, 872 .parent_map = gcc_cxo_pll8_map, 873 }, 874 .clkr = { 875 .hw.init = &(struct clk_init_data){ 876 .name = "prng_src", 877 .parent_names = gcc_cxo_pll8, 878 .num_parents = 2, 879 .ops = &clk_rcg_ops, 880 }, 881 }, 882}; 883 884static struct clk_branch prng_clk = { 885 .halt_reg = 0x2fd8, 886 .halt_check = BRANCH_HALT_VOTED, 887 .halt_bit = 10, 888 .clkr = { 889 .enable_reg = 0x3080, 890 .enable_mask = BIT(10), 891 .hw.init = &(struct clk_init_data){ 892 .name = "prng_clk", 893 .parent_names = (const char *[]){ "prng_src" }, 894 .num_parents = 1, 895 .ops = &clk_branch_ops, 896 }, 897 }, 898}; 899 900static const struct freq_tbl clk_tbl_sdc[] = { 901 { 144000, P_CXO, 1, 1, 133 }, 902 { 400000, P_PLL8, 4, 1, 240 }, 903 { 16000000, P_PLL8, 4, 1, 6 }, 904 { 17070000, P_PLL8, 1, 2, 45 }, 905 { 20210000, P_PLL8, 1, 1, 19 }, 906 { 24000000, P_PLL8, 4, 1, 4 }, 907 { 38400000, P_PLL8, 2, 1, 5 }, 908 { 48000000, P_PLL8, 4, 1, 2 }, 909 { 64000000, P_PLL8, 3, 1, 2 }, 910 { 76800000, P_PLL8, 1, 1, 5 }, 911 { } 912}; 913 914static struct clk_rcg sdc1_src = { 915 .ns_reg = 0x282c, 916 .md_reg = 0x2828, 917 .mn = { 918 .mnctr_en_bit = 8, 919 .mnctr_reset_bit = 7, 920 .mnctr_mode_shift = 5, 921 .n_val_shift = 16, 922 .m_val_shift = 16, 923 .width = 8, 924 }, 925 .p = { 926 .pre_div_shift = 3, 927 .pre_div_width = 2, 928 }, 929 .s = { 930 .src_sel_shift = 0, 931 .parent_map = gcc_cxo_pll8_map, 932 }, 933 .freq_tbl = clk_tbl_sdc, 934 .clkr = { 935 .enable_reg = 0x282c, 936 .enable_mask = BIT(11), 937 .hw.init = &(struct clk_init_data){ 938 .name = "sdc1_src", 939 .parent_names = gcc_cxo_pll8, 940 .num_parents = 2, 941 .ops = &clk_rcg_ops, 942 }, 943 } 944}; 945 946static struct clk_branch sdc1_clk = { 947 .halt_reg = 0x2fc8, 948 .halt_bit = 6, 949 .clkr = { 950 .enable_reg = 0x282c, 951 .enable_mask = BIT(9), 952 .hw.init = &(struct clk_init_data){ 953 .name = "sdc1_clk", 954 .parent_names = (const char *[]){ "sdc1_src" }, 955 .num_parents = 1, 956 .ops = &clk_branch_ops, 957 .flags = CLK_SET_RATE_PARENT, 958 }, 959 }, 960}; 961 962static struct clk_rcg sdc2_src = { 963 .ns_reg = 0x284c, 964 .md_reg = 0x2848, 965 .mn = { 966 .mnctr_en_bit = 8, 967 .mnctr_reset_bit = 7, 968 .mnctr_mode_shift = 5, 969 .n_val_shift = 16, 970 .m_val_shift = 16, 971 .width = 8, 972 }, 973 .p = { 974 .pre_div_shift = 3, 975 .pre_div_width = 2, 976 }, 977 .s = { 978 .src_sel_shift = 0, 979 .parent_map = gcc_cxo_pll8_map, 980 }, 981 .freq_tbl = clk_tbl_sdc, 982 .clkr = { 983 .enable_reg = 0x284c, 984 .enable_mask = BIT(11), 985 .hw.init = &(struct clk_init_data){ 986 .name = "sdc2_src", 987 .parent_names = gcc_cxo_pll8, 988 .num_parents = 2, 989 .ops = &clk_rcg_ops, 990 }, 991 } 992}; 993 994static struct clk_branch sdc2_clk = { 995 .halt_reg = 0x2fc8, 996 .halt_bit = 5, 997 .clkr = { 998 .enable_reg = 0x284c, 999 .enable_mask = BIT(9), 1000 .hw.init = &(struct clk_init_data){ 1001 .name = "sdc2_clk", 1002 .parent_names = (const char *[]){ "sdc2_src" }, 1003 .num_parents = 1, 1004 .ops = &clk_branch_ops, 1005 .flags = CLK_SET_RATE_PARENT, 1006 }, 1007 }, 1008}; 1009 1010static const struct freq_tbl clk_tbl_usb[] = { 1011 { 60000000, P_PLL8, 1, 5, 32 }, 1012 { } 1013}; 1014 1015static struct clk_rcg usb_hs1_xcvr_src = { 1016 .ns_reg = 0x290c, 1017 .md_reg = 0x2908, 1018 .mn = { 1019 .mnctr_en_bit = 8, 1020 .mnctr_reset_bit = 7, 1021 .mnctr_mode_shift = 5, 1022 .n_val_shift = 16, 1023 .m_val_shift = 16, 1024 .width = 8, 1025 }, 1026 .p = { 1027 .pre_div_shift = 3, 1028 .pre_div_width = 2, 1029 }, 1030 .s = { 1031 .src_sel_shift = 0, 1032 .parent_map = gcc_cxo_pll8_map, 1033 }, 1034 .freq_tbl = clk_tbl_usb, 1035 .clkr = { 1036 .enable_reg = 0x290c, 1037 .enable_mask = BIT(11), 1038 .hw.init = &(struct clk_init_data){ 1039 .name = "usb_hs1_xcvr_src", 1040 .parent_names = gcc_cxo_pll8, 1041 .num_parents = 2, 1042 .ops = &clk_rcg_ops, 1043 .flags = CLK_SET_RATE_GATE, 1044 }, 1045 } 1046}; 1047 1048static struct clk_branch usb_hs1_xcvr_clk = { 1049 .halt_reg = 0x2fc8, 1050 .halt_bit = 0, 1051 .clkr = { 1052 .enable_reg = 0x290c, 1053 .enable_mask = BIT(9), 1054 .hw.init = &(struct clk_init_data){ 1055 .name = "usb_hs1_xcvr_clk", 1056 .parent_names = (const char *[]){ "usb_hs1_xcvr_src" }, 1057 .num_parents = 1, 1058 .ops = &clk_branch_ops, 1059 .flags = CLK_SET_RATE_PARENT, 1060 }, 1061 }, 1062}; 1063 1064static struct clk_rcg usb_hsic_xcvr_fs_src = { 1065 .ns_reg = 0x2928, 1066 .md_reg = 0x2924, 1067 .mn = { 1068 .mnctr_en_bit = 8, 1069 .mnctr_reset_bit = 7, 1070 .mnctr_mode_shift = 5, 1071 .n_val_shift = 16, 1072 .m_val_shift = 16, 1073 .width = 8, 1074 }, 1075 .p = { 1076 .pre_div_shift = 3, 1077 .pre_div_width = 2, 1078 }, 1079 .s = { 1080 .src_sel_shift = 0, 1081 .parent_map = gcc_cxo_pll8_map, 1082 }, 1083 .freq_tbl = clk_tbl_usb, 1084 .clkr = { 1085 .enable_reg = 0x2928, 1086 .enable_mask = BIT(11), 1087 .hw.init = &(struct clk_init_data){ 1088 .name = "usb_hsic_xcvr_fs_src", 1089 .parent_names = gcc_cxo_pll8, 1090 .num_parents = 2, 1091 .ops = &clk_rcg_ops, 1092 .flags = CLK_SET_RATE_GATE, 1093 }, 1094 } 1095}; 1096 1097static struct clk_branch usb_hsic_xcvr_fs_clk = { 1098 .halt_reg = 0x2fc8, 1099 .halt_bit = 9, 1100 .clkr = { 1101 .enable_reg = 0x2928, 1102 .enable_mask = BIT(9), 1103 .hw.init = &(struct clk_init_data){ 1104 .name = "usb_hsic_xcvr_fs_clk", 1105 .parent_names = 1106 (const char *[]){ "usb_hsic_xcvr_fs_src" }, 1107 .num_parents = 1, 1108 .ops = &clk_branch_ops, 1109 .flags = CLK_SET_RATE_PARENT, 1110 }, 1111 }, 1112}; 1113 1114static const struct freq_tbl clk_tbl_usb_hs1_system[] = { 1115 { 60000000, P_PLL8, 1, 5, 32 }, 1116 { } 1117}; 1118 1119static struct clk_rcg usb_hs1_system_src = { 1120 .ns_reg = 0x36a4, 1121 .md_reg = 0x36a0, 1122 .mn = { 1123 .mnctr_en_bit = 8, 1124 .mnctr_reset_bit = 7, 1125 .mnctr_mode_shift = 5, 1126 .n_val_shift = 16, 1127 .m_val_shift = 16, 1128 .width = 8, 1129 }, 1130 .p = { 1131 .pre_div_shift = 3, 1132 .pre_div_width = 2, 1133 }, 1134 .s = { 1135 .src_sel_shift = 0, 1136 .parent_map = gcc_cxo_pll8_map, 1137 }, 1138 .freq_tbl = clk_tbl_usb_hs1_system, 1139 .clkr = { 1140 .enable_reg = 0x36a4, 1141 .enable_mask = BIT(11), 1142 .hw.init = &(struct clk_init_data){ 1143 .name = "usb_hs1_system_src", 1144 .parent_names = gcc_cxo_pll8, 1145 .num_parents = 2, 1146 .ops = &clk_rcg_ops, 1147 .flags = CLK_SET_RATE_GATE, 1148 }, 1149 } 1150}; 1151 1152static struct clk_branch usb_hs1_system_clk = { 1153 .halt_reg = 0x2fc8, 1154 .halt_bit = 4, 1155 .clkr = { 1156 .enable_reg = 0x36a4, 1157 .enable_mask = BIT(9), 1158 .hw.init = &(struct clk_init_data){ 1159 .parent_names = 1160 (const char *[]){ "usb_hs1_system_src" }, 1161 .num_parents = 1, 1162 .name = "usb_hs1_system_clk", 1163 .ops = &clk_branch_ops, 1164 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 1165 }, 1166 }, 1167}; 1168 1169static const struct freq_tbl clk_tbl_usb_hsic_system[] = { 1170 { 64000000, P_PLL8, 1, 1, 6 }, 1171 { } 1172}; 1173 1174static struct clk_rcg usb_hsic_system_src = { 1175 .ns_reg = 0x2b58, 1176 .md_reg = 0x2b54, 1177 .mn = { 1178 .mnctr_en_bit = 8, 1179 .mnctr_reset_bit = 7, 1180 .mnctr_mode_shift = 5, 1181 .n_val_shift = 16, 1182 .m_val_shift = 16, 1183 .width = 8, 1184 }, 1185 .p = { 1186 .pre_div_shift = 3, 1187 .pre_div_width = 2, 1188 }, 1189 .s = { 1190 .src_sel_shift = 0, 1191 .parent_map = gcc_cxo_pll8_map, 1192 }, 1193 .freq_tbl = clk_tbl_usb_hsic_system, 1194 .clkr = { 1195 .enable_reg = 0x2b58, 1196 .enable_mask = BIT(11), 1197 .hw.init = &(struct clk_init_data){ 1198 .name = "usb_hsic_system_src", 1199 .parent_names = gcc_cxo_pll8, 1200 .num_parents = 2, 1201 .ops = &clk_rcg_ops, 1202 .flags = CLK_SET_RATE_GATE, 1203 }, 1204 } 1205}; 1206 1207static struct clk_branch usb_hsic_system_clk = { 1208 .halt_reg = 0x2fc8, 1209 .halt_bit = 7, 1210 .clkr = { 1211 .enable_reg = 0x2b58, 1212 .enable_mask = BIT(9), 1213 .hw.init = &(struct clk_init_data){ 1214 .parent_names = 1215 (const char *[]){ "usb_hsic_system_src" }, 1216 .num_parents = 1, 1217 .name = "usb_hsic_system_clk", 1218 .ops = &clk_branch_ops, 1219 .flags = CLK_SET_RATE_PARENT, 1220 }, 1221 }, 1222}; 1223 1224static const struct freq_tbl clk_tbl_usb_hsic_hsic[] = { 1225 { 48000000, P_PLL14, 1, 0, 0 }, 1226 { } 1227}; 1228 1229static struct clk_rcg usb_hsic_hsic_src = { 1230 .ns_reg = 0x2b50, 1231 .md_reg = 0x2b4c, 1232 .mn = { 1233 .mnctr_en_bit = 8, 1234 .mnctr_reset_bit = 7, 1235 .mnctr_mode_shift = 5, 1236 .n_val_shift = 16, 1237 .m_val_shift = 16, 1238 .width = 8, 1239 }, 1240 .p = { 1241 .pre_div_shift = 3, 1242 .pre_div_width = 2, 1243 }, 1244 .s = { 1245 .src_sel_shift = 0, 1246 .parent_map = gcc_cxo_pll14_map, 1247 }, 1248 .freq_tbl = clk_tbl_usb_hsic_hsic, 1249 .clkr = { 1250 .enable_reg = 0x2b50, 1251 .enable_mask = BIT(11), 1252 .hw.init = &(struct clk_init_data){ 1253 .name = "usb_hsic_hsic_src", 1254 .parent_names = gcc_cxo_pll14, 1255 .num_parents = 2, 1256 .ops = &clk_rcg_ops, 1257 .flags = CLK_SET_RATE_GATE, 1258 }, 1259 } 1260}; 1261 1262static struct clk_branch usb_hsic_hsic_clk = { 1263 .halt_check = BRANCH_HALT_DELAY, 1264 .clkr = { 1265 .enable_reg = 0x2b50, 1266 .enable_mask = BIT(9), 1267 .hw.init = &(struct clk_init_data){ 1268 .parent_names = (const char *[]){ "usb_hsic_hsic_src" }, 1269 .num_parents = 1, 1270 .name = "usb_hsic_hsic_clk", 1271 .ops = &clk_branch_ops, 1272 .flags = CLK_SET_RATE_PARENT, 1273 }, 1274 }, 1275}; 1276 1277static struct clk_branch usb_hsic_hsio_cal_clk = { 1278 .halt_reg = 0x2fc8, 1279 .halt_bit = 8, 1280 .clkr = { 1281 .enable_reg = 0x2b48, 1282 .enable_mask = BIT(0), 1283 .hw.init = &(struct clk_init_data){ 1284 .parent_names = (const char *[]){ "cxo" }, 1285 .num_parents = 1, 1286 .name = "usb_hsic_hsio_cal_clk", 1287 .ops = &clk_branch_ops, 1288 }, 1289 }, 1290}; 1291 1292static struct clk_branch ce1_core_clk = { 1293 .hwcg_reg = 0x2724, 1294 .hwcg_bit = 6, 1295 .halt_reg = 0x2fd4, 1296 .halt_bit = 27, 1297 .clkr = { 1298 .enable_reg = 0x2724, 1299 .enable_mask = BIT(4), 1300 .hw.init = &(struct clk_init_data){ 1301 .name = "ce1_core_clk", 1302 .ops = &clk_branch_ops, 1303 }, 1304 }, 1305}; 1306 1307static struct clk_branch ce1_h_clk = { 1308 .halt_reg = 0x2fd4, 1309 .halt_bit = 1, 1310 .clkr = { 1311 .enable_reg = 0x2720, 1312 .enable_mask = BIT(4), 1313 .hw.init = &(struct clk_init_data){ 1314 .name = "ce1_h_clk", 1315 .ops = &clk_branch_ops, 1316 }, 1317 }, 1318}; 1319 1320static struct clk_branch dma_bam_h_clk = { 1321 .hwcg_reg = 0x25c0, 1322 .hwcg_bit = 6, 1323 .halt_reg = 0x2fc8, 1324 .halt_bit = 12, 1325 .clkr = { 1326 .enable_reg = 0x25c0, 1327 .enable_mask = BIT(4), 1328 .hw.init = &(struct clk_init_data){ 1329 .name = "dma_bam_h_clk", 1330 .ops = &clk_branch_ops, 1331 }, 1332 }, 1333}; 1334 1335static struct clk_branch gsbi1_h_clk = { 1336 .hwcg_reg = 0x29c0, 1337 .hwcg_bit = 6, 1338 .halt_reg = 0x2fcc, 1339 .halt_bit = 11, 1340 .clkr = { 1341 .enable_reg = 0x29c0, 1342 .enable_mask = BIT(4), 1343 .hw.init = &(struct clk_init_data){ 1344 .name = "gsbi1_h_clk", 1345 .ops = &clk_branch_ops, 1346 }, 1347 }, 1348}; 1349 1350static struct clk_branch gsbi2_h_clk = { 1351 .hwcg_reg = 0x29e0, 1352 .hwcg_bit = 6, 1353 .halt_reg = 0x2fcc, 1354 .halt_bit = 7, 1355 .clkr = { 1356 .enable_reg = 0x29e0, 1357 .enable_mask = BIT(4), 1358 .hw.init = &(struct clk_init_data){ 1359 .name = "gsbi2_h_clk", 1360 .ops = &clk_branch_ops, 1361 }, 1362 }, 1363}; 1364 1365static struct clk_branch gsbi3_h_clk = { 1366 .hwcg_reg = 0x2a00, 1367 .hwcg_bit = 6, 1368 .halt_reg = 0x2fcc, 1369 .halt_bit = 3, 1370 .clkr = { 1371 .enable_reg = 0x2a00, 1372 .enable_mask = BIT(4), 1373 .hw.init = &(struct clk_init_data){ 1374 .name = "gsbi3_h_clk", 1375 .ops = &clk_branch_ops, 1376 }, 1377 }, 1378}; 1379 1380static struct clk_branch gsbi4_h_clk = { 1381 .hwcg_reg = 0x2a20, 1382 .hwcg_bit = 6, 1383 .halt_reg = 0x2fd0, 1384 .halt_bit = 27, 1385 .clkr = { 1386 .enable_reg = 0x2a20, 1387 .enable_mask = BIT(4), 1388 .hw.init = &(struct clk_init_data){ 1389 .name = "gsbi4_h_clk", 1390 .ops = &clk_branch_ops, 1391 }, 1392 }, 1393}; 1394 1395static struct clk_branch gsbi5_h_clk = { 1396 .hwcg_reg = 0x2a40, 1397 .hwcg_bit = 6, 1398 .halt_reg = 0x2fd0, 1399 .halt_bit = 23, 1400 .clkr = { 1401 .enable_reg = 0x2a40, 1402 .enable_mask = BIT(4), 1403 .hw.init = &(struct clk_init_data){ 1404 .name = "gsbi5_h_clk", 1405 .ops = &clk_branch_ops, 1406 }, 1407 }, 1408}; 1409 1410static struct clk_branch usb_hs1_h_clk = { 1411 .hwcg_reg = 0x2900, 1412 .hwcg_bit = 6, 1413 .halt_reg = 0x2fc8, 1414 .halt_bit = 1, 1415 .clkr = { 1416 .enable_reg = 0x2900, 1417 .enable_mask = BIT(4), 1418 .hw.init = &(struct clk_init_data){ 1419 .name = "usb_hs1_h_clk", 1420 .ops = &clk_branch_ops, 1421 }, 1422 }, 1423}; 1424 1425static struct clk_branch usb_hsic_h_clk = { 1426 .halt_reg = 0x2fcc, 1427 .halt_bit = 28, 1428 .clkr = { 1429 .enable_reg = 0x2920, 1430 .enable_mask = BIT(4), 1431 .hw.init = &(struct clk_init_data){ 1432 .name = "usb_hsic_h_clk", 1433 .ops = &clk_branch_ops, 1434 }, 1435 }, 1436}; 1437 1438static struct clk_branch sdc1_h_clk = { 1439 .hwcg_reg = 0x2820, 1440 .hwcg_bit = 6, 1441 .halt_reg = 0x2fc8, 1442 .halt_bit = 11, 1443 .clkr = { 1444 .enable_reg = 0x2820, 1445 .enable_mask = BIT(4), 1446 .hw.init = &(struct clk_init_data){ 1447 .name = "sdc1_h_clk", 1448 .ops = &clk_branch_ops, 1449 }, 1450 }, 1451}; 1452 1453static struct clk_branch sdc2_h_clk = { 1454 .hwcg_reg = 0x2840, 1455 .hwcg_bit = 6, 1456 .halt_reg = 0x2fc8, 1457 .halt_bit = 10, 1458 .clkr = { 1459 .enable_reg = 0x2840, 1460 .enable_mask = BIT(4), 1461 .hw.init = &(struct clk_init_data){ 1462 .name = "sdc2_h_clk", 1463 .ops = &clk_branch_ops, 1464 }, 1465 }, 1466}; 1467 1468static struct clk_branch adm0_clk = { 1469 .halt_reg = 0x2fdc, 1470 .halt_check = BRANCH_HALT_VOTED, 1471 .halt_bit = 14, 1472 .clkr = { 1473 .enable_reg = 0x3080, 1474 .enable_mask = BIT(2), 1475 .hw.init = &(struct clk_init_data){ 1476 .name = "adm0_clk", 1477 .ops = &clk_branch_ops, 1478 }, 1479 }, 1480}; 1481 1482static struct clk_branch adm0_pbus_clk = { 1483 .hwcg_reg = 0x2208, 1484 .hwcg_bit = 6, 1485 .halt_reg = 0x2fdc, 1486 .halt_check = BRANCH_HALT_VOTED, 1487 .halt_bit = 13, 1488 .clkr = { 1489 .enable_reg = 0x3080, 1490 .enable_mask = BIT(3), 1491 .hw.init = &(struct clk_init_data){ 1492 .name = "adm0_pbus_clk", 1493 .ops = &clk_branch_ops, 1494 }, 1495 }, 1496}; 1497 1498static struct clk_branch pmic_arb0_h_clk = { 1499 .halt_reg = 0x2fd8, 1500 .halt_check = BRANCH_HALT_VOTED, 1501 .halt_bit = 22, 1502 .clkr = { 1503 .enable_reg = 0x3080, 1504 .enable_mask = BIT(8), 1505 .hw.init = &(struct clk_init_data){ 1506 .name = "pmic_arb0_h_clk", 1507 .ops = &clk_branch_ops, 1508 }, 1509 }, 1510}; 1511 1512static struct clk_branch pmic_arb1_h_clk = { 1513 .halt_reg = 0x2fd8, 1514 .halt_check = BRANCH_HALT_VOTED, 1515 .halt_bit = 21, 1516 .clkr = { 1517 .enable_reg = 0x3080, 1518 .enable_mask = BIT(9), 1519 .hw.init = &(struct clk_init_data){ 1520 .name = "pmic_arb1_h_clk", 1521 .ops = &clk_branch_ops, 1522 }, 1523 }, 1524}; 1525 1526static struct clk_branch pmic_ssbi2_clk = { 1527 .halt_reg = 0x2fd8, 1528 .halt_check = BRANCH_HALT_VOTED, 1529 .halt_bit = 23, 1530 .clkr = { 1531 .enable_reg = 0x3080, 1532 .enable_mask = BIT(7), 1533 .hw.init = &(struct clk_init_data){ 1534 .name = "pmic_ssbi2_clk", 1535 .ops = &clk_branch_ops, 1536 }, 1537 }, 1538}; 1539 1540static struct clk_branch rpm_msg_ram_h_clk = { 1541 .hwcg_reg = 0x27e0, 1542 .hwcg_bit = 6, 1543 .halt_reg = 0x2fd8, 1544 .halt_check = BRANCH_HALT_VOTED, 1545 .halt_bit = 12, 1546 .clkr = { 1547 .enable_reg = 0x3080, 1548 .enable_mask = BIT(6), 1549 .hw.init = &(struct clk_init_data){ 1550 .name = "rpm_msg_ram_h_clk", 1551 .ops = &clk_branch_ops, 1552 }, 1553 }, 1554}; 1555 1556static struct clk_branch ebi2_clk = { 1557 .hwcg_reg = 0x2664, 1558 .hwcg_bit = 6, 1559 .halt_reg = 0x2fcc, 1560 .halt_bit = 24, 1561 .clkr = { 1562 .enable_reg = 0x2664, 1563 .enable_mask = BIT(6) | BIT(4), 1564 .hw.init = &(struct clk_init_data){ 1565 .name = "ebi2_clk", 1566 .ops = &clk_branch_ops, 1567 }, 1568 }, 1569}; 1570 1571static struct clk_branch ebi2_aon_clk = { 1572 .halt_reg = 0x2fcc, 1573 .halt_bit = 23, 1574 .clkr = { 1575 .enable_reg = 0x2664, 1576 .enable_mask = BIT(8), 1577 .hw.init = &(struct clk_init_data){ 1578 .name = "ebi2_aon_clk", 1579 .ops = &clk_branch_ops, 1580 }, 1581 }, 1582}; 1583 1584static struct clk_hw *gcc_mdm9615_hws[] = { 1585 &cxo.hw, 1586}; 1587 1588static struct clk_regmap *gcc_mdm9615_clks[] = { 1589 [PLL0] = &pll0.clkr, 1590 [PLL0_VOTE] = &pll0_vote, 1591 [PLL4_VOTE] = &pll4_vote, 1592 [PLL8] = &pll8.clkr, 1593 [PLL8_VOTE] = &pll8_vote, 1594 [PLL14] = &pll14.clkr, 1595 [PLL14_VOTE] = &pll14_vote, 1596 [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr, 1597 [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr, 1598 [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr, 1599 [GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr, 1600 [GSBI3_UART_SRC] = &gsbi3_uart_src.clkr, 1601 [GSBI3_UART_CLK] = &gsbi3_uart_clk.clkr, 1602 [GSBI4_UART_SRC] = &gsbi4_uart_src.clkr, 1603 [GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr, 1604 [GSBI5_UART_SRC] = &gsbi5_uart_src.clkr, 1605 [GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr, 1606 [GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr, 1607 [GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr, 1608 [GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr, 1609 [GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr, 1610 [GSBI3_QUP_SRC] = &gsbi3_qup_src.clkr, 1611 [GSBI3_QUP_CLK] = &gsbi3_qup_clk.clkr, 1612 [GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr, 1613 [GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr, 1614 [GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr, 1615 [GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr, 1616 [GP0_SRC] = &gp0_src.clkr, 1617 [GP0_CLK] = &gp0_clk.clkr, 1618 [GP1_SRC] = &gp1_src.clkr, 1619 [GP1_CLK] = &gp1_clk.clkr, 1620 [GP2_SRC] = &gp2_src.clkr, 1621 [GP2_CLK] = &gp2_clk.clkr, 1622 [PMEM_A_CLK] = &pmem_clk.clkr, 1623 [PRNG_SRC] = &prng_src.clkr, 1624 [PRNG_CLK] = &prng_clk.clkr, 1625 [SDC1_SRC] = &sdc1_src.clkr, 1626 [SDC1_CLK] = &sdc1_clk.clkr, 1627 [SDC2_SRC] = &sdc2_src.clkr, 1628 [SDC2_CLK] = &sdc2_clk.clkr, 1629 [USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_src.clkr, 1630 [USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr, 1631 [USB_HS1_SYSTEM_CLK_SRC] = &usb_hs1_system_src.clkr, 1632 [USB_HS1_SYSTEM_CLK] = &usb_hs1_system_clk.clkr, 1633 [USB_HSIC_XCVR_FS_SRC] = &usb_hsic_xcvr_fs_src.clkr, 1634 [USB_HSIC_XCVR_FS_CLK] = &usb_hsic_xcvr_fs_clk.clkr, 1635 [USB_HSIC_SYSTEM_CLK_SRC] = &usb_hsic_system_src.clkr, 1636 [USB_HSIC_SYSTEM_CLK] = &usb_hsic_system_clk.clkr, 1637 [USB_HSIC_HSIC_CLK_SRC] = &usb_hsic_hsic_src.clkr, 1638 [USB_HSIC_HSIC_CLK] = &usb_hsic_hsic_clk.clkr, 1639 [USB_HSIC_HSIO_CAL_CLK] = &usb_hsic_hsio_cal_clk.clkr, 1640 [CE1_CORE_CLK] = &ce1_core_clk.clkr, 1641 [CE1_H_CLK] = &ce1_h_clk.clkr, 1642 [DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr, 1643 [GSBI1_H_CLK] = &gsbi1_h_clk.clkr, 1644 [GSBI2_H_CLK] = &gsbi2_h_clk.clkr, 1645 [GSBI3_H_CLK] = &gsbi3_h_clk.clkr, 1646 [GSBI4_H_CLK] = &gsbi4_h_clk.clkr, 1647 [GSBI5_H_CLK] = &gsbi5_h_clk.clkr, 1648 [USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr, 1649 [USB_HSIC_H_CLK] = &usb_hsic_h_clk.clkr, 1650 [SDC1_H_CLK] = &sdc1_h_clk.clkr, 1651 [SDC2_H_CLK] = &sdc2_h_clk.clkr, 1652 [ADM0_CLK] = &adm0_clk.clkr, 1653 [ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr, 1654 [PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr, 1655 [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr, 1656 [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr, 1657 [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr, 1658 [EBI2_CLK] = &ebi2_clk.clkr, 1659 [EBI2_AON_CLK] = &ebi2_aon_clk.clkr, 1660}; 1661 1662static const struct qcom_reset_map gcc_mdm9615_resets[] = { 1663 [DMA_BAM_RESET] = { 0x25c0, 7 }, 1664 [CE1_H_RESET] = { 0x2720, 7 }, 1665 [CE1_CORE_RESET] = { 0x2724, 7 }, 1666 [SDC1_RESET] = { 0x2830 }, 1667 [SDC2_RESET] = { 0x2850 }, 1668 [ADM0_C2_RESET] = { 0x220c, 4 }, 1669 [ADM0_C1_RESET] = { 0x220c, 3 }, 1670 [ADM0_C0_RESET] = { 0x220c, 2 }, 1671 [ADM0_PBUS_RESET] = { 0x220c, 1 }, 1672 [ADM0_RESET] = { 0x220c }, 1673 [USB_HS1_RESET] = { 0x2910 }, 1674 [USB_HSIC_RESET] = { 0x2934 }, 1675 [GSBI1_RESET] = { 0x29dc }, 1676 [GSBI2_RESET] = { 0x29fc }, 1677 [GSBI3_RESET] = { 0x2a1c }, 1678 [GSBI4_RESET] = { 0x2a3c }, 1679 [GSBI5_RESET] = { 0x2a5c }, 1680 [PDM_RESET] = { 0x2CC0, 12 }, 1681}; 1682 1683static const struct regmap_config gcc_mdm9615_regmap_config = { 1684 .reg_bits = 32, 1685 .reg_stride = 4, 1686 .val_bits = 32, 1687 .max_register = 0x3660, 1688 .fast_io = true, 1689}; 1690 1691static const struct qcom_cc_desc gcc_mdm9615_desc = { 1692 .config = &gcc_mdm9615_regmap_config, 1693 .clks = gcc_mdm9615_clks, 1694 .num_clks = ARRAY_SIZE(gcc_mdm9615_clks), 1695 .resets = gcc_mdm9615_resets, 1696 .num_resets = ARRAY_SIZE(gcc_mdm9615_resets), 1697 .clk_hws = gcc_mdm9615_hws, 1698 .num_clk_hws = ARRAY_SIZE(gcc_mdm9615_hws), 1699}; 1700 1701static const struct of_device_id gcc_mdm9615_match_table[] = { 1702 { .compatible = "qcom,gcc-mdm9615" }, 1703 { } 1704}; 1705MODULE_DEVICE_TABLE(of, gcc_mdm9615_match_table); 1706 1707static int gcc_mdm9615_probe(struct platform_device *pdev) 1708{ 1709 struct regmap *regmap; 1710 1711 regmap = qcom_cc_map(pdev, &gcc_mdm9615_desc); 1712 if (IS_ERR(regmap)) 1713 return PTR_ERR(regmap); 1714 1715 return qcom_cc_really_probe(pdev, &gcc_mdm9615_desc, regmap); 1716} 1717 1718static struct platform_driver gcc_mdm9615_driver = { 1719 .probe = gcc_mdm9615_probe, 1720 .driver = { 1721 .name = "gcc-mdm9615", 1722 .of_match_table = gcc_mdm9615_match_table, 1723 }, 1724}; 1725 1726static int __init gcc_mdm9615_init(void) 1727{ 1728 return platform_driver_register(&gcc_mdm9615_driver); 1729} 1730core_initcall(gcc_mdm9615_init); 1731 1732static void __exit gcc_mdm9615_exit(void) 1733{ 1734 platform_driver_unregister(&gcc_mdm9615_driver); 1735} 1736module_exit(gcc_mdm9615_exit); 1737 1738MODULE_DESCRIPTION("QCOM GCC MDM9615 Driver"); 1739MODULE_LICENSE("GPL v2"); 1740MODULE_ALIAS("platform:gcc-mdm9615");