linux/drivers/clk/qcom/gcc-qcm2290.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
   4 */
   5
   6#include <linux/clk-provider.h>
   7#include <linux/err.h>
   8#include <linux/kernel.h>
   9#include <linux/module.h>
  10#include <linux/platform_device.h>
  11#include <linux/regmap.h>
  12
  13#include <dt-bindings/clock/qcom,gcc-qcm2290.h>
  14
  15#include "clk-alpha-pll.h"
  16#include "clk-branch.h"
  17#include "clk-rcg.h"
  18#include "clk-regmap-divider.h"
  19#include "common.h"
  20#include "gdsc.h"
  21#include "reset.h"
  22
  23enum {
  24        P_BI_TCXO,
  25        P_GPLL0_OUT_AUX2,
  26        P_GPLL0_OUT_EARLY,
  27        P_GPLL10_OUT_MAIN,
  28        P_GPLL11_OUT_AUX,
  29        P_GPLL11_OUT_AUX2,
  30        P_GPLL11_OUT_MAIN,
  31        P_GPLL3_OUT_EARLY,
  32        P_GPLL3_OUT_MAIN,
  33        P_GPLL4_OUT_MAIN,
  34        P_GPLL5_OUT_MAIN,
  35        P_GPLL6_OUT_EARLY,
  36        P_GPLL6_OUT_MAIN,
  37        P_GPLL7_OUT_MAIN,
  38        P_GPLL8_OUT_EARLY,
  39        P_GPLL8_OUT_MAIN,
  40        P_GPLL9_OUT_EARLY,
  41        P_GPLL9_OUT_MAIN,
  42        P_SLEEP_CLK,
  43};
  44
  45static const struct pll_vco brammo_vco[] = {
  46        { 500000000, 1250000000, 0 },
  47};
  48
  49static const struct pll_vco default_vco[] = {
  50        { 500000000, 1000000000, 2 },
  51};
  52
  53static const struct pll_vco spark_vco[] = {
  54        { 750000000, 1500000000, 1 },
  55};
  56
  57static const u8 clk_alpha_pll_regs_offset[][PLL_OFF_MAX_REGS] = {
  58        [CLK_ALPHA_PLL_TYPE_DEFAULT] =  {
  59                [PLL_OFF_L_VAL] = 0x04,
  60                [PLL_OFF_ALPHA_VAL] = 0x08,
  61                [PLL_OFF_ALPHA_VAL_U] = 0x0c,
  62                [PLL_OFF_TEST_CTL] = 0x10,
  63                [PLL_OFF_TEST_CTL_U] = 0x14,
  64                [PLL_OFF_USER_CTL] = 0x18,
  65                [PLL_OFF_USER_CTL_U] = 0x1C,
  66                [PLL_OFF_CONFIG_CTL] = 0x20,
  67                [PLL_OFF_STATUS] = 0x24,
  68        },
  69        [CLK_ALPHA_PLL_TYPE_BRAMMO] =  {
  70                [PLL_OFF_L_VAL] = 0x04,
  71                [PLL_OFF_ALPHA_VAL] = 0x08,
  72                [PLL_OFF_ALPHA_VAL_U] = 0x0c,
  73                [PLL_OFF_TEST_CTL] = 0x10,
  74                [PLL_OFF_TEST_CTL_U] = 0x14,
  75                [PLL_OFF_USER_CTL] = 0x18,
  76                [PLL_OFF_CONFIG_CTL] = 0x1C,
  77                [PLL_OFF_STATUS] = 0x20,
  78        },
  79};
  80
  81static struct clk_alpha_pll gpll0 = {
  82        .offset = 0x0,
  83        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
  84        .clkr = {
  85                .enable_reg = 0x79000,
  86                .enable_mask = BIT(0),
  87                .hw.init = &(struct clk_init_data){
  88                        .name = "gpll0",
  89                        .parent_data = &(const struct clk_parent_data){
  90                                .fw_name = "bi_tcxo",
  91                        },
  92                        .num_parents = 1,
  93                        .ops = &clk_alpha_pll_ops,
  94                },
  95        },
  96};
  97
  98static const struct clk_div_table post_div_table_gpll0_out_aux2[] = {
  99        { 0x1, 2 },
 100        { }
 101};
 102
 103static struct clk_alpha_pll_postdiv gpll0_out_aux2 = {
 104        .offset = 0x0,
 105        .post_div_shift = 8,
 106        .post_div_table = post_div_table_gpll0_out_aux2,
 107        .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_aux2),
 108        .width = 4,
 109        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 110        .clkr.hw.init = &(struct clk_init_data){
 111                .name = "gpll0_out_aux2",
 112                .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
 113                .num_parents = 1,
 114                .ops = &clk_alpha_pll_postdiv_ro_ops,
 115        },
 116};
 117
 118static struct clk_alpha_pll gpll1 = {
 119        .offset = 0x1000,
 120        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 121        .clkr = {
 122                .enable_reg = 0x79000,
 123                .enable_mask = BIT(1),
 124                .hw.init = &(struct clk_init_data){
 125                        .name = "gpll1",
 126                        .parent_data = &(const struct clk_parent_data){
 127                                .fw_name = "bi_tcxo",
 128                        },
 129                        .num_parents = 1,
 130                        .ops = &clk_alpha_pll_ops,
 131                },
 132        },
 133};
 134
 135/* 1152MHz configuration */
 136static const struct alpha_pll_config gpll10_config = {
 137        .l = 0x3c,
 138        .alpha = 0x0,
 139        .vco_val = 0x1 << 20,
 140        .vco_mask = GENMASK(21, 20),
 141        .main_output_mask = BIT(0),
 142        .config_ctl_val = 0x4001055B,
 143        .test_ctl_hi1_val = 0x1,
 144};
 145
 146static struct clk_alpha_pll gpll10 = {
 147        .offset = 0xa000,
 148        .vco_table = spark_vco,
 149        .num_vco = ARRAY_SIZE(spark_vco),
 150        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 151        .clkr = {
 152                .enable_reg = 0x79000,
 153                .enable_mask = BIT(10),
 154                .hw.init = &(struct clk_init_data){
 155                        .name = "gpll10",
 156                        .parent_data = &(const struct clk_parent_data){
 157                                .fw_name = "bi_tcxo",
 158                        },
 159                        .num_parents = 1,
 160                        .ops = &clk_alpha_pll_ops,
 161                },
 162        },
 163};
 164
 165/* 532MHz configuration */
 166static const struct alpha_pll_config gpll11_config = {
 167        .l = 0x1B,
 168        .alpha = 0x55555555,
 169        .alpha_hi = 0xB5,
 170        .alpha_en_mask = BIT(24),
 171        .vco_val = 0x2 << 20,
 172        .vco_mask = GENMASK(21, 20),
 173        .main_output_mask = BIT(0),
 174        .config_ctl_val = 0x4001055B,
 175        .test_ctl_hi1_val = 0x1,
 176};
 177
 178static struct clk_alpha_pll gpll11 = {
 179        .offset = 0xb000,
 180        .vco_table = default_vco,
 181        .num_vco = ARRAY_SIZE(default_vco),
 182        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 183        .flags = SUPPORTS_DYNAMIC_UPDATE,
 184        .clkr = {
 185                .enable_reg = 0x79000,
 186                .enable_mask = BIT(11),
 187                .hw.init = &(struct clk_init_data){
 188                        .name = "gpll11",
 189                        .parent_data = &(const struct clk_parent_data){
 190                                .fw_name = "bi_tcxo",
 191                        },
 192                        .num_parents = 1,
 193                        .ops = &clk_alpha_pll_ops,
 194                },
 195        },
 196};
 197
 198static struct clk_alpha_pll gpll3 = {
 199        .offset = 0x3000,
 200        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 201        .clkr = {
 202                .enable_reg = 0x79000,
 203                .enable_mask = BIT(3),
 204                .hw.init = &(struct clk_init_data){
 205                        .name = "gpll3",
 206                        .parent_data = &(const struct clk_parent_data){
 207                                .fw_name = "bi_tcxo",
 208                        },
 209                        .num_parents = 1,
 210                        .ops = &clk_alpha_pll_ops,
 211                },
 212        },
 213};
 214
 215static const struct clk_div_table post_div_table_gpll3_out_main[] = {
 216        { 0x1, 2 },
 217        { }
 218};
 219
 220static struct clk_alpha_pll_postdiv gpll3_out_main = {
 221        .offset = 0x3000,
 222        .post_div_shift = 8,
 223        .post_div_table = post_div_table_gpll3_out_main,
 224        .num_post_div = ARRAY_SIZE(post_div_table_gpll3_out_main),
 225        .width = 4,
 226        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 227        .clkr.hw.init = &(struct clk_init_data){
 228                .name = "gpll3_out_main",
 229                .parent_hws = (const struct clk_hw *[]){ &gpll3.clkr.hw },
 230                .num_parents = 1,
 231                .ops = &clk_alpha_pll_postdiv_ro_ops,
 232        },
 233};
 234
 235static struct clk_alpha_pll gpll4 = {
 236        .offset = 0x4000,
 237        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 238        .clkr = {
 239                .enable_reg = 0x79000,
 240                .enable_mask = BIT(4),
 241                .hw.init = &(struct clk_init_data){
 242                        .name = "gpll4",
 243                        .parent_data = &(const struct clk_parent_data){
 244                                .fw_name = "bi_tcxo",
 245                        },
 246                        .num_parents = 1,
 247                        .ops = &clk_alpha_pll_ops,
 248                },
 249        },
 250};
 251
 252static struct clk_alpha_pll gpll5 = {
 253        .offset = 0x5000,
 254        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 255        .clkr = {
 256                .enable_reg = 0x79000,
 257                .enable_mask = BIT(5),
 258                .hw.init = &(struct clk_init_data){
 259                        .name = "gpll5",
 260                        .parent_data = &(const struct clk_parent_data){
 261                                .fw_name = "bi_tcxo",
 262                        },
 263                        .num_parents = 1,
 264                        .ops = &clk_alpha_pll_ops,
 265                },
 266        },
 267};
 268
 269static struct clk_alpha_pll gpll6 = {
 270        .offset = 0x6000,
 271        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 272        .clkr = {
 273                .enable_reg = 0x79000,
 274                .enable_mask = BIT(6),
 275                .hw.init = &(struct clk_init_data){
 276                        .name = "gpll6",
 277                        .parent_data = &(const struct clk_parent_data){
 278                                .fw_name = "bi_tcxo",
 279                        },
 280                        .num_parents = 1,
 281                        .ops = &clk_alpha_pll_ops,
 282                },
 283        },
 284};
 285
 286static const struct clk_div_table post_div_table_gpll6_out_main[] = {
 287        { 0x1, 2 },
 288        { }
 289};
 290
 291static struct clk_alpha_pll_postdiv gpll6_out_main = {
 292        .offset = 0x6000,
 293        .post_div_shift = 8,
 294        .post_div_table = post_div_table_gpll6_out_main,
 295        .num_post_div = ARRAY_SIZE(post_div_table_gpll6_out_main),
 296        .width = 4,
 297        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 298        .clkr.hw.init = &(struct clk_init_data){
 299                .name = "gpll6_out_main",
 300                .parent_hws = (const struct clk_hw *[]){ &gpll6.clkr.hw },
 301                .num_parents = 1,
 302                .ops = &clk_alpha_pll_postdiv_ro_ops,
 303        },
 304};
 305
 306static struct clk_alpha_pll gpll7 = {
 307        .offset = 0x7000,
 308        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 309        .clkr = {
 310                .enable_reg = 0x79000,
 311                .enable_mask = BIT(7),
 312                .hw.init = &(struct clk_init_data){
 313                        .name = "gpll7",
 314                        .parent_data = &(const struct clk_parent_data){
 315                                .fw_name = "bi_tcxo",
 316                        },
 317                        .num_parents = 1,
 318                        .ops = &clk_alpha_pll_ops,
 319                },
 320        },
 321};
 322
 323/* 533.2MHz configuration */
 324static const struct alpha_pll_config gpll8_config = {
 325        .l = 0x1B,
 326        .alpha = 0x55555555,
 327        .alpha_hi = 0xC5,
 328        .alpha_en_mask = BIT(24),
 329        .vco_val = 0x2 << 20,
 330        .vco_mask = GENMASK(21, 20),
 331        .main_output_mask = BIT(0),
 332        .early_output_mask = BIT(3),
 333        .post_div_val = 0x1 << 8,
 334        .post_div_mask = GENMASK(11, 8),
 335        .config_ctl_val = 0x4001055B,
 336        .test_ctl_hi1_val = 0x1,
 337};
 338
 339static struct clk_alpha_pll gpll8 = {
 340        .offset = 0x8000,
 341        .vco_table = default_vco,
 342        .num_vco = ARRAY_SIZE(default_vco),
 343        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 344        .flags = SUPPORTS_DYNAMIC_UPDATE,
 345        .clkr = {
 346                .enable_reg = 0x79000,
 347                .enable_mask = BIT(8),
 348                .hw.init = &(struct clk_init_data){
 349                        .name = "gpll8",
 350                        .parent_data = &(const struct clk_parent_data){
 351                                .fw_name = "bi_tcxo",
 352                        },
 353                        .num_parents = 1,
 354                        .ops = &clk_alpha_pll_ops,
 355                },
 356        },
 357};
 358
 359static const struct clk_div_table post_div_table_gpll8_out_main[] = {
 360        { 0x1, 2 },
 361        { }
 362};
 363
 364static struct clk_alpha_pll_postdiv gpll8_out_main = {
 365        .offset = 0x8000,
 366        .post_div_shift = 8,
 367        .post_div_table = post_div_table_gpll8_out_main,
 368        .num_post_div = ARRAY_SIZE(post_div_table_gpll8_out_main),
 369        .width = 4,
 370        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
 371        .clkr.hw.init = &(struct clk_init_data){
 372                .name = "gpll8_out_main",
 373                .parent_hws = (const struct clk_hw *[]){ &gpll8.clkr.hw },
 374                .num_parents = 1,
 375                .flags = CLK_SET_RATE_PARENT,
 376                .ops = &clk_alpha_pll_postdiv_ro_ops,
 377        },
 378};
 379
 380/* 1152MHz configuration */
 381static const struct alpha_pll_config gpll9_config = {
 382        .l = 0x3C,
 383        .alpha = 0x0,
 384        .post_div_val = 0x1 << 8,
 385        .post_div_mask = GENMASK(9, 8),
 386        .main_output_mask = BIT(0),
 387        .early_output_mask = BIT(3),
 388        .config_ctl_val = 0x00004289,
 389        .test_ctl_val = 0x08000000,
 390};
 391
 392static struct clk_alpha_pll gpll9 = {
 393        .offset = 0x9000,
 394        .vco_table = brammo_vco,
 395        .num_vco = ARRAY_SIZE(brammo_vco),
 396        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_BRAMMO],
 397        .clkr = {
 398                .enable_reg = 0x79000,
 399                .enable_mask = BIT(9),
 400                .hw.init = &(struct clk_init_data){
 401                        .name = "gpll9",
 402                        .parent_data = &(const struct clk_parent_data){
 403                                .fw_name = "bi_tcxo",
 404                        },
 405                        .num_parents = 1,
 406                        .ops = &clk_alpha_pll_ops,
 407                },
 408        },
 409};
 410
 411static const struct clk_div_table post_div_table_gpll9_out_main[] = {
 412        { 0x1, 2 },
 413        { }
 414};
 415
 416static struct clk_alpha_pll_postdiv gpll9_out_main = {
 417        .offset = 0x9000,
 418        .post_div_shift = 8,
 419        .post_div_table = post_div_table_gpll9_out_main,
 420        .num_post_div = ARRAY_SIZE(post_div_table_gpll9_out_main),
 421        .width = 2,
 422        .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_BRAMMO],
 423        .clkr.hw.init = &(struct clk_init_data){
 424                .name = "gpll9_out_main",
 425                .parent_hws = (const struct clk_hw *[]){ &gpll9.clkr.hw },
 426                .num_parents = 1,
 427                .flags = CLK_SET_RATE_PARENT,
 428                .ops = &clk_alpha_pll_postdiv_ro_ops,
 429        },
 430};
 431
 432static const struct parent_map gcc_parent_map_0[] = {
 433        { P_BI_TCXO, 0 },
 434        { P_GPLL0_OUT_EARLY, 1 },
 435        { P_GPLL0_OUT_AUX2, 2 },
 436};
 437
 438static const struct clk_parent_data gcc_parents_0[] = {
 439        { .fw_name = "bi_tcxo" },
 440        { .hw = &gpll0.clkr.hw },
 441        { .hw = &gpll0_out_aux2.clkr.hw },
 442};
 443
 444static const struct parent_map gcc_parent_map_1[] = {
 445        { P_BI_TCXO, 0 },
 446        { P_GPLL0_OUT_EARLY, 1 },
 447        { P_GPLL0_OUT_AUX2, 2 },
 448        { P_GPLL6_OUT_MAIN, 4 },
 449};
 450
 451static const struct clk_parent_data gcc_parents_1[] = {
 452        { .fw_name = "bi_tcxo" },
 453        { .hw = &gpll0.clkr.hw },
 454        { .hw = &gpll0_out_aux2.clkr.hw },
 455        { .hw = &gpll6_out_main.clkr.hw },
 456};
 457
 458static const struct parent_map gcc_parent_map_2[] = {
 459        { P_BI_TCXO, 0 },
 460        { P_GPLL0_OUT_EARLY, 1 },
 461        { P_GPLL0_OUT_AUX2, 2 },
 462        { P_SLEEP_CLK, 5 },
 463};
 464
 465static const struct clk_parent_data gcc_parents_2[] = {
 466        { .fw_name = "bi_tcxo" },
 467        { .hw = &gpll0.clkr.hw },
 468        { .hw = &gpll0_out_aux2.clkr.hw },
 469        { .fw_name = "sleep_clk" },
 470};
 471
 472static const struct parent_map gcc_parent_map_3[] = {
 473        { P_BI_TCXO, 0 },
 474        { P_GPLL0_OUT_EARLY, 1 },
 475        { P_GPLL9_OUT_EARLY, 2 },
 476        { P_GPLL10_OUT_MAIN, 3 },
 477        { P_GPLL9_OUT_MAIN, 5 },
 478        { P_GPLL3_OUT_MAIN, 6 },
 479};
 480
 481static const struct clk_parent_data gcc_parents_3[] = {
 482        { .fw_name = "bi_tcxo" },
 483        { .hw = &gpll0.clkr.hw },
 484        { .hw = &gpll9.clkr.hw },
 485        { .hw = &gpll10.clkr.hw },
 486        { .hw = &gpll9_out_main.clkr.hw },
 487        { .hw = &gpll3_out_main.clkr.hw },
 488};
 489
 490static const struct parent_map gcc_parent_map_4[] = {
 491        { P_BI_TCXO, 0 },
 492        { P_GPLL0_OUT_EARLY, 1 },
 493        { P_GPLL0_OUT_AUX2, 2 },
 494        { P_GPLL10_OUT_MAIN, 3 },
 495        { P_GPLL4_OUT_MAIN, 5 },
 496        { P_GPLL3_OUT_EARLY, 6 },
 497};
 498
 499static const struct clk_parent_data gcc_parents_4[] = {
 500        { .fw_name = "bi_tcxo" },
 501        { .hw = &gpll0.clkr.hw },
 502        { .hw = &gpll0_out_aux2.clkr.hw },
 503        { .hw = &gpll10.clkr.hw },
 504        { .hw = &gpll4.clkr.hw },
 505        { .hw = &gpll3.clkr.hw },
 506};
 507
 508static const struct parent_map gcc_parent_map_5[] = {
 509        { P_BI_TCXO, 0 },
 510        { P_GPLL0_OUT_EARLY, 1 },
 511        { P_GPLL0_OUT_AUX2, 2 },
 512        { P_GPLL4_OUT_MAIN, 5 },
 513        { P_GPLL3_OUT_MAIN, 6 },
 514};
 515
 516static const struct clk_parent_data gcc_parents_5[] = {
 517        { .fw_name = "bi_tcxo" },
 518        { .hw = &gpll0.clkr.hw },
 519        { .hw = &gpll0_out_aux2.clkr.hw },
 520        { .hw = &gpll4.clkr.hw },
 521        { .hw = &gpll3_out_main.clkr.hw },
 522};
 523
 524static const struct parent_map gcc_parent_map_6[] = {
 525        { P_BI_TCXO, 0 },
 526        { P_GPLL0_OUT_EARLY, 1 },
 527        { P_GPLL8_OUT_EARLY, 2 },
 528        { P_GPLL10_OUT_MAIN, 3 },
 529        { P_GPLL8_OUT_MAIN, 4 },
 530        { P_GPLL9_OUT_MAIN, 5 },
 531        { P_GPLL3_OUT_EARLY, 6 },
 532};
 533
 534static const struct clk_parent_data gcc_parents_6[] = {
 535        { .fw_name = "bi_tcxo" },
 536        { .hw = &gpll0.clkr.hw },
 537        { .hw = &gpll8.clkr.hw },
 538        { .hw = &gpll10.clkr.hw },
 539        { .hw = &gpll8_out_main.clkr.hw },
 540        { .hw = &gpll9_out_main.clkr.hw },
 541        { .hw = &gpll3.clkr.hw },
 542};
 543
 544static const struct parent_map gcc_parent_map_7[] = {
 545        { P_BI_TCXO, 0 },
 546        { P_GPLL0_OUT_EARLY, 1 },
 547        { P_GPLL8_OUT_EARLY, 2 },
 548        { P_GPLL10_OUT_MAIN, 3 },
 549        { P_GPLL8_OUT_MAIN, 4 },
 550        { P_GPLL9_OUT_MAIN, 5 },
 551        { P_GPLL3_OUT_MAIN, 6 },
 552};
 553
 554static const struct clk_parent_data gcc_parents_7[] = {
 555        { .fw_name = "bi_tcxo" },
 556        { .hw = &gpll0.clkr.hw },
 557        { .hw = &gpll8.clkr.hw },
 558        { .hw = &gpll10.clkr.hw },
 559        { .hw = &gpll8_out_main.clkr.hw },
 560        { .hw = &gpll9_out_main.clkr.hw },
 561        { .hw = &gpll3_out_main.clkr.hw },
 562};
 563
 564static const struct parent_map gcc_parent_map_8[] = {
 565        { P_BI_TCXO, 0 },
 566        { P_GPLL0_OUT_EARLY, 1 },
 567        { P_GPLL8_OUT_EARLY, 2 },
 568        { P_GPLL10_OUT_MAIN, 3 },
 569        { P_GPLL6_OUT_MAIN, 4 },
 570        { P_GPLL9_OUT_MAIN, 5 },
 571        { P_GPLL3_OUT_EARLY, 6 },
 572};
 573
 574static const struct clk_parent_data gcc_parents_8[] = {
 575        { .fw_name = "bi_tcxo" },
 576        { .hw = &gpll0.clkr.hw },
 577        { .hw = &gpll8.clkr.hw },
 578        { .hw = &gpll10.clkr.hw },
 579        { .hw = &gpll6_out_main.clkr.hw },
 580        { .hw = &gpll9_out_main.clkr.hw },
 581        { .hw = &gpll3.clkr.hw },
 582};
 583
 584static const struct parent_map gcc_parent_map_9[] = {
 585        { P_BI_TCXO, 0 },
 586        { P_GPLL0_OUT_EARLY, 1 },
 587        { P_GPLL0_OUT_AUX2, 2 },
 588        { P_GPLL10_OUT_MAIN, 3 },
 589        { P_GPLL8_OUT_MAIN, 4 },
 590        { P_GPLL9_OUT_MAIN, 5 },
 591        { P_GPLL3_OUT_EARLY, 6 },
 592};
 593
 594static const struct clk_parent_data gcc_parents_9[] = {
 595        { .fw_name = "bi_tcxo" },
 596        { .hw = &gpll0.clkr.hw },
 597        { .hw = &gpll0_out_aux2.clkr.hw },
 598        { .hw = &gpll10.clkr.hw },
 599        { .hw = &gpll8_out_main.clkr.hw },
 600        { .hw = &gpll9_out_main.clkr.hw },
 601        { .hw = &gpll3.clkr.hw },
 602};
 603
 604static const struct parent_map gcc_parent_map_10[] = {
 605        { P_BI_TCXO, 0 },
 606        { P_GPLL0_OUT_EARLY, 1 },
 607        { P_GPLL8_OUT_EARLY, 2 },
 608        { P_GPLL10_OUT_MAIN, 3 },
 609        { P_GPLL6_OUT_EARLY, 5 },
 610        { P_GPLL3_OUT_MAIN, 6 },
 611};
 612
 613static const struct clk_parent_data gcc_parents_10[] = {
 614        { .fw_name = "bi_tcxo" },
 615        { .hw = &gpll0.clkr.hw },
 616        { .hw = &gpll8.clkr.hw },
 617        { .hw = &gpll10.clkr.hw },
 618        { .hw = &gpll6.clkr.hw },
 619        { .hw = &gpll3_out_main.clkr.hw },
 620};
 621
 622static const struct parent_map gcc_parent_map_12[] = {
 623        { P_BI_TCXO, 0 },
 624        { P_GPLL0_OUT_EARLY, 1 },
 625        { P_GPLL0_OUT_AUX2, 2 },
 626        { P_GPLL7_OUT_MAIN, 3 },
 627        { P_GPLL4_OUT_MAIN, 5 },
 628};
 629
 630static const struct clk_parent_data gcc_parents_12[] = {
 631        { .fw_name = "bi_tcxo" },
 632        { .hw = &gpll0.clkr.hw },
 633        { .hw = &gpll0_out_aux2.clkr.hw },
 634        { .hw = &gpll7.clkr.hw },
 635        { .hw = &gpll4.clkr.hw },
 636};
 637
 638static const struct parent_map gcc_parent_map_13[] = {
 639        { P_BI_TCXO, 0 },
 640        { P_SLEEP_CLK, 5 },
 641};
 642
 643static const struct clk_parent_data gcc_parents_13[] = {
 644        { .fw_name = "bi_tcxo" },
 645        { .fw_name = "sleep_clk" },
 646};
 647
 648static const struct parent_map gcc_parent_map_14[] = {
 649        { P_BI_TCXO, 0 },
 650        { P_GPLL11_OUT_MAIN, 1 },
 651        { P_GPLL11_OUT_AUX, 2 },
 652        { P_GPLL11_OUT_AUX2, 3 },
 653};
 654
 655static const struct clk_parent_data gcc_parents_14[] = {
 656        { .fw_name = "bi_tcxo" },
 657        { .hw = &gpll11.clkr.hw },
 658        { .hw = &gpll11.clkr.hw },
 659        { .hw = &gpll11.clkr.hw },
 660};
 661
 662static const struct freq_tbl ftbl_gcc_usb30_prim_mock_utmi_clk_src[] = {
 663        F(19200000, P_BI_TCXO, 1, 0, 0),
 664        { }
 665};
 666
 667static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = {
 668        .cmd_rcgr = 0x1a034,
 669        .mnd_width = 0,
 670        .hid_width = 5,
 671        .parent_map = gcc_parent_map_0,
 672        .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src,
 673        .clkr.hw.init = &(struct clk_init_data){
 674                .name = "gcc_usb30_prim_mock_utmi_clk_src",
 675                .parent_data = gcc_parents_0,
 676                .num_parents = ARRAY_SIZE(gcc_parents_0),
 677                .ops = &clk_rcg2_ops,
 678        },
 679};
 680
 681static struct clk_regmap_div gcc_usb30_prim_mock_utmi_postdiv = {
 682        .reg = 0x1a04c,
 683        .shift = 0,
 684        .width = 2,
 685        .clkr.hw.init = &(struct clk_init_data) {
 686                .name = "gcc_usb30_prim_mock_utmi_postdiv",
 687                .parent_hws = (const struct clk_hw *[])
 688                                { &gcc_usb30_prim_mock_utmi_clk_src.clkr.hw },
 689                .num_parents = 1,
 690                .flags = CLK_SET_RATE_PARENT,
 691                .ops = &clk_regmap_div_ro_ops,
 692        },
 693};
 694
 695static const struct freq_tbl ftbl_gcc_camss_axi_clk_src[] = {
 696        F(19200000, P_BI_TCXO, 1, 0, 0),
 697        F(150000000, P_GPLL0_OUT_AUX2, 2, 0, 0),
 698        F(200000000, P_GPLL0_OUT_AUX2, 1.5, 0, 0),
 699        F(300000000, P_GPLL0_OUT_AUX2, 1, 0, 0),
 700        { }
 701};
 702
 703static struct clk_rcg2 gcc_camss_axi_clk_src = {
 704        .cmd_rcgr = 0x5802c,
 705        .mnd_width = 0,
 706        .hid_width = 5,
 707        .parent_map = gcc_parent_map_4,
 708        .freq_tbl = ftbl_gcc_camss_axi_clk_src,
 709        .clkr.hw.init = &(struct clk_init_data){
 710                .name = "gcc_camss_axi_clk_src",
 711                .parent_data = gcc_parents_4,
 712                .num_parents = ARRAY_SIZE(gcc_parents_4),
 713                .ops = &clk_rcg2_ops,
 714        },
 715};
 716
 717static const struct freq_tbl ftbl_gcc_camss_cci_clk_src[] = {
 718        F(19200000, P_BI_TCXO, 1, 0, 0),
 719        F(37500000, P_GPLL0_OUT_AUX2, 8, 0, 0),
 720        { }
 721};
 722
 723static struct clk_rcg2 gcc_camss_cci_clk_src = {
 724        .cmd_rcgr = 0x56000,
 725        .mnd_width = 0,
 726        .hid_width = 5,
 727        .parent_map = gcc_parent_map_9,
 728        .freq_tbl = ftbl_gcc_camss_cci_clk_src,
 729        .clkr.hw.init = &(struct clk_init_data){
 730                .name = "gcc_camss_cci_clk_src",
 731                .parent_data = gcc_parents_9,
 732                .num_parents = ARRAY_SIZE(gcc_parents_9),
 733                .ops = &clk_rcg2_ops,
 734        },
 735};
 736
 737static const struct freq_tbl ftbl_gcc_camss_csi0phytimer_clk_src[] = {
 738        F(19200000, P_BI_TCXO, 1, 0, 0),
 739        F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
 740        F(200000000, P_GPLL0_OUT_AUX2, 1.5, 0, 0),
 741        F(268800000, P_GPLL4_OUT_MAIN, 3, 0, 0),
 742        { }
 743};
 744
 745static struct clk_rcg2 gcc_camss_csi0phytimer_clk_src = {
 746        .cmd_rcgr = 0x45000,
 747        .mnd_width = 0,
 748        .hid_width = 5,
 749        .parent_map = gcc_parent_map_5,
 750        .freq_tbl = ftbl_gcc_camss_csi0phytimer_clk_src,
 751        .clkr.hw.init = &(struct clk_init_data){
 752                .name = "gcc_camss_csi0phytimer_clk_src",
 753                .parent_data = gcc_parents_5,
 754                .num_parents = ARRAY_SIZE(gcc_parents_5),
 755                .ops = &clk_rcg2_ops,
 756        },
 757};
 758
 759static struct clk_rcg2 gcc_camss_csi1phytimer_clk_src = {
 760        .cmd_rcgr = 0x4501c,
 761        .mnd_width = 0,
 762        .hid_width = 5,
 763        .parent_map = gcc_parent_map_5,
 764        .freq_tbl = ftbl_gcc_camss_csi0phytimer_clk_src,
 765        .clkr.hw.init = &(struct clk_init_data){
 766                .name = "gcc_camss_csi1phytimer_clk_src",
 767                .parent_data = gcc_parents_5,
 768                .num_parents = ARRAY_SIZE(gcc_parents_5),
 769                .ops = &clk_rcg2_ops,
 770        },
 771};
 772
 773static const struct freq_tbl ftbl_gcc_camss_mclk0_clk_src[] = {
 774        F(19200000, P_BI_TCXO, 1, 0, 0),
 775        F(24000000, P_GPLL9_OUT_MAIN, 1, 1, 24),
 776        F(64000000, P_GPLL9_OUT_EARLY, 9, 1, 2),
 777        { }
 778};
 779
 780static struct clk_rcg2 gcc_camss_mclk0_clk_src = {
 781        .cmd_rcgr = 0x51000,
 782        .mnd_width = 8,
 783        .hid_width = 5,
 784        .parent_map = gcc_parent_map_3,
 785        .freq_tbl = ftbl_gcc_camss_mclk0_clk_src,
 786        .clkr.hw.init = &(struct clk_init_data){
 787                .name = "gcc_camss_mclk0_clk_src",
 788                .parent_data = gcc_parents_3,
 789                .num_parents = ARRAY_SIZE(gcc_parents_3),
 790                .flags = CLK_OPS_PARENT_ENABLE,
 791                .ops = &clk_rcg2_ops,
 792        },
 793};
 794
 795static struct clk_rcg2 gcc_camss_mclk1_clk_src = {
 796        .cmd_rcgr = 0x5101c,
 797        .mnd_width = 8,
 798        .hid_width = 5,
 799        .parent_map = gcc_parent_map_3,
 800        .freq_tbl = ftbl_gcc_camss_mclk0_clk_src,
 801        .clkr.hw.init = &(struct clk_init_data){
 802                .name = "gcc_camss_mclk1_clk_src",
 803                .parent_data = gcc_parents_3,
 804                .num_parents = ARRAY_SIZE(gcc_parents_3),
 805                .flags = CLK_OPS_PARENT_ENABLE,
 806                .ops = &clk_rcg2_ops,
 807        },
 808};
 809
 810static struct clk_rcg2 gcc_camss_mclk2_clk_src = {
 811        .cmd_rcgr = 0x51038,
 812        .mnd_width = 8,
 813        .hid_width = 5,
 814        .parent_map = gcc_parent_map_3,
 815        .freq_tbl = ftbl_gcc_camss_mclk0_clk_src,
 816        .clkr.hw.init = &(struct clk_init_data){
 817                .name = "gcc_camss_mclk2_clk_src",
 818                .parent_data = gcc_parents_3,
 819                .num_parents = ARRAY_SIZE(gcc_parents_3),
 820                .flags = CLK_OPS_PARENT_ENABLE,
 821                .ops = &clk_rcg2_ops,
 822        },
 823};
 824
 825static struct clk_rcg2 gcc_camss_mclk3_clk_src = {
 826        .cmd_rcgr = 0x51054,
 827        .mnd_width = 8,
 828        .hid_width = 5,
 829        .parent_map = gcc_parent_map_3,
 830        .freq_tbl = ftbl_gcc_camss_mclk0_clk_src,
 831        .clkr.hw.init = &(struct clk_init_data){
 832                .name = "gcc_camss_mclk3_clk_src",
 833                .parent_data = gcc_parents_3,
 834                .num_parents = ARRAY_SIZE(gcc_parents_3),
 835                .flags = CLK_OPS_PARENT_ENABLE,
 836                .ops = &clk_rcg2_ops,
 837        },
 838};
 839
 840static const struct freq_tbl ftbl_gcc_camss_ope_ahb_clk_src[] = {
 841        F(19200000, P_BI_TCXO, 1, 0, 0),
 842        F(171428571, P_GPLL0_OUT_EARLY, 3.5, 0, 0),
 843        F(240000000, P_GPLL0_OUT_EARLY, 2.5, 0, 0),
 844        { }
 845};
 846
 847static struct clk_rcg2 gcc_camss_ope_ahb_clk_src = {
 848        .cmd_rcgr = 0x55024,
 849        .mnd_width = 0,
 850        .hid_width = 5,
 851        .parent_map = gcc_parent_map_6,
 852        .freq_tbl = ftbl_gcc_camss_ope_ahb_clk_src,
 853        .clkr.hw.init = &(struct clk_init_data){
 854                .name = "gcc_camss_ope_ahb_clk_src",
 855                .parent_data = gcc_parents_6,
 856                .num_parents = ARRAY_SIZE(gcc_parents_6),
 857                .ops = &clk_rcg2_ops,
 858        },
 859};
 860
 861static const struct freq_tbl ftbl_gcc_camss_ope_clk_src[] = {
 862        F(19200000, P_BI_TCXO, 1, 0, 0),
 863        F(200000000, P_GPLL8_OUT_MAIN, 2, 0, 0),
 864        F(266600000, P_GPLL8_OUT_MAIN, 1, 0, 0),
 865        F(465000000, P_GPLL8_OUT_MAIN, 1, 0, 0),
 866        F(580000000, P_GPLL8_OUT_EARLY, 1, 0, 0),
 867        { }
 868};
 869
 870static struct clk_rcg2 gcc_camss_ope_clk_src = {
 871        .cmd_rcgr = 0x55004,
 872        .mnd_width = 0,
 873        .hid_width = 5,
 874        .parent_map = gcc_parent_map_6,
 875        .freq_tbl = ftbl_gcc_camss_ope_clk_src,
 876        .clkr.hw.init = &(struct clk_init_data){
 877                .name = "gcc_camss_ope_clk_src",
 878                .parent_data = gcc_parents_6,
 879                .num_parents = ARRAY_SIZE(gcc_parents_6),
 880                .flags = CLK_SET_RATE_PARENT,
 881                .ops = &clk_rcg2_ops,
 882        },
 883};
 884
 885static const struct freq_tbl ftbl_gcc_camss_tfe_0_clk_src[] = {
 886        F(19200000, P_BI_TCXO, 1, 0, 0),
 887        F(128000000, P_GPLL10_OUT_MAIN, 9, 0, 0),
 888        F(135529412, P_GPLL10_OUT_MAIN, 8.5, 0, 0),
 889        F(144000000, P_GPLL10_OUT_MAIN, 8, 0, 0),
 890        F(153600000, P_GPLL10_OUT_MAIN, 7.5, 0, 0),
 891        F(164571429, P_GPLL10_OUT_MAIN, 7, 0, 0),
 892        F(177230769, P_GPLL10_OUT_MAIN, 6.5, 0, 0),
 893        F(192000000, P_GPLL10_OUT_MAIN, 6, 0, 0),
 894        F(209454545, P_GPLL10_OUT_MAIN, 5.5, 0, 0),
 895        F(230400000, P_GPLL10_OUT_MAIN, 5, 0, 0),
 896        F(256000000, P_GPLL10_OUT_MAIN, 4.5, 0, 0),
 897        F(288000000, P_GPLL10_OUT_MAIN, 4, 0, 0),
 898        F(329142857, P_GPLL10_OUT_MAIN, 3.5, 0, 0),
 899        F(384000000, P_GPLL10_OUT_MAIN, 3, 0, 0),
 900        F(460800000, P_GPLL10_OUT_MAIN, 2.5, 0, 0),
 901        F(576000000, P_GPLL10_OUT_MAIN, 2, 0, 0),
 902        { }
 903};
 904
 905static struct clk_rcg2 gcc_camss_tfe_0_clk_src = {
 906        .cmd_rcgr = 0x52004,
 907        .mnd_width = 8,
 908        .hid_width = 5,
 909        .parent_map = gcc_parent_map_7,
 910        .freq_tbl = ftbl_gcc_camss_tfe_0_clk_src,
 911        .clkr.hw.init = &(struct clk_init_data){
 912                .name = "gcc_camss_tfe_0_clk_src",
 913                .parent_data = gcc_parents_7,
 914                .num_parents = ARRAY_SIZE(gcc_parents_7),
 915                .ops = &clk_rcg2_ops,
 916        },
 917};
 918
 919static const struct freq_tbl ftbl_gcc_camss_tfe_0_csid_clk_src[] = {
 920        F(19200000, P_BI_TCXO, 1, 0, 0),
 921        F(120000000, P_GPLL0_OUT_EARLY, 5, 0, 0),
 922        F(192000000, P_GPLL6_OUT_MAIN, 2, 0, 0),
 923        F(240000000, P_GPLL0_OUT_EARLY, 2.5, 0, 0),
 924        F(384000000, P_GPLL6_OUT_MAIN, 1, 0, 0),
 925        F(426400000, P_GPLL3_OUT_EARLY, 2.5, 0, 0),
 926        { }
 927};
 928
 929static struct clk_rcg2 gcc_camss_tfe_0_csid_clk_src = {
 930        .cmd_rcgr = 0x52094,
 931        .mnd_width = 0,
 932        .hid_width = 5,
 933        .parent_map = gcc_parent_map_8,
 934        .freq_tbl = ftbl_gcc_camss_tfe_0_csid_clk_src,
 935        .clkr.hw.init = &(struct clk_init_data){
 936                .name = "gcc_camss_tfe_0_csid_clk_src",
 937                .parent_data = gcc_parents_8,
 938                .num_parents = ARRAY_SIZE(gcc_parents_8),
 939                .ops = &clk_rcg2_ops,
 940        },
 941};
 942
 943static struct clk_rcg2 gcc_camss_tfe_1_clk_src = {
 944        .cmd_rcgr = 0x52024,
 945        .mnd_width = 8,
 946        .hid_width = 5,
 947        .parent_map = gcc_parent_map_7,
 948        .freq_tbl = ftbl_gcc_camss_tfe_0_clk_src,
 949        .clkr.hw.init = &(struct clk_init_data){
 950                .name = "gcc_camss_tfe_1_clk_src",
 951                .parent_data = gcc_parents_7,
 952                .num_parents = ARRAY_SIZE(gcc_parents_7),
 953                .ops = &clk_rcg2_ops,
 954        },
 955};
 956
 957static struct clk_rcg2 gcc_camss_tfe_1_csid_clk_src = {
 958        .cmd_rcgr = 0x520b4,
 959        .mnd_width = 0,
 960        .hid_width = 5,
 961        .parent_map = gcc_parent_map_8,
 962        .freq_tbl = ftbl_gcc_camss_tfe_0_csid_clk_src,
 963        .clkr.hw.init = &(struct clk_init_data){
 964                .name = "gcc_camss_tfe_1_csid_clk_src",
 965                .parent_data = gcc_parents_8,
 966                .num_parents = ARRAY_SIZE(gcc_parents_8),
 967                .ops = &clk_rcg2_ops,
 968        },
 969};
 970
 971static const struct freq_tbl ftbl_gcc_camss_tfe_cphy_rx_clk_src[] = {
 972        F(19200000, P_BI_TCXO, 1, 0, 0),
 973        F(240000000, P_GPLL0_OUT_EARLY, 2.5, 0, 0),
 974        F(341333333, P_GPLL6_OUT_EARLY, 1, 4, 9),
 975        F(384000000, P_GPLL6_OUT_EARLY, 2, 0, 0),
 976        { }
 977};
 978
 979static struct clk_rcg2 gcc_camss_tfe_cphy_rx_clk_src = {
 980        .cmd_rcgr = 0x52064,
 981        .mnd_width = 16,
 982        .hid_width = 5,
 983        .parent_map = gcc_parent_map_10,
 984        .freq_tbl = ftbl_gcc_camss_tfe_cphy_rx_clk_src,
 985        .clkr.hw.init = &(struct clk_init_data){
 986                .name = "gcc_camss_tfe_cphy_rx_clk_src",
 987                .parent_data = gcc_parents_10,
 988                .num_parents = ARRAY_SIZE(gcc_parents_10),
 989                .flags = CLK_OPS_PARENT_ENABLE,
 990                .ops = &clk_rcg2_ops,
 991        },
 992};
 993
 994static const struct freq_tbl ftbl_gcc_camss_top_ahb_clk_src[] = {
 995        F(19200000, P_BI_TCXO, 1, 0, 0),
 996        F(40000000, P_GPLL0_OUT_AUX2, 7.5, 0, 0),
 997        F(80000000, P_GPLL0_OUT_EARLY, 7.5, 0, 0),
 998        { }
 999};
1000
1001static struct clk_rcg2 gcc_camss_top_ahb_clk_src = {
1002        .cmd_rcgr = 0x58010,
1003        .mnd_width = 0,
1004        .hid_width = 5,
1005        .parent_map = gcc_parent_map_4,
1006        .freq_tbl = ftbl_gcc_camss_top_ahb_clk_src,
1007        .clkr.hw.init = &(struct clk_init_data){
1008                .name = "gcc_camss_top_ahb_clk_src",
1009                .parent_data = gcc_parents_4,
1010                .num_parents = ARRAY_SIZE(gcc_parents_4),
1011                .ops = &clk_rcg2_ops,
1012        },
1013};
1014
1015static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
1016        F(25000000, P_GPLL0_OUT_AUX2, 12, 0, 0),
1017        F(50000000, P_GPLL0_OUT_AUX2, 6, 0, 0),
1018        F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
1019        F(200000000, P_GPLL0_OUT_AUX2, 1.5, 0, 0),
1020        { }
1021};
1022
1023static struct clk_rcg2 gcc_gp1_clk_src = {
1024        .cmd_rcgr = 0x4d004,
1025        .mnd_width = 8,
1026        .hid_width = 5,
1027        .parent_map = gcc_parent_map_2,
1028        .freq_tbl = ftbl_gcc_gp1_clk_src,
1029        .clkr.hw.init = &(struct clk_init_data){
1030                .name = "gcc_gp1_clk_src",
1031                .parent_data = gcc_parents_2,
1032                .num_parents = ARRAY_SIZE(gcc_parents_2),
1033                .ops = &clk_rcg2_ops,
1034        },
1035};
1036
1037static struct clk_rcg2 gcc_gp2_clk_src = {
1038        .cmd_rcgr = 0x4e004,
1039        .mnd_width = 8,
1040        .hid_width = 5,
1041        .parent_map = gcc_parent_map_2,
1042        .freq_tbl = ftbl_gcc_gp1_clk_src,
1043        .clkr.hw.init = &(struct clk_init_data){
1044                .name = "gcc_gp2_clk_src",
1045                .parent_data = gcc_parents_2,
1046                .num_parents = ARRAY_SIZE(gcc_parents_2),
1047                .ops = &clk_rcg2_ops,
1048        },
1049};
1050
1051static struct clk_rcg2 gcc_gp3_clk_src = {
1052        .cmd_rcgr = 0x4f004,
1053        .mnd_width = 8,
1054        .hid_width = 5,
1055        .parent_map = gcc_parent_map_2,
1056        .freq_tbl = ftbl_gcc_gp1_clk_src,
1057        .clkr.hw.init = &(struct clk_init_data){
1058                .name = "gcc_gp3_clk_src",
1059                .parent_data = gcc_parents_2,
1060                .num_parents = ARRAY_SIZE(gcc_parents_2),
1061                .ops = &clk_rcg2_ops,
1062        },
1063};
1064
1065static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = {
1066        F(19200000, P_BI_TCXO, 1, 0, 0),
1067        F(60000000, P_GPLL0_OUT_AUX2, 5, 0, 0),
1068        { }
1069};
1070
1071static struct clk_rcg2 gcc_pdm2_clk_src = {
1072        .cmd_rcgr = 0x20010,
1073        .mnd_width = 0,
1074        .hid_width = 5,
1075        .parent_map = gcc_parent_map_0,
1076        .freq_tbl = ftbl_gcc_pdm2_clk_src,
1077        .clkr.hw.init = &(struct clk_init_data){
1078                .name = "gcc_pdm2_clk_src",
1079                .parent_data = gcc_parents_0,
1080                .num_parents = ARRAY_SIZE(gcc_parents_0),
1081                .ops = &clk_rcg2_ops,
1082        },
1083};
1084
1085static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = {
1086        F(7372800, P_GPLL0_OUT_AUX2, 1, 384, 15625),
1087        F(14745600, P_GPLL0_OUT_AUX2, 1, 768, 15625),
1088        F(19200000, P_BI_TCXO, 1, 0, 0),
1089        F(29491200, P_GPLL0_OUT_AUX2, 1, 1536, 15625),
1090        F(32000000, P_GPLL0_OUT_AUX2, 1, 8, 75),
1091        F(48000000, P_GPLL0_OUT_AUX2, 1, 4, 25),
1092        F(64000000, P_GPLL0_OUT_AUX2, 1, 16, 75),
1093        F(75000000, P_GPLL0_OUT_AUX2, 4, 0, 0),
1094        F(80000000, P_GPLL0_OUT_AUX2, 1, 4, 15),
1095        F(96000000, P_GPLL0_OUT_AUX2, 1, 8, 25),
1096        F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
1097        F(102400000, P_GPLL0_OUT_AUX2, 1, 128, 375),
1098        F(112000000, P_GPLL0_OUT_AUX2, 1, 28, 75),
1099        F(117964800, P_GPLL0_OUT_AUX2, 1, 6144, 15625),
1100        F(120000000, P_GPLL0_OUT_AUX2, 2.5, 0, 0),
1101        F(128000000, P_GPLL6_OUT_MAIN, 3, 0, 0),
1102        { }
1103};
1104
1105static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = {
1106        .name = "gcc_qupv3_wrap0_s0_clk_src",
1107        .parent_data = gcc_parents_1,
1108        .num_parents = ARRAY_SIZE(gcc_parents_1),
1109        .ops = &clk_rcg2_ops,
1110};
1111
1112static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
1113        .cmd_rcgr = 0x1f148,
1114        .mnd_width = 16,
1115        .hid_width = 5,
1116        .parent_map = gcc_parent_map_1,
1117        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
1118        .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init,
1119};
1120
1121static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = {
1122        .name = "gcc_qupv3_wrap0_s1_clk_src",
1123        .parent_data = gcc_parents_1,
1124        .num_parents = ARRAY_SIZE(gcc_parents_1),
1125        .ops = &clk_rcg2_ops,
1126};
1127
1128static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
1129        .cmd_rcgr = 0x1f278,
1130        .mnd_width = 16,
1131        .hid_width = 5,
1132        .parent_map = gcc_parent_map_1,
1133        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
1134        .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init,
1135};
1136
1137static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = {
1138        .name = "gcc_qupv3_wrap0_s2_clk_src",
1139        .parent_data = gcc_parents_1,
1140        .num_parents = ARRAY_SIZE(gcc_parents_1),
1141        .ops = &clk_rcg2_ops,
1142};
1143
1144static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
1145        .cmd_rcgr = 0x1f3a8,
1146        .mnd_width = 16,
1147        .hid_width = 5,
1148        .parent_map = gcc_parent_map_1,
1149        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
1150        .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init,
1151};
1152
1153static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = {
1154        .name = "gcc_qupv3_wrap0_s3_clk_src",
1155        .parent_data = gcc_parents_1,
1156        .num_parents = ARRAY_SIZE(gcc_parents_1),
1157        .ops = &clk_rcg2_ops,
1158};
1159
1160static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
1161        .cmd_rcgr = 0x1f4d8,
1162        .mnd_width = 16,
1163        .hid_width = 5,
1164        .parent_map = gcc_parent_map_1,
1165        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
1166        .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init,
1167};
1168
1169static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = {
1170        .name = "gcc_qupv3_wrap0_s4_clk_src",
1171        .parent_data = gcc_parents_1,
1172        .num_parents = ARRAY_SIZE(gcc_parents_1),
1173        .ops = &clk_rcg2_ops,
1174};
1175
1176static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
1177        .cmd_rcgr = 0x1f608,
1178        .mnd_width = 16,
1179        .hid_width = 5,
1180        .parent_map = gcc_parent_map_1,
1181        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
1182        .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init,
1183};
1184
1185static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = {
1186        .name = "gcc_qupv3_wrap0_s5_clk_src",
1187        .parent_data = gcc_parents_1,
1188        .num_parents = ARRAY_SIZE(gcc_parents_1),
1189        .ops = &clk_rcg2_ops,
1190};
1191
1192static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
1193        .cmd_rcgr = 0x1f738,
1194        .mnd_width = 16,
1195        .hid_width = 5,
1196        .parent_map = gcc_parent_map_1,
1197        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
1198        .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init,
1199};
1200
1201static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = {
1202        F(144000, P_BI_TCXO, 16, 3, 25),
1203        F(400000, P_BI_TCXO, 12, 1, 4),
1204        F(20000000, P_GPLL0_OUT_AUX2, 5, 1, 3),
1205        F(25000000, P_GPLL0_OUT_AUX2, 6, 1, 2),
1206        F(50000000, P_GPLL0_OUT_AUX2, 6, 0, 0),
1207        F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
1208        F(192000000, P_GPLL6_OUT_MAIN, 2, 0, 0),
1209        F(384000000, P_GPLL6_OUT_MAIN, 1, 0, 0),
1210        { }
1211};
1212
1213static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
1214        .cmd_rcgr = 0x38028,
1215        .mnd_width = 8,
1216        .hid_width = 5,
1217        .parent_map = gcc_parent_map_1,
1218        .freq_tbl = ftbl_gcc_sdcc1_apps_clk_src,
1219        .clkr.hw.init = &(struct clk_init_data){
1220                .name = "gcc_sdcc1_apps_clk_src",
1221                .parent_data = gcc_parents_1,
1222                .num_parents = ARRAY_SIZE(gcc_parents_1),
1223                .ops = &clk_rcg2_floor_ops,
1224        },
1225};
1226
1227static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = {
1228        F(75000000, P_GPLL0_OUT_AUX2, 4, 0, 0),
1229        F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
1230        F(150000000, P_GPLL0_OUT_AUX2, 2, 0, 0),
1231        F(200000000, P_GPLL0_OUT_EARLY, 3, 0, 0),
1232        F(300000000, P_GPLL0_OUT_AUX2, 1, 0, 0),
1233        { }
1234};
1235
1236static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = {
1237        .cmd_rcgr = 0x38010,
1238        .mnd_width = 0,
1239        .hid_width = 5,
1240        .parent_map = gcc_parent_map_0,
1241        .freq_tbl = ftbl_gcc_sdcc1_ice_core_clk_src,
1242        .clkr.hw.init = &(struct clk_init_data){
1243                .name = "gcc_sdcc1_ice_core_clk_src",
1244                .parent_data = gcc_parents_0,
1245                .num_parents = ARRAY_SIZE(gcc_parents_0),
1246                .ops = &clk_rcg2_ops,
1247        },
1248};
1249
1250static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = {
1251        F(400000, P_BI_TCXO, 12, 1, 4),
1252        F(19200000, P_BI_TCXO, 1, 0, 0),
1253        F(25000000, P_GPLL0_OUT_AUX2, 12, 0, 0),
1254        F(50000000, P_GPLL0_OUT_AUX2, 6, 0, 0),
1255        F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
1256        F(202000000, P_GPLL7_OUT_MAIN, 4, 0, 0),
1257        { }
1258};
1259
1260static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
1261        .cmd_rcgr = 0x1e00c,
1262        .mnd_width = 8,
1263        .hid_width = 5,
1264        .parent_map = gcc_parent_map_12,
1265        .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src,
1266        .clkr.hw.init = &(struct clk_init_data){
1267                .name = "gcc_sdcc2_apps_clk_src",
1268                .parent_data = gcc_parents_12,
1269                .num_parents = ARRAY_SIZE(gcc_parents_12),
1270                .ops = &clk_rcg2_ops,
1271        },
1272};
1273
1274static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = {
1275        F(66666667, P_GPLL0_OUT_AUX2, 4.5, 0, 0),
1276        F(133333333, P_GPLL0_OUT_EARLY, 4.5, 0, 0),
1277        F(200000000, P_GPLL0_OUT_EARLY, 3, 0, 0),
1278        F(240000000, P_GPLL0_OUT_EARLY, 2.5, 0, 0),
1279        { }
1280};
1281
1282static struct clk_rcg2 gcc_usb30_prim_master_clk_src = {
1283        .cmd_rcgr = 0x1a01c,
1284        .mnd_width = 8,
1285        .hid_width = 5,
1286        .parent_map = gcc_parent_map_0,
1287        .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src,
1288        .clkr.hw.init = &(struct clk_init_data){
1289                .name = "gcc_usb30_prim_master_clk_src",
1290                .parent_data = gcc_parents_0,
1291                .num_parents = ARRAY_SIZE(gcc_parents_0),
1292                .ops = &clk_rcg2_ops,
1293        },
1294};
1295
1296static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = {
1297        .cmd_rcgr = 0x1a060,
1298        .mnd_width = 0,
1299        .hid_width = 5,
1300        .parent_map = gcc_parent_map_13,
1301        .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src,
1302        .clkr.hw.init = &(struct clk_init_data){
1303                .name = "gcc_usb3_prim_phy_aux_clk_src",
1304                .parent_data = gcc_parents_13,
1305                .num_parents = ARRAY_SIZE(gcc_parents_13),
1306                .ops = &clk_rcg2_ops,
1307        },
1308};
1309
1310static const struct freq_tbl ftbl_gcc_video_venus_clk_src[] = {
1311        F(133333333, P_GPLL11_OUT_MAIN, 4.5, 0, 0),
1312        F(240000000, P_GPLL11_OUT_MAIN, 2.5, 0, 0),
1313        F(300000000, P_GPLL11_OUT_MAIN, 2, 0, 0),
1314        F(384000000, P_GPLL11_OUT_MAIN, 2, 0, 0),
1315        { }
1316};
1317
1318static struct clk_rcg2 gcc_video_venus_clk_src = {
1319        .cmd_rcgr = 0x58060,
1320        .mnd_width = 0,
1321        .hid_width = 5,
1322        .parent_map = gcc_parent_map_14,
1323        .freq_tbl = ftbl_gcc_video_venus_clk_src,
1324        .clkr.hw.init = &(struct clk_init_data){
1325                .name = "gcc_video_venus_clk_src",
1326                .parent_data = gcc_parents_14,
1327                .num_parents = ARRAY_SIZE(gcc_parents_14),
1328                .flags = CLK_SET_RATE_PARENT,
1329                .ops = &clk_rcg2_ops,
1330        },
1331};
1332
1333static struct clk_branch gcc_ahb2phy_csi_clk = {
1334        .halt_reg = 0x1d004,
1335        .halt_check = BRANCH_HALT_DELAY,
1336        .hwcg_reg = 0x1d004,
1337        .hwcg_bit = 1,
1338        .clkr = {
1339                .enable_reg = 0x1d004,
1340                .enable_mask = BIT(0),
1341                .hw.init = &(struct clk_init_data){
1342                        .name = "gcc_ahb2phy_csi_clk",
1343                        .ops = &clk_branch2_ops,
1344                },
1345        },
1346};
1347
1348static struct clk_branch gcc_ahb2phy_usb_clk = {
1349        .halt_reg = 0x1d008,
1350        .halt_check = BRANCH_HALT,
1351        .hwcg_reg = 0x1d008,
1352        .hwcg_bit = 1,
1353        .clkr = {
1354                .enable_reg = 0x1d008,
1355                .enable_mask = BIT(0),
1356                .hw.init = &(struct clk_init_data){
1357                        .name = "gcc_ahb2phy_usb_clk",
1358                        .ops = &clk_branch2_ops,
1359                },
1360        },
1361};
1362
1363static struct clk_branch gcc_bimc_gpu_axi_clk = {
1364        .halt_reg = 0x71154,
1365        .halt_check = BRANCH_HALT_DELAY,
1366        .hwcg_reg = 0x71154,
1367        .hwcg_bit = 1,
1368        .clkr = {
1369                .enable_reg = 0x71154,
1370                .enable_mask = BIT(0),
1371                .hw.init = &(struct clk_init_data){
1372                        .name = "gcc_bimc_gpu_axi_clk",
1373                        .ops = &clk_branch2_ops,
1374                },
1375        },
1376};
1377
1378static struct clk_branch gcc_boot_rom_ahb_clk = {
1379        .halt_reg = 0x23004,
1380        .halt_check = BRANCH_HALT_VOTED,
1381        .hwcg_reg = 0x23004,
1382        .hwcg_bit = 1,
1383        .clkr = {
1384                .enable_reg = 0x79004,
1385                .enable_mask = BIT(10),
1386                .hw.init = &(struct clk_init_data){
1387                        .name = "gcc_boot_rom_ahb_clk",
1388                        .ops = &clk_branch2_ops,
1389                },
1390        },
1391};
1392
1393static struct clk_branch gcc_cam_throttle_nrt_clk = {
1394        .halt_reg = 0x17070,
1395        .halt_check = BRANCH_HALT_VOTED,
1396        .hwcg_reg = 0x17070,
1397        .hwcg_bit = 1,
1398        .clkr = {
1399                .enable_reg = 0x79004,
1400                .enable_mask = BIT(27),
1401                .hw.init = &(struct clk_init_data){
1402                        .name = "gcc_cam_throttle_nrt_clk",
1403                        .ops = &clk_branch2_ops,
1404                },
1405        },
1406};
1407
1408static struct clk_branch gcc_cam_throttle_rt_clk = {
1409        .halt_reg = 0x1706c,
1410        .halt_check = BRANCH_HALT_VOTED,
1411        .hwcg_reg = 0x1706c,
1412        .hwcg_bit = 1,
1413        .clkr = {
1414                .enable_reg = 0x79004,
1415                .enable_mask = BIT(26),
1416                .hw.init = &(struct clk_init_data){
1417                        .name = "gcc_cam_throttle_rt_clk",
1418                        .ops = &clk_branch2_ops,
1419                },
1420        },
1421};
1422
1423static struct clk_branch gcc_camera_ahb_clk = {
1424        .halt_reg = 0x17008,
1425        .halt_check = BRANCH_HALT_DELAY,
1426        .hwcg_reg = 0x17008,
1427        .hwcg_bit = 1,
1428        .clkr = {
1429                .enable_reg = 0x17008,
1430                .enable_mask = BIT(0),
1431                .hw.init = &(struct clk_init_data){
1432                        .name = "gcc_camera_ahb_clk",
1433                        .flags = CLK_IS_CRITICAL,
1434                        .ops = &clk_branch2_ops,
1435                },
1436        },
1437};
1438
1439static struct clk_branch gcc_camera_xo_clk = {
1440        .halt_reg = 0x17028,
1441        .halt_check = BRANCH_HALT,
1442        .clkr = {
1443                .enable_reg = 0x17028,
1444                .enable_mask = BIT(0),
1445                .hw.init = &(struct clk_init_data){
1446                        .name = "gcc_camera_xo_clk",
1447                        .flags = CLK_IS_CRITICAL,
1448                        .ops = &clk_branch2_ops,
1449                },
1450        },
1451};
1452
1453static struct clk_branch gcc_camss_axi_clk = {
1454        .halt_reg = 0x58044,
1455        .halt_check = BRANCH_HALT,
1456        .clkr = {
1457                .enable_reg = 0x58044,
1458                .enable_mask = BIT(0),
1459                .hw.init = &(struct clk_init_data){
1460                        .name = "gcc_camss_axi_clk",
1461                        .parent_hws = (const struct clk_hw *[])
1462                                        { &gcc_camss_axi_clk_src.clkr.hw },
1463                        .num_parents = 1,
1464                        .flags = CLK_SET_RATE_PARENT,
1465                        .ops = &clk_branch2_ops,
1466                },
1467        },
1468};
1469
1470static struct clk_branch gcc_camss_camnoc_atb_clk = {
1471        .halt_reg = 0x5804c,
1472        .halt_check = BRANCH_HALT_DELAY,
1473        .hwcg_reg = 0x5804c,
1474        .hwcg_bit = 1,
1475        .clkr = {
1476                .enable_reg = 0x5804c,
1477                .enable_mask = BIT(0),
1478                .hw.init = &(struct clk_init_data){
1479                        .name = "gcc_camss_camnoc_atb_clk",
1480                        .ops = &clk_branch2_ops,
1481                },
1482        },
1483};
1484
1485static struct clk_branch gcc_camss_camnoc_nts_xo_clk = {
1486        .halt_reg = 0x58050,
1487        .halt_check = BRANCH_HALT_DELAY,
1488        .hwcg_reg = 0x58050,
1489        .hwcg_bit = 1,
1490        .clkr = {
1491                .enable_reg = 0x58050,
1492                .enable_mask = BIT(0),
1493                .hw.init = &(struct clk_init_data){
1494                        .name = "gcc_camss_camnoc_nts_xo_clk",
1495                        .ops = &clk_branch2_ops,
1496                },
1497        },
1498};
1499
1500static struct clk_branch gcc_camss_cci_0_clk = {
1501        .halt_reg = 0x56018,
1502        .halt_check = BRANCH_HALT,
1503        .clkr = {
1504                .enable_reg = 0x56018,
1505                .enable_mask = BIT(0),
1506                .hw.init = &(struct clk_init_data){
1507                        .name = "gcc_camss_cci_0_clk",
1508                        .parent_hws = (const struct clk_hw *[])
1509                                        { &gcc_camss_cci_clk_src.clkr.hw },
1510                        .num_parents = 1,
1511                        .flags = CLK_SET_RATE_PARENT,
1512                        .ops = &clk_branch2_ops,
1513                },
1514        },
1515};
1516
1517static struct clk_branch gcc_camss_cphy_0_clk = {
1518        .halt_reg = 0x52088,
1519        .halt_check = BRANCH_HALT,
1520        .clkr = {
1521                .enable_reg = 0x52088,
1522                .enable_mask = BIT(0),
1523                .hw.init = &(struct clk_init_data){
1524                        .name = "gcc_camss_cphy_0_clk",
1525                        .parent_hws = (const struct clk_hw *[])
1526                                { &gcc_camss_tfe_cphy_rx_clk_src.clkr.hw },
1527                        .num_parents = 1,
1528                        .flags = CLK_SET_RATE_PARENT,
1529                        .ops = &clk_branch2_ops,
1530                },
1531        },
1532};
1533
1534static struct clk_branch gcc_camss_cphy_1_clk = {
1535        .halt_reg = 0x5208c,
1536        .halt_check = BRANCH_HALT,
1537        .clkr = {
1538                .enable_reg = 0x5208c,
1539                .enable_mask = BIT(0),
1540                .hw.init = &(struct clk_init_data){
1541                        .name = "gcc_camss_cphy_1_clk",
1542                        .parent_hws = (const struct clk_hw *[])
1543                                { &gcc_camss_tfe_cphy_rx_clk_src.clkr.hw },
1544                        .num_parents = 1,
1545                        .flags = CLK_SET_RATE_PARENT,
1546                        .ops = &clk_branch2_ops,
1547                },
1548        },
1549};
1550
1551static struct clk_branch gcc_camss_csi0phytimer_clk = {
1552        .halt_reg = 0x45018,
1553        .halt_check = BRANCH_HALT,
1554        .clkr = {
1555                .enable_reg = 0x45018,
1556                .enable_mask = BIT(0),
1557                .hw.init = &(struct clk_init_data){
1558                        .name = "gcc_camss_csi0phytimer_clk",
1559                        .parent_hws = (const struct clk_hw *[])
1560                                { &gcc_camss_csi0phytimer_clk_src.clkr.hw },
1561                        .num_parents = 1,
1562                        .flags = CLK_SET_RATE_PARENT,
1563                        .ops = &clk_branch2_ops,
1564                },
1565        },
1566};
1567
1568static struct clk_branch gcc_camss_csi1phytimer_clk = {
1569        .halt_reg = 0x45034,
1570        .halt_check = BRANCH_HALT,
1571        .clkr = {
1572                .enable_reg = 0x45034,
1573                .enable_mask = BIT(0),
1574                .hw.init = &(struct clk_init_data){
1575                        .name = "gcc_camss_csi1phytimer_clk",
1576                        .parent_hws = (const struct clk_hw *[])
1577                                { &gcc_camss_csi1phytimer_clk_src.clkr.hw },
1578                        .num_parents = 1,
1579                        .flags = CLK_SET_RATE_PARENT,
1580                        .ops = &clk_branch2_ops,
1581                },
1582        },
1583};
1584
1585static struct clk_branch gcc_camss_mclk0_clk = {
1586        .halt_reg = 0x51018,
1587        .halt_check = BRANCH_HALT,
1588        .clkr = {
1589                .enable_reg = 0x51018,
1590                .enable_mask = BIT(0),
1591                .hw.init = &(struct clk_init_data){
1592                        .name = "gcc_camss_mclk0_clk",
1593                        .parent_hws = (const struct clk_hw *[])
1594                                        { &gcc_camss_mclk0_clk_src.clkr.hw },
1595                        .num_parents = 1,
1596                        .flags = CLK_SET_RATE_PARENT,
1597                        .ops = &clk_branch2_ops,
1598                },
1599        },
1600};
1601
1602static struct clk_branch gcc_camss_mclk1_clk = {
1603        .halt_reg = 0x51034,
1604        .halt_check = BRANCH_HALT,
1605        .clkr = {
1606                .enable_reg = 0x51034,
1607                .enable_mask = BIT(0),
1608                .hw.init = &(struct clk_init_data){
1609                        .name = "gcc_camss_mclk1_clk",
1610                        .parent_hws = (const struct clk_hw *[])
1611                                        { &gcc_camss_mclk1_clk_src.clkr.hw },
1612                        .num_parents = 1,
1613                        .flags = CLK_SET_RATE_PARENT,
1614                        .ops = &clk_branch2_ops,
1615                },
1616        },
1617};
1618
1619static struct clk_branch gcc_camss_mclk2_clk = {
1620        .halt_reg = 0x51050,
1621        .halt_check = BRANCH_HALT,
1622        .clkr = {
1623                .enable_reg = 0x51050,
1624                .enable_mask = BIT(0),
1625                .hw.init = &(struct clk_init_data){
1626                        .name = "gcc_camss_mclk2_clk",
1627                        .parent_hws = (const struct clk_hw *[])
1628                                        { &gcc_camss_mclk2_clk_src.clkr.hw },
1629                        .num_parents = 1,
1630                        .flags = CLK_SET_RATE_PARENT,
1631                        .ops = &clk_branch2_ops,
1632                },
1633        },
1634};
1635
1636static struct clk_branch gcc_camss_mclk3_clk = {
1637        .halt_reg = 0x5106c,
1638        .halt_check = BRANCH_HALT,
1639        .clkr = {
1640                .enable_reg = 0x5106c,
1641                .enable_mask = BIT(0),
1642                .hw.init = &(struct clk_init_data){
1643                        .name = "gcc_camss_mclk3_clk",
1644                        .parent_hws = (const struct clk_hw *[])
1645                                        { &gcc_camss_mclk3_clk_src.clkr.hw },
1646                        .num_parents = 1,
1647                        .flags = CLK_SET_RATE_PARENT,
1648                        .ops = &clk_branch2_ops,
1649                },
1650        },
1651};
1652
1653static struct clk_branch gcc_camss_nrt_axi_clk = {
1654        .halt_reg = 0x58054,
1655        .halt_check = BRANCH_HALT,
1656        .clkr = {
1657                .enable_reg = 0x58054,
1658                .enable_mask = BIT(0),
1659                .hw.init = &(struct clk_init_data){
1660                        .name = "gcc_camss_nrt_axi_clk",
1661                        .ops = &clk_branch2_ops,
1662                },
1663        },
1664};
1665
1666static struct clk_branch gcc_camss_ope_ahb_clk = {
1667        .halt_reg = 0x5503c,
1668        .halt_check = BRANCH_HALT,
1669        .clkr = {
1670                .enable_reg = 0x5503c,
1671                .enable_mask = BIT(0),
1672                .hw.init = &(struct clk_init_data){
1673                        .name = "gcc_camss_ope_ahb_clk",
1674                        .parent_hws = (const struct clk_hw *[])
1675                                        { &gcc_camss_ope_ahb_clk_src.clkr.hw },
1676                        .num_parents = 1,
1677                        .flags = CLK_SET_RATE_PARENT,
1678                        .ops = &clk_branch2_ops,
1679                },
1680        },
1681};
1682
1683static struct clk_branch gcc_camss_ope_clk = {
1684        .halt_reg = 0x5501c,
1685        .halt_check = BRANCH_HALT,
1686        .clkr = {
1687                .enable_reg = 0x5501c,
1688                .enable_mask = BIT(0),
1689                .hw.init = &(struct clk_init_data){
1690                        .name = "gcc_camss_ope_clk",
1691                        .parent_hws = (const struct clk_hw *[])
1692                                        { &gcc_camss_ope_clk_src.clkr.hw },
1693                        .num_parents = 1,
1694                        .flags = CLK_SET_RATE_PARENT,
1695                        .ops = &clk_branch2_ops,
1696                },
1697        },
1698};
1699
1700static struct clk_branch gcc_camss_rt_axi_clk = {
1701        .halt_reg = 0x5805c,
1702        .halt_check = BRANCH_HALT,
1703        .clkr = {
1704                .enable_reg = 0x5805c,
1705                .enable_mask = BIT(0),
1706                .hw.init = &(struct clk_init_data){
1707                        .name = "gcc_camss_rt_axi_clk",
1708                        .ops = &clk_branch2_ops,
1709                },
1710        },
1711};
1712
1713static struct clk_branch gcc_camss_tfe_0_clk = {
1714        .halt_reg = 0x5201c,
1715        .halt_check = BRANCH_HALT,
1716        .clkr = {
1717                .enable_reg = 0x5201c,
1718                .enable_mask = BIT(0),
1719                .hw.init = &(struct clk_init_data){
1720                        .name = "gcc_camss_tfe_0_clk",
1721                        .parent_hws = (const struct clk_hw *[])
1722                                        { &gcc_camss_tfe_0_clk_src.clkr.hw },
1723                        .num_parents = 1,
1724                        .flags = CLK_SET_RATE_PARENT,
1725                        .ops = &clk_branch2_ops,
1726                },
1727        },
1728};
1729
1730static struct clk_branch gcc_camss_tfe_0_cphy_rx_clk = {
1731        .halt_reg = 0x5207c,
1732        .halt_check = BRANCH_HALT,
1733        .clkr = {
1734                .enable_reg = 0x5207c,
1735                .enable_mask = BIT(0),
1736                .hw.init = &(struct clk_init_data){
1737                        .name = "gcc_camss_tfe_0_cphy_rx_clk",
1738                        .parent_hws = (const struct clk_hw *[])
1739                                { &gcc_camss_tfe_cphy_rx_clk_src.clkr.hw },
1740                        .num_parents = 1,
1741                        .flags = CLK_SET_RATE_PARENT,
1742                        .ops = &clk_branch2_ops,
1743                },
1744        },
1745};
1746
1747static struct clk_branch gcc_camss_tfe_0_csid_clk = {
1748        .halt_reg = 0x520ac,
1749        .halt_check = BRANCH_HALT,
1750        .clkr = {
1751                .enable_reg = 0x520ac,
1752                .enable_mask = BIT(0),
1753                .hw.init = &(struct clk_init_data){
1754                        .name = "gcc_camss_tfe_0_csid_clk",
1755                        .parent_hws = (const struct clk_hw *[])
1756                                { &gcc_camss_tfe_0_csid_clk_src.clkr.hw },
1757                        .num_parents = 1,
1758                        .flags = CLK_SET_RATE_PARENT,
1759                        .ops = &clk_branch2_ops,
1760                },
1761        },
1762};
1763
1764static struct clk_branch gcc_camss_tfe_1_clk = {
1765        .halt_reg = 0x5203c,
1766        .halt_check = BRANCH_HALT,
1767        .clkr = {
1768                .enable_reg = 0x5203c,
1769                .enable_mask = BIT(0),
1770                .hw.init = &(struct clk_init_data){
1771                        .name = "gcc_camss_tfe_1_clk",
1772                        .parent_hws = (const struct clk_hw *[])
1773                                        { &gcc_camss_tfe_1_clk_src.clkr.hw },
1774                        .num_parents = 1,
1775                        .flags = CLK_SET_RATE_PARENT,
1776                        .ops = &clk_branch2_ops,
1777                },
1778        },
1779};
1780
1781static struct clk_branch gcc_camss_tfe_1_cphy_rx_clk = {
1782        .halt_reg = 0x52080,
1783        .halt_check = BRANCH_HALT,
1784        .clkr = {
1785                .enable_reg = 0x52080,
1786                .enable_mask = BIT(0),
1787                .hw.init = &(struct clk_init_data){
1788                        .name = "gcc_camss_tfe_1_cphy_rx_clk",
1789                        .parent_hws = (const struct clk_hw *[])
1790                                { &gcc_camss_tfe_cphy_rx_clk_src.clkr.hw },
1791                        .num_parents = 1,
1792                        .flags = CLK_SET_RATE_PARENT,
1793                        .ops = &clk_branch2_ops,
1794                },
1795        },
1796};
1797
1798static struct clk_branch gcc_camss_tfe_1_csid_clk = {
1799        .halt_reg = 0x520cc,
1800        .halt_check = BRANCH_HALT,
1801        .clkr = {
1802                .enable_reg = 0x520cc,
1803                .enable_mask = BIT(0),
1804                .hw.init = &(struct clk_init_data){
1805                        .name = "gcc_camss_tfe_1_csid_clk",
1806                        .parent_hws = (const struct clk_hw *[])
1807                                { &gcc_camss_tfe_1_csid_clk_src.clkr.hw },
1808                        .num_parents = 1,
1809                        .flags = CLK_SET_RATE_PARENT,
1810                        .ops = &clk_branch2_ops,
1811                },
1812        },
1813};
1814
1815static struct clk_branch gcc_camss_top_ahb_clk = {
1816        .halt_reg = 0x58028,
1817        .halt_check = BRANCH_HALT,
1818        .clkr = {
1819                .enable_reg = 0x58028,
1820                .enable_mask = BIT(0),
1821                .hw.init = &(struct clk_init_data){
1822                        .name = "gcc_camss_top_ahb_clk",
1823                        .parent_hws = (const struct clk_hw *[])
1824                                        { &gcc_camss_top_ahb_clk_src.clkr.hw },
1825                        .num_parents = 1,
1826                        .flags = CLK_SET_RATE_PARENT,
1827                        .ops = &clk_branch2_ops,
1828                },
1829        },
1830};
1831
1832static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = {
1833        .halt_reg = 0x1a084,
1834        .halt_check = BRANCH_HALT,
1835        .hwcg_reg = 0x1a084,
1836        .hwcg_bit = 1,
1837        .clkr = {
1838                .enable_reg = 0x1a084,
1839                .enable_mask = BIT(0),
1840                .hw.init = &(struct clk_init_data){
1841                        .name = "gcc_cfg_noc_usb3_prim_axi_clk",
1842                        .parent_hws = (const struct clk_hw *[])
1843                                { &gcc_usb30_prim_master_clk_src.clkr.hw },
1844                        .num_parents = 1,
1845                        .flags = CLK_SET_RATE_PARENT,
1846                        .ops = &clk_branch2_ops,
1847                },
1848        },
1849};
1850
1851static struct clk_branch gcc_disp_ahb_clk = {
1852        .halt_reg = 0x1700c,
1853        .halt_check = BRANCH_HALT,
1854        .hwcg_reg = 0x1700c,
1855        .hwcg_bit = 1,
1856        .clkr = {
1857                .enable_reg = 0x1700c,
1858                .enable_mask = BIT(0),
1859                .hw.init = &(struct clk_init_data){
1860                        .name = "gcc_disp_ahb_clk",
1861                        .flags = CLK_IS_CRITICAL,
1862                        .ops = &clk_branch2_ops,
1863                },
1864        },
1865};
1866
1867static struct clk_regmap_div gcc_disp_gpll0_clk_src = {
1868        .reg = 0x17058,
1869        .shift = 0,
1870        .width = 2,
1871        .clkr.hw.init = &(struct clk_init_data) {
1872                .name = "gcc_disp_gpll0_clk_src",
1873                .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
1874                .num_parents = 1,
1875                .ops = &clk_regmap_div_ops,
1876        },
1877};
1878
1879static struct clk_branch gcc_disp_gpll0_div_clk_src = {
1880        .halt_check = BRANCH_HALT_DELAY,
1881        .clkr = {
1882                .enable_reg = 0x79004,
1883                .enable_mask = BIT(20),
1884                .hw.init = &(struct clk_init_data){
1885                        .name = "gcc_disp_gpll0_div_clk_src",
1886                        .parent_hws = (const struct clk_hw *[])
1887                                        { &gcc_disp_gpll0_clk_src.clkr.hw },
1888                        .num_parents = 1,
1889                        .flags = CLK_SET_RATE_PARENT,
1890                        .ops = &clk_branch2_ops,
1891                },
1892        },
1893};
1894
1895static struct clk_branch gcc_disp_hf_axi_clk = {
1896        .halt_reg = 0x17020,
1897        .halt_check = BRANCH_HALT,
1898        .hwcg_reg = 0x17020,
1899        .hwcg_bit = 1,
1900        .clkr = {
1901                .enable_reg = 0x17020,
1902                .enable_mask = BIT(0),
1903                .hw.init = &(struct clk_init_data){
1904                        .name = "gcc_disp_hf_axi_clk",
1905                        .ops = &clk_branch2_ops,
1906                },
1907        },
1908};
1909
1910static struct clk_branch gcc_disp_throttle_core_clk = {
1911        .halt_reg = 0x17064,
1912        .halt_check = BRANCH_HALT_VOTED,
1913        .hwcg_reg = 0x17064,
1914        .hwcg_bit = 1,
1915        .clkr = {
1916                .enable_reg = 0x7900c,
1917                .enable_mask = BIT(5),
1918                .hw.init = &(struct clk_init_data){
1919                        .name = "gcc_disp_throttle_core_clk",
1920                        .ops = &clk_branch2_ops,
1921                },
1922        },
1923};
1924
1925static struct clk_branch gcc_disp_xo_clk = {
1926        .halt_reg = 0x1702c,
1927        .halt_check = BRANCH_HALT,
1928        .clkr = {
1929                .enable_reg = 0x1702c,
1930                .enable_mask = BIT(0),
1931                .hw.init = &(struct clk_init_data){
1932                        .name = "gcc_disp_xo_clk",
1933                        .flags = CLK_IS_CRITICAL,
1934                        .ops = &clk_branch2_ops,
1935                },
1936        },
1937};
1938
1939static struct clk_branch gcc_gp1_clk = {
1940        .halt_reg = 0x4d000,
1941        .halt_check = BRANCH_HALT,
1942        .clkr = {
1943                .enable_reg = 0x4d000,
1944                .enable_mask = BIT(0),
1945                .hw.init = &(struct clk_init_data){
1946                        .name = "gcc_gp1_clk",
1947                        .parent_hws = (const struct clk_hw *[])
1948                                        { &gcc_gp1_clk_src.clkr.hw },
1949                        .num_parents = 1,
1950                        .flags = CLK_SET_RATE_PARENT,
1951                        .ops = &clk_branch2_ops,
1952                },
1953        },
1954};
1955
1956static struct clk_branch gcc_gp2_clk = {
1957        .halt_reg = 0x4e000,
1958        .halt_check = BRANCH_HALT,
1959        .clkr = {
1960                .enable_reg = 0x4e000,
1961                .enable_mask = BIT(0),
1962                .hw.init = &(struct clk_init_data){
1963                        .name = "gcc_gp2_clk",
1964                        .parent_hws = (const struct clk_hw *[])
1965                                        { &gcc_gp2_clk_src.clkr.hw },
1966                        .num_parents = 1,
1967                        .flags = CLK_SET_RATE_PARENT,
1968                        .ops = &clk_branch2_ops,
1969                },
1970        },
1971};
1972
1973static struct clk_branch gcc_gp3_clk = {
1974        .halt_reg = 0x4f000,
1975        .halt_check = BRANCH_HALT,
1976        .clkr = {
1977                .enable_reg = 0x4f000,
1978                .enable_mask = BIT(0),
1979                .hw.init = &(struct clk_init_data){
1980                        .name = "gcc_gp3_clk",
1981                        .parent_hws = (const struct clk_hw *[])
1982                                        { &gcc_gp3_clk_src.clkr.hw },
1983                        .num_parents = 1,
1984                        .flags = CLK_SET_RATE_PARENT,
1985                        .ops = &clk_branch2_ops,
1986                },
1987        },
1988};
1989
1990static struct clk_branch gcc_gpu_cfg_ahb_clk = {
1991        .halt_reg = 0x36004,
1992        .halt_check = BRANCH_HALT,
1993        .hwcg_reg = 0x36004,
1994        .hwcg_bit = 1,
1995        .clkr = {
1996                .enable_reg = 0x36004,
1997                .enable_mask = BIT(0),
1998                .hw.init = &(struct clk_init_data){
1999                        .name = "gcc_gpu_cfg_ahb_clk",
2000                        .flags = CLK_IS_CRITICAL,
2001                        .ops = &clk_branch2_ops,
2002                },
2003        },
2004};
2005
2006static struct clk_branch gcc_gpu_gpll0_clk_src = {
2007        .halt_check = BRANCH_HALT_DELAY,
2008        .clkr = {
2009                .enable_reg = 0x79004,
2010                .enable_mask = BIT(15),
2011                .hw.init = &(struct clk_init_data){
2012                        .name = "gcc_gpu_gpll0_clk_src",
2013                        .parent_hws = (const struct clk_hw *[])
2014                                        { &gpll0.clkr.hw },
2015                        .num_parents = 1,
2016                        .flags = CLK_SET_RATE_PARENT,
2017                        .ops = &clk_branch2_ops,
2018                },
2019        },
2020};
2021
2022static struct clk_branch gcc_gpu_gpll0_div_clk_src = {
2023        .halt_check = BRANCH_HALT_DELAY,
2024        .clkr = {
2025                .enable_reg = 0x79004,
2026                .enable_mask = BIT(16),
2027                .hw.init = &(struct clk_init_data){
2028                        .name = "gcc_gpu_gpll0_div_clk_src",
2029                        .parent_hws = (const struct clk_hw *[])
2030                                        { &gpll0_out_aux2.clkr.hw },
2031                        .num_parents = 1,
2032                        .flags = CLK_SET_RATE_PARENT,
2033                        .ops = &clk_branch2_ops,
2034                },
2035        },
2036};
2037
2038static struct clk_branch gcc_gpu_iref_clk = {
2039        .halt_reg = 0x36100,
2040        .halt_check = BRANCH_HALT_DELAY,
2041        .clkr = {
2042                .enable_reg = 0x36100,
2043                .enable_mask = BIT(0),
2044                .hw.init = &(struct clk_init_data){
2045                        .name = "gcc_gpu_iref_clk",
2046                        .ops = &clk_branch2_ops,
2047                },
2048        },
2049};
2050
2051static struct clk_branch gcc_gpu_memnoc_gfx_clk = {
2052        .halt_reg = 0x3600c,
2053        .halt_check = BRANCH_VOTED,
2054        .hwcg_reg = 0x3600c,
2055        .hwcg_bit = 1,
2056        .clkr = {
2057                .enable_reg = 0x3600c,
2058                .enable_mask = BIT(0),
2059                .hw.init = &(struct clk_init_data){
2060                        .name = "gcc_gpu_memnoc_gfx_clk",
2061                        .ops = &clk_branch2_ops,
2062                },
2063        },
2064};
2065
2066static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = {
2067        .halt_reg = 0x36018,
2068        .halt_check = BRANCH_HALT,
2069        .clkr = {
2070                .enable_reg = 0x36018,
2071                .enable_mask = BIT(0),
2072                .hw.init = &(struct clk_init_data){
2073                        .name = "gcc_gpu_snoc_dvm_gfx_clk",
2074                        .ops = &clk_branch2_ops,
2075                },
2076        },
2077};
2078
2079static struct clk_branch gcc_gpu_throttle_core_clk = {
2080        .halt_reg = 0x36048,
2081        .halt_check = BRANCH_HALT_VOTED,
2082        .hwcg_reg = 0x36048,
2083        .hwcg_bit = 1,
2084        .clkr = {
2085                .enable_reg = 0x79004,
2086                .enable_mask = BIT(31),
2087                .hw.init = &(struct clk_init_data){
2088                        .name = "gcc_gpu_throttle_core_clk",
2089                        .flags = CLK_SET_RATE_PARENT,
2090                        .ops = &clk_branch2_ops,
2091                },
2092        },
2093};
2094
2095static struct clk_branch gcc_pdm2_clk = {
2096        .halt_reg = 0x2000c,
2097        .halt_check = BRANCH_HALT,
2098        .clkr = {
2099                .enable_reg = 0x2000c,
2100                .enable_mask = BIT(0),
2101                .hw.init = &(struct clk_init_data){
2102                        .name = "gcc_pdm2_clk",
2103                        .parent_hws = (const struct clk_hw *[])
2104                                        { &gcc_pdm2_clk_src.clkr.hw },
2105                        .num_parents = 1,
2106                        .flags = CLK_SET_RATE_PARENT,
2107                        .ops = &clk_branch2_ops,
2108                },
2109        },
2110};
2111
2112static struct clk_branch gcc_pdm_ahb_clk = {
2113        .halt_reg = 0x20004,
2114        .halt_check = BRANCH_HALT,
2115        .hwcg_reg = 0x20004,
2116        .hwcg_bit = 1,
2117        .clkr = {
2118                .enable_reg = 0x20004,
2119                .enable_mask = BIT(0),
2120                .hw.init = &(struct clk_init_data){
2121                        .name = "gcc_pdm_ahb_clk",
2122                        .ops = &clk_branch2_ops,
2123                },
2124        },
2125};
2126
2127static struct clk_branch gcc_pdm_xo4_clk = {
2128        .halt_reg = 0x20008,
2129        .halt_check = BRANCH_HALT,
2130        .clkr = {
2131                .enable_reg = 0x20008,
2132                .enable_mask = BIT(0),
2133                .hw.init = &(struct clk_init_data){
2134                        .name = "gcc_pdm_xo4_clk",
2135                        .ops = &clk_branch2_ops,
2136                },
2137        },
2138};
2139
2140static struct clk_branch gcc_pwm0_xo512_clk = {
2141        .halt_reg = 0x2002c,
2142        .halt_check = BRANCH_HALT,
2143        .clkr = {
2144                .enable_reg = 0x2002c,
2145                .enable_mask = BIT(0),
2146                .hw.init = &(struct clk_init_data){
2147                        .name = "gcc_pwm0_xo512_clk",
2148                        .ops = &clk_branch2_ops,
2149                },
2150        },
2151};
2152
2153static struct clk_branch gcc_qmip_camera_nrt_ahb_clk = {
2154        .halt_reg = 0x17014,
2155        .halt_check = BRANCH_HALT_VOTED,
2156        .hwcg_reg = 0x17014,
2157        .hwcg_bit = 1,
2158        .clkr = {
2159                .enable_reg = 0x7900c,
2160                .enable_mask = BIT(0),
2161                .hw.init = &(struct clk_init_data){
2162                        .name = "gcc_qmip_camera_nrt_ahb_clk",
2163                        .ops = &clk_branch2_ops,
2164                },
2165        },
2166};
2167
2168static struct clk_branch gcc_qmip_camera_rt_ahb_clk = {
2169        .halt_reg = 0x17060,
2170        .halt_check = BRANCH_HALT_VOTED,
2171        .hwcg_reg = 0x17060,
2172        .hwcg_bit = 1,
2173        .clkr = {
2174                .enable_reg = 0x7900c,
2175                .enable_mask = BIT(2),
2176                .hw.init = &(struct clk_init_data){
2177                        .name = "gcc_qmip_camera_rt_ahb_clk",
2178                        .ops = &clk_branch2_ops,
2179                },
2180        },
2181};
2182
2183static struct clk_branch gcc_qmip_disp_ahb_clk = {
2184        .halt_reg = 0x17018,
2185        .halt_check = BRANCH_HALT_VOTED,
2186        .hwcg_reg = 0x17018,
2187        .hwcg_bit = 1,
2188        .clkr = {
2189                .enable_reg = 0x7900c,
2190                .enable_mask = BIT(1),
2191                .hw.init = &(struct clk_init_data){
2192                        .name = "gcc_qmip_disp_ahb_clk",
2193                        .ops = &clk_branch2_ops,
2194                },
2195        },
2196};
2197
2198static struct clk_branch gcc_qmip_gpu_cfg_ahb_clk = {
2199        .halt_reg = 0x36040,
2200        .halt_check = BRANCH_HALT_VOTED,
2201        .hwcg_reg = 0x36040,
2202        .hwcg_bit = 1,
2203        .clkr = {
2204                .enable_reg = 0x7900c,
2205                .enable_mask = BIT(4),
2206                .hw.init = &(struct clk_init_data){
2207                        .name = "gcc_qmip_gpu_cfg_ahb_clk",
2208                        .ops = &clk_branch2_ops,
2209                },
2210        },
2211};
2212
2213static struct clk_branch gcc_qmip_video_vcodec_ahb_clk = {
2214        .halt_reg = 0x17010,
2215        .halt_check = BRANCH_HALT_VOTED,
2216        .hwcg_reg = 0x17010,
2217        .hwcg_bit = 1,
2218        .clkr = {
2219                .enable_reg = 0x79004,
2220                .enable_mask = BIT(25),
2221                .hw.init = &(struct clk_init_data){
2222                        .name = "gcc_qmip_video_vcodec_ahb_clk",
2223                        .ops = &clk_branch2_ops,
2224                },
2225        },
2226};
2227
2228static struct clk_branch gcc_qupv3_wrap0_core_2x_clk = {
2229        .halt_reg = 0x1f014,
2230        .halt_check = BRANCH_HALT_VOTED,
2231        .clkr = {
2232                .enable_reg = 0x7900c,
2233                .enable_mask = BIT(9),
2234                .hw.init = &(struct clk_init_data){
2235                        .name = "gcc_qupv3_wrap0_core_2x_clk",
2236                        .ops = &clk_branch2_ops,
2237                },
2238        },
2239};
2240
2241static struct clk_branch gcc_qupv3_wrap0_core_clk = {
2242        .halt_reg = 0x1f00c,
2243        .halt_check = BRANCH_HALT_VOTED,
2244        .clkr = {
2245                .enable_reg = 0x7900c,
2246                .enable_mask = BIT(8),
2247                .hw.init = &(struct clk_init_data){
2248                        .name = "gcc_qupv3_wrap0_core_clk",
2249                        .ops = &clk_branch2_ops,
2250                },
2251        },
2252};
2253
2254static struct clk_branch gcc_qupv3_wrap0_s0_clk = {
2255        .halt_reg = 0x1f144,
2256        .halt_check = BRANCH_HALT_VOTED,
2257        .clkr = {
2258                .enable_reg = 0x7900c,
2259                .enable_mask = BIT(10),
2260                .hw.init = &(struct clk_init_data){
2261                        .name = "gcc_qupv3_wrap0_s0_clk",
2262                        .parent_hws = (const struct clk_hw *[])
2263                                        { &gcc_qupv3_wrap0_s0_clk_src.clkr.hw },
2264                        .num_parents = 1,
2265                        .flags = CLK_SET_RATE_PARENT,
2266                        .ops = &clk_branch2_ops,
2267                },
2268        },
2269};
2270
2271static struct clk_branch gcc_qupv3_wrap0_s1_clk = {
2272        .halt_reg = 0x1f274,
2273        .halt_check = BRANCH_HALT_VOTED,
2274        .clkr = {
2275                .enable_reg = 0x7900c,
2276                .enable_mask = BIT(11),
2277                .hw.init = &(struct clk_init_data){
2278                        .name = "gcc_qupv3_wrap0_s1_clk",
2279                        .parent_hws = (const struct clk_hw *[])
2280                                        { &gcc_qupv3_wrap0_s1_clk_src.clkr.hw },
2281                        .num_parents = 1,
2282                        .flags = CLK_SET_RATE_PARENT,
2283                        .ops = &clk_branch2_ops,
2284                },
2285        },
2286};
2287
2288static struct clk_branch gcc_qupv3_wrap0_s2_clk = {
2289        .halt_reg = 0x1f3a4,
2290        .halt_check = BRANCH_HALT_VOTED,
2291        .clkr = {
2292                .enable_reg = 0x7900c,
2293                .enable_mask = BIT(12),
2294                .hw.init = &(struct clk_init_data){
2295                        .name = "gcc_qupv3_wrap0_s2_clk",
2296                        .parent_hws = (const struct clk_hw *[])
2297                                        { &gcc_qupv3_wrap0_s2_clk_src.clkr.hw },
2298                        .num_parents = 1,
2299                        .flags = CLK_SET_RATE_PARENT,
2300                        .ops = &clk_branch2_ops,
2301                },
2302        },
2303};
2304
2305static struct clk_branch gcc_qupv3_wrap0_s3_clk = {
2306        .halt_reg = 0x1f4d4,
2307        .halt_check = BRANCH_HALT_VOTED,
2308        .clkr = {
2309                .enable_reg = 0x7900c,
2310                .enable_mask = BIT(13),
2311                .hw.init = &(struct clk_init_data){
2312                        .name = "gcc_qupv3_wrap0_s3_clk",
2313                        .parent_hws = (const struct clk_hw *[])
2314                                        { &gcc_qupv3_wrap0_s3_clk_src.clkr.hw },
2315                        .num_parents = 1,
2316                        .flags = CLK_SET_RATE_PARENT,
2317                        .ops = &clk_branch2_ops,
2318                },
2319        },
2320};
2321
2322static struct clk_branch gcc_qupv3_wrap0_s4_clk = {
2323        .halt_reg = 0x1f604,
2324        .halt_check = BRANCH_HALT_VOTED,
2325        .clkr = {
2326                .enable_reg = 0x7900c,
2327                .enable_mask = BIT(14),
2328                .hw.init = &(struct clk_init_data){
2329                        .name = "gcc_qupv3_wrap0_s4_clk",
2330                        .parent_hws = (const struct clk_hw *[])
2331                                        { &gcc_qupv3_wrap0_s4_clk_src.clkr.hw },
2332                        .num_parents = 1,
2333                        .flags = CLK_SET_RATE_PARENT,
2334                        .ops = &clk_branch2_ops,
2335                },
2336        },
2337};
2338
2339static struct clk_branch gcc_qupv3_wrap0_s5_clk = {
2340        .halt_reg = 0x1f734,
2341        .halt_check = BRANCH_HALT_VOTED,
2342        .clkr = {
2343                .enable_reg = 0x7900c,
2344                .enable_mask = BIT(15),
2345                .hw.init = &(struct clk_init_data){
2346                        .name = "gcc_qupv3_wrap0_s5_clk",
2347                        .parent_hws = (const struct clk_hw *[])
2348                                        { &gcc_qupv3_wrap0_s5_clk_src.clkr.hw },
2349                        .num_parents = 1,
2350                        .flags = CLK_SET_RATE_PARENT,
2351                        .ops = &clk_branch2_ops,
2352                },
2353        },
2354};
2355
2356static struct clk_branch gcc_qupv3_wrap_0_m_ahb_clk = {
2357        .halt_reg = 0x1f004,
2358        .halt_check = BRANCH_HALT_VOTED,
2359        .hwcg_reg = 0x1f004,
2360        .hwcg_bit = 1,
2361        .clkr = {
2362                .enable_reg = 0x7900c,
2363                .enable_mask = BIT(6),
2364                .hw.init = &(struct clk_init_data){
2365                        .name = "gcc_qupv3_wrap_0_m_ahb_clk",
2366                        .ops = &clk_branch2_ops,
2367                },
2368        },
2369};
2370
2371static struct clk_branch gcc_qupv3_wrap_0_s_ahb_clk = {
2372        .halt_reg = 0x1f008,
2373        .halt_check = BRANCH_HALT_VOTED,
2374        .hwcg_reg = 0x1f008,
2375        .hwcg_bit = 1,
2376        .clkr = {
2377                .enable_reg = 0x7900c,
2378                .enable_mask = BIT(7),
2379                .hw.init = &(struct clk_init_data){
2380                        .name = "gcc_qupv3_wrap_0_s_ahb_clk",
2381                        .ops = &clk_branch2_ops,
2382                },
2383        },
2384};
2385
2386static struct clk_branch gcc_sdcc1_ahb_clk = {
2387        .halt_reg = 0x38008,
2388        .halt_check = BRANCH_HALT,
2389        .clkr = {
2390                .enable_reg = 0x38008,
2391                .enable_mask = BIT(0),
2392                .hw.init = &(struct clk_init_data){
2393                        .name = "gcc_sdcc1_ahb_clk",
2394                        .ops = &clk_branch2_ops,
2395                },
2396        },
2397};
2398
2399static struct clk_branch gcc_sdcc1_apps_clk = {
2400        .halt_reg = 0x38004,
2401        .halt_check = BRANCH_HALT,
2402        .clkr = {
2403                .enable_reg = 0x38004,
2404                .enable_mask = BIT(0),
2405                .hw.init = &(struct clk_init_data){
2406                        .name = "gcc_sdcc1_apps_clk",
2407                        .parent_hws = (const struct clk_hw *[])
2408                                        { &gcc_sdcc1_apps_clk_src.clkr.hw },
2409                        .num_parents = 1,
2410                        .flags = CLK_SET_RATE_PARENT,
2411                        .ops = &clk_branch2_ops,
2412                },
2413        },
2414};
2415
2416static struct clk_branch gcc_sdcc1_ice_core_clk = {
2417        .halt_reg = 0x3800c,
2418        .halt_check = BRANCH_HALT,
2419        .hwcg_reg = 0x3800c,
2420        .hwcg_bit = 1,
2421        .clkr = {
2422                .enable_reg = 0x3800c,
2423                .enable_mask = BIT(0),
2424                .hw.init = &(struct clk_init_data){
2425                        .name = "gcc_sdcc1_ice_core_clk",
2426                        .parent_hws = (const struct clk_hw *[])
2427                                        { &gcc_sdcc1_ice_core_clk_src.clkr.hw },
2428                        .num_parents = 1,
2429                        .flags = CLK_SET_RATE_PARENT,
2430                        .ops = &clk_branch2_ops,
2431                },
2432        },
2433};
2434
2435static struct clk_branch gcc_sdcc2_ahb_clk = {
2436        .halt_reg = 0x1e008,
2437        .halt_check = BRANCH_HALT,
2438        .clkr = {
2439                .enable_reg = 0x1e008,
2440                .enable_mask = BIT(0),
2441                .hw.init = &(struct clk_init_data){
2442                        .name = "gcc_sdcc2_ahb_clk",
2443                        .ops = &clk_branch2_ops,
2444                },
2445        },
2446};
2447
2448static struct clk_branch gcc_sdcc2_apps_clk = {
2449        .halt_reg = 0x1e004,
2450        .halt_check = BRANCH_HALT,
2451        .clkr = {
2452                .enable_reg = 0x1e004,
2453                .enable_mask = BIT(0),
2454                .hw.init = &(struct clk_init_data){
2455                        .name = "gcc_sdcc2_apps_clk",
2456                        .parent_hws = (const struct clk_hw *[])
2457                                        { &gcc_sdcc2_apps_clk_src.clkr.hw },
2458                        .num_parents = 1,
2459                        .flags = CLK_SET_RATE_PARENT,
2460                        .ops = &clk_branch2_ops,
2461                },
2462        },
2463};
2464
2465static struct clk_branch gcc_sys_noc_cpuss_ahb_clk = {
2466        .halt_reg = 0x2b06c,
2467        .halt_check = BRANCH_HALT_VOTED,
2468        .hwcg_reg = 0x2b06c,
2469        .hwcg_bit = 1,
2470        .clkr = {
2471                .enable_reg = 0x79004,
2472                .enable_mask = BIT(0),
2473                .hw.init = &(struct clk_init_data){
2474                        .name = "gcc_sys_noc_cpuss_ahb_clk",
2475                        .flags = CLK_IS_CRITICAL,
2476                        .ops = &clk_branch2_ops,
2477                },
2478        },
2479};
2480
2481static struct clk_branch gcc_sys_noc_usb3_prim_axi_clk = {
2482        .halt_reg = 0x1a080,
2483        .halt_check = BRANCH_HALT,
2484        .hwcg_reg = 0x1a080,
2485        .hwcg_bit = 1,
2486        .clkr = {
2487                .enable_reg = 0x1a080,
2488                .enable_mask = BIT(0),
2489                .hw.init = &(struct clk_init_data){
2490                        .name = "gcc_sys_noc_usb3_prim_axi_clk",
2491                        .parent_hws = (const struct clk_hw *[])
2492                                { &gcc_usb30_prim_master_clk_src.clkr.hw },
2493                        .num_parents = 1,
2494                        .flags = CLK_SET_RATE_PARENT,
2495                        .ops = &clk_branch2_ops,
2496                },
2497        },
2498};
2499
2500static struct clk_branch gcc_usb30_prim_master_clk = {
2501        .halt_reg = 0x1a010,
2502        .halt_check = BRANCH_HALT,
2503        .clkr = {
2504                .enable_reg = 0x1a010,
2505                .enable_mask = BIT(0),
2506                .hw.init = &(struct clk_init_data){
2507                        .name = "gcc_usb30_prim_master_clk",
2508                        .parent_hws = (const struct clk_hw *[])
2509                                { &gcc_usb30_prim_master_clk_src.clkr.hw },
2510                        .num_parents = 1,
2511                        .flags = CLK_SET_RATE_PARENT,
2512                        .ops = &clk_branch2_ops,
2513                },
2514        },
2515};
2516
2517static struct clk_branch gcc_usb30_prim_mock_utmi_clk = {
2518        .halt_reg = 0x1a018,
2519        .halt_check = BRANCH_HALT,
2520        .clkr = {
2521                .enable_reg = 0x1a018,
2522                .enable_mask = BIT(0),
2523                .hw.init = &(struct clk_init_data){
2524                        .name = "gcc_usb30_prim_mock_utmi_clk",
2525                        .parent_hws = (const struct clk_hw *[])
2526                                { &gcc_usb30_prim_mock_utmi_postdiv.clkr.hw },
2527                        .num_parents = 1,
2528                        .flags = CLK_SET_RATE_PARENT,
2529                        .ops = &clk_branch2_ops,
2530                },
2531        },
2532};
2533
2534static struct clk_branch gcc_usb30_prim_sleep_clk = {
2535        .halt_reg = 0x1a014,
2536        .halt_check = BRANCH_HALT,
2537        .clkr = {
2538                .enable_reg = 0x1a014,
2539                .enable_mask = BIT(0),
2540                .hw.init = &(struct clk_init_data){
2541                        .name = "gcc_usb30_prim_sleep_clk",
2542                        .ops = &clk_branch2_ops,
2543                },
2544        },
2545};
2546
2547static struct clk_branch gcc_usb3_prim_clkref_clk = {
2548        .halt_reg = 0x9f000,
2549        .halt_check = BRANCH_HALT,
2550        .clkr = {
2551                .enable_reg = 0x9f000,
2552                .enable_mask = BIT(0),
2553                .hw.init = &(struct clk_init_data){
2554                        .name = "gcc_usb3_prim_clkref_clk",
2555                        .ops = &clk_branch2_ops,
2556                },
2557        },
2558};
2559
2560static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = {
2561        .halt_reg = 0x1a054,
2562        .halt_check = BRANCH_HALT,
2563        .clkr = {
2564                .enable_reg = 0x1a054,
2565                .enable_mask = BIT(0),
2566                .hw.init = &(struct clk_init_data){
2567                        .name = "gcc_usb3_prim_phy_com_aux_clk",
2568                        .parent_hws = (const struct clk_hw *[])
2569                                { &gcc_usb3_prim_phy_aux_clk_src.clkr.hw },
2570                        .num_parents = 1,
2571                        .flags = CLK_SET_RATE_PARENT,
2572                        .ops = &clk_branch2_ops,
2573                },
2574        },
2575};
2576
2577static struct clk_branch gcc_usb3_prim_phy_pipe_clk = {
2578        .halt_reg = 0x1a058,
2579        .halt_check = BRANCH_HALT_SKIP,
2580        .hwcg_reg = 0x1a058,
2581        .hwcg_bit = 1,
2582        .clkr = {
2583                .enable_reg = 0x1a058,
2584                .enable_mask = BIT(0),
2585                .hw.init = &(struct clk_init_data){
2586                        .name = "gcc_usb3_prim_phy_pipe_clk",
2587                        .ops = &clk_branch2_ops,
2588                },
2589        },
2590};
2591
2592static struct clk_branch gcc_vcodec0_axi_clk = {
2593        .halt_reg = 0x6e008,
2594        .halt_check = BRANCH_HALT,
2595        .clkr = {
2596                .enable_reg = 0x6e008,
2597                .enable_mask = BIT(0),
2598                .hw.init = &(struct clk_init_data){
2599                        .name = "gcc_vcodec0_axi_clk",
2600                        .ops = &clk_branch2_ops,
2601                },
2602        },
2603};
2604
2605static struct clk_branch gcc_venus_ahb_clk = {
2606        .halt_reg = 0x6e010,
2607        .halt_check = BRANCH_HALT,
2608        .clkr = {
2609                .enable_reg = 0x6e010,
2610                .enable_mask = BIT(0),
2611                .hw.init = &(struct clk_init_data){
2612                        .name = "gcc_venus_ahb_clk",
2613                        .ops = &clk_branch2_ops,
2614                },
2615        },
2616};
2617
2618static struct clk_branch gcc_venus_ctl_axi_clk = {
2619        .halt_reg = 0x6e004,
2620        .halt_check = BRANCH_HALT,
2621        .clkr = {
2622                .enable_reg = 0x6e004,
2623                .enable_mask = BIT(0),
2624                .hw.init = &(struct clk_init_data){
2625                        .name = "gcc_venus_ctl_axi_clk",
2626                        .ops = &clk_branch2_ops,
2627                },
2628        },
2629};
2630
2631static struct clk_branch gcc_video_ahb_clk = {
2632        .halt_reg = 0x17004,
2633        .halt_check = BRANCH_HALT,
2634        .hwcg_reg = 0x17004,
2635        .hwcg_bit = 1,
2636        .clkr = {
2637                .enable_reg = 0x17004,
2638                .enable_mask = BIT(0),
2639                .hw.init = &(struct clk_init_data){
2640                        .name = "gcc_video_ahb_clk",
2641                        .ops = &clk_branch2_ops,
2642                },
2643        },
2644};
2645
2646static struct clk_branch gcc_video_axi0_clk = {
2647        .halt_reg = 0x1701c,
2648        .halt_check = BRANCH_HALT,
2649        .hwcg_reg = 0x1701c,
2650        .hwcg_bit = 1,
2651        .clkr = {
2652                .enable_reg = 0x1701c,
2653                .enable_mask = BIT(0),
2654                .hw.init = &(struct clk_init_data){
2655                        .name = "gcc_video_axi0_clk",
2656                        .ops = &clk_branch2_ops,
2657                },
2658        },
2659};
2660
2661static struct clk_branch gcc_video_throttle_core_clk = {
2662        .halt_reg = 0x17068,
2663        .halt_check = BRANCH_HALT_VOTED,
2664        .hwcg_reg = 0x17068,
2665        .hwcg_bit = 1,
2666        .clkr = {
2667                .enable_reg = 0x79004,
2668                .enable_mask = BIT(28),
2669                .hw.init = &(struct clk_init_data){
2670                        .name = "gcc_video_throttle_core_clk",
2671                        .ops = &clk_branch2_ops,
2672                },
2673        },
2674};
2675
2676static struct clk_branch gcc_video_vcodec0_sys_clk = {
2677        .halt_reg = 0x580a4,
2678        .halt_check = BRANCH_HALT_DELAY,
2679        .hwcg_reg = 0x580a4,
2680        .hwcg_bit = 1,
2681        .clkr = {
2682                .enable_reg = 0x580a4,
2683                .enable_mask = BIT(0),
2684                .hw.init = &(struct clk_init_data){
2685                        .name = "gcc_video_vcodec0_sys_clk",
2686                        .parent_hws = (const struct clk_hw *[])
2687                                        { &gcc_video_venus_clk_src.clkr.hw },
2688                        .num_parents = 1,
2689                        .flags = CLK_SET_RATE_PARENT,
2690                        .ops = &clk_branch2_ops,
2691                },
2692        },
2693};
2694
2695static struct clk_branch gcc_video_venus_ctl_clk = {
2696        .halt_reg = 0x5808c,
2697        .halt_check = BRANCH_HALT,
2698        .clkr = {
2699                .enable_reg = 0x5808c,
2700                .enable_mask = BIT(0),
2701                .hw.init = &(struct clk_init_data){
2702                        .name = "gcc_video_venus_ctl_clk",
2703                        .parent_hws = (const struct clk_hw *[])
2704                                        { &gcc_video_venus_clk_src.clkr.hw },
2705                        .num_parents = 1,
2706                        .flags = CLK_SET_RATE_PARENT,
2707                        .ops = &clk_branch2_ops,
2708                },
2709        },
2710};
2711
2712static struct clk_branch gcc_video_xo_clk = {
2713        .halt_reg = 0x17024,
2714        .halt_check = BRANCH_HALT,
2715        .clkr = {
2716                .enable_reg = 0x17024,
2717                .enable_mask = BIT(0),
2718                .hw.init = &(struct clk_init_data){
2719                        .name = "gcc_video_xo_clk",
2720                        .ops = &clk_branch2_ops,
2721                },
2722        },
2723};
2724
2725static struct gdsc gcc_camss_top_gdsc = {
2726        .gdscr = 0x58004,
2727        .pd = {
2728                .name = "gcc_camss_top",
2729        },
2730        .pwrsts = PWRSTS_OFF_ON,
2731};
2732
2733static struct gdsc gcc_usb30_prim_gdsc = {
2734        .gdscr = 0x1a004,
2735        .pd = {
2736                .name = "gcc_usb30_prim",
2737        },
2738        .pwrsts = PWRSTS_OFF_ON,
2739};
2740
2741static struct gdsc gcc_vcodec0_gdsc = {
2742        .gdscr = 0x58098,
2743        .pd = {
2744                .name = "gcc_vcodec0",
2745        },
2746        .pwrsts = PWRSTS_OFF_ON,
2747};
2748
2749static struct gdsc gcc_venus_gdsc = {
2750        .gdscr = 0x5807c,
2751        .pd = {
2752                .name = "gcc_venus",
2753        },
2754        .pwrsts = PWRSTS_OFF_ON,
2755};
2756
2757static struct gdsc hlos1_vote_turing_mmu_tbu1_gdsc = {
2758        .gdscr = 0x7d060,
2759        .pd = {
2760                .name = "hlos1_vote_turing_mmu_tbu1",
2761        },
2762        .pwrsts = PWRSTS_OFF_ON,
2763        .flags = VOTABLE,
2764};
2765
2766static struct gdsc hlos1_vote_turing_mmu_tbu0_gdsc = {
2767        .gdscr = 0x7d07c,
2768        .pd = {
2769                .name = "hlos1_vote_turing_mmu_tbu0",
2770        },
2771        .pwrsts = PWRSTS_OFF_ON,
2772        .flags = VOTABLE,
2773};
2774
2775static struct gdsc hlos1_vote_mm_snoc_mmu_tbu_rt_gdsc = {
2776        .gdscr = 0x7d074,
2777        .pd = {
2778                .name = "hlos1_vote_mm_snoc_mmu_tbu_rt",
2779        },
2780        .pwrsts = PWRSTS_OFF_ON,
2781        .flags = VOTABLE,
2782};
2783
2784static struct gdsc hlos1_vote_mm_snoc_mmu_tbu_nrt_gdsc = {
2785        .gdscr = 0x7d078,
2786        .pd = {
2787                .name = "hlos1_vote_mm_snoc_mmu_tbu_nrt",
2788        },
2789        .pwrsts = PWRSTS_OFF_ON,
2790        .flags = VOTABLE,
2791};
2792
2793static struct clk_regmap *gcc_qcm2290_clocks[] = {
2794        [GCC_AHB2PHY_CSI_CLK] = &gcc_ahb2phy_csi_clk.clkr,
2795        [GCC_AHB2PHY_USB_CLK] = &gcc_ahb2phy_usb_clk.clkr,
2796        [GCC_BIMC_GPU_AXI_CLK] = &gcc_bimc_gpu_axi_clk.clkr,
2797        [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
2798        [GCC_CAM_THROTTLE_NRT_CLK] = &gcc_cam_throttle_nrt_clk.clkr,
2799        [GCC_CAM_THROTTLE_RT_CLK] = &gcc_cam_throttle_rt_clk.clkr,
2800        [GCC_CAMERA_AHB_CLK] = &gcc_camera_ahb_clk.clkr,
2801        [GCC_CAMERA_XO_CLK] = &gcc_camera_xo_clk.clkr,
2802        [GCC_CAMSS_AXI_CLK] = &gcc_camss_axi_clk.clkr,
2803        [GCC_CAMSS_AXI_CLK_SRC] = &gcc_camss_axi_clk_src.clkr,
2804        [GCC_CAMSS_CAMNOC_ATB_CLK] = &gcc_camss_camnoc_atb_clk.clkr,
2805        [GCC_CAMSS_CAMNOC_NTS_XO_CLK] = &gcc_camss_camnoc_nts_xo_clk.clkr,
2806        [GCC_CAMSS_CCI_0_CLK] = &gcc_camss_cci_0_clk.clkr,
2807        [GCC_CAMSS_CCI_CLK_SRC] = &gcc_camss_cci_clk_src.clkr,
2808        [GCC_CAMSS_CPHY_0_CLK] = &gcc_camss_cphy_0_clk.clkr,
2809        [GCC_CAMSS_CPHY_1_CLK] = &gcc_camss_cphy_1_clk.clkr,
2810        [GCC_CAMSS_CSI0PHYTIMER_CLK] = &gcc_camss_csi0phytimer_clk.clkr,
2811        [GCC_CAMSS_CSI0PHYTIMER_CLK_SRC] = &gcc_camss_csi0phytimer_clk_src.clkr,
2812        [GCC_CAMSS_CSI1PHYTIMER_CLK] = &gcc_camss_csi1phytimer_clk.clkr,
2813        [GCC_CAMSS_CSI1PHYTIMER_CLK_SRC] = &gcc_camss_csi1phytimer_clk_src.clkr,
2814        [GCC_CAMSS_MCLK0_CLK] = &gcc_camss_mclk0_clk.clkr,
2815        [GCC_CAMSS_MCLK0_CLK_SRC] = &gcc_camss_mclk0_clk_src.clkr,
2816        [GCC_CAMSS_MCLK1_CLK] = &gcc_camss_mclk1_clk.clkr,
2817        [GCC_CAMSS_MCLK1_CLK_SRC] = &gcc_camss_mclk1_clk_src.clkr,
2818        [GCC_CAMSS_MCLK2_CLK] = &gcc_camss_mclk2_clk.clkr,
2819        [GCC_CAMSS_MCLK2_CLK_SRC] = &gcc_camss_mclk2_clk_src.clkr,
2820        [GCC_CAMSS_MCLK3_CLK] = &gcc_camss_mclk3_clk.clkr,
2821        [GCC_CAMSS_MCLK3_CLK_SRC] = &gcc_camss_mclk3_clk_src.clkr,
2822        [GCC_CAMSS_NRT_AXI_CLK] = &gcc_camss_nrt_axi_clk.clkr,
2823        [GCC_CAMSS_OPE_AHB_CLK] = &gcc_camss_ope_ahb_clk.clkr,
2824        [GCC_CAMSS_OPE_AHB_CLK_SRC] = &gcc_camss_ope_ahb_clk_src.clkr,
2825        [GCC_CAMSS_OPE_CLK] = &gcc_camss_ope_clk.clkr,
2826        [GCC_CAMSS_OPE_CLK_SRC] = &gcc_camss_ope_clk_src.clkr,
2827        [GCC_CAMSS_RT_AXI_CLK] = &gcc_camss_rt_axi_clk.clkr,
2828        [GCC_CAMSS_TFE_0_CLK] = &gcc_camss_tfe_0_clk.clkr,
2829        [GCC_CAMSS_TFE_0_CLK_SRC] = &gcc_camss_tfe_0_clk_src.clkr,
2830        [GCC_CAMSS_TFE_0_CPHY_RX_CLK] = &gcc_camss_tfe_0_cphy_rx_clk.clkr,
2831        [GCC_CAMSS_TFE_0_CSID_CLK] = &gcc_camss_tfe_0_csid_clk.clkr,
2832        [GCC_CAMSS_TFE_0_CSID_CLK_SRC] = &gcc_camss_tfe_0_csid_clk_src.clkr,
2833        [GCC_CAMSS_TFE_1_CLK] = &gcc_camss_tfe_1_clk.clkr,
2834        [GCC_CAMSS_TFE_1_CLK_SRC] = &gcc_camss_tfe_1_clk_src.clkr,
2835        [GCC_CAMSS_TFE_1_CPHY_RX_CLK] = &gcc_camss_tfe_1_cphy_rx_clk.clkr,
2836        [GCC_CAMSS_TFE_1_CSID_CLK] = &gcc_camss_tfe_1_csid_clk.clkr,
2837        [GCC_CAMSS_TFE_1_CSID_CLK_SRC] = &gcc_camss_tfe_1_csid_clk_src.clkr,
2838        [GCC_CAMSS_TFE_CPHY_RX_CLK_SRC] = &gcc_camss_tfe_cphy_rx_clk_src.clkr,
2839        [GCC_CAMSS_TOP_AHB_CLK] = &gcc_camss_top_ahb_clk.clkr,
2840        [GCC_CAMSS_TOP_AHB_CLK_SRC] = &gcc_camss_top_ahb_clk_src.clkr,
2841        [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr,
2842        [GCC_DISP_AHB_CLK] = &gcc_disp_ahb_clk.clkr,
2843        [GCC_DISP_GPLL0_CLK_SRC] = &gcc_disp_gpll0_clk_src.clkr,
2844        [GCC_DISP_GPLL0_DIV_CLK_SRC] = &gcc_disp_gpll0_div_clk_src.clkr,
2845        [GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr,
2846        [GCC_DISP_THROTTLE_CORE_CLK] = &gcc_disp_throttle_core_clk.clkr,
2847        [GCC_DISP_XO_CLK] = &gcc_disp_xo_clk.clkr,
2848        [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
2849        [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr,
2850        [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
2851        [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr,
2852        [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
2853        [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr,
2854        [GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr,
2855        [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr,
2856        [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr,
2857        [GCC_GPU_IREF_CLK] = &gcc_gpu_iref_clk.clkr,
2858        [GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr,
2859        [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr,
2860        [GCC_GPU_THROTTLE_CORE_CLK] = &gcc_gpu_throttle_core_clk.clkr,
2861        [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
2862        [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr,
2863        [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
2864        [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr,
2865        [GCC_PWM0_XO512_CLK] = &gcc_pwm0_xo512_clk.clkr,
2866        [GCC_QMIP_CAMERA_NRT_AHB_CLK] = &gcc_qmip_camera_nrt_ahb_clk.clkr,
2867        [GCC_QMIP_CAMERA_RT_AHB_CLK] = &gcc_qmip_camera_rt_ahb_clk.clkr,
2868        [GCC_QMIP_DISP_AHB_CLK] = &gcc_qmip_disp_ahb_clk.clkr,
2869        [GCC_QMIP_GPU_CFG_AHB_CLK] = &gcc_qmip_gpu_cfg_ahb_clk.clkr,
2870        [GCC_QMIP_VIDEO_VCODEC_AHB_CLK] = &gcc_qmip_video_vcodec_ahb_clk.clkr,
2871        [GCC_QUPV3_WRAP0_CORE_2X_CLK] = &gcc_qupv3_wrap0_core_2x_clk.clkr,
2872        [GCC_QUPV3_WRAP0_CORE_CLK] = &gcc_qupv3_wrap0_core_clk.clkr,
2873        [GCC_QUPV3_WRAP0_S0_CLK] = &gcc_qupv3_wrap0_s0_clk.clkr,
2874        [GCC_QUPV3_WRAP0_S0_CLK_SRC] = &gcc_qupv3_wrap0_s0_clk_src.clkr,
2875        [GCC_QUPV3_WRAP0_S1_CLK] = &gcc_qupv3_wrap0_s1_clk.clkr,
2876        [GCC_QUPV3_WRAP0_S1_CLK_SRC] = &gcc_qupv3_wrap0_s1_clk_src.clkr,
2877        [GCC_QUPV3_WRAP0_S2_CLK] = &gcc_qupv3_wrap0_s2_clk.clkr,
2878        [GCC_QUPV3_WRAP0_S2_CLK_SRC] = &gcc_qupv3_wrap0_s2_clk_src.clkr,
2879        [GCC_QUPV3_WRAP0_S3_CLK] = &gcc_qupv3_wrap0_s3_clk.clkr,
2880        [GCC_QUPV3_WRAP0_S3_CLK_SRC] = &gcc_qupv3_wrap0_s3_clk_src.clkr,
2881        [GCC_QUPV3_WRAP0_S4_CLK] = &gcc_qupv3_wrap0_s4_clk.clkr,
2882        [GCC_QUPV3_WRAP0_S4_CLK_SRC] = &gcc_qupv3_wrap0_s4_clk_src.clkr,
2883        [GCC_QUPV3_WRAP0_S5_CLK] = &gcc_qupv3_wrap0_s5_clk.clkr,
2884        [GCC_QUPV3_WRAP0_S5_CLK_SRC] = &gcc_qupv3_wrap0_s5_clk_src.clkr,
2885        [GCC_QUPV3_WRAP_0_M_AHB_CLK] = &gcc_qupv3_wrap_0_m_ahb_clk.clkr,
2886        [GCC_QUPV3_WRAP_0_S_AHB_CLK] = &gcc_qupv3_wrap_0_s_ahb_clk.clkr,
2887        [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
2888        [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
2889        [GCC_SDCC1_APPS_CLK_SRC] = &gcc_sdcc1_apps_clk_src.clkr,
2890        [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
2891        [GCC_SDCC1_ICE_CORE_CLK_SRC] = &gcc_sdcc1_ice_core_clk_src.clkr,
2892        [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
2893        [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
2894        [GCC_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr,
2895        [GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr,
2896        [GCC_SYS_NOC_USB3_PRIM_AXI_CLK] = &gcc_sys_noc_usb3_prim_axi_clk.clkr,
2897        [GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr,
2898        [GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr,
2899        [GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr,
2900        [GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] =
2901                &gcc_usb30_prim_mock_utmi_clk_src.clkr,
2902        [GCC_USB30_PRIM_MOCK_UTMI_POSTDIV] =
2903                &gcc_usb30_prim_mock_utmi_postdiv.clkr,
2904        [GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr,
2905        [GCC_USB3_PRIM_CLKREF_CLK] = &gcc_usb3_prim_clkref_clk.clkr,
2906        [GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr,
2907        [GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr,
2908        [GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr,
2909        [GCC_VCODEC0_AXI_CLK] = &gcc_vcodec0_axi_clk.clkr,
2910        [GCC_VENUS_AHB_CLK] = &gcc_venus_ahb_clk.clkr,
2911        [GCC_VENUS_CTL_AXI_CLK] = &gcc_venus_ctl_axi_clk.clkr,
2912        [GCC_VIDEO_AHB_CLK] = &gcc_video_ahb_clk.clkr,
2913        [GCC_VIDEO_AXI0_CLK] = &gcc_video_axi0_clk.clkr,
2914        [GCC_VIDEO_THROTTLE_CORE_CLK] = &gcc_video_throttle_core_clk.clkr,
2915        [GCC_VIDEO_VCODEC0_SYS_CLK] = &gcc_video_vcodec0_sys_clk.clkr,
2916        [GCC_VIDEO_VENUS_CLK_SRC] = &gcc_video_venus_clk_src.clkr,
2917        [GCC_VIDEO_VENUS_CTL_CLK] = &gcc_video_venus_ctl_clk.clkr,
2918        [GCC_VIDEO_XO_CLK] = &gcc_video_xo_clk.clkr,
2919        [GPLL0] = &gpll0.clkr,
2920        [GPLL0_OUT_AUX2] = &gpll0_out_aux2.clkr,
2921        [GPLL1] = &gpll1.clkr,
2922        [GPLL10] = &gpll10.clkr,
2923        [GPLL11] = &gpll11.clkr,
2924        [GPLL3] = &gpll3.clkr,
2925        [GPLL3_OUT_MAIN] = &gpll3_out_main.clkr,
2926        [GPLL4] = &gpll4.clkr,
2927        [GPLL5] = &gpll5.clkr,
2928        [GPLL6] = &gpll6.clkr,
2929        [GPLL6_OUT_MAIN] = &gpll6_out_main.clkr,
2930        [GPLL7] = &gpll7.clkr,
2931        [GPLL8] = &gpll8.clkr,
2932        [GPLL8_OUT_MAIN] = &gpll8_out_main.clkr,
2933        [GPLL9] = &gpll9.clkr,
2934        [GPLL9_OUT_MAIN] = &gpll9_out_main.clkr,
2935};
2936
2937static const struct qcom_reset_map gcc_qcm2290_resets[] = {
2938        [GCC_CAMSS_OPE_BCR] = { 0x55000 },
2939        [GCC_CAMSS_TFE_BCR] = { 0x52000 },
2940        [GCC_CAMSS_TOP_BCR] = { 0x58000 },
2941        [GCC_GPU_BCR] = { 0x36000 },
2942        [GCC_MMSS_BCR] = { 0x17000 },
2943        [GCC_PDM_BCR] = { 0x20000 },
2944        [GCC_QUPV3_WRAPPER_0_BCR] = { 0x1f000 },
2945        [GCC_QUSB2PHY_PRIM_BCR] = { 0x1c000 },
2946        [GCC_SDCC1_BCR] = { 0x38000 },
2947        [GCC_SDCC2_BCR] = { 0x1e000 },
2948        [GCC_USB30_PRIM_BCR] = { 0x1a000 },
2949        [GCC_USB3_PHY_PRIM_SP0_BCR] = { 0x1b000 },
2950        [GCC_USB3PHY_PHY_PRIM_SP0_BCR] = { 0x1b008 },
2951        [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x1d000 },
2952        [GCC_VCODEC0_BCR] = { 0x58094 },
2953        [GCC_VENUS_BCR] = { 0x58078 },
2954        [GCC_VIDEO_INTERFACE_BCR] = { 0x6e000 },
2955};
2956
2957static struct gdsc *gcc_qcm2290_gdscs[] = {
2958        [GCC_CAMSS_TOP_GDSC] = &gcc_camss_top_gdsc,
2959        [GCC_USB30_PRIM_GDSC] = &gcc_usb30_prim_gdsc,
2960        [GCC_VCODEC0_GDSC] = &gcc_vcodec0_gdsc,
2961        [GCC_VENUS_GDSC] = &gcc_venus_gdsc,
2962        [HLOS1_VOTE_TURING_MMU_TBU1_GDSC] = &hlos1_vote_turing_mmu_tbu1_gdsc,
2963        [HLOS1_VOTE_TURING_MMU_TBU0_GDSC] = &hlos1_vote_turing_mmu_tbu0_gdsc,
2964        [HLOS1_VOTE_MM_SNOC_MMU_TBU_RT_GDSC] = &hlos1_vote_mm_snoc_mmu_tbu_rt_gdsc,
2965        [HLOS1_VOTE_MM_SNOC_MMU_TBU_NRT_GDSC] = &hlos1_vote_mm_snoc_mmu_tbu_nrt_gdsc,
2966};
2967
2968static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
2969        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk_src),
2970        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk_src),
2971        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk_src),
2972        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk_src),
2973        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk_src),
2974        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk_src),
2975};
2976
2977static const struct regmap_config gcc_qcm2290_regmap_config = {
2978        .reg_bits = 32,
2979        .reg_stride = 4,
2980        .val_bits = 32,
2981        .max_register = 0xc7000,
2982        .fast_io = true,
2983};
2984
2985static const struct qcom_cc_desc gcc_qcm2290_desc = {
2986        .config = &gcc_qcm2290_regmap_config,
2987        .clks = gcc_qcm2290_clocks,
2988        .num_clks = ARRAY_SIZE(gcc_qcm2290_clocks),
2989        .resets = gcc_qcm2290_resets,
2990        .num_resets = ARRAY_SIZE(gcc_qcm2290_resets),
2991        .gdscs = gcc_qcm2290_gdscs,
2992        .num_gdscs = ARRAY_SIZE(gcc_qcm2290_gdscs),
2993};
2994
2995static const struct of_device_id gcc_qcm2290_match_table[] = {
2996        { .compatible = "qcom,gcc-qcm2290" },
2997        { }
2998};
2999MODULE_DEVICE_TABLE(of, gcc_qcm2290_match_table);
3000
3001static int gcc_qcm2290_probe(struct platform_device *pdev)
3002{
3003        struct regmap *regmap;
3004        int ret;
3005
3006        regmap = qcom_cc_map(pdev, &gcc_qcm2290_desc);
3007        if (IS_ERR(regmap))
3008                return PTR_ERR(regmap);
3009
3010        ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
3011                                       ARRAY_SIZE(gcc_dfs_clocks));
3012        if (ret)
3013                return ret;
3014
3015        clk_alpha_pll_configure(&gpll10, regmap, &gpll10_config);
3016        clk_alpha_pll_configure(&gpll11, regmap, &gpll11_config);
3017        clk_alpha_pll_configure(&gpll8, regmap, &gpll8_config);
3018        clk_alpha_pll_configure(&gpll9, regmap, &gpll9_config);
3019
3020        return qcom_cc_really_probe(pdev, &gcc_qcm2290_desc, regmap);
3021}
3022
3023static struct platform_driver gcc_qcm2290_driver = {
3024        .probe = gcc_qcm2290_probe,
3025        .driver = {
3026                .name = "gcc-qcm2290",
3027                .of_match_table = gcc_qcm2290_match_table,
3028        },
3029};
3030
3031static int __init gcc_qcm2290_init(void)
3032{
3033        return platform_driver_register(&gcc_qcm2290_driver);
3034}
3035subsys_initcall(gcc_qcm2290_init);
3036
3037static void __exit gcc_qcm2290_exit(void)
3038{
3039        platform_driver_unregister(&gcc_qcm2290_driver);
3040}
3041module_exit(gcc_qcm2290_exit);
3042
3043MODULE_DESCRIPTION("QTI GCC QCM2290 Driver");
3044MODULE_LICENSE("GPL v2");
3045