root/drivers/clk/qcom/gcc-mdm9615.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. gcc_mdm9615_probe
  2. gcc_mdm9615_init
  3. gcc_mdm9615_exit

   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 
  29 static 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 
  40 static 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 
  56 static 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 
  67 static 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 
  78 static 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 
  94 static 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 
 105 static 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 
 121 static 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 
 132 enum {
 133         P_CXO,
 134         P_PLL8,
 135         P_PLL14,
 136 };
 137 
 138 static const struct parent_map gcc_cxo_pll8_map[] = {
 139         { P_CXO, 0 },
 140         { P_PLL8, 3 }
 141 };
 142 
 143 static const char * const gcc_cxo_pll8[] = {
 144         "cxo",
 145         "pll8_vote",
 146 };
 147 
 148 static const struct parent_map gcc_cxo_pll14_map[] = {
 149         { P_CXO, 0 },
 150         { P_PLL14, 4 }
 151 };
 152 
 153 static const char * const gcc_cxo_pll14[] = {
 154         "cxo",
 155         "pll14_vote",
 156 };
 157 
 158 static const struct parent_map gcc_cxo_map[] = {
 159         { P_CXO, 0 },
 160 };
 161 
 162 static const char * const gcc_cxo[] = {
 163         "cxo",
 164 };
 165 
 166 static 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 
 184 static 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 
 217 static 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 
 235 static 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 
 268 static 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 
 286 static 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 
 319 static 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 
 337 static 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 
 370 static 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 
 388 static 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 
 421 static 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 
 439 static 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 
 451 static 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 
 484 static 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 
 500 static 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 
 533 static 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 
 549 static 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 
 582 static 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 
 598 static 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 
 631 static 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 
 647 static 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 
 680 static 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 
 696 static const struct freq_tbl clk_tbl_gp[] = {
 697         { 9600000, P_CXO,  2, 0, 0 },
 698         { 19200000, P_CXO,  1, 0, 0 },
 699         { }
 700 };
 701 
 702 static 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 
 735 static 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 
 751 static 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 
 784 static 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 
 800 static 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 
 833 static 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 
 849 static 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 
 864 static 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 
 884 static 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 
 900 static 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 
 914 static 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 
 946 static 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 
 962 static 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 
 994 static 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 
1010 static const struct freq_tbl clk_tbl_usb[] = {
1011         { 60000000, P_PLL8, 1, 5, 32 },
1012         { }
1013 };
1014 
1015 static 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 
1048 static 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 
1064 static 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 
1097 static 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 
1114 static const struct freq_tbl clk_tbl_usb_hs1_system[] = {
1115         { 60000000, P_PLL8, 1, 5, 32 },
1116         { }
1117 };
1118 
1119 static 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 
1152 static 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 
1169 static const struct freq_tbl clk_tbl_usb_hsic_system[] = {
1170         { 64000000, P_PLL8, 1, 1, 6 },
1171         { }
1172 };
1173 
1174 static 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 
1207 static 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 
1224 static const struct freq_tbl clk_tbl_usb_hsic_hsic[] = {
1225         { 48000000, P_PLL14, 1, 0, 0 },
1226         { }
1227 };
1228 
1229 static 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 
1262 static 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 
1277 static 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 
1292 static 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 
1307 static 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 
1320 static 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 
1335 static 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 
1350 static 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 
1365 static 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 
1380 static 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 
1395 static 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 
1410 static 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 
1425 static 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 
1438 static 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 
1453 static 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 
1468 static 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 
1482 static 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 
1498 static 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 
1512 static 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 
1526 static 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 
1540 static 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 
1556 static 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 
1571 static 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 
1584 static struct clk_hw *gcc_mdm9615_hws[] = {
1585         &cxo.hw,
1586 };
1587 
1588 static 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 
1662 static 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 
1683 static 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 
1691 static 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 
1701 static const struct of_device_id gcc_mdm9615_match_table[] = {
1702         { .compatible = "qcom,gcc-mdm9615" },
1703         { }
1704 };
1705 MODULE_DEVICE_TABLE(of, gcc_mdm9615_match_table);
1706 
1707 static 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 
1718 static 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 
1726 static int __init gcc_mdm9615_init(void)
1727 {
1728         return platform_driver_register(&gcc_mdm9615_driver);
1729 }
1730 core_initcall(gcc_mdm9615_init);
1731 
1732 static void __exit gcc_mdm9615_exit(void)
1733 {
1734         platform_driver_unregister(&gcc_mdm9615_driver);
1735 }
1736 module_exit(gcc_mdm9615_exit);
1737 
1738 MODULE_DESCRIPTION("QCOM GCC MDM9615 Driver");
1739 MODULE_LICENSE("GPL v2");
1740 MODULE_ALIAS("platform:gcc-mdm9615");

/* [<][>][^][v][top][bottom][index][help] */