linux/drivers/clk/qcom/gcc-msm8660.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
   3 *
   4 * This software is licensed under the terms of the GNU General Public
   5 * License version 2, as published by the Free Software Foundation, and
   6 * may be copied, distributed, and modified under those terms.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 * GNU General Public License for more details.
  12 */
  13
  14#include <linux/kernel.h>
  15#include <linux/bitops.h>
  16#include <linux/err.h>
  17#include <linux/platform_device.h>
  18#include <linux/module.h>
  19#include <linux/of.h>
  20#include <linux/of_device.h>
  21#include <linux/clk-provider.h>
  22#include <linux/regmap.h>
  23#include <linux/reset-controller.h>
  24
  25#include <dt-bindings/clock/qcom,gcc-msm8660.h>
  26#include <dt-bindings/reset/qcom,gcc-msm8660.h>
  27
  28#include "common.h"
  29#include "clk-regmap.h"
  30#include "clk-pll.h"
  31#include "clk-rcg.h"
  32#include "clk-branch.h"
  33#include "reset.h"
  34
  35static struct clk_pll pll8 = {
  36        .l_reg = 0x3144,
  37        .m_reg = 0x3148,
  38        .n_reg = 0x314c,
  39        .config_reg = 0x3154,
  40        .mode_reg = 0x3140,
  41        .status_reg = 0x3158,
  42        .status_bit = 16,
  43        .clkr.hw.init = &(struct clk_init_data){
  44                .name = "pll8",
  45                .parent_names = (const char *[]){ "pxo" },
  46                .num_parents = 1,
  47                .ops = &clk_pll_ops,
  48        },
  49};
  50
  51static struct clk_regmap pll8_vote = {
  52        .enable_reg = 0x34c0,
  53        .enable_mask = BIT(8),
  54        .hw.init = &(struct clk_init_data){
  55                .name = "pll8_vote",
  56                .parent_names = (const char *[]){ "pll8" },
  57                .num_parents = 1,
  58                .ops = &clk_pll_vote_ops,
  59        },
  60};
  61
  62enum {
  63        P_PXO,
  64        P_PLL8,
  65        P_CXO,
  66};
  67
  68static const struct parent_map gcc_pxo_pll8_map[] = {
  69        { P_PXO, 0 },
  70        { P_PLL8, 3 }
  71};
  72
  73static const char * const gcc_pxo_pll8[] = {
  74        "pxo",
  75        "pll8_vote",
  76};
  77
  78static const struct parent_map gcc_pxo_pll8_cxo_map[] = {
  79        { P_PXO, 0 },
  80        { P_PLL8, 3 },
  81        { P_CXO, 5 }
  82};
  83
  84static const char * const gcc_pxo_pll8_cxo[] = {
  85        "pxo",
  86        "pll8_vote",
  87        "cxo",
  88};
  89
  90static struct freq_tbl clk_tbl_gsbi_uart[] = {
  91        {  1843200, P_PLL8, 2,  6, 625 },
  92        {  3686400, P_PLL8, 2, 12, 625 },
  93        {  7372800, P_PLL8, 2, 24, 625 },
  94        { 14745600, P_PLL8, 2, 48, 625 },
  95        { 16000000, P_PLL8, 4,  1,   6 },
  96        { 24000000, P_PLL8, 4,  1,   4 },
  97        { 32000000, P_PLL8, 4,  1,   3 },
  98        { 40000000, P_PLL8, 1,  5,  48 },
  99        { 46400000, P_PLL8, 1, 29, 240 },
 100        { 48000000, P_PLL8, 4,  1,   2 },
 101        { 51200000, P_PLL8, 1,  2,  15 },
 102        { 56000000, P_PLL8, 1,  7,  48 },
 103        { 58982400, P_PLL8, 1, 96, 625 },
 104        { 64000000, P_PLL8, 2,  1,   3 },
 105        { }
 106};
 107
 108static struct clk_rcg gsbi1_uart_src = {
 109        .ns_reg = 0x29d4,
 110        .md_reg = 0x29d0,
 111        .mn = {
 112                .mnctr_en_bit = 8,
 113                .mnctr_reset_bit = 7,
 114                .mnctr_mode_shift = 5,
 115                .n_val_shift = 16,
 116                .m_val_shift = 16,
 117                .width = 16,
 118        },
 119        .p = {
 120                .pre_div_shift = 3,
 121                .pre_div_width = 2,
 122        },
 123        .s = {
 124                .src_sel_shift = 0,
 125                .parent_map = gcc_pxo_pll8_map,
 126        },
 127        .freq_tbl = clk_tbl_gsbi_uart,
 128        .clkr = {
 129                .enable_reg = 0x29d4,
 130                .enable_mask = BIT(11),
 131                .hw.init = &(struct clk_init_data){
 132                        .name = "gsbi1_uart_src",
 133                        .parent_names = gcc_pxo_pll8,
 134                        .num_parents = 2,
 135                        .ops = &clk_rcg_ops,
 136                        .flags = CLK_SET_PARENT_GATE,
 137                },
 138        },
 139};
 140
 141static struct clk_branch gsbi1_uart_clk = {
 142        .halt_reg = 0x2fcc,
 143        .halt_bit = 10,
 144        .clkr = {
 145                .enable_reg = 0x29d4,
 146                .enable_mask = BIT(9),
 147                .hw.init = &(struct clk_init_data){
 148                        .name = "gsbi1_uart_clk",
 149                        .parent_names = (const char *[]){
 150                                "gsbi1_uart_src",
 151                        },
 152                        .num_parents = 1,
 153                        .ops = &clk_branch_ops,
 154                        .flags = CLK_SET_RATE_PARENT,
 155                },
 156        },
 157};
 158
 159static struct clk_rcg gsbi2_uart_src = {
 160        .ns_reg = 0x29f4,
 161        .md_reg = 0x29f0,
 162        .mn = {
 163                .mnctr_en_bit = 8,
 164                .mnctr_reset_bit = 7,
 165                .mnctr_mode_shift = 5,
 166                .n_val_shift = 16,
 167                .m_val_shift = 16,
 168                .width = 16,
 169        },
 170        .p = {
 171                .pre_div_shift = 3,
 172                .pre_div_width = 2,
 173        },
 174        .s = {
 175                .src_sel_shift = 0,
 176                .parent_map = gcc_pxo_pll8_map,
 177        },
 178        .freq_tbl = clk_tbl_gsbi_uart,
 179        .clkr = {
 180                .enable_reg = 0x29f4,
 181                .enable_mask = BIT(11),
 182                .hw.init = &(struct clk_init_data){
 183                        .name = "gsbi2_uart_src",
 184                        .parent_names = gcc_pxo_pll8,
 185                        .num_parents = 2,
 186                        .ops = &clk_rcg_ops,
 187                        .flags = CLK_SET_PARENT_GATE,
 188                },
 189        },
 190};
 191
 192static struct clk_branch gsbi2_uart_clk = {
 193        .halt_reg = 0x2fcc,
 194        .halt_bit = 6,
 195        .clkr = {
 196                .enable_reg = 0x29f4,
 197                .enable_mask = BIT(9),
 198                .hw.init = &(struct clk_init_data){
 199                        .name = "gsbi2_uart_clk",
 200                        .parent_names = (const char *[]){
 201                                "gsbi2_uart_src",
 202                        },
 203                        .num_parents = 1,
 204                        .ops = &clk_branch_ops,
 205                        .flags = CLK_SET_RATE_PARENT,
 206                },
 207        },
 208};
 209
 210static struct clk_rcg gsbi3_uart_src = {
 211        .ns_reg = 0x2a14,
 212        .md_reg = 0x2a10,
 213        .mn = {
 214                .mnctr_en_bit = 8,
 215                .mnctr_reset_bit = 7,
 216                .mnctr_mode_shift = 5,
 217                .n_val_shift = 16,
 218                .m_val_shift = 16,
 219                .width = 16,
 220        },
 221        .p = {
 222                .pre_div_shift = 3,
 223                .pre_div_width = 2,
 224        },
 225        .s = {
 226                .src_sel_shift = 0,
 227                .parent_map = gcc_pxo_pll8_map,
 228        },
 229        .freq_tbl = clk_tbl_gsbi_uart,
 230        .clkr = {
 231                .enable_reg = 0x2a14,
 232                .enable_mask = BIT(11),
 233                .hw.init = &(struct clk_init_data){
 234                        .name = "gsbi3_uart_src",
 235                        .parent_names = gcc_pxo_pll8,
 236                        .num_parents = 2,
 237                        .ops = &clk_rcg_ops,
 238                        .flags = CLK_SET_PARENT_GATE,
 239                },
 240        },
 241};
 242
 243static struct clk_branch gsbi3_uart_clk = {
 244        .halt_reg = 0x2fcc,
 245        .halt_bit = 2,
 246        .clkr = {
 247                .enable_reg = 0x2a14,
 248                .enable_mask = BIT(9),
 249                .hw.init = &(struct clk_init_data){
 250                        .name = "gsbi3_uart_clk",
 251                        .parent_names = (const char *[]){
 252                                "gsbi3_uart_src",
 253                        },
 254                        .num_parents = 1,
 255                        .ops = &clk_branch_ops,
 256                        .flags = CLK_SET_RATE_PARENT,
 257                },
 258        },
 259};
 260
 261static struct clk_rcg gsbi4_uart_src = {
 262        .ns_reg = 0x2a34,
 263        .md_reg = 0x2a30,
 264        .mn = {
 265                .mnctr_en_bit = 8,
 266                .mnctr_reset_bit = 7,
 267                .mnctr_mode_shift = 5,
 268                .n_val_shift = 16,
 269                .m_val_shift = 16,
 270                .width = 16,
 271        },
 272        .p = {
 273                .pre_div_shift = 3,
 274                .pre_div_width = 2,
 275        },
 276        .s = {
 277                .src_sel_shift = 0,
 278                .parent_map = gcc_pxo_pll8_map,
 279        },
 280        .freq_tbl = clk_tbl_gsbi_uart,
 281        .clkr = {
 282                .enable_reg = 0x2a34,
 283                .enable_mask = BIT(11),
 284                .hw.init = &(struct clk_init_data){
 285                        .name = "gsbi4_uart_src",
 286                        .parent_names = gcc_pxo_pll8,
 287                        .num_parents = 2,
 288                        .ops = &clk_rcg_ops,
 289                        .flags = CLK_SET_PARENT_GATE,
 290                },
 291        },
 292};
 293
 294static struct clk_branch gsbi4_uart_clk = {
 295        .halt_reg = 0x2fd0,
 296        .halt_bit = 26,
 297        .clkr = {
 298                .enable_reg = 0x2a34,
 299                .enable_mask = BIT(9),
 300                .hw.init = &(struct clk_init_data){
 301                        .name = "gsbi4_uart_clk",
 302                        .parent_names = (const char *[]){
 303                                "gsbi4_uart_src",
 304                        },
 305                        .num_parents = 1,
 306                        .ops = &clk_branch_ops,
 307                        .flags = CLK_SET_RATE_PARENT,
 308                },
 309        },
 310};
 311
 312static struct clk_rcg gsbi5_uart_src = {
 313        .ns_reg = 0x2a54,
 314        .md_reg = 0x2a50,
 315        .mn = {
 316                .mnctr_en_bit = 8,
 317                .mnctr_reset_bit = 7,
 318                .mnctr_mode_shift = 5,
 319                .n_val_shift = 16,
 320                .m_val_shift = 16,
 321                .width = 16,
 322        },
 323        .p = {
 324                .pre_div_shift = 3,
 325                .pre_div_width = 2,
 326        },
 327        .s = {
 328                .src_sel_shift = 0,
 329                .parent_map = gcc_pxo_pll8_map,
 330        },
 331        .freq_tbl = clk_tbl_gsbi_uart,
 332        .clkr = {
 333                .enable_reg = 0x2a54,
 334                .enable_mask = BIT(11),
 335                .hw.init = &(struct clk_init_data){
 336                        .name = "gsbi5_uart_src",
 337                        .parent_names = gcc_pxo_pll8,
 338                        .num_parents = 2,
 339                        .ops = &clk_rcg_ops,
 340                        .flags = CLK_SET_PARENT_GATE,
 341                },
 342        },
 343};
 344
 345static struct clk_branch gsbi5_uart_clk = {
 346        .halt_reg = 0x2fd0,
 347        .halt_bit = 22,
 348        .clkr = {
 349                .enable_reg = 0x2a54,
 350                .enable_mask = BIT(9),
 351                .hw.init = &(struct clk_init_data){
 352                        .name = "gsbi5_uart_clk",
 353                        .parent_names = (const char *[]){
 354                                "gsbi5_uart_src",
 355                        },
 356                        .num_parents = 1,
 357                        .ops = &clk_branch_ops,
 358                        .flags = CLK_SET_RATE_PARENT,
 359                },
 360        },
 361};
 362
 363static struct clk_rcg gsbi6_uart_src = {
 364        .ns_reg = 0x2a74,
 365        .md_reg = 0x2a70,
 366        .mn = {
 367                .mnctr_en_bit = 8,
 368                .mnctr_reset_bit = 7,
 369                .mnctr_mode_shift = 5,
 370                .n_val_shift = 16,
 371                .m_val_shift = 16,
 372                .width = 16,
 373        },
 374        .p = {
 375                .pre_div_shift = 3,
 376                .pre_div_width = 2,
 377        },
 378        .s = {
 379                .src_sel_shift = 0,
 380                .parent_map = gcc_pxo_pll8_map,
 381        },
 382        .freq_tbl = clk_tbl_gsbi_uart,
 383        .clkr = {
 384                .enable_reg = 0x2a74,
 385                .enable_mask = BIT(11),
 386                .hw.init = &(struct clk_init_data){
 387                        .name = "gsbi6_uart_src",
 388                        .parent_names = gcc_pxo_pll8,
 389                        .num_parents = 2,
 390                        .ops = &clk_rcg_ops,
 391                        .flags = CLK_SET_PARENT_GATE,
 392                },
 393        },
 394};
 395
 396static struct clk_branch gsbi6_uart_clk = {
 397        .halt_reg = 0x2fd0,
 398        .halt_bit = 18,
 399        .clkr = {
 400                .enable_reg = 0x2a74,
 401                .enable_mask = BIT(9),
 402                .hw.init = &(struct clk_init_data){
 403                        .name = "gsbi6_uart_clk",
 404                        .parent_names = (const char *[]){
 405                                "gsbi6_uart_src",
 406                        },
 407                        .num_parents = 1,
 408                        .ops = &clk_branch_ops,
 409                        .flags = CLK_SET_RATE_PARENT,
 410                },
 411        },
 412};
 413
 414static struct clk_rcg gsbi7_uart_src = {
 415        .ns_reg = 0x2a94,
 416        .md_reg = 0x2a90,
 417        .mn = {
 418                .mnctr_en_bit = 8,
 419                .mnctr_reset_bit = 7,
 420                .mnctr_mode_shift = 5,
 421                .n_val_shift = 16,
 422                .m_val_shift = 16,
 423                .width = 16,
 424        },
 425        .p = {
 426                .pre_div_shift = 3,
 427                .pre_div_width = 2,
 428        },
 429        .s = {
 430                .src_sel_shift = 0,
 431                .parent_map = gcc_pxo_pll8_map,
 432        },
 433        .freq_tbl = clk_tbl_gsbi_uart,
 434        .clkr = {
 435                .enable_reg = 0x2a94,
 436                .enable_mask = BIT(11),
 437                .hw.init = &(struct clk_init_data){
 438                        .name = "gsbi7_uart_src",
 439                        .parent_names = gcc_pxo_pll8,
 440                        .num_parents = 2,
 441                        .ops = &clk_rcg_ops,
 442                        .flags = CLK_SET_PARENT_GATE,
 443                },
 444        },
 445};
 446
 447static struct clk_branch gsbi7_uart_clk = {
 448        .halt_reg = 0x2fd0,
 449        .halt_bit = 14,
 450        .clkr = {
 451                .enable_reg = 0x2a94,
 452                .enable_mask = BIT(9),
 453                .hw.init = &(struct clk_init_data){
 454                        .name = "gsbi7_uart_clk",
 455                        .parent_names = (const char *[]){
 456                                "gsbi7_uart_src",
 457                        },
 458                        .num_parents = 1,
 459                        .ops = &clk_branch_ops,
 460                        .flags = CLK_SET_RATE_PARENT,
 461                },
 462        },
 463};
 464
 465static struct clk_rcg gsbi8_uart_src = {
 466        .ns_reg = 0x2ab4,
 467        .md_reg = 0x2ab0,
 468        .mn = {
 469                .mnctr_en_bit = 8,
 470                .mnctr_reset_bit = 7,
 471                .mnctr_mode_shift = 5,
 472                .n_val_shift = 16,
 473                .m_val_shift = 16,
 474                .width = 16,
 475        },
 476        .p = {
 477                .pre_div_shift = 3,
 478                .pre_div_width = 2,
 479        },
 480        .s = {
 481                .src_sel_shift = 0,
 482                .parent_map = gcc_pxo_pll8_map,
 483        },
 484        .freq_tbl = clk_tbl_gsbi_uart,
 485        .clkr = {
 486                .enable_reg = 0x2ab4,
 487                .enable_mask = BIT(11),
 488                .hw.init = &(struct clk_init_data){
 489                        .name = "gsbi8_uart_src",
 490                        .parent_names = gcc_pxo_pll8,
 491                        .num_parents = 2,
 492                        .ops = &clk_rcg_ops,
 493                        .flags = CLK_SET_PARENT_GATE,
 494                },
 495        },
 496};
 497
 498static struct clk_branch gsbi8_uart_clk = {
 499        .halt_reg = 0x2fd0,
 500        .halt_bit = 10,
 501        .clkr = {
 502                .enable_reg = 0x2ab4,
 503                .enable_mask = BIT(9),
 504                .hw.init = &(struct clk_init_data){
 505                        .name = "gsbi8_uart_clk",
 506                        .parent_names = (const char *[]){ "gsbi8_uart_src" },
 507                        .num_parents = 1,
 508                        .ops = &clk_branch_ops,
 509                        .flags = CLK_SET_RATE_PARENT,
 510                },
 511        },
 512};
 513
 514static struct clk_rcg gsbi9_uart_src = {
 515        .ns_reg = 0x2ad4,
 516        .md_reg = 0x2ad0,
 517        .mn = {
 518                .mnctr_en_bit = 8,
 519                .mnctr_reset_bit = 7,
 520                .mnctr_mode_shift = 5,
 521                .n_val_shift = 16,
 522                .m_val_shift = 16,
 523                .width = 16,
 524        },
 525        .p = {
 526                .pre_div_shift = 3,
 527                .pre_div_width = 2,
 528        },
 529        .s = {
 530                .src_sel_shift = 0,
 531                .parent_map = gcc_pxo_pll8_map,
 532        },
 533        .freq_tbl = clk_tbl_gsbi_uart,
 534        .clkr = {
 535                .enable_reg = 0x2ad4,
 536                .enable_mask = BIT(11),
 537                .hw.init = &(struct clk_init_data){
 538                        .name = "gsbi9_uart_src",
 539                        .parent_names = gcc_pxo_pll8,
 540                        .num_parents = 2,
 541                        .ops = &clk_rcg_ops,
 542                        .flags = CLK_SET_PARENT_GATE,
 543                },
 544        },
 545};
 546
 547static struct clk_branch gsbi9_uart_clk = {
 548        .halt_reg = 0x2fd0,
 549        .halt_bit = 6,
 550        .clkr = {
 551                .enable_reg = 0x2ad4,
 552                .enable_mask = BIT(9),
 553                .hw.init = &(struct clk_init_data){
 554                        .name = "gsbi9_uart_clk",
 555                        .parent_names = (const char *[]){ "gsbi9_uart_src" },
 556                        .num_parents = 1,
 557                        .ops = &clk_branch_ops,
 558                        .flags = CLK_SET_RATE_PARENT,
 559                },
 560        },
 561};
 562
 563static struct clk_rcg gsbi10_uart_src = {
 564        .ns_reg = 0x2af4,
 565        .md_reg = 0x2af0,
 566        .mn = {
 567                .mnctr_en_bit = 8,
 568                .mnctr_reset_bit = 7,
 569                .mnctr_mode_shift = 5,
 570                .n_val_shift = 16,
 571                .m_val_shift = 16,
 572                .width = 16,
 573        },
 574        .p = {
 575                .pre_div_shift = 3,
 576                .pre_div_width = 2,
 577        },
 578        .s = {
 579                .src_sel_shift = 0,
 580                .parent_map = gcc_pxo_pll8_map,
 581        },
 582        .freq_tbl = clk_tbl_gsbi_uart,
 583        .clkr = {
 584                .enable_reg = 0x2af4,
 585                .enable_mask = BIT(11),
 586                .hw.init = &(struct clk_init_data){
 587                        .name = "gsbi10_uart_src",
 588                        .parent_names = gcc_pxo_pll8,
 589                        .num_parents = 2,
 590                        .ops = &clk_rcg_ops,
 591                        .flags = CLK_SET_PARENT_GATE,
 592                },
 593        },
 594};
 595
 596static struct clk_branch gsbi10_uart_clk = {
 597        .halt_reg = 0x2fd0,
 598        .halt_bit = 2,
 599        .clkr = {
 600                .enable_reg = 0x2af4,
 601                .enable_mask = BIT(9),
 602                .hw.init = &(struct clk_init_data){
 603                        .name = "gsbi10_uart_clk",
 604                        .parent_names = (const char *[]){ "gsbi10_uart_src" },
 605                        .num_parents = 1,
 606                        .ops = &clk_branch_ops,
 607                        .flags = CLK_SET_RATE_PARENT,
 608                },
 609        },
 610};
 611
 612static struct clk_rcg gsbi11_uart_src = {
 613        .ns_reg = 0x2b14,
 614        .md_reg = 0x2b10,
 615        .mn = {
 616                .mnctr_en_bit = 8,
 617                .mnctr_reset_bit = 7,
 618                .mnctr_mode_shift = 5,
 619                .n_val_shift = 16,
 620                .m_val_shift = 16,
 621                .width = 16,
 622        },
 623        .p = {
 624                .pre_div_shift = 3,
 625                .pre_div_width = 2,
 626        },
 627        .s = {
 628                .src_sel_shift = 0,
 629                .parent_map = gcc_pxo_pll8_map,
 630        },
 631        .freq_tbl = clk_tbl_gsbi_uart,
 632        .clkr = {
 633                .enable_reg = 0x2b14,
 634                .enable_mask = BIT(11),
 635                .hw.init = &(struct clk_init_data){
 636                        .name = "gsbi11_uart_src",
 637                        .parent_names = gcc_pxo_pll8,
 638                        .num_parents = 2,
 639                        .ops = &clk_rcg_ops,
 640                        .flags = CLK_SET_PARENT_GATE,
 641                },
 642        },
 643};
 644
 645static struct clk_branch gsbi11_uart_clk = {
 646        .halt_reg = 0x2fd4,
 647        .halt_bit = 17,
 648        .clkr = {
 649                .enable_reg = 0x2b14,
 650                .enable_mask = BIT(9),
 651                .hw.init = &(struct clk_init_data){
 652                        .name = "gsbi11_uart_clk",
 653                        .parent_names = (const char *[]){ "gsbi11_uart_src" },
 654                        .num_parents = 1,
 655                        .ops = &clk_branch_ops,
 656                        .flags = CLK_SET_RATE_PARENT,
 657                },
 658        },
 659};
 660
 661static struct clk_rcg gsbi12_uart_src = {
 662        .ns_reg = 0x2b34,
 663        .md_reg = 0x2b30,
 664        .mn = {
 665                .mnctr_en_bit = 8,
 666                .mnctr_reset_bit = 7,
 667                .mnctr_mode_shift = 5,
 668                .n_val_shift = 16,
 669                .m_val_shift = 16,
 670                .width = 16,
 671        },
 672        .p = {
 673                .pre_div_shift = 3,
 674                .pre_div_width = 2,
 675        },
 676        .s = {
 677                .src_sel_shift = 0,
 678                .parent_map = gcc_pxo_pll8_map,
 679        },
 680        .freq_tbl = clk_tbl_gsbi_uart,
 681        .clkr = {
 682                .enable_reg = 0x2b34,
 683                .enable_mask = BIT(11),
 684                .hw.init = &(struct clk_init_data){
 685                        .name = "gsbi12_uart_src",
 686                        .parent_names = gcc_pxo_pll8,
 687                        .num_parents = 2,
 688                        .ops = &clk_rcg_ops,
 689                        .flags = CLK_SET_PARENT_GATE,
 690                },
 691        },
 692};
 693
 694static struct clk_branch gsbi12_uart_clk = {
 695        .halt_reg = 0x2fd4,
 696        .halt_bit = 13,
 697        .clkr = {
 698                .enable_reg = 0x2b34,
 699                .enable_mask = BIT(9),
 700                .hw.init = &(struct clk_init_data){
 701                        .name = "gsbi12_uart_clk",
 702                        .parent_names = (const char *[]){ "gsbi12_uart_src" },
 703                        .num_parents = 1,
 704                        .ops = &clk_branch_ops,
 705                        .flags = CLK_SET_RATE_PARENT,
 706                },
 707        },
 708};
 709
 710static struct freq_tbl clk_tbl_gsbi_qup[] = {
 711        {  1100000, P_PXO,  1, 2, 49 },
 712        {  5400000, P_PXO,  1, 1,  5 },
 713        { 10800000, P_PXO,  1, 2,  5 },
 714        { 15060000, P_PLL8, 1, 2, 51 },
 715        { 24000000, P_PLL8, 4, 1,  4 },
 716        { 25600000, P_PLL8, 1, 1, 15 },
 717        { 27000000, P_PXO,  1, 0,  0 },
 718        { 48000000, P_PLL8, 4, 1,  2 },
 719        { 51200000, P_PLL8, 1, 2, 15 },
 720        { }
 721};
 722
 723static struct clk_rcg gsbi1_qup_src = {
 724        .ns_reg = 0x29cc,
 725        .md_reg = 0x29c8,
 726        .mn = {
 727                .mnctr_en_bit = 8,
 728                .mnctr_reset_bit = 7,
 729                .mnctr_mode_shift = 5,
 730                .n_val_shift = 16,
 731                .m_val_shift = 16,
 732                .width = 8,
 733        },
 734        .p = {
 735                .pre_div_shift = 3,
 736                .pre_div_width = 2,
 737        },
 738        .s = {
 739                .src_sel_shift = 0,
 740                .parent_map = gcc_pxo_pll8_map,
 741        },
 742        .freq_tbl = clk_tbl_gsbi_qup,
 743        .clkr = {
 744                .enable_reg = 0x29cc,
 745                .enable_mask = BIT(11),
 746                .hw.init = &(struct clk_init_data){
 747                        .name = "gsbi1_qup_src",
 748                        .parent_names = gcc_pxo_pll8,
 749                        .num_parents = 2,
 750                        .ops = &clk_rcg_ops,
 751                        .flags = CLK_SET_PARENT_GATE,
 752                },
 753        },
 754};
 755
 756static struct clk_branch gsbi1_qup_clk = {
 757        .halt_reg = 0x2fcc,
 758        .halt_bit = 9,
 759        .clkr = {
 760                .enable_reg = 0x29cc,
 761                .enable_mask = BIT(9),
 762                .hw.init = &(struct clk_init_data){
 763                        .name = "gsbi1_qup_clk",
 764                        .parent_names = (const char *[]){ "gsbi1_qup_src" },
 765                        .num_parents = 1,
 766                        .ops = &clk_branch_ops,
 767                        .flags = CLK_SET_RATE_PARENT,
 768                },
 769        },
 770};
 771
 772static struct clk_rcg gsbi2_qup_src = {
 773        .ns_reg = 0x29ec,
 774        .md_reg = 0x29e8,
 775        .mn = {
 776                .mnctr_en_bit = 8,
 777                .mnctr_reset_bit = 7,
 778                .mnctr_mode_shift = 5,
 779                .n_val_shift = 16,
 780                .m_val_shift = 16,
 781                .width = 8,
 782        },
 783        .p = {
 784                .pre_div_shift = 3,
 785                .pre_div_width = 2,
 786        },
 787        .s = {
 788                .src_sel_shift = 0,
 789                .parent_map = gcc_pxo_pll8_map,
 790        },
 791        .freq_tbl = clk_tbl_gsbi_qup,
 792        .clkr = {
 793                .enable_reg = 0x29ec,
 794                .enable_mask = BIT(11),
 795                .hw.init = &(struct clk_init_data){
 796                        .name = "gsbi2_qup_src",
 797                        .parent_names = gcc_pxo_pll8,
 798                        .num_parents = 2,
 799                        .ops = &clk_rcg_ops,
 800                        .flags = CLK_SET_PARENT_GATE,
 801                },
 802        },
 803};
 804
 805static struct clk_branch gsbi2_qup_clk = {
 806        .halt_reg = 0x2fcc,
 807        .halt_bit = 4,
 808        .clkr = {
 809                .enable_reg = 0x29ec,
 810                .enable_mask = BIT(9),
 811                .hw.init = &(struct clk_init_data){
 812                        .name = "gsbi2_qup_clk",
 813                        .parent_names = (const char *[]){ "gsbi2_qup_src" },
 814                        .num_parents = 1,
 815                        .ops = &clk_branch_ops,
 816                        .flags = CLK_SET_RATE_PARENT,
 817                },
 818        },
 819};
 820
 821static struct clk_rcg gsbi3_qup_src = {
 822        .ns_reg = 0x2a0c,
 823        .md_reg = 0x2a08,
 824        .mn = {
 825                .mnctr_en_bit = 8,
 826                .mnctr_reset_bit = 7,
 827                .mnctr_mode_shift = 5,
 828                .n_val_shift = 16,
 829                .m_val_shift = 16,
 830                .width = 8,
 831        },
 832        .p = {
 833                .pre_div_shift = 3,
 834                .pre_div_width = 2,
 835        },
 836        .s = {
 837                .src_sel_shift = 0,
 838                .parent_map = gcc_pxo_pll8_map,
 839        },
 840        .freq_tbl = clk_tbl_gsbi_qup,
 841        .clkr = {
 842                .enable_reg = 0x2a0c,
 843                .enable_mask = BIT(11),
 844                .hw.init = &(struct clk_init_data){
 845                        .name = "gsbi3_qup_src",
 846                        .parent_names = gcc_pxo_pll8,
 847                        .num_parents = 2,
 848                        .ops = &clk_rcg_ops,
 849                        .flags = CLK_SET_PARENT_GATE,
 850                },
 851        },
 852};
 853
 854static struct clk_branch gsbi3_qup_clk = {
 855        .halt_reg = 0x2fcc,
 856        .halt_bit = 0,
 857        .clkr = {
 858                .enable_reg = 0x2a0c,
 859                .enable_mask = BIT(9),
 860                .hw.init = &(struct clk_init_data){
 861                        .name = "gsbi3_qup_clk",
 862                        .parent_names = (const char *[]){ "gsbi3_qup_src" },
 863                        .num_parents = 1,
 864                        .ops = &clk_branch_ops,
 865                        .flags = CLK_SET_RATE_PARENT,
 866                },
 867        },
 868};
 869
 870static struct clk_rcg gsbi4_qup_src = {
 871        .ns_reg = 0x2a2c,
 872        .md_reg = 0x2a28,
 873        .mn = {
 874                .mnctr_en_bit = 8,
 875                .mnctr_reset_bit = 7,
 876                .mnctr_mode_shift = 5,
 877                .n_val_shift = 16,
 878                .m_val_shift = 16,
 879                .width = 8,
 880        },
 881        .p = {
 882                .pre_div_shift = 3,
 883                .pre_div_width = 2,
 884        },
 885        .s = {
 886                .src_sel_shift = 0,
 887                .parent_map = gcc_pxo_pll8_map,
 888        },
 889        .freq_tbl = clk_tbl_gsbi_qup,
 890        .clkr = {
 891                .enable_reg = 0x2a2c,
 892                .enable_mask = BIT(11),
 893                .hw.init = &(struct clk_init_data){
 894                        .name = "gsbi4_qup_src",
 895                        .parent_names = gcc_pxo_pll8,
 896                        .num_parents = 2,
 897                        .ops = &clk_rcg_ops,
 898                        .flags = CLK_SET_PARENT_GATE,
 899                },
 900        },
 901};
 902
 903static struct clk_branch gsbi4_qup_clk = {
 904        .halt_reg = 0x2fd0,
 905        .halt_bit = 24,
 906        .clkr = {
 907                .enable_reg = 0x2a2c,
 908                .enable_mask = BIT(9),
 909                .hw.init = &(struct clk_init_data){
 910                        .name = "gsbi4_qup_clk",
 911                        .parent_names = (const char *[]){ "gsbi4_qup_src" },
 912                        .num_parents = 1,
 913                        .ops = &clk_branch_ops,
 914                        .flags = CLK_SET_RATE_PARENT,
 915                },
 916        },
 917};
 918
 919static struct clk_rcg gsbi5_qup_src = {
 920        .ns_reg = 0x2a4c,
 921        .md_reg = 0x2a48,
 922        .mn = {
 923                .mnctr_en_bit = 8,
 924                .mnctr_reset_bit = 7,
 925                .mnctr_mode_shift = 5,
 926                .n_val_shift = 16,
 927                .m_val_shift = 16,
 928                .width = 8,
 929        },
 930        .p = {
 931                .pre_div_shift = 3,
 932                .pre_div_width = 2,
 933        },
 934        .s = {
 935                .src_sel_shift = 0,
 936                .parent_map = gcc_pxo_pll8_map,
 937        },
 938        .freq_tbl = clk_tbl_gsbi_qup,
 939        .clkr = {
 940                .enable_reg = 0x2a4c,
 941                .enable_mask = BIT(11),
 942                .hw.init = &(struct clk_init_data){
 943                        .name = "gsbi5_qup_src",
 944                        .parent_names = gcc_pxo_pll8,
 945                        .num_parents = 2,
 946                        .ops = &clk_rcg_ops,
 947                        .flags = CLK_SET_PARENT_GATE,
 948                },
 949        },
 950};
 951
 952static struct clk_branch gsbi5_qup_clk = {
 953        .halt_reg = 0x2fd0,
 954        .halt_bit = 20,
 955        .clkr = {
 956                .enable_reg = 0x2a4c,
 957                .enable_mask = BIT(9),
 958                .hw.init = &(struct clk_init_data){
 959                        .name = "gsbi5_qup_clk",
 960                        .parent_names = (const char *[]){ "gsbi5_qup_src" },
 961                        .num_parents = 1,
 962                        .ops = &clk_branch_ops,
 963                        .flags = CLK_SET_RATE_PARENT,
 964                },
 965        },
 966};
 967
 968static struct clk_rcg gsbi6_qup_src = {
 969        .ns_reg = 0x2a6c,
 970        .md_reg = 0x2a68,
 971        .mn = {
 972                .mnctr_en_bit = 8,
 973                .mnctr_reset_bit = 7,
 974                .mnctr_mode_shift = 5,
 975                .n_val_shift = 16,
 976                .m_val_shift = 16,
 977                .width = 8,
 978        },
 979        .p = {
 980                .pre_div_shift = 3,
 981                .pre_div_width = 2,
 982        },
 983        .s = {
 984                .src_sel_shift = 0,
 985                .parent_map = gcc_pxo_pll8_map,
 986        },
 987        .freq_tbl = clk_tbl_gsbi_qup,
 988        .clkr = {
 989                .enable_reg = 0x2a6c,
 990                .enable_mask = BIT(11),
 991                .hw.init = &(struct clk_init_data){
 992                        .name = "gsbi6_qup_src",
 993                        .parent_names = gcc_pxo_pll8,
 994                        .num_parents = 2,
 995                        .ops = &clk_rcg_ops,
 996                        .flags = CLK_SET_PARENT_GATE,
 997                },
 998        },
 999};
1000
1001static struct clk_branch gsbi6_qup_clk = {
1002        .halt_reg = 0x2fd0,
1003        .halt_bit = 16,
1004        .clkr = {
1005                .enable_reg = 0x2a6c,
1006                .enable_mask = BIT(9),
1007                .hw.init = &(struct clk_init_data){
1008                        .name = "gsbi6_qup_clk",
1009                        .parent_names = (const char *[]){ "gsbi6_qup_src" },
1010                        .num_parents = 1,
1011                        .ops = &clk_branch_ops,
1012                        .flags = CLK_SET_RATE_PARENT,
1013                },
1014        },
1015};
1016
1017static struct clk_rcg gsbi7_qup_src = {
1018        .ns_reg = 0x2a8c,
1019        .md_reg = 0x2a88,
1020        .mn = {
1021                .mnctr_en_bit = 8,
1022                .mnctr_reset_bit = 7,
1023                .mnctr_mode_shift = 5,
1024                .n_val_shift = 16,
1025                .m_val_shift = 16,
1026                .width = 8,
1027        },
1028        .p = {
1029                .pre_div_shift = 3,
1030                .pre_div_width = 2,
1031        },
1032        .s = {
1033                .src_sel_shift = 0,
1034                .parent_map = gcc_pxo_pll8_map,
1035        },
1036        .freq_tbl = clk_tbl_gsbi_qup,
1037        .clkr = {
1038                .enable_reg = 0x2a8c,
1039                .enable_mask = BIT(11),
1040                .hw.init = &(struct clk_init_data){
1041                        .name = "gsbi7_qup_src",
1042                        .parent_names = gcc_pxo_pll8,
1043                        .num_parents = 2,
1044                        .ops = &clk_rcg_ops,
1045                        .flags = CLK_SET_PARENT_GATE,
1046                },
1047        },
1048};
1049
1050static struct clk_branch gsbi7_qup_clk = {
1051        .halt_reg = 0x2fd0,
1052        .halt_bit = 12,
1053        .clkr = {
1054                .enable_reg = 0x2a8c,
1055                .enable_mask = BIT(9),
1056                .hw.init = &(struct clk_init_data){
1057                        .name = "gsbi7_qup_clk",
1058                        .parent_names = (const char *[]){ "gsbi7_qup_src" },
1059                        .num_parents = 1,
1060                        .ops = &clk_branch_ops,
1061                        .flags = CLK_SET_RATE_PARENT,
1062                },
1063        },
1064};
1065
1066static struct clk_rcg gsbi8_qup_src = {
1067        .ns_reg = 0x2aac,
1068        .md_reg = 0x2aa8,
1069        .mn = {
1070                .mnctr_en_bit = 8,
1071                .mnctr_reset_bit = 7,
1072                .mnctr_mode_shift = 5,
1073                .n_val_shift = 16,
1074                .m_val_shift = 16,
1075                .width = 8,
1076        },
1077        .p = {
1078                .pre_div_shift = 3,
1079                .pre_div_width = 2,
1080        },
1081        .s = {
1082                .src_sel_shift = 0,
1083                .parent_map = gcc_pxo_pll8_map,
1084        },
1085        .freq_tbl = clk_tbl_gsbi_qup,
1086        .clkr = {
1087                .enable_reg = 0x2aac,
1088                .enable_mask = BIT(11),
1089                .hw.init = &(struct clk_init_data){
1090                        .name = "gsbi8_qup_src",
1091                        .parent_names = gcc_pxo_pll8,
1092                        .num_parents = 2,
1093                        .ops = &clk_rcg_ops,
1094                        .flags = CLK_SET_PARENT_GATE,
1095                },
1096        },
1097};
1098
1099static struct clk_branch gsbi8_qup_clk = {
1100        .halt_reg = 0x2fd0,
1101        .halt_bit = 8,
1102        .clkr = {
1103                .enable_reg = 0x2aac,
1104                .enable_mask = BIT(9),
1105                .hw.init = &(struct clk_init_data){
1106                        .name = "gsbi8_qup_clk",
1107                        .parent_names = (const char *[]){ "gsbi8_qup_src" },
1108                        .num_parents = 1,
1109                        .ops = &clk_branch_ops,
1110                        .flags = CLK_SET_RATE_PARENT,
1111                },
1112        },
1113};
1114
1115static struct clk_rcg gsbi9_qup_src = {
1116        .ns_reg = 0x2acc,
1117        .md_reg = 0x2ac8,
1118        .mn = {
1119                .mnctr_en_bit = 8,
1120                .mnctr_reset_bit = 7,
1121                .mnctr_mode_shift = 5,
1122                .n_val_shift = 16,
1123                .m_val_shift = 16,
1124                .width = 8,
1125        },
1126        .p = {
1127                .pre_div_shift = 3,
1128                .pre_div_width = 2,
1129        },
1130        .s = {
1131                .src_sel_shift = 0,
1132                .parent_map = gcc_pxo_pll8_map,
1133        },
1134        .freq_tbl = clk_tbl_gsbi_qup,
1135        .clkr = {
1136                .enable_reg = 0x2acc,
1137                .enable_mask = BIT(11),
1138                .hw.init = &(struct clk_init_data){
1139                        .name = "gsbi9_qup_src",
1140                        .parent_names = gcc_pxo_pll8,
1141                        .num_parents = 2,
1142                        .ops = &clk_rcg_ops,
1143                        .flags = CLK_SET_PARENT_GATE,
1144                },
1145        },
1146};
1147
1148static struct clk_branch gsbi9_qup_clk = {
1149        .halt_reg = 0x2fd0,
1150        .halt_bit = 4,
1151        .clkr = {
1152                .enable_reg = 0x2acc,
1153                .enable_mask = BIT(9),
1154                .hw.init = &(struct clk_init_data){
1155                        .name = "gsbi9_qup_clk",
1156                        .parent_names = (const char *[]){ "gsbi9_qup_src" },
1157                        .num_parents = 1,
1158                        .ops = &clk_branch_ops,
1159                        .flags = CLK_SET_RATE_PARENT,
1160                },
1161        },
1162};
1163
1164static struct clk_rcg gsbi10_qup_src = {
1165        .ns_reg = 0x2aec,
1166        .md_reg = 0x2ae8,
1167        .mn = {
1168                .mnctr_en_bit = 8,
1169                .mnctr_reset_bit = 7,
1170                .mnctr_mode_shift = 5,
1171                .n_val_shift = 16,
1172                .m_val_shift = 16,
1173                .width = 8,
1174        },
1175        .p = {
1176                .pre_div_shift = 3,
1177                .pre_div_width = 2,
1178        },
1179        .s = {
1180                .src_sel_shift = 0,
1181                .parent_map = gcc_pxo_pll8_map,
1182        },
1183        .freq_tbl = clk_tbl_gsbi_qup,
1184        .clkr = {
1185                .enable_reg = 0x2aec,
1186                .enable_mask = BIT(11),
1187                .hw.init = &(struct clk_init_data){
1188                        .name = "gsbi10_qup_src",
1189                        .parent_names = gcc_pxo_pll8,
1190                        .num_parents = 2,
1191                        .ops = &clk_rcg_ops,
1192                        .flags = CLK_SET_PARENT_GATE,
1193                },
1194        },
1195};
1196
1197static struct clk_branch gsbi10_qup_clk = {
1198        .halt_reg = 0x2fd0,
1199        .halt_bit = 0,
1200        .clkr = {
1201                .enable_reg = 0x2aec,
1202                .enable_mask = BIT(9),
1203                .hw.init = &(struct clk_init_data){
1204                        .name = "gsbi10_qup_clk",
1205                        .parent_names = (const char *[]){ "gsbi10_qup_src" },
1206                        .num_parents = 1,
1207                        .ops = &clk_branch_ops,
1208                        .flags = CLK_SET_RATE_PARENT,
1209                },
1210        },
1211};
1212
1213static struct clk_rcg gsbi11_qup_src = {
1214        .ns_reg = 0x2b0c,
1215        .md_reg = 0x2b08,
1216        .mn = {
1217                .mnctr_en_bit = 8,
1218                .mnctr_reset_bit = 7,
1219                .mnctr_mode_shift = 5,
1220                .n_val_shift = 16,
1221                .m_val_shift = 16,
1222                .width = 8,
1223        },
1224        .p = {
1225                .pre_div_shift = 3,
1226                .pre_div_width = 2,
1227        },
1228        .s = {
1229                .src_sel_shift = 0,
1230                .parent_map = gcc_pxo_pll8_map,
1231        },
1232        .freq_tbl = clk_tbl_gsbi_qup,
1233        .clkr = {
1234                .enable_reg = 0x2b0c,
1235                .enable_mask = BIT(11),
1236                .hw.init = &(struct clk_init_data){
1237                        .name = "gsbi11_qup_src",
1238                        .parent_names = gcc_pxo_pll8,
1239                        .num_parents = 2,
1240                        .ops = &clk_rcg_ops,
1241                        .flags = CLK_SET_PARENT_GATE,
1242                },
1243        },
1244};
1245
1246static struct clk_branch gsbi11_qup_clk = {
1247        .halt_reg = 0x2fd4,
1248        .halt_bit = 15,
1249        .clkr = {
1250                .enable_reg = 0x2b0c,
1251                .enable_mask = BIT(9),
1252                .hw.init = &(struct clk_init_data){
1253                        .name = "gsbi11_qup_clk",
1254                        .parent_names = (const char *[]){ "gsbi11_qup_src" },
1255                        .num_parents = 1,
1256                        .ops = &clk_branch_ops,
1257                        .flags = CLK_SET_RATE_PARENT,
1258                },
1259        },
1260};
1261
1262static struct clk_rcg gsbi12_qup_src = {
1263        .ns_reg = 0x2b2c,
1264        .md_reg = 0x2b28,
1265        .mn = {
1266                .mnctr_en_bit = 8,
1267                .mnctr_reset_bit = 7,
1268                .mnctr_mode_shift = 5,
1269                .n_val_shift = 16,
1270                .m_val_shift = 16,
1271                .width = 8,
1272        },
1273        .p = {
1274                .pre_div_shift = 3,
1275                .pre_div_width = 2,
1276        },
1277        .s = {
1278                .src_sel_shift = 0,
1279                .parent_map = gcc_pxo_pll8_map,
1280        },
1281        .freq_tbl = clk_tbl_gsbi_qup,
1282        .clkr = {
1283                .enable_reg = 0x2b2c,
1284                .enable_mask = BIT(11),
1285                .hw.init = &(struct clk_init_data){
1286                        .name = "gsbi12_qup_src",
1287                        .parent_names = gcc_pxo_pll8,
1288                        .num_parents = 2,
1289                        .ops = &clk_rcg_ops,
1290                        .flags = CLK_SET_PARENT_GATE,
1291                },
1292        },
1293};
1294
1295static struct clk_branch gsbi12_qup_clk = {
1296        .halt_reg = 0x2fd4,
1297        .halt_bit = 11,
1298        .clkr = {
1299                .enable_reg = 0x2b2c,
1300                .enable_mask = BIT(9),
1301                .hw.init = &(struct clk_init_data){
1302                        .name = "gsbi12_qup_clk",
1303                        .parent_names = (const char *[]){ "gsbi12_qup_src" },
1304                        .num_parents = 1,
1305                        .ops = &clk_branch_ops,
1306                        .flags = CLK_SET_RATE_PARENT,
1307                },
1308        },
1309};
1310
1311static const struct freq_tbl clk_tbl_gp[] = {
1312        { 9600000, P_CXO,  2, 0, 0 },
1313        { 13500000, P_PXO,  2, 0, 0 },
1314        { 19200000, P_CXO,  1, 0, 0 },
1315        { 27000000, P_PXO,  1, 0, 0 },
1316        { 64000000, P_PLL8, 2, 1, 3 },
1317        { 76800000, P_PLL8, 1, 1, 5 },
1318        { 96000000, P_PLL8, 4, 0, 0 },
1319        { 128000000, P_PLL8, 3, 0, 0 },
1320        { 192000000, P_PLL8, 2, 0, 0 },
1321        { }
1322};
1323
1324static struct clk_rcg gp0_src = {
1325        .ns_reg = 0x2d24,
1326        .md_reg = 0x2d00,
1327        .mn = {
1328                .mnctr_en_bit = 8,
1329                .mnctr_reset_bit = 7,
1330                .mnctr_mode_shift = 5,
1331                .n_val_shift = 16,
1332                .m_val_shift = 16,
1333                .width = 8,
1334        },
1335        .p = {
1336                .pre_div_shift = 3,
1337                .pre_div_width = 2,
1338        },
1339        .s = {
1340                .src_sel_shift = 0,
1341                .parent_map = gcc_pxo_pll8_cxo_map,
1342        },
1343        .freq_tbl = clk_tbl_gp,
1344        .clkr = {
1345                .enable_reg = 0x2d24,
1346                .enable_mask = BIT(11),
1347                .hw.init = &(struct clk_init_data){
1348                        .name = "gp0_src",
1349                        .parent_names = gcc_pxo_pll8_cxo,
1350                        .num_parents = 3,
1351                        .ops = &clk_rcg_ops,
1352                        .flags = CLK_SET_PARENT_GATE,
1353                },
1354        }
1355};
1356
1357static struct clk_branch gp0_clk = {
1358        .halt_reg = 0x2fd8,
1359        .halt_bit = 7,
1360        .clkr = {
1361                .enable_reg = 0x2d24,
1362                .enable_mask = BIT(9),
1363                .hw.init = &(struct clk_init_data){
1364                        .name = "gp0_clk",
1365                        .parent_names = (const char *[]){ "gp0_src" },
1366                        .num_parents = 1,
1367                        .ops = &clk_branch_ops,
1368                        .flags = CLK_SET_RATE_PARENT,
1369                },
1370        },
1371};
1372
1373static struct clk_rcg gp1_src = {
1374        .ns_reg = 0x2d44,
1375        .md_reg = 0x2d40,
1376        .mn = {
1377                .mnctr_en_bit = 8,
1378                .mnctr_reset_bit = 7,
1379                .mnctr_mode_shift = 5,
1380                .n_val_shift = 16,
1381                .m_val_shift = 16,
1382                .width = 8,
1383        },
1384        .p = {
1385                .pre_div_shift = 3,
1386                .pre_div_width = 2,
1387        },
1388        .s = {
1389                .src_sel_shift = 0,
1390                .parent_map = gcc_pxo_pll8_cxo_map,
1391        },
1392        .freq_tbl = clk_tbl_gp,
1393        .clkr = {
1394                .enable_reg = 0x2d44,
1395                .enable_mask = BIT(11),
1396                .hw.init = &(struct clk_init_data){
1397                        .name = "gp1_src",
1398                        .parent_names = gcc_pxo_pll8_cxo,
1399                        .num_parents = 3,
1400                        .ops = &clk_rcg_ops,
1401                        .flags = CLK_SET_RATE_GATE,
1402                },
1403        }
1404};
1405
1406static struct clk_branch gp1_clk = {
1407        .halt_reg = 0x2fd8,
1408        .halt_bit = 6,
1409        .clkr = {
1410                .enable_reg = 0x2d44,
1411                .enable_mask = BIT(9),
1412                .hw.init = &(struct clk_init_data){
1413                        .name = "gp1_clk",
1414                        .parent_names = (const char *[]){ "gp1_src" },
1415                        .num_parents = 1,
1416                        .ops = &clk_branch_ops,
1417                        .flags = CLK_SET_RATE_PARENT,
1418                },
1419        },
1420};
1421
1422static struct clk_rcg gp2_src = {
1423        .ns_reg = 0x2d64,
1424        .md_reg = 0x2d60,
1425        .mn = {
1426                .mnctr_en_bit = 8,
1427                .mnctr_reset_bit = 7,
1428                .mnctr_mode_shift = 5,
1429                .n_val_shift = 16,
1430                .m_val_shift = 16,
1431                .width = 8,
1432        },
1433        .p = {
1434                .pre_div_shift = 3,
1435                .pre_div_width = 2,
1436        },
1437        .s = {
1438                .src_sel_shift = 0,
1439                .parent_map = gcc_pxo_pll8_cxo_map,
1440        },
1441        .freq_tbl = clk_tbl_gp,
1442        .clkr = {
1443                .enable_reg = 0x2d64,
1444                .enable_mask = BIT(11),
1445                .hw.init = &(struct clk_init_data){
1446                        .name = "gp2_src",
1447                        .parent_names = gcc_pxo_pll8_cxo,
1448                        .num_parents = 3,
1449                        .ops = &clk_rcg_ops,
1450                        .flags = CLK_SET_RATE_GATE,
1451                },
1452        }
1453};
1454
1455static struct clk_branch gp2_clk = {
1456        .halt_reg = 0x2fd8,
1457        .halt_bit = 5,
1458        .clkr = {
1459                .enable_reg = 0x2d64,
1460                .enable_mask = BIT(9),
1461                .hw.init = &(struct clk_init_data){
1462                        .name = "gp2_clk",
1463                        .parent_names = (const char *[]){ "gp2_src" },
1464                        .num_parents = 1,
1465                        .ops = &clk_branch_ops,
1466                        .flags = CLK_SET_RATE_PARENT,
1467                },
1468        },
1469};
1470
1471static struct clk_branch pmem_clk = {
1472        .hwcg_reg = 0x25a0,
1473        .hwcg_bit = 6,
1474        .halt_reg = 0x2fc8,
1475        .halt_bit = 20,
1476        .clkr = {
1477                .enable_reg = 0x25a0,
1478                .enable_mask = BIT(4),
1479                .hw.init = &(struct clk_init_data){
1480                        .name = "pmem_clk",
1481                        .ops = &clk_branch_ops,
1482                        .flags = CLK_IS_ROOT,
1483                },
1484        },
1485};
1486
1487static struct clk_rcg prng_src = {
1488        .ns_reg = 0x2e80,
1489        .p = {
1490                .pre_div_shift = 3,
1491                .pre_div_width = 4,
1492        },
1493        .s = {
1494                .src_sel_shift = 0,
1495                .parent_map = gcc_pxo_pll8_map,
1496        },
1497        .clkr.hw = {
1498                .init = &(struct clk_init_data){
1499                        .name = "prng_src",
1500                        .parent_names = gcc_pxo_pll8,
1501                        .num_parents = 2,
1502                        .ops = &clk_rcg_ops,
1503                },
1504        },
1505};
1506
1507static struct clk_branch prng_clk = {
1508        .halt_reg = 0x2fd8,
1509        .halt_check = BRANCH_HALT_VOTED,
1510        .halt_bit = 10,
1511        .clkr = {
1512                .enable_reg = 0x3080,
1513                .enable_mask = BIT(10),
1514                .hw.init = &(struct clk_init_data){
1515                        .name = "prng_clk",
1516                        .parent_names = (const char *[]){ "prng_src" },
1517                        .num_parents = 1,
1518                        .ops = &clk_branch_ops,
1519                },
1520        },
1521};
1522
1523static const struct freq_tbl clk_tbl_sdc[] = {
1524        {    144000, P_PXO,   3, 2, 125 },
1525        {    400000, P_PLL8,  4, 1, 240 },
1526        {  16000000, P_PLL8,  4, 1,   6 },
1527        {  17070000, P_PLL8,  1, 2,  45 },
1528        {  20210000, P_PLL8,  1, 1,  19 },
1529        {  24000000, P_PLL8,  4, 1,   4 },
1530        {  48000000, P_PLL8,  4, 1,   2 },
1531        { }
1532};
1533
1534static struct clk_rcg sdc1_src = {
1535        .ns_reg = 0x282c,
1536        .md_reg = 0x2828,
1537        .mn = {
1538                .mnctr_en_bit = 8,
1539                .mnctr_reset_bit = 7,
1540                .mnctr_mode_shift = 5,
1541                .n_val_shift = 16,
1542                .m_val_shift = 16,
1543                .width = 8,
1544        },
1545        .p = {
1546                .pre_div_shift = 3,
1547                .pre_div_width = 2,
1548        },
1549        .s = {
1550                .src_sel_shift = 0,
1551                .parent_map = gcc_pxo_pll8_map,
1552        },
1553        .freq_tbl = clk_tbl_sdc,
1554        .clkr = {
1555                .enable_reg = 0x282c,
1556                .enable_mask = BIT(11),
1557                .hw.init = &(struct clk_init_data){
1558                        .name = "sdc1_src",
1559                        .parent_names = gcc_pxo_pll8,
1560                        .num_parents = 2,
1561                        .ops = &clk_rcg_ops,
1562                        .flags = CLK_SET_RATE_GATE,
1563                },
1564        }
1565};
1566
1567static struct clk_branch sdc1_clk = {
1568        .halt_reg = 0x2fc8,
1569        .halt_bit = 6,
1570        .clkr = {
1571                .enable_reg = 0x282c,
1572                .enable_mask = BIT(9),
1573                .hw.init = &(struct clk_init_data){
1574                        .name = "sdc1_clk",
1575                        .parent_names = (const char *[]){ "sdc1_src" },
1576                        .num_parents = 1,
1577                        .ops = &clk_branch_ops,
1578                        .flags = CLK_SET_RATE_PARENT,
1579                },
1580        },
1581};
1582
1583static struct clk_rcg sdc2_src = {
1584        .ns_reg = 0x284c,
1585        .md_reg = 0x2848,
1586        .mn = {
1587                .mnctr_en_bit = 8,
1588                .mnctr_reset_bit = 7,
1589                .mnctr_mode_shift = 5,
1590                .n_val_shift = 16,
1591                .m_val_shift = 16,
1592                .width = 8,
1593        },
1594        .p = {
1595                .pre_div_shift = 3,
1596                .pre_div_width = 2,
1597        },
1598        .s = {
1599                .src_sel_shift = 0,
1600                .parent_map = gcc_pxo_pll8_map,
1601        },
1602        .freq_tbl = clk_tbl_sdc,
1603        .clkr = {
1604                .enable_reg = 0x284c,
1605                .enable_mask = BIT(11),
1606                .hw.init = &(struct clk_init_data){
1607                        .name = "sdc2_src",
1608                        .parent_names = gcc_pxo_pll8,
1609                        .num_parents = 2,
1610                        .ops = &clk_rcg_ops,
1611                        .flags = CLK_SET_RATE_GATE,
1612                },
1613        }
1614};
1615
1616static struct clk_branch sdc2_clk = {
1617        .halt_reg = 0x2fc8,
1618        .halt_bit = 5,
1619        .clkr = {
1620                .enable_reg = 0x284c,
1621                .enable_mask = BIT(9),
1622                .hw.init = &(struct clk_init_data){
1623                        .name = "sdc2_clk",
1624                        .parent_names = (const char *[]){ "sdc2_src" },
1625                        .num_parents = 1,
1626                        .ops = &clk_branch_ops,
1627                        .flags = CLK_SET_RATE_PARENT,
1628                },
1629        },
1630};
1631
1632static struct clk_rcg sdc3_src = {
1633        .ns_reg = 0x286c,
1634        .md_reg = 0x2868,
1635        .mn = {
1636                .mnctr_en_bit = 8,
1637                .mnctr_reset_bit = 7,
1638                .mnctr_mode_shift = 5,
1639                .n_val_shift = 16,
1640                .m_val_shift = 16,
1641                .width = 8,
1642        },
1643        .p = {
1644                .pre_div_shift = 3,
1645                .pre_div_width = 2,
1646        },
1647        .s = {
1648                .src_sel_shift = 0,
1649                .parent_map = gcc_pxo_pll8_map,
1650        },
1651        .freq_tbl = clk_tbl_sdc,
1652        .clkr = {
1653                .enable_reg = 0x286c,
1654                .enable_mask = BIT(11),
1655                .hw.init = &(struct clk_init_data){
1656                        .name = "sdc3_src",
1657                        .parent_names = gcc_pxo_pll8,
1658                        .num_parents = 2,
1659                        .ops = &clk_rcg_ops,
1660                        .flags = CLK_SET_RATE_GATE,
1661                },
1662        }
1663};
1664
1665static struct clk_branch sdc3_clk = {
1666        .halt_reg = 0x2fc8,
1667        .halt_bit = 4,
1668        .clkr = {
1669                .enable_reg = 0x286c,
1670                .enable_mask = BIT(9),
1671                .hw.init = &(struct clk_init_data){
1672                        .name = "sdc3_clk",
1673                        .parent_names = (const char *[]){ "sdc3_src" },
1674                        .num_parents = 1,
1675                        .ops = &clk_branch_ops,
1676                        .flags = CLK_SET_RATE_PARENT,
1677                },
1678        },
1679};
1680
1681static struct clk_rcg sdc4_src = {
1682        .ns_reg = 0x288c,
1683        .md_reg = 0x2888,
1684        .mn = {
1685                .mnctr_en_bit = 8,
1686                .mnctr_reset_bit = 7,
1687                .mnctr_mode_shift = 5,
1688                .n_val_shift = 16,
1689                .m_val_shift = 16,
1690                .width = 8,
1691        },
1692        .p = {
1693                .pre_div_shift = 3,
1694                .pre_div_width = 2,
1695        },
1696        .s = {
1697                .src_sel_shift = 0,
1698                .parent_map = gcc_pxo_pll8_map,
1699        },
1700        .freq_tbl = clk_tbl_sdc,
1701        .clkr = {
1702                .enable_reg = 0x288c,
1703                .enable_mask = BIT(11),
1704                .hw.init = &(struct clk_init_data){
1705                        .name = "sdc4_src",
1706                        .parent_names = gcc_pxo_pll8,
1707                        .num_parents = 2,
1708                        .ops = &clk_rcg_ops,
1709                        .flags = CLK_SET_RATE_GATE,
1710                },
1711        }
1712};
1713
1714static struct clk_branch sdc4_clk = {
1715        .halt_reg = 0x2fc8,
1716        .halt_bit = 3,
1717        .clkr = {
1718                .enable_reg = 0x288c,
1719                .enable_mask = BIT(9),
1720                .hw.init = &(struct clk_init_data){
1721                        .name = "sdc4_clk",
1722                        .parent_names = (const char *[]){ "sdc4_src" },
1723                        .num_parents = 1,
1724                        .ops = &clk_branch_ops,
1725                        .flags = CLK_SET_RATE_PARENT,
1726                },
1727        },
1728};
1729
1730static struct clk_rcg sdc5_src = {
1731        .ns_reg = 0x28ac,
1732        .md_reg = 0x28a8,
1733        .mn = {
1734                .mnctr_en_bit = 8,
1735                .mnctr_reset_bit = 7,
1736                .mnctr_mode_shift = 5,
1737                .n_val_shift = 16,
1738                .m_val_shift = 16,
1739                .width = 8,
1740        },
1741        .p = {
1742                .pre_div_shift = 3,
1743                .pre_div_width = 2,
1744        },
1745        .s = {
1746                .src_sel_shift = 0,
1747                .parent_map = gcc_pxo_pll8_map,
1748        },
1749        .freq_tbl = clk_tbl_sdc,
1750        .clkr = {
1751                .enable_reg = 0x28ac,
1752                .enable_mask = BIT(11),
1753                .hw.init = &(struct clk_init_data){
1754                        .name = "sdc5_src",
1755                        .parent_names = gcc_pxo_pll8,
1756                        .num_parents = 2,
1757                        .ops = &clk_rcg_ops,
1758                        .flags = CLK_SET_RATE_GATE,
1759                },
1760        }
1761};
1762
1763static struct clk_branch sdc5_clk = {
1764        .halt_reg = 0x2fc8,
1765        .halt_bit = 2,
1766        .clkr = {
1767                .enable_reg = 0x28ac,
1768                .enable_mask = BIT(9),
1769                .hw.init = &(struct clk_init_data){
1770                        .name = "sdc5_clk",
1771                        .parent_names = (const char *[]){ "sdc5_src" },
1772                        .num_parents = 1,
1773                        .ops = &clk_branch_ops,
1774                        .flags = CLK_SET_RATE_PARENT,
1775                },
1776        },
1777};
1778
1779static const struct freq_tbl clk_tbl_tsif_ref[] = {
1780        { 105000, P_PXO,  1, 1, 256 },
1781        { }
1782};
1783
1784static struct clk_rcg tsif_ref_src = {
1785        .ns_reg = 0x2710,
1786        .md_reg = 0x270c,
1787        .mn = {
1788                .mnctr_en_bit = 8,
1789                .mnctr_reset_bit = 7,
1790                .mnctr_mode_shift = 5,
1791                .n_val_shift = 16,
1792                .m_val_shift = 16,
1793                .width = 16,
1794        },
1795        .p = {
1796                .pre_div_shift = 3,
1797                .pre_div_width = 2,
1798        },
1799        .s = {
1800                .src_sel_shift = 0,
1801                .parent_map = gcc_pxo_pll8_map,
1802        },
1803        .freq_tbl = clk_tbl_tsif_ref,
1804        .clkr = {
1805                .enable_reg = 0x2710,
1806                .enable_mask = BIT(11),
1807                .hw.init = &(struct clk_init_data){
1808                        .name = "tsif_ref_src",
1809                        .parent_names = gcc_pxo_pll8,
1810                        .num_parents = 2,
1811                        .ops = &clk_rcg_ops,
1812                        .flags = CLK_SET_RATE_GATE,
1813                },
1814        }
1815};
1816
1817static struct clk_branch tsif_ref_clk = {
1818        .halt_reg = 0x2fd4,
1819        .halt_bit = 5,
1820        .clkr = {
1821                .enable_reg = 0x2710,
1822                .enable_mask = BIT(9),
1823                .hw.init = &(struct clk_init_data){
1824                        .name = "tsif_ref_clk",
1825                        .parent_names = (const char *[]){ "tsif_ref_src" },
1826                        .num_parents = 1,
1827                        .ops = &clk_branch_ops,
1828                        .flags = CLK_SET_RATE_PARENT,
1829                },
1830        },
1831};
1832
1833static const struct freq_tbl clk_tbl_usb[] = {
1834        { 60000000, P_PLL8, 1, 5, 32 },
1835        { }
1836};
1837
1838static struct clk_rcg usb_hs1_xcvr_src = {
1839        .ns_reg = 0x290c,
1840        .md_reg = 0x2908,
1841        .mn = {
1842                .mnctr_en_bit = 8,
1843                .mnctr_reset_bit = 7,
1844                .mnctr_mode_shift = 5,
1845                .n_val_shift = 16,
1846                .m_val_shift = 16,
1847                .width = 8,
1848        },
1849        .p = {
1850                .pre_div_shift = 3,
1851                .pre_div_width = 2,
1852        },
1853        .s = {
1854                .src_sel_shift = 0,
1855                .parent_map = gcc_pxo_pll8_map,
1856        },
1857        .freq_tbl = clk_tbl_usb,
1858        .clkr = {
1859                .enable_reg = 0x290c,
1860                .enable_mask = BIT(11),
1861                .hw.init = &(struct clk_init_data){
1862                        .name = "usb_hs1_xcvr_src",
1863                        .parent_names = gcc_pxo_pll8,
1864                        .num_parents = 2,
1865                        .ops = &clk_rcg_ops,
1866                        .flags = CLK_SET_RATE_GATE,
1867                },
1868        }
1869};
1870
1871static struct clk_branch usb_hs1_xcvr_clk = {
1872        .halt_reg = 0x2fc8,
1873        .halt_bit = 0,
1874        .clkr = {
1875                .enable_reg = 0x290c,
1876                .enable_mask = BIT(9),
1877                .hw.init = &(struct clk_init_data){
1878                        .name = "usb_hs1_xcvr_clk",
1879                        .parent_names = (const char *[]){ "usb_hs1_xcvr_src" },
1880                        .num_parents = 1,
1881                        .ops = &clk_branch_ops,
1882                        .flags = CLK_SET_RATE_PARENT,
1883                },
1884        },
1885};
1886
1887static struct clk_rcg usb_fs1_xcvr_fs_src = {
1888        .ns_reg = 0x2968,
1889        .md_reg = 0x2964,
1890        .mn = {
1891                .mnctr_en_bit = 8,
1892                .mnctr_reset_bit = 7,
1893                .mnctr_mode_shift = 5,
1894                .n_val_shift = 16,
1895                .m_val_shift = 16,
1896                .width = 8,
1897        },
1898        .p = {
1899                .pre_div_shift = 3,
1900                .pre_div_width = 2,
1901        },
1902        .s = {
1903                .src_sel_shift = 0,
1904                .parent_map = gcc_pxo_pll8_map,
1905        },
1906        .freq_tbl = clk_tbl_usb,
1907        .clkr = {
1908                .enable_reg = 0x2968,
1909                .enable_mask = BIT(11),
1910                .hw.init = &(struct clk_init_data){
1911                        .name = "usb_fs1_xcvr_fs_src",
1912                        .parent_names = gcc_pxo_pll8,
1913                        .num_parents = 2,
1914                        .ops = &clk_rcg_ops,
1915                        .flags = CLK_SET_RATE_GATE,
1916                },
1917        }
1918};
1919
1920static const char * const usb_fs1_xcvr_fs_src_p[] = { "usb_fs1_xcvr_fs_src" };
1921
1922static struct clk_branch usb_fs1_xcvr_fs_clk = {
1923        .halt_reg = 0x2fcc,
1924        .halt_bit = 15,
1925        .clkr = {
1926                .enable_reg = 0x2968,
1927                .enable_mask = BIT(9),
1928                .hw.init = &(struct clk_init_data){
1929                        .name = "usb_fs1_xcvr_fs_clk",
1930                        .parent_names = usb_fs1_xcvr_fs_src_p,
1931                        .num_parents = 1,
1932                        .ops = &clk_branch_ops,
1933                        .flags = CLK_SET_RATE_PARENT,
1934                },
1935        },
1936};
1937
1938static struct clk_branch usb_fs1_system_clk = {
1939        .halt_reg = 0x2fcc,
1940        .halt_bit = 16,
1941        .clkr = {
1942                .enable_reg = 0x296c,
1943                .enable_mask = BIT(4),
1944                .hw.init = &(struct clk_init_data){
1945                        .parent_names = usb_fs1_xcvr_fs_src_p,
1946                        .num_parents = 1,
1947                        .name = "usb_fs1_system_clk",
1948                        .ops = &clk_branch_ops,
1949                        .flags = CLK_SET_RATE_PARENT,
1950                },
1951        },
1952};
1953
1954static struct clk_rcg usb_fs2_xcvr_fs_src = {
1955        .ns_reg = 0x2988,
1956        .md_reg = 0x2984,
1957        .mn = {
1958                .mnctr_en_bit = 8,
1959                .mnctr_reset_bit = 7,
1960                .mnctr_mode_shift = 5,
1961                .n_val_shift = 16,
1962                .m_val_shift = 16,
1963                .width = 8,
1964        },
1965        .p = {
1966                .pre_div_shift = 3,
1967                .pre_div_width = 2,
1968        },
1969        .s = {
1970                .src_sel_shift = 0,
1971                .parent_map = gcc_pxo_pll8_map,
1972        },
1973        .freq_tbl = clk_tbl_usb,
1974        .clkr = {
1975                .enable_reg = 0x2988,
1976                .enable_mask = BIT(11),
1977                .hw.init = &(struct clk_init_data){
1978                        .name = "usb_fs2_xcvr_fs_src",
1979                        .parent_names = gcc_pxo_pll8,
1980                        .num_parents = 2,
1981                        .ops = &clk_rcg_ops,
1982                        .flags = CLK_SET_RATE_GATE,
1983                },
1984        }
1985};
1986
1987static const char * const usb_fs2_xcvr_fs_src_p[] = { "usb_fs2_xcvr_fs_src" };
1988
1989static struct clk_branch usb_fs2_xcvr_fs_clk = {
1990        .halt_reg = 0x2fcc,
1991        .halt_bit = 12,
1992        .clkr = {
1993                .enable_reg = 0x2988,
1994                .enable_mask = BIT(9),
1995                .hw.init = &(struct clk_init_data){
1996                        .name = "usb_fs2_xcvr_fs_clk",
1997                        .parent_names = usb_fs2_xcvr_fs_src_p,
1998                        .num_parents = 1,
1999                        .ops = &clk_branch_ops,
2000                        .flags = CLK_SET_RATE_PARENT,
2001                },
2002        },
2003};
2004
2005static struct clk_branch usb_fs2_system_clk = {
2006        .halt_reg = 0x2fcc,
2007        .halt_bit = 13,
2008        .clkr = {
2009                .enable_reg = 0x298c,
2010                .enable_mask = BIT(4),
2011                .hw.init = &(struct clk_init_data){
2012                        .name = "usb_fs2_system_clk",
2013                        .parent_names = usb_fs2_xcvr_fs_src_p,
2014                        .num_parents = 1,
2015                        .ops = &clk_branch_ops,
2016                        .flags = CLK_SET_RATE_PARENT,
2017                },
2018        },
2019};
2020
2021static struct clk_branch gsbi1_h_clk = {
2022        .halt_reg = 0x2fcc,
2023        .halt_bit = 11,
2024        .clkr = {
2025                .enable_reg = 0x29c0,
2026                .enable_mask = BIT(4),
2027                .hw.init = &(struct clk_init_data){
2028                        .name = "gsbi1_h_clk",
2029                        .ops = &clk_branch_ops,
2030                        .flags = CLK_IS_ROOT,
2031                },
2032        },
2033};
2034
2035static struct clk_branch gsbi2_h_clk = {
2036        .halt_reg = 0x2fcc,
2037        .halt_bit = 7,
2038        .clkr = {
2039                .enable_reg = 0x29e0,
2040                .enable_mask = BIT(4),
2041                .hw.init = &(struct clk_init_data){
2042                        .name = "gsbi2_h_clk",
2043                        .ops = &clk_branch_ops,
2044                        .flags = CLK_IS_ROOT,
2045                },
2046        },
2047};
2048
2049static struct clk_branch gsbi3_h_clk = {
2050        .halt_reg = 0x2fcc,
2051        .halt_bit = 3,
2052        .clkr = {
2053                .enable_reg = 0x2a00,
2054                .enable_mask = BIT(4),
2055                .hw.init = &(struct clk_init_data){
2056                        .name = "gsbi3_h_clk",
2057                        .ops = &clk_branch_ops,
2058                        .flags = CLK_IS_ROOT,
2059                },
2060        },
2061};
2062
2063static struct clk_branch gsbi4_h_clk = {
2064        .halt_reg = 0x2fd0,
2065        .halt_bit = 27,
2066        .clkr = {
2067                .enable_reg = 0x2a20,
2068                .enable_mask = BIT(4),
2069                .hw.init = &(struct clk_init_data){
2070                        .name = "gsbi4_h_clk",
2071                        .ops = &clk_branch_ops,
2072                        .flags = CLK_IS_ROOT,
2073                },
2074        },
2075};
2076
2077static struct clk_branch gsbi5_h_clk = {
2078        .halt_reg = 0x2fd0,
2079        .halt_bit = 23,
2080        .clkr = {
2081                .enable_reg = 0x2a40,
2082                .enable_mask = BIT(4),
2083                .hw.init = &(struct clk_init_data){
2084                        .name = "gsbi5_h_clk",
2085                        .ops = &clk_branch_ops,
2086                        .flags = CLK_IS_ROOT,
2087                },
2088        },
2089};
2090
2091static struct clk_branch gsbi6_h_clk = {
2092        .halt_reg = 0x2fd0,
2093        .halt_bit = 19,
2094        .clkr = {
2095                .enable_reg = 0x2a60,
2096                .enable_mask = BIT(4),
2097                .hw.init = &(struct clk_init_data){
2098                        .name = "gsbi6_h_clk",
2099                        .ops = &clk_branch_ops,
2100                        .flags = CLK_IS_ROOT,
2101                },
2102        },
2103};
2104
2105static struct clk_branch gsbi7_h_clk = {
2106        .halt_reg = 0x2fd0,
2107        .halt_bit = 15,
2108        .clkr = {
2109                .enable_reg = 0x2a80,
2110                .enable_mask = BIT(4),
2111                .hw.init = &(struct clk_init_data){
2112                        .name = "gsbi7_h_clk",
2113                        .ops = &clk_branch_ops,
2114                        .flags = CLK_IS_ROOT,
2115                },
2116        },
2117};
2118
2119static struct clk_branch gsbi8_h_clk = {
2120        .halt_reg = 0x2fd0,
2121        .halt_bit = 11,
2122        .clkr = {
2123                .enable_reg = 0x2aa0,
2124                .enable_mask = BIT(4),
2125                .hw.init = &(struct clk_init_data){
2126                        .name = "gsbi8_h_clk",
2127                        .ops = &clk_branch_ops,
2128                        .flags = CLK_IS_ROOT,
2129                },
2130        },
2131};
2132
2133static struct clk_branch gsbi9_h_clk = {
2134        .halt_reg = 0x2fd0,
2135        .halt_bit = 7,
2136        .clkr = {
2137                .enable_reg = 0x2ac0,
2138                .enable_mask = BIT(4),
2139                .hw.init = &(struct clk_init_data){
2140                        .name = "gsbi9_h_clk",
2141                        .ops = &clk_branch_ops,
2142                        .flags = CLK_IS_ROOT,
2143                },
2144        },
2145};
2146
2147static struct clk_branch gsbi10_h_clk = {
2148        .halt_reg = 0x2fd0,
2149        .halt_bit = 3,
2150        .clkr = {
2151                .enable_reg = 0x2ae0,
2152                .enable_mask = BIT(4),
2153                .hw.init = &(struct clk_init_data){
2154                        .name = "gsbi10_h_clk",
2155                        .ops = &clk_branch_ops,
2156                        .flags = CLK_IS_ROOT,
2157                },
2158        },
2159};
2160
2161static struct clk_branch gsbi11_h_clk = {
2162        .halt_reg = 0x2fd4,
2163        .halt_bit = 18,
2164        .clkr = {
2165                .enable_reg = 0x2b00,
2166                .enable_mask = BIT(4),
2167                .hw.init = &(struct clk_init_data){
2168                        .name = "gsbi11_h_clk",
2169                        .ops = &clk_branch_ops,
2170                        .flags = CLK_IS_ROOT,
2171                },
2172        },
2173};
2174
2175static struct clk_branch gsbi12_h_clk = {
2176        .halt_reg = 0x2fd4,
2177        .halt_bit = 14,
2178        .clkr = {
2179                .enable_reg = 0x2b20,
2180                .enable_mask = BIT(4),
2181                .hw.init = &(struct clk_init_data){
2182                        .name = "gsbi12_h_clk",
2183                        .ops = &clk_branch_ops,
2184                        .flags = CLK_IS_ROOT,
2185                },
2186        },
2187};
2188
2189static struct clk_branch tsif_h_clk = {
2190        .halt_reg = 0x2fd4,
2191        .halt_bit = 7,
2192        .clkr = {
2193                .enable_reg = 0x2700,
2194                .enable_mask = BIT(4),
2195                .hw.init = &(struct clk_init_data){
2196                        .name = "tsif_h_clk",
2197                        .ops = &clk_branch_ops,
2198                        .flags = CLK_IS_ROOT,
2199                },
2200        },
2201};
2202
2203static struct clk_branch usb_fs1_h_clk = {
2204        .halt_reg = 0x2fcc,
2205        .halt_bit = 17,
2206        .clkr = {
2207                .enable_reg = 0x2960,
2208                .enable_mask = BIT(4),
2209                .hw.init = &(struct clk_init_data){
2210                        .name = "usb_fs1_h_clk",
2211                        .ops = &clk_branch_ops,
2212                        .flags = CLK_IS_ROOT,
2213                },
2214        },
2215};
2216
2217static struct clk_branch usb_fs2_h_clk = {
2218        .halt_reg = 0x2fcc,
2219        .halt_bit = 14,
2220        .clkr = {
2221                .enable_reg = 0x2980,
2222                .enable_mask = BIT(4),
2223                .hw.init = &(struct clk_init_data){
2224                        .name = "usb_fs2_h_clk",
2225                        .ops = &clk_branch_ops,
2226                        .flags = CLK_IS_ROOT,
2227                },
2228        },
2229};
2230
2231static struct clk_branch usb_hs1_h_clk = {
2232        .halt_reg = 0x2fc8,
2233        .halt_bit = 1,
2234        .clkr = {
2235                .enable_reg = 0x2900,
2236                .enable_mask = BIT(4),
2237                .hw.init = &(struct clk_init_data){
2238                        .name = "usb_hs1_h_clk",
2239                        .ops = &clk_branch_ops,
2240                        .flags = CLK_IS_ROOT,
2241                },
2242        },
2243};
2244
2245static struct clk_branch sdc1_h_clk = {
2246        .halt_reg = 0x2fc8,
2247        .halt_bit = 11,
2248        .clkr = {
2249                .enable_reg = 0x2820,
2250                .enable_mask = BIT(4),
2251                .hw.init = &(struct clk_init_data){
2252                        .name = "sdc1_h_clk",
2253                        .ops = &clk_branch_ops,
2254                        .flags = CLK_IS_ROOT,
2255                },
2256        },
2257};
2258
2259static struct clk_branch sdc2_h_clk = {
2260        .halt_reg = 0x2fc8,
2261        .halt_bit = 10,
2262        .clkr = {
2263                .enable_reg = 0x2840,
2264                .enable_mask = BIT(4),
2265                .hw.init = &(struct clk_init_data){
2266                        .name = "sdc2_h_clk",
2267                        .ops = &clk_branch_ops,
2268                        .flags = CLK_IS_ROOT,
2269                },
2270        },
2271};
2272
2273static struct clk_branch sdc3_h_clk = {
2274        .halt_reg = 0x2fc8,
2275        .halt_bit = 9,
2276        .clkr = {
2277                .enable_reg = 0x2860,
2278                .enable_mask = BIT(4),
2279                .hw.init = &(struct clk_init_data){
2280                        .name = "sdc3_h_clk",
2281                        .ops = &clk_branch_ops,
2282                        .flags = CLK_IS_ROOT,
2283                },
2284        },
2285};
2286
2287static struct clk_branch sdc4_h_clk = {
2288        .halt_reg = 0x2fc8,
2289        .halt_bit = 8,
2290        .clkr = {
2291                .enable_reg = 0x2880,
2292                .enable_mask = BIT(4),
2293                .hw.init = &(struct clk_init_data){
2294                        .name = "sdc4_h_clk",
2295                        .ops = &clk_branch_ops,
2296                        .flags = CLK_IS_ROOT,
2297                },
2298        },
2299};
2300
2301static struct clk_branch sdc5_h_clk = {
2302        .halt_reg = 0x2fc8,
2303        .halt_bit = 7,
2304        .clkr = {
2305                .enable_reg = 0x28a0,
2306                .enable_mask = BIT(4),
2307                .hw.init = &(struct clk_init_data){
2308                        .name = "sdc5_h_clk",
2309                        .ops = &clk_branch_ops,
2310                        .flags = CLK_IS_ROOT,
2311                },
2312        },
2313};
2314
2315static struct clk_branch adm0_clk = {
2316        .halt_reg = 0x2fdc,
2317        .halt_check = BRANCH_HALT_VOTED,
2318        .halt_bit = 14,
2319        .clkr = {
2320                .enable_reg = 0x3080,
2321                .enable_mask = BIT(2),
2322                .hw.init = &(struct clk_init_data){
2323                        .name = "adm0_clk",
2324                        .ops = &clk_branch_ops,
2325                        .flags = CLK_IS_ROOT,
2326                },
2327        },
2328};
2329
2330static struct clk_branch adm0_pbus_clk = {
2331        .halt_reg = 0x2fdc,
2332        .halt_check = BRANCH_HALT_VOTED,
2333        .halt_bit = 13,
2334        .clkr = {
2335                .enable_reg = 0x3080,
2336                .enable_mask = BIT(3),
2337                .hw.init = &(struct clk_init_data){
2338                        .name = "adm0_pbus_clk",
2339                        .ops = &clk_branch_ops,
2340                        .flags = CLK_IS_ROOT,
2341                },
2342        },
2343};
2344
2345static struct clk_branch adm1_clk = {
2346        .halt_reg = 0x2fdc,
2347        .halt_bit = 12,
2348        .halt_check = BRANCH_HALT_VOTED,
2349        .clkr = {
2350                .enable_reg = 0x3080,
2351                .enable_mask = BIT(4),
2352                .hw.init = &(struct clk_init_data){
2353                        .name = "adm1_clk",
2354                        .ops = &clk_branch_ops,
2355                        .flags = CLK_IS_ROOT,
2356                },
2357        },
2358};
2359
2360static struct clk_branch adm1_pbus_clk = {
2361        .halt_reg = 0x2fdc,
2362        .halt_bit = 11,
2363        .halt_check = BRANCH_HALT_VOTED,
2364        .clkr = {
2365                .enable_reg = 0x3080,
2366                .enable_mask = BIT(5),
2367                .hw.init = &(struct clk_init_data){
2368                        .name = "adm1_pbus_clk",
2369                        .ops = &clk_branch_ops,
2370                        .flags = CLK_IS_ROOT,
2371                },
2372        },
2373};
2374
2375static struct clk_branch modem_ahb1_h_clk = {
2376        .halt_reg = 0x2fdc,
2377        .halt_bit = 8,
2378        .halt_check = BRANCH_HALT_VOTED,
2379        .clkr = {
2380                .enable_reg = 0x3080,
2381                .enable_mask = BIT(0),
2382                .hw.init = &(struct clk_init_data){
2383                        .name = "modem_ahb1_h_clk",
2384                        .ops = &clk_branch_ops,
2385                        .flags = CLK_IS_ROOT,
2386                },
2387        },
2388};
2389
2390static struct clk_branch modem_ahb2_h_clk = {
2391        .halt_reg = 0x2fdc,
2392        .halt_bit = 7,
2393        .halt_check = BRANCH_HALT_VOTED,
2394        .clkr = {
2395                .enable_reg = 0x3080,
2396                .enable_mask = BIT(1),
2397                .hw.init = &(struct clk_init_data){
2398                        .name = "modem_ahb2_h_clk",
2399                        .ops = &clk_branch_ops,
2400                        .flags = CLK_IS_ROOT,
2401                },
2402        },
2403};
2404
2405static struct clk_branch pmic_arb0_h_clk = {
2406        .halt_reg = 0x2fd8,
2407        .halt_check = BRANCH_HALT_VOTED,
2408        .halt_bit = 22,
2409        .clkr = {
2410                .enable_reg = 0x3080,
2411                .enable_mask = BIT(8),
2412                .hw.init = &(struct clk_init_data){
2413                        .name = "pmic_arb0_h_clk",
2414                        .ops = &clk_branch_ops,
2415                        .flags = CLK_IS_ROOT,
2416                },
2417        },
2418};
2419
2420static struct clk_branch pmic_arb1_h_clk = {
2421        .halt_reg = 0x2fd8,
2422        .halt_check = BRANCH_HALT_VOTED,
2423        .halt_bit = 21,
2424        .clkr = {
2425                .enable_reg = 0x3080,
2426                .enable_mask = BIT(9),
2427                .hw.init = &(struct clk_init_data){
2428                        .name = "pmic_arb1_h_clk",
2429                        .ops = &clk_branch_ops,
2430                        .flags = CLK_IS_ROOT,
2431                },
2432        },
2433};
2434
2435static struct clk_branch pmic_ssbi2_clk = {
2436        .halt_reg = 0x2fd8,
2437        .halt_check = BRANCH_HALT_VOTED,
2438        .halt_bit = 23,
2439        .clkr = {
2440                .enable_reg = 0x3080,
2441                .enable_mask = BIT(7),
2442                .hw.init = &(struct clk_init_data){
2443                        .name = "pmic_ssbi2_clk",
2444                        .ops = &clk_branch_ops,
2445                        .flags = CLK_IS_ROOT,
2446                },
2447        },
2448};
2449
2450static struct clk_branch rpm_msg_ram_h_clk = {
2451        .hwcg_reg = 0x27e0,
2452        .hwcg_bit = 6,
2453        .halt_reg = 0x2fd8,
2454        .halt_check = BRANCH_HALT_VOTED,
2455        .halt_bit = 12,
2456        .clkr = {
2457                .enable_reg = 0x3080,
2458                .enable_mask = BIT(6),
2459                .hw.init = &(struct clk_init_data){
2460                        .name = "rpm_msg_ram_h_clk",
2461                        .ops = &clk_branch_ops,
2462                        .flags = CLK_IS_ROOT,
2463                },
2464        },
2465};
2466
2467static struct clk_regmap *gcc_msm8660_clks[] = {
2468        [PLL8] = &pll8.clkr,
2469        [PLL8_VOTE] = &pll8_vote,
2470        [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
2471        [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
2472        [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
2473        [GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr,
2474        [GSBI3_UART_SRC] = &gsbi3_uart_src.clkr,
2475        [GSBI3_UART_CLK] = &gsbi3_uart_clk.clkr,
2476        [GSBI4_UART_SRC] = &gsbi4_uart_src.clkr,
2477        [GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr,
2478        [GSBI5_UART_SRC] = &gsbi5_uart_src.clkr,
2479        [GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr,
2480        [GSBI6_UART_SRC] = &gsbi6_uart_src.clkr,
2481        [GSBI6_UART_CLK] = &gsbi6_uart_clk.clkr,
2482        [GSBI7_UART_SRC] = &gsbi7_uart_src.clkr,
2483        [GSBI7_UART_CLK] = &gsbi7_uart_clk.clkr,
2484        [GSBI8_UART_SRC] = &gsbi8_uart_src.clkr,
2485        [GSBI8_UART_CLK] = &gsbi8_uart_clk.clkr,
2486        [GSBI9_UART_SRC] = &gsbi9_uart_src.clkr,
2487        [GSBI9_UART_CLK] = &gsbi9_uart_clk.clkr,
2488        [GSBI10_UART_SRC] = &gsbi10_uart_src.clkr,
2489        [GSBI10_UART_CLK] = &gsbi10_uart_clk.clkr,
2490        [GSBI11_UART_SRC] = &gsbi11_uart_src.clkr,
2491        [GSBI11_UART_CLK] = &gsbi11_uart_clk.clkr,
2492        [GSBI12_UART_SRC] = &gsbi12_uart_src.clkr,
2493        [GSBI12_UART_CLK] = &gsbi12_uart_clk.clkr,
2494        [GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr,
2495        [GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr,
2496        [GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr,
2497        [GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr,
2498        [GSBI3_QUP_SRC] = &gsbi3_qup_src.clkr,
2499        [GSBI3_QUP_CLK] = &gsbi3_qup_clk.clkr,
2500        [GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr,
2501        [GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr,
2502        [GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr,
2503        [GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr,
2504        [GSBI6_QUP_SRC] = &gsbi6_qup_src.clkr,
2505        [GSBI6_QUP_CLK] = &gsbi6_qup_clk.clkr,
2506        [GSBI7_QUP_SRC] = &gsbi7_qup_src.clkr,
2507        [GSBI7_QUP_CLK] = &gsbi7_qup_clk.clkr,
2508        [GSBI8_QUP_SRC] = &gsbi8_qup_src.clkr,
2509        [GSBI8_QUP_CLK] = &gsbi8_qup_clk.clkr,
2510        [GSBI9_QUP_SRC] = &gsbi9_qup_src.clkr,
2511        [GSBI9_QUP_CLK] = &gsbi9_qup_clk.clkr,
2512        [GSBI10_QUP_SRC] = &gsbi10_qup_src.clkr,
2513        [GSBI10_QUP_CLK] = &gsbi10_qup_clk.clkr,
2514        [GSBI11_QUP_SRC] = &gsbi11_qup_src.clkr,
2515        [GSBI11_QUP_CLK] = &gsbi11_qup_clk.clkr,
2516        [GSBI12_QUP_SRC] = &gsbi12_qup_src.clkr,
2517        [GSBI12_QUP_CLK] = &gsbi12_qup_clk.clkr,
2518        [GP0_SRC] = &gp0_src.clkr,
2519        [GP0_CLK] = &gp0_clk.clkr,
2520        [GP1_SRC] = &gp1_src.clkr,
2521        [GP1_CLK] = &gp1_clk.clkr,
2522        [GP2_SRC] = &gp2_src.clkr,
2523        [GP2_CLK] = &gp2_clk.clkr,
2524        [PMEM_CLK] = &pmem_clk.clkr,
2525        [PRNG_SRC] = &prng_src.clkr,
2526        [PRNG_CLK] = &prng_clk.clkr,
2527        [SDC1_SRC] = &sdc1_src.clkr,
2528        [SDC1_CLK] = &sdc1_clk.clkr,
2529        [SDC2_SRC] = &sdc2_src.clkr,
2530        [SDC2_CLK] = &sdc2_clk.clkr,
2531        [SDC3_SRC] = &sdc3_src.clkr,
2532        [SDC3_CLK] = &sdc3_clk.clkr,
2533        [SDC4_SRC] = &sdc4_src.clkr,
2534        [SDC4_CLK] = &sdc4_clk.clkr,
2535        [SDC5_SRC] = &sdc5_src.clkr,
2536        [SDC5_CLK] = &sdc5_clk.clkr,
2537        [TSIF_REF_SRC] = &tsif_ref_src.clkr,
2538        [TSIF_REF_CLK] = &tsif_ref_clk.clkr,
2539        [USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_src.clkr,
2540        [USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr,
2541        [USB_FS1_XCVR_FS_SRC] = &usb_fs1_xcvr_fs_src.clkr,
2542        [USB_FS1_XCVR_FS_CLK] = &usb_fs1_xcvr_fs_clk.clkr,
2543        [USB_FS1_SYSTEM_CLK] = &usb_fs1_system_clk.clkr,
2544        [USB_FS2_XCVR_FS_SRC] = &usb_fs2_xcvr_fs_src.clkr,
2545        [USB_FS2_XCVR_FS_CLK] = &usb_fs2_xcvr_fs_clk.clkr,
2546        [USB_FS2_SYSTEM_CLK] = &usb_fs2_system_clk.clkr,
2547        [GSBI1_H_CLK] = &gsbi1_h_clk.clkr,
2548        [GSBI2_H_CLK] = &gsbi2_h_clk.clkr,
2549        [GSBI3_H_CLK] = &gsbi3_h_clk.clkr,
2550        [GSBI4_H_CLK] = &gsbi4_h_clk.clkr,
2551        [GSBI5_H_CLK] = &gsbi5_h_clk.clkr,
2552        [GSBI6_H_CLK] = &gsbi6_h_clk.clkr,
2553        [GSBI7_H_CLK] = &gsbi7_h_clk.clkr,
2554        [GSBI8_H_CLK] = &gsbi8_h_clk.clkr,
2555        [GSBI9_H_CLK] = &gsbi9_h_clk.clkr,
2556        [GSBI10_H_CLK] = &gsbi10_h_clk.clkr,
2557        [GSBI11_H_CLK] = &gsbi11_h_clk.clkr,
2558        [GSBI12_H_CLK] = &gsbi12_h_clk.clkr,
2559        [TSIF_H_CLK] = &tsif_h_clk.clkr,
2560        [USB_FS1_H_CLK] = &usb_fs1_h_clk.clkr,
2561        [USB_FS2_H_CLK] = &usb_fs2_h_clk.clkr,
2562        [USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr,
2563        [SDC1_H_CLK] = &sdc1_h_clk.clkr,
2564        [SDC2_H_CLK] = &sdc2_h_clk.clkr,
2565        [SDC3_H_CLK] = &sdc3_h_clk.clkr,
2566        [SDC4_H_CLK] = &sdc4_h_clk.clkr,
2567        [SDC5_H_CLK] = &sdc5_h_clk.clkr,
2568        [ADM0_CLK] = &adm0_clk.clkr,
2569        [ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr,
2570        [ADM1_CLK] = &adm1_clk.clkr,
2571        [ADM1_PBUS_CLK] = &adm1_pbus_clk.clkr,
2572        [MODEM_AHB1_H_CLK] = &modem_ahb1_h_clk.clkr,
2573        [MODEM_AHB2_H_CLK] = &modem_ahb2_h_clk.clkr,
2574        [PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr,
2575        [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
2576        [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
2577        [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
2578};
2579
2580static const struct qcom_reset_map gcc_msm8660_resets[] = {
2581        [AFAB_CORE_RESET] = { 0x2080, 7 },
2582        [SCSS_SYS_RESET] = { 0x20b4, 1 },
2583        [SCSS_SYS_POR_RESET] = { 0x20b4 },
2584        [AFAB_SMPSS_S_RESET] = { 0x20b8, 2 },
2585        [AFAB_SMPSS_M1_RESET] = { 0x20b8, 1 },
2586        [AFAB_SMPSS_M0_RESET] = { 0x20b8 },
2587        [AFAB_EBI1_S_RESET] = { 0x20c0, 7 },
2588        [SFAB_CORE_RESET] = { 0x2120, 7 },
2589        [SFAB_ADM0_M0_RESET] = { 0x21e0, 7 },
2590        [SFAB_ADM0_M1_RESET] = { 0x21e4, 7 },
2591        [SFAB_ADM0_M2_RESET] = { 0x21e4, 7 },
2592        [ADM0_C2_RESET] = { 0x220c, 4 },
2593        [ADM0_C1_RESET] = { 0x220c, 3 },
2594        [ADM0_C0_RESET] = { 0x220c, 2 },
2595        [ADM0_PBUS_RESET] = { 0x220c, 1 },
2596        [ADM0_RESET] = { 0x220c },
2597        [SFAB_ADM1_M0_RESET] = { 0x2220, 7 },
2598        [SFAB_ADM1_M1_RESET] = { 0x2224, 7 },
2599        [SFAB_ADM1_M2_RESET] = { 0x2228, 7 },
2600        [MMFAB_ADM1_M3_RESET] = { 0x2240, 7 },
2601        [ADM1_C3_RESET] = { 0x226c, 5 },
2602        [ADM1_C2_RESET] = { 0x226c, 4 },
2603        [ADM1_C1_RESET] = { 0x226c, 3 },
2604        [ADM1_C0_RESET] = { 0x226c, 2 },
2605        [ADM1_PBUS_RESET] = { 0x226c, 1 },
2606        [ADM1_RESET] = { 0x226c },
2607        [IMEM0_RESET] = { 0x2280, 7 },
2608        [SFAB_LPASS_Q6_RESET] = { 0x23a0, 7 },
2609        [SFAB_AFAB_M_RESET] = { 0x23e0, 7 },
2610        [AFAB_SFAB_M0_RESET] = { 0x2420, 7 },
2611        [AFAB_SFAB_M1_RESET] = { 0x2424, 7 },
2612        [DFAB_CORE_RESET] = { 0x24ac, 7 },
2613        [SFAB_DFAB_M_RESET] = { 0x2500, 7 },
2614        [DFAB_SFAB_M_RESET] = { 0x2520, 7 },
2615        [DFAB_SWAY0_RESET] = { 0x2540, 7 },
2616        [DFAB_SWAY1_RESET] = { 0x2544, 7 },
2617        [DFAB_ARB0_RESET] = { 0x2560, 7 },
2618        [DFAB_ARB1_RESET] = { 0x2564, 7 },
2619        [PPSS_PROC_RESET] = { 0x2594, 1 },
2620        [PPSS_RESET] = { 0x2594 },
2621        [PMEM_RESET] = { 0x25a0, 7 },
2622        [DMA_BAM_RESET] = { 0x25c0, 7 },
2623        [SIC_RESET] = { 0x25e0, 7 },
2624        [SPS_TIC_RESET] = { 0x2600, 7 },
2625        [CFBP0_RESET] = { 0x2650, 7 },
2626        [CFBP1_RESET] = { 0x2654, 7 },
2627        [CFBP2_RESET] = { 0x2658, 7 },
2628        [EBI2_RESET] = { 0x2664, 7 },
2629        [SFAB_CFPB_M_RESET] = { 0x2680, 7 },
2630        [CFPB_MASTER_RESET] = { 0x26a0, 7 },
2631        [SFAB_CFPB_S_RESET] = { 0x26c0, 7 },
2632        [CFPB_SPLITTER_RESET] = { 0x26e0, 7 },
2633        [TSIF_RESET] = { 0x2700, 7 },
2634        [CE1_RESET] = { 0x2720, 7 },
2635        [CE2_RESET] = { 0x2740, 7 },
2636        [SFAB_SFPB_M_RESET] = { 0x2780, 7 },
2637        [SFAB_SFPB_S_RESET] = { 0x27a0, 7 },
2638        [RPM_PROC_RESET] = { 0x27c0, 7 },
2639        [RPM_BUS_RESET] = { 0x27c4, 7 },
2640        [RPM_MSG_RAM_RESET] = { 0x27e0, 7 },
2641        [PMIC_ARB0_RESET] = { 0x2800, 7 },
2642        [PMIC_ARB1_RESET] = { 0x2804, 7 },
2643        [PMIC_SSBI2_RESET] = { 0x280c, 12 },
2644        [SDC1_RESET] = { 0x2830 },
2645        [SDC2_RESET] = { 0x2850 },
2646        [SDC3_RESET] = { 0x2870 },
2647        [SDC4_RESET] = { 0x2890 },
2648        [SDC5_RESET] = { 0x28b0 },
2649        [USB_HS1_RESET] = { 0x2910 },
2650        [USB_HS2_XCVR_RESET] = { 0x2934, 1 },
2651        [USB_HS2_RESET] = { 0x2934 },
2652        [USB_FS1_XCVR_RESET] = { 0x2974, 1 },
2653        [USB_FS1_RESET] = { 0x2974 },
2654        [USB_FS2_XCVR_RESET] = { 0x2994, 1 },
2655        [USB_FS2_RESET] = { 0x2994 },
2656        [GSBI1_RESET] = { 0x29dc },
2657        [GSBI2_RESET] = { 0x29fc },
2658        [GSBI3_RESET] = { 0x2a1c },
2659        [GSBI4_RESET] = { 0x2a3c },
2660        [GSBI5_RESET] = { 0x2a5c },
2661        [GSBI6_RESET] = { 0x2a7c },
2662        [GSBI7_RESET] = { 0x2a9c },
2663        [GSBI8_RESET] = { 0x2abc },
2664        [GSBI9_RESET] = { 0x2adc },
2665        [GSBI10_RESET] = { 0x2afc },
2666        [GSBI11_RESET] = { 0x2b1c },
2667        [GSBI12_RESET] = { 0x2b3c },
2668        [SPDM_RESET] = { 0x2b6c },
2669        [SEC_CTRL_RESET] = { 0x2b80, 7 },
2670        [TLMM_H_RESET] = { 0x2ba0, 7 },
2671        [TLMM_RESET] = { 0x2ba4, 7 },
2672        [MARRM_PWRON_RESET] = { 0x2bd4, 1 },
2673        [MARM_RESET] = { 0x2bd4 },
2674        [MAHB1_RESET] = { 0x2be4, 7 },
2675        [SFAB_MSS_S_RESET] = { 0x2c00, 7 },
2676        [MAHB2_RESET] = { 0x2c20, 7 },
2677        [MODEM_SW_AHB_RESET] = { 0x2c48, 1 },
2678        [MODEM_RESET] = { 0x2c48 },
2679        [SFAB_MSS_MDM1_RESET] = { 0x2c4c, 1 },
2680        [SFAB_MSS_MDM0_RESET] = { 0x2c4c },
2681        [MSS_SLP_RESET] = { 0x2c60, 7 },
2682        [MSS_MARM_SAW_RESET] = { 0x2c68, 1 },
2683        [MSS_WDOG_RESET] = { 0x2c68 },
2684        [TSSC_RESET] = { 0x2ca0, 7 },
2685        [PDM_RESET] = { 0x2cc0, 12 },
2686        [SCSS_CORE0_RESET] = { 0x2d60, 1 },
2687        [SCSS_CORE0_POR_RESET] = { 0x2d60 },
2688        [SCSS_CORE1_RESET] = { 0x2d80, 1 },
2689        [SCSS_CORE1_POR_RESET] = { 0x2d80 },
2690        [MPM_RESET] = { 0x2da4, 1 },
2691        [EBI1_1X_DIV_RESET] = { 0x2dec, 9 },
2692        [EBI1_RESET] = { 0x2dec, 7 },
2693        [SFAB_SMPSS_S_RESET] = { 0x2e00, 7 },
2694        [USB_PHY0_RESET] = { 0x2e20 },
2695        [USB_PHY1_RESET] = { 0x2e40 },
2696        [PRNG_RESET] = { 0x2e80, 12 },
2697};
2698
2699static const struct regmap_config gcc_msm8660_regmap_config = {
2700        .reg_bits       = 32,
2701        .reg_stride     = 4,
2702        .val_bits       = 32,
2703        .max_register   = 0x363c,
2704        .fast_io        = true,
2705};
2706
2707static const struct qcom_cc_desc gcc_msm8660_desc = {
2708        .config = &gcc_msm8660_regmap_config,
2709        .clks = gcc_msm8660_clks,
2710        .num_clks = ARRAY_SIZE(gcc_msm8660_clks),
2711        .resets = gcc_msm8660_resets,
2712        .num_resets = ARRAY_SIZE(gcc_msm8660_resets),
2713};
2714
2715static const struct of_device_id gcc_msm8660_match_table[] = {
2716        { .compatible = "qcom,gcc-msm8660" },
2717        { }
2718};
2719MODULE_DEVICE_TABLE(of, gcc_msm8660_match_table);
2720
2721static int gcc_msm8660_probe(struct platform_device *pdev)
2722{
2723        struct clk *clk;
2724        struct device *dev = &pdev->dev;
2725
2726        /* Temporary until RPM clocks supported */
2727        clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000);
2728        if (IS_ERR(clk))
2729                return PTR_ERR(clk);
2730
2731        clk = clk_register_fixed_rate(dev, "pxo", NULL, CLK_IS_ROOT, 27000000);
2732        if (IS_ERR(clk))
2733                return PTR_ERR(clk);
2734
2735        return qcom_cc_probe(pdev, &gcc_msm8660_desc);
2736}
2737
2738static struct platform_driver gcc_msm8660_driver = {
2739        .probe          = gcc_msm8660_probe,
2740        .driver         = {
2741                .name   = "gcc-msm8660",
2742                .of_match_table = gcc_msm8660_match_table,
2743        },
2744};
2745
2746static int __init gcc_msm8660_init(void)
2747{
2748        return platform_driver_register(&gcc_msm8660_driver);
2749}
2750core_initcall(gcc_msm8660_init);
2751
2752static void __exit gcc_msm8660_exit(void)
2753{
2754        platform_driver_unregister(&gcc_msm8660_driver);
2755}
2756module_exit(gcc_msm8660_exit);
2757
2758MODULE_DESCRIPTION("GCC MSM 8660 Driver");
2759MODULE_LICENSE("GPL v2");
2760MODULE_ALIAS("platform:gcc-msm8660");
2761