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