linux/drivers/clk/qcom/gcc-sc7180.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2019-2021, 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/of.h>
  11#include <linux/of_device.h>
  12#include <linux/regmap.h>
  13
  14#include <dt-bindings/clock/qcom,gcc-sc7180.h>
  15
  16#include "clk-alpha-pll.h"
  17#include "clk-branch.h"
  18#include "clk-rcg.h"
  19#include "clk-regmap.h"
  20#include "common.h"
  21#include "gdsc.h"
  22#include "reset.h"
  23
  24enum {
  25        P_BI_TCXO,
  26        P_CORE_BI_PLL_TEST_SE,
  27        P_GPLL0_OUT_EVEN,
  28        P_GPLL0_OUT_MAIN,
  29        P_GPLL1_OUT_MAIN,
  30        P_GPLL4_OUT_MAIN,
  31        P_GPLL6_OUT_MAIN,
  32        P_GPLL7_OUT_MAIN,
  33        P_SLEEP_CLK,
  34};
  35
  36static struct clk_alpha_pll gpll0 = {
  37        .offset = 0x0,
  38        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  39        .clkr = {
  40                .enable_reg = 0x52010,
  41                .enable_mask = BIT(0),
  42                .hw.init = &(struct clk_init_data){
  43                        .name = "gpll0",
  44                        .parent_data = &(const struct clk_parent_data){
  45                                .fw_name = "bi_tcxo",
  46                                .name = "bi_tcxo",
  47                        },
  48                        .num_parents = 1,
  49                        .ops = &clk_alpha_pll_fixed_fabia_ops,
  50                },
  51        },
  52};
  53
  54static const struct clk_div_table post_div_table_gpll0_out_even[] = {
  55        { 0x1, 2 },
  56        { }
  57};
  58
  59static struct clk_alpha_pll_postdiv gpll0_out_even = {
  60        .offset = 0x0,
  61        .post_div_shift = 8,
  62        .post_div_table = post_div_table_gpll0_out_even,
  63        .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_even),
  64        .width = 4,
  65        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  66        .clkr.hw.init = &(struct clk_init_data){
  67                .name = "gpll0_out_even",
  68                .parent_data = &(const struct clk_parent_data){
  69                        .hw = &gpll0.clkr.hw,
  70                },
  71                .num_parents = 1,
  72                .ops = &clk_alpha_pll_postdiv_fabia_ops,
  73        },
  74};
  75
  76static struct clk_fixed_factor gcc_pll0_main_div_cdiv = {
  77        .mult = 1,
  78        .div = 2,
  79        .hw.init = &(struct clk_init_data){
  80                .name = "gcc_pll0_main_div_cdiv",
  81                .parent_data = &(const struct clk_parent_data){
  82                        .hw = &gpll0.clkr.hw,
  83                },
  84                .num_parents = 1,
  85                .ops = &clk_fixed_factor_ops,
  86        },
  87};
  88
  89static struct clk_alpha_pll gpll1 = {
  90        .offset = 0x01000,
  91        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  92        .clkr = {
  93                .enable_reg = 0x52010,
  94                .enable_mask = BIT(1),
  95                .hw.init = &(struct clk_init_data){
  96                        .name = "gpll1",
  97                        .parent_data = &(const struct clk_parent_data){
  98                                .fw_name = "bi_tcxo",
  99                                .name = "bi_tcxo",
 100                        },
 101                        .num_parents = 1,
 102                        .ops = &clk_alpha_pll_fixed_fabia_ops,
 103                },
 104        },
 105};
 106
 107static struct clk_alpha_pll gpll4 = {
 108        .offset = 0x76000,
 109        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
 110        .clkr = {
 111                .enable_reg = 0x52010,
 112                .enable_mask = BIT(4),
 113                .hw.init = &(struct clk_init_data){
 114                        .name = "gpll4",
 115                        .parent_data = &(const struct clk_parent_data){
 116                                .fw_name = "bi_tcxo",
 117                                .name = "bi_tcxo",
 118                        },
 119                        .num_parents = 1,
 120                        .ops = &clk_alpha_pll_fixed_fabia_ops,
 121                },
 122        },
 123};
 124
 125static struct clk_alpha_pll gpll6 = {
 126        .offset = 0x13000,
 127        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
 128        .clkr = {
 129                .enable_reg = 0x52010,
 130                .enable_mask = BIT(6),
 131                .hw.init = &(struct clk_init_data){
 132                        .name = "gpll6",
 133                        .parent_data = &(const struct clk_parent_data){
 134                                .fw_name = "bi_tcxo",
 135                                .name = "bi_tcxo",
 136                        },
 137                        .num_parents = 1,
 138                        .ops = &clk_alpha_pll_fixed_fabia_ops,
 139                },
 140        },
 141};
 142
 143static struct clk_alpha_pll gpll7 = {
 144        .offset = 0x27000,
 145        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
 146        .clkr = {
 147                .enable_reg = 0x52010,
 148                .enable_mask = BIT(7),
 149                .hw.init = &(struct clk_init_data){
 150                        .name = "gpll7",
 151                        .parent_data = &(const struct clk_parent_data){
 152                                .fw_name = "bi_tcxo",
 153                                .name = "bi_tcxo",
 154                        },
 155                        .num_parents = 1,
 156                        .ops = &clk_alpha_pll_fixed_fabia_ops,
 157                },
 158        },
 159};
 160
 161static const struct parent_map gcc_parent_map_0[] = {
 162        { P_BI_TCXO, 0 },
 163        { P_GPLL0_OUT_MAIN, 1 },
 164        { P_GPLL0_OUT_EVEN, 6 },
 165        { P_CORE_BI_PLL_TEST_SE, 7 },
 166};
 167
 168static const struct clk_parent_data gcc_parent_data_0[] = {
 169        { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
 170        { .hw = &gpll0.clkr.hw },
 171        { .hw = &gpll0_out_even.clkr.hw },
 172        { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
 173};
 174
 175static const struct clk_parent_data gcc_parent_data_0_ao[] = {
 176        { .fw_name = "bi_tcxo_ao", .name = "bi_tcxo_ao" },
 177        { .hw = &gpll0.clkr.hw },
 178        { .hw = &gpll0_out_even.clkr.hw },
 179        { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
 180};
 181
 182static const struct parent_map gcc_parent_map_1[] = {
 183        { P_BI_TCXO, 0 },
 184        { P_GPLL0_OUT_MAIN, 1 },
 185        { P_GPLL6_OUT_MAIN, 2 },
 186        { P_GPLL0_OUT_EVEN, 6 },
 187        { P_CORE_BI_PLL_TEST_SE, 7 },
 188};
 189
 190static const struct clk_parent_data gcc_parent_data_1[] = {
 191        { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
 192        { .hw = &gpll0.clkr.hw },
 193        { .hw = &gpll6.clkr.hw },
 194        { .hw = &gpll0_out_even.clkr.hw },
 195        { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
 196};
 197
 198static const struct parent_map gcc_parent_map_2[] = {
 199        { P_BI_TCXO, 0 },
 200        { P_GPLL0_OUT_MAIN, 1 },
 201        { P_GPLL1_OUT_MAIN, 4 },
 202        { P_GPLL4_OUT_MAIN, 5 },
 203        { P_GPLL0_OUT_EVEN, 6 },
 204        { P_CORE_BI_PLL_TEST_SE, 7 },
 205};
 206
 207static const struct clk_parent_data gcc_parent_data_2[] = {
 208        { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
 209        { .hw = &gpll0.clkr.hw },
 210        { .hw = &gpll1.clkr.hw },
 211        { .hw = &gpll4.clkr.hw },
 212        { .hw = &gpll0_out_even.clkr.hw },
 213        { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
 214};
 215
 216static const struct parent_map gcc_parent_map_3[] = {
 217        { P_BI_TCXO, 0 },
 218        { P_GPLL0_OUT_MAIN, 1 },
 219        { P_CORE_BI_PLL_TEST_SE, 7 },
 220};
 221
 222static const struct clk_parent_data gcc_parent_data_3[] = {
 223        { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
 224        { .hw = &gpll0.clkr.hw },
 225        { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
 226};
 227
 228static const struct parent_map gcc_parent_map_4[] = {
 229        { P_BI_TCXO, 0 },
 230        { P_GPLL0_OUT_MAIN, 1 },
 231        { P_SLEEP_CLK, 5 },
 232        { P_GPLL0_OUT_EVEN, 6 },
 233        { P_CORE_BI_PLL_TEST_SE, 7 },
 234};
 235
 236static const struct clk_parent_data gcc_parent_data_4[] = {
 237        { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
 238        { .hw = &gpll0.clkr.hw },
 239        { .fw_name = "sleep_clk", .name = "sleep_clk" },
 240        { .hw = &gpll0_out_even.clkr.hw },
 241        { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
 242};
 243
 244static const struct parent_map gcc_parent_map_5[] = {
 245        { P_BI_TCXO, 0 },
 246        { P_GPLL0_OUT_MAIN, 1 },
 247        { P_GPLL7_OUT_MAIN, 3 },
 248        { P_GPLL0_OUT_EVEN, 6 },
 249        { P_CORE_BI_PLL_TEST_SE, 7 },
 250};
 251
 252static const struct clk_parent_data gcc_parent_data_5[] = {
 253        { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
 254        { .hw = &gpll0.clkr.hw },
 255        { .hw = &gpll7.clkr.hw },
 256        { .hw = &gpll0_out_even.clkr.hw },
 257        { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
 258};
 259
 260static const struct parent_map gcc_parent_map_6[] = {
 261        { P_BI_TCXO, 0 },
 262        { P_GPLL0_OUT_MAIN, 1 },
 263        { P_SLEEP_CLK, 5 },
 264        { P_CORE_BI_PLL_TEST_SE, 7 },
 265};
 266
 267static const struct clk_parent_data gcc_parent_data_6[] = {
 268        { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
 269        { .hw = &gpll0.clkr.hw },
 270        { .fw_name = "sleep_clk", .name = "sleep_clk" },
 271        { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
 272};
 273
 274static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = {
 275        F(19200000, P_BI_TCXO, 1, 0, 0),
 276        { }
 277};
 278
 279static struct clk_rcg2 gcc_cpuss_ahb_clk_src = {
 280        .cmd_rcgr = 0x48014,
 281        .mnd_width = 0,
 282        .hid_width = 5,
 283        .parent_map = gcc_parent_map_0,
 284        .freq_tbl = ftbl_gcc_cpuss_ahb_clk_src,
 285        .clkr.hw.init = &(struct clk_init_data){
 286                .name = "gcc_cpuss_ahb_clk_src",
 287                .parent_data = gcc_parent_data_0_ao,
 288                .num_parents = 4,
 289                .flags = CLK_SET_RATE_PARENT,
 290                .ops = &clk_rcg2_ops,
 291                },
 292};
 293
 294static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
 295        F(19200000, P_BI_TCXO, 1, 0, 0),
 296        F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
 297        F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
 298        F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
 299        F(200000000, P_GPLL0_OUT_EVEN, 1.5, 0, 0),
 300        { }
 301};
 302
 303static struct clk_rcg2 gcc_gp1_clk_src = {
 304        .cmd_rcgr = 0x64004,
 305        .mnd_width = 8,
 306        .hid_width = 5,
 307        .parent_map = gcc_parent_map_4,
 308        .freq_tbl = ftbl_gcc_gp1_clk_src,
 309        .clkr.hw.init = &(struct clk_init_data){
 310                .name = "gcc_gp1_clk_src",
 311                .parent_data = gcc_parent_data_4,
 312                .num_parents = 5,
 313                .ops = &clk_rcg2_ops,
 314        },
 315};
 316
 317static struct clk_rcg2 gcc_gp2_clk_src = {
 318        .cmd_rcgr = 0x65004,
 319        .mnd_width = 8,
 320        .hid_width = 5,
 321        .parent_map = gcc_parent_map_4,
 322        .freq_tbl = ftbl_gcc_gp1_clk_src,
 323        .clkr.hw.init = &(struct clk_init_data){
 324                .name = "gcc_gp2_clk_src",
 325                .parent_data = gcc_parent_data_4,
 326                .num_parents = 5,
 327                .ops = &clk_rcg2_ops,
 328        },
 329};
 330
 331static struct clk_rcg2 gcc_gp3_clk_src = {
 332        .cmd_rcgr = 0x66004,
 333        .mnd_width = 8,
 334        .hid_width = 5,
 335        .parent_map = gcc_parent_map_4,
 336        .freq_tbl = ftbl_gcc_gp1_clk_src,
 337        .clkr.hw.init = &(struct clk_init_data){
 338                .name = "gcc_gp3_clk_src",
 339                .parent_data = gcc_parent_data_4,
 340                .num_parents = 5,
 341                .ops = &clk_rcg2_ops,
 342        },
 343};
 344
 345static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = {
 346        F(19200000, P_BI_TCXO, 1, 0, 0),
 347        F(60000000, P_GPLL0_OUT_EVEN, 5, 0, 0),
 348        { }
 349};
 350
 351static struct clk_rcg2 gcc_pdm2_clk_src = {
 352        .cmd_rcgr = 0x33010,
 353        .mnd_width = 0,
 354        .hid_width = 5,
 355        .parent_map = gcc_parent_map_0,
 356        .freq_tbl = ftbl_gcc_pdm2_clk_src,
 357        .clkr.hw.init = &(struct clk_init_data){
 358                .name = "gcc_pdm2_clk_src",
 359                .parent_data = gcc_parent_data_0,
 360                .num_parents = 4,
 361                .ops = &clk_rcg2_ops,
 362        },
 363};
 364
 365static const struct freq_tbl ftbl_gcc_qspi_core_clk_src[] = {
 366        F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
 367        F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
 368        F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0),
 369        { }
 370};
 371
 372static struct clk_rcg2 gcc_qspi_core_clk_src = {
 373        .cmd_rcgr = 0x4b00c,
 374        .mnd_width = 0,
 375        .hid_width = 5,
 376        .parent_map = gcc_parent_map_2,
 377        .freq_tbl = ftbl_gcc_qspi_core_clk_src,
 378        .clkr.hw.init = &(struct clk_init_data){
 379                .name = "gcc_qspi_core_clk_src",
 380                .parent_data = gcc_parent_data_2,
 381                .num_parents = 6,
 382                .ops = &clk_rcg2_ops,
 383        },
 384};
 385
 386static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = {
 387        F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625),
 388        F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625),
 389        F(19200000, P_BI_TCXO, 1, 0, 0),
 390        F(29491200, P_GPLL0_OUT_EVEN, 1, 1536, 15625),
 391        F(32000000, P_GPLL0_OUT_EVEN, 1, 8, 75),
 392        F(48000000, P_GPLL0_OUT_EVEN, 1, 4, 25),
 393        F(51200000, P_GPLL6_OUT_MAIN, 7.5, 0, 0),
 394        F(64000000, P_GPLL0_OUT_EVEN, 1, 16, 75),
 395        F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
 396        F(80000000, P_GPLL0_OUT_EVEN, 1, 4, 15),
 397        F(96000000, P_GPLL0_OUT_EVEN, 1, 8, 25),
 398        F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
 399        F(102400000, P_GPLL0_OUT_EVEN, 1, 128, 375),
 400        F(112000000, P_GPLL0_OUT_EVEN, 1, 28, 75),
 401        F(117964800, P_GPLL0_OUT_EVEN, 1, 6144, 15625),
 402        F(120000000, P_GPLL0_OUT_EVEN, 2.5, 0, 0),
 403        F(128000000, P_GPLL6_OUT_MAIN, 3, 0, 0),
 404        { }
 405};
 406
 407static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = {
 408        .name = "gcc_qupv3_wrap0_s0_clk_src",
 409        .parent_data = gcc_parent_data_1,
 410        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 411        .ops = &clk_rcg2_ops,
 412};
 413
 414static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
 415        .cmd_rcgr = 0x17034,
 416        .mnd_width = 16,
 417        .hid_width = 5,
 418        .parent_map = gcc_parent_map_1,
 419        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 420        .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init,
 421};
 422
 423static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = {
 424        .name = "gcc_qupv3_wrap0_s1_clk_src",
 425        .parent_data = gcc_parent_data_1,
 426        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 427        .ops = &clk_rcg2_ops,
 428};
 429
 430static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
 431        .cmd_rcgr = 0x17164,
 432        .mnd_width = 16,
 433        .hid_width = 5,
 434        .parent_map = gcc_parent_map_1,
 435        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 436        .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init,
 437};
 438
 439static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = {
 440        .name = "gcc_qupv3_wrap0_s2_clk_src",
 441        .parent_data = gcc_parent_data_1,
 442        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 443        .ops = &clk_rcg2_ops,
 444};
 445
 446static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
 447        .cmd_rcgr = 0x17294,
 448        .mnd_width = 16,
 449        .hid_width = 5,
 450        .parent_map = gcc_parent_map_1,
 451        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 452        .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init,
 453};
 454
 455static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = {
 456        .name = "gcc_qupv3_wrap0_s3_clk_src",
 457        .parent_data = gcc_parent_data_1,
 458        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 459        .ops = &clk_rcg2_ops,
 460};
 461
 462static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
 463        .cmd_rcgr = 0x173c4,
 464        .mnd_width = 16,
 465        .hid_width = 5,
 466        .parent_map = gcc_parent_map_1,
 467        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 468        .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init,
 469};
 470
 471static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = {
 472        .name = "gcc_qupv3_wrap0_s4_clk_src",
 473        .parent_data = gcc_parent_data_1,
 474        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 475        .ops = &clk_rcg2_ops,
 476};
 477
 478static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
 479        .cmd_rcgr = 0x174f4,
 480        .mnd_width = 16,
 481        .hid_width = 5,
 482        .parent_map = gcc_parent_map_1,
 483        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 484        .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init,
 485};
 486
 487static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = {
 488        .name = "gcc_qupv3_wrap0_s5_clk_src",
 489        .parent_data = gcc_parent_data_1,
 490        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 491        .ops = &clk_rcg2_ops,
 492};
 493
 494static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
 495        .cmd_rcgr = 0x17624,
 496        .mnd_width = 16,
 497        .hid_width = 5,
 498        .parent_map = gcc_parent_map_1,
 499        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 500        .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init,
 501};
 502
 503static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = {
 504        .name = "gcc_qupv3_wrap1_s0_clk_src",
 505        .parent_data = gcc_parent_data_1,
 506        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 507        .ops = &clk_rcg2_ops,
 508};
 509
 510static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
 511        .cmd_rcgr = 0x18018,
 512        .mnd_width = 16,
 513        .hid_width = 5,
 514        .parent_map = gcc_parent_map_1,
 515        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 516        .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init,
 517};
 518
 519static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = {
 520        .name = "gcc_qupv3_wrap1_s1_clk_src",
 521        .parent_data = gcc_parent_data_1,
 522        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 523        .ops = &clk_rcg2_ops,
 524};
 525
 526static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
 527        .cmd_rcgr = 0x18148,
 528        .mnd_width = 16,
 529        .hid_width = 5,
 530        .parent_map = gcc_parent_map_1,
 531        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 532        .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init,
 533};
 534
 535static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = {
 536        .name = "gcc_qupv3_wrap1_s2_clk_src",
 537        .parent_data = gcc_parent_data_1,
 538        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 539        .ops = &clk_rcg2_ops,
 540};
 541
 542static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
 543        .cmd_rcgr = 0x18278,
 544        .mnd_width = 16,
 545        .hid_width = 5,
 546        .parent_map = gcc_parent_map_1,
 547        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 548        .clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_src_init,
 549};
 550
 551static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = {
 552        .name = "gcc_qupv3_wrap1_s3_clk_src",
 553        .parent_data = gcc_parent_data_1,
 554        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 555        .ops = &clk_rcg2_ops,
 556};
 557
 558static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
 559        .cmd_rcgr = 0x183a8,
 560        .mnd_width = 16,
 561        .hid_width = 5,
 562        .parent_map = gcc_parent_map_1,
 563        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 564        .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init,
 565};
 566
 567static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = {
 568        .name = "gcc_qupv3_wrap1_s4_clk_src",
 569        .parent_data = gcc_parent_data_1,
 570        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 571        .ops = &clk_rcg2_ops,
 572};
 573
 574static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
 575        .cmd_rcgr = 0x184d8,
 576        .mnd_width = 16,
 577        .hid_width = 5,
 578        .parent_map = gcc_parent_map_1,
 579        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 580        .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init,
 581};
 582
 583static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = {
 584        .name = "gcc_qupv3_wrap1_s5_clk_src",
 585        .parent_data = gcc_parent_data_1,
 586        .num_parents = ARRAY_SIZE(gcc_parent_data_1),
 587        .ops = &clk_rcg2_ops,
 588};
 589
 590static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
 591        .cmd_rcgr = 0x18608,
 592        .mnd_width = 16,
 593        .hid_width = 5,
 594        .parent_map = gcc_parent_map_1,
 595        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
 596        .clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_src_init,
 597};
 598
 599
 600static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = {
 601        F(144000, P_BI_TCXO, 16, 3, 25),
 602        F(400000, P_BI_TCXO, 12, 1, 4),
 603        F(19200000, P_BI_TCXO, 1, 0, 0),
 604        F(20000000, P_GPLL0_OUT_EVEN, 5, 1, 3),
 605        F(25000000, P_GPLL0_OUT_EVEN, 6, 1, 2),
 606        F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
 607        F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
 608        F(192000000, P_GPLL6_OUT_MAIN, 2, 0, 0),
 609        F(384000000, P_GPLL6_OUT_MAIN, 1, 0, 0),
 610        { }
 611};
 612
 613static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
 614        .cmd_rcgr = 0x12028,
 615        .mnd_width = 8,
 616        .hid_width = 5,
 617        .parent_map = gcc_parent_map_1,
 618        .freq_tbl = ftbl_gcc_sdcc1_apps_clk_src,
 619        .clkr.hw.init = &(struct clk_init_data){
 620                .name = "gcc_sdcc1_apps_clk_src",
 621                .parent_data = gcc_parent_data_1,
 622                .num_parents = 5,
 623                .ops = &clk_rcg2_floor_ops,
 624        },
 625};
 626
 627static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = {
 628        F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
 629        F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
 630        F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
 631        F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0),
 632        { }
 633};
 634
 635static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = {
 636        .cmd_rcgr = 0x12010,
 637        .mnd_width = 0,
 638        .hid_width = 5,
 639        .parent_map = gcc_parent_map_0,
 640        .freq_tbl = ftbl_gcc_sdcc1_ice_core_clk_src,
 641        .clkr.hw.init = &(struct clk_init_data){
 642                .name = "gcc_sdcc1_ice_core_clk_src",
 643                .parent_data = gcc_parent_data_0,
 644                .num_parents = 4,
 645                .ops = &clk_rcg2_ops,
 646        },
 647};
 648
 649static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = {
 650        F(400000, P_BI_TCXO, 12, 1, 4),
 651        F(9600000, P_BI_TCXO, 2, 0, 0),
 652        F(19200000, P_BI_TCXO, 1, 0, 0),
 653        F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
 654        F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
 655        F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
 656        F(202000000, P_GPLL7_OUT_MAIN, 4, 0, 0),
 657        { }
 658};
 659
 660static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
 661        .cmd_rcgr = 0x1400c,
 662        .mnd_width = 8,
 663        .hid_width = 5,
 664        .parent_map = gcc_parent_map_5,
 665        .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src,
 666        .clkr.hw.init = &(struct clk_init_data){
 667                .name = "gcc_sdcc2_apps_clk_src",
 668                .parent_data = gcc_parent_data_5,
 669                .num_parents = 5,
 670                .ops = &clk_rcg2_floor_ops,
 671        },
 672};
 673
 674static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = {
 675        F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
 676        F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
 677        F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
 678        F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
 679        F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
 680        { }
 681};
 682
 683static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = {
 684        .cmd_rcgr = 0x77020,
 685        .mnd_width = 8,
 686        .hid_width = 5,
 687        .parent_map = gcc_parent_map_0,
 688        .freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src,
 689        .clkr.hw.init = &(struct clk_init_data){
 690                .name = "gcc_ufs_phy_axi_clk_src",
 691                .parent_data = gcc_parent_data_0,
 692                .num_parents = 4,
 693                .ops = &clk_rcg2_ops,
 694        },
 695};
 696
 697static const struct freq_tbl ftbl_gcc_ufs_phy_ice_core_clk_src[] = {
 698        F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0),
 699        F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
 700        F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
 701        F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0),
 702        { }
 703};
 704
 705static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = {
 706        .cmd_rcgr = 0x77048,
 707        .mnd_width = 0,
 708        .hid_width = 5,
 709        .parent_map = gcc_parent_map_0,
 710        .freq_tbl = ftbl_gcc_ufs_phy_ice_core_clk_src,
 711        .clkr.hw.init = &(struct clk_init_data){
 712                .name = "gcc_ufs_phy_ice_core_clk_src",
 713                .parent_data = gcc_parent_data_0,
 714                .num_parents = 4,
 715                .ops = &clk_rcg2_ops,
 716        },
 717};
 718
 719static const struct freq_tbl ftbl_gcc_ufs_phy_phy_aux_clk_src[] = {
 720        F(9600000, P_BI_TCXO, 2, 0, 0),
 721        F(19200000, P_BI_TCXO, 1, 0, 0),
 722        { }
 723};
 724
 725static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = {
 726        .cmd_rcgr = 0x77098,
 727        .mnd_width = 0,
 728        .hid_width = 5,
 729        .parent_map = gcc_parent_map_3,
 730        .freq_tbl = ftbl_gcc_ufs_phy_phy_aux_clk_src,
 731        .clkr.hw.init = &(struct clk_init_data){
 732                .name = "gcc_ufs_phy_phy_aux_clk_src",
 733                .parent_data = gcc_parent_data_3,
 734                .num_parents = 3,
 735                .ops = &clk_rcg2_ops,
 736        },
 737};
 738
 739static const struct freq_tbl ftbl_gcc_ufs_phy_unipro_core_clk_src[] = {
 740        F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0),
 741        F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
 742        F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
 743        { }
 744};
 745
 746static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = {
 747        .cmd_rcgr = 0x77060,
 748        .mnd_width = 0,
 749        .hid_width = 5,
 750        .parent_map = gcc_parent_map_0,
 751        .freq_tbl = ftbl_gcc_ufs_phy_unipro_core_clk_src,
 752        .clkr.hw.init = &(struct clk_init_data){
 753                .name = "gcc_ufs_phy_unipro_core_clk_src",
 754                .parent_data = gcc_parent_data_0,
 755                .num_parents = 4,
 756                .ops = &clk_rcg2_ops,
 757        },
 758};
 759
 760static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = {
 761        F(66666667, P_GPLL0_OUT_EVEN, 4.5, 0, 0),
 762        F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
 763        F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
 764        F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
 765        { }
 766};
 767
 768static struct clk_rcg2 gcc_usb30_prim_master_clk_src = {
 769        .cmd_rcgr = 0xf01c,
 770        .mnd_width = 8,
 771        .hid_width = 5,
 772        .parent_map = gcc_parent_map_0,
 773        .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src,
 774        .clkr.hw.init = &(struct clk_init_data){
 775                .name = "gcc_usb30_prim_master_clk_src",
 776                .parent_data = gcc_parent_data_0,
 777                .num_parents = 4,
 778                .ops = &clk_rcg2_ops,
 779        },
 780};
 781
 782static const struct freq_tbl ftbl_gcc_usb30_prim_mock_utmi_clk_src[] = {
 783        F(19200000, P_BI_TCXO, 1, 0, 0),
 784        F(20000000, P_GPLL0_OUT_EVEN, 15, 0, 0),
 785        { }
 786};
 787
 788static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = {
 789        .cmd_rcgr = 0xf034,
 790        .mnd_width = 0,
 791        .hid_width = 5,
 792        .parent_map = gcc_parent_map_0,
 793        .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src,
 794        .clkr.hw.init = &(struct clk_init_data){
 795                .name = "gcc_usb30_prim_mock_utmi_clk_src",
 796                .parent_data = gcc_parent_data_0,
 797                .num_parents = 4,
 798                .ops = &clk_rcg2_ops,
 799        },
 800};
 801
 802static const struct freq_tbl ftbl_gcc_usb3_prim_phy_aux_clk_src[] = {
 803        F(19200000, P_BI_TCXO, 1, 0, 0),
 804        { }
 805};
 806
 807static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = {
 808        .cmd_rcgr = 0xf060,
 809        .mnd_width = 0,
 810        .hid_width = 5,
 811        .parent_map = gcc_parent_map_6,
 812        .freq_tbl = ftbl_gcc_usb3_prim_phy_aux_clk_src,
 813        .clkr.hw.init = &(struct clk_init_data){
 814                .name = "gcc_usb3_prim_phy_aux_clk_src",
 815                .parent_data = gcc_parent_data_6,
 816                .num_parents = 4,
 817                .ops = &clk_rcg2_ops,
 818        },
 819};
 820
 821static const struct freq_tbl ftbl_gcc_sec_ctrl_clk_src[] = {
 822        F(4800000, P_BI_TCXO, 4, 0, 0),
 823        F(19200000, P_BI_TCXO, 1, 0, 0),
 824        { }
 825};
 826
 827static struct clk_rcg2 gcc_sec_ctrl_clk_src = {
 828        .cmd_rcgr = 0x3d030,
 829        .mnd_width = 0,
 830        .hid_width = 5,
 831        .parent_map = gcc_parent_map_3,
 832        .freq_tbl = ftbl_gcc_sec_ctrl_clk_src,
 833        .clkr.hw.init = &(struct clk_init_data){
 834                .name = "gcc_sec_ctrl_clk_src",
 835                .parent_data = gcc_parent_data_3,
 836                .num_parents = ARRAY_SIZE(gcc_parent_data_3),
 837                .ops = &clk_rcg2_ops,
 838        },
 839};
 840
 841static struct clk_branch gcc_aggre_ufs_phy_axi_clk = {
 842        .halt_reg = 0x82024,
 843        .halt_check = BRANCH_HALT_DELAY,
 844        .hwcg_reg = 0x82024,
 845        .hwcg_bit = 1,
 846        .clkr = {
 847                .enable_reg = 0x82024,
 848                .enable_mask = BIT(0),
 849                .hw.init = &(struct clk_init_data){
 850                        .name = "gcc_aggre_ufs_phy_axi_clk",
 851                        .parent_data = &(const struct clk_parent_data){
 852                                .hw = &gcc_ufs_phy_axi_clk_src.clkr.hw,
 853                        },
 854                        .num_parents = 1,
 855                        .flags = CLK_SET_RATE_PARENT,
 856                        .ops = &clk_branch2_ops,
 857                },
 858        },
 859};
 860
 861static struct clk_branch gcc_aggre_usb3_prim_axi_clk = {
 862        .halt_reg = 0x8201c,
 863        .halt_check = BRANCH_HALT,
 864        .clkr = {
 865                .enable_reg = 0x8201c,
 866                .enable_mask = BIT(0),
 867                .hw.init = &(struct clk_init_data){
 868                        .name = "gcc_aggre_usb3_prim_axi_clk",
 869                        .parent_data = &(const struct clk_parent_data){
 870                                .hw = &gcc_usb30_prim_master_clk_src.clkr.hw,
 871                        },
 872                        .num_parents = 1,
 873                        .flags = CLK_SET_RATE_PARENT,
 874                        .ops = &clk_branch2_ops,
 875                },
 876        },
 877};
 878
 879static struct clk_branch gcc_boot_rom_ahb_clk = {
 880        .halt_reg = 0x38004,
 881        .halt_check = BRANCH_HALT_VOTED,
 882        .hwcg_reg = 0x38004,
 883        .hwcg_bit = 1,
 884        .clkr = {
 885                .enable_reg = 0x52000,
 886                .enable_mask = BIT(10),
 887                .hw.init = &(struct clk_init_data){
 888                        .name = "gcc_boot_rom_ahb_clk",
 889                        .ops = &clk_branch2_ops,
 890                },
 891        },
 892};
 893
 894static struct clk_branch gcc_camera_hf_axi_clk = {
 895        .halt_reg = 0xb020,
 896        .halt_check = BRANCH_HALT,
 897        .clkr = {
 898                .enable_reg = 0xb020,
 899                .enable_mask = BIT(0),
 900                .hw.init = &(struct clk_init_data){
 901                        .name = "gcc_camera_hf_axi_clk",
 902                        .ops = &clk_branch2_ops,
 903                },
 904        },
 905};
 906
 907static struct clk_branch gcc_camera_throttle_hf_axi_clk = {
 908        .halt_reg = 0xb080,
 909        .halt_check = BRANCH_HALT,
 910        .hwcg_reg = 0xb080,
 911        .hwcg_bit = 1,
 912        .clkr = {
 913                .enable_reg = 0xb080,
 914                .enable_mask = BIT(0),
 915                .hw.init = &(struct clk_init_data){
 916                        .name = "gcc_camera_throttle_hf_axi_clk",
 917                        .ops = &clk_branch2_ops,
 918                },
 919        },
 920};
 921
 922static struct clk_branch gcc_ce1_ahb_clk = {
 923        .halt_reg = 0x4100c,
 924        .halt_check = BRANCH_HALT_VOTED,
 925        .hwcg_reg = 0x4100c,
 926        .hwcg_bit = 1,
 927        .clkr = {
 928                .enable_reg = 0x52000,
 929                .enable_mask = BIT(3),
 930                .hw.init = &(struct clk_init_data){
 931                        .name = "gcc_ce1_ahb_clk",
 932                        .ops = &clk_branch2_ops,
 933                },
 934        },
 935};
 936
 937static struct clk_branch gcc_ce1_axi_clk = {
 938        .halt_reg = 0x41008,
 939        .halt_check = BRANCH_HALT_VOTED,
 940        .clkr = {
 941                .enable_reg = 0x52000,
 942                .enable_mask = BIT(4),
 943                .hw.init = &(struct clk_init_data){
 944                        .name = "gcc_ce1_axi_clk",
 945                        .ops = &clk_branch2_ops,
 946                },
 947        },
 948};
 949
 950static struct clk_branch gcc_ce1_clk = {
 951        .halt_reg = 0x41004,
 952        .halt_check = BRANCH_HALT_VOTED,
 953        .clkr = {
 954                .enable_reg = 0x52000,
 955                .enable_mask = BIT(5),
 956                .hw.init = &(struct clk_init_data){
 957                        .name = "gcc_ce1_clk",
 958                        .ops = &clk_branch2_ops,
 959                },
 960        },
 961};
 962
 963static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = {
 964        .halt_reg = 0x502c,
 965        .halt_check = BRANCH_HALT,
 966        .clkr = {
 967                .enable_reg = 0x502c,
 968                .enable_mask = BIT(0),
 969                .hw.init = &(struct clk_init_data){
 970                        .name = "gcc_cfg_noc_usb3_prim_axi_clk",
 971                        .parent_data = &(const struct clk_parent_data){
 972                                .hw = &gcc_usb30_prim_master_clk_src.clkr.hw,
 973                        },
 974                        .num_parents = 1,
 975                        .flags = CLK_SET_RATE_PARENT,
 976                        .ops = &clk_branch2_ops,
 977                },
 978        },
 979};
 980
 981/* For CPUSS functionality the AHB clock needs to be left enabled */
 982static struct clk_branch gcc_cpuss_ahb_clk = {
 983        .halt_reg = 0x48000,
 984        .halt_check = BRANCH_HALT_VOTED,
 985        .clkr = {
 986                .enable_reg = 0x52000,
 987                .enable_mask = BIT(21),
 988                .hw.init = &(struct clk_init_data){
 989                        .name = "gcc_cpuss_ahb_clk",
 990                        .parent_data = &(const struct clk_parent_data){
 991                                .hw = &gcc_cpuss_ahb_clk_src.clkr.hw,
 992                        },
 993                        .num_parents = 1,
 994                        .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
 995                        .ops = &clk_branch2_ops,
 996                },
 997        },
 998};
 999
1000static struct clk_branch gcc_cpuss_rbcpr_clk = {
1001        .halt_reg = 0x48008,
1002        .halt_check = BRANCH_HALT,
1003        .clkr = {
1004                .enable_reg = 0x48008,
1005                .enable_mask = BIT(0),
1006                .hw.init = &(struct clk_init_data){
1007                        .name = "gcc_cpuss_rbcpr_clk",
1008                        .ops = &clk_branch2_ops,
1009                },
1010        },
1011};
1012
1013static struct clk_branch gcc_ddrss_gpu_axi_clk = {
1014        .halt_reg = 0x4452c,
1015        .halt_check = BRANCH_VOTED,
1016        .clkr = {
1017                .enable_reg = 0x4452c,
1018                .enable_mask = BIT(0),
1019                .hw.init = &(struct clk_init_data){
1020                        .name = "gcc_ddrss_gpu_axi_clk",
1021                        .ops = &clk_branch2_ops,
1022                },
1023        },
1024};
1025
1026static struct clk_branch gcc_disp_gpll0_clk_src = {
1027        .halt_check = BRANCH_HALT_DELAY,
1028        .clkr = {
1029                .enable_reg = 0x52000,
1030                .enable_mask = BIT(18),
1031                .hw.init = &(struct clk_init_data){
1032                        .name = "gcc_disp_gpll0_clk_src",
1033                        .parent_data = &(const struct clk_parent_data){
1034                                .hw = &gpll0.clkr.hw,
1035                        },
1036                        .num_parents = 1,
1037                        .ops = &clk_branch2_aon_ops,
1038                },
1039        },
1040};
1041
1042static struct clk_branch gcc_disp_gpll0_div_clk_src = {
1043        .halt_check = BRANCH_HALT_DELAY,
1044        .clkr = {
1045                .enable_reg = 0x52000,
1046                .enable_mask = BIT(19),
1047                .hw.init = &(struct clk_init_data){
1048                        .name = "gcc_disp_gpll0_div_clk_src",
1049                        .parent_data = &(const struct clk_parent_data){
1050                                .hw = &gcc_pll0_main_div_cdiv.hw,
1051                        },
1052                        .num_parents = 1,
1053                        .ops = &clk_branch2_ops,
1054                },
1055        },
1056};
1057
1058static struct clk_branch gcc_disp_hf_axi_clk = {
1059        .halt_reg = 0xb024,
1060        .halt_check = BRANCH_HALT,
1061        .clkr = {
1062                .enable_reg = 0xb024,
1063                .enable_mask = BIT(0),
1064                .hw.init = &(struct clk_init_data){
1065                        .name = "gcc_disp_hf_axi_clk",
1066                        .ops = &clk_branch2_ops,
1067                },
1068        },
1069};
1070
1071static struct clk_branch gcc_disp_throttle_hf_axi_clk = {
1072        .halt_reg = 0xb084,
1073        .halt_check = BRANCH_HALT,
1074        .hwcg_reg = 0xb084,
1075        .hwcg_bit = 1,
1076        .clkr = {
1077                .enable_reg = 0xb084,
1078                .enable_mask = BIT(0),
1079                .hw.init = &(struct clk_init_data){
1080                        .name = "gcc_disp_throttle_hf_axi_clk",
1081                        .ops = &clk_branch2_ops,
1082                },
1083        },
1084};
1085
1086static struct clk_branch gcc_gp1_clk = {
1087        .halt_reg = 0x64000,
1088        .halt_check = BRANCH_HALT,
1089        .clkr = {
1090                .enable_reg = 0x64000,
1091                .enable_mask = BIT(0),
1092                .hw.init = &(struct clk_init_data){
1093                        .name = "gcc_gp1_clk",
1094                        .parent_data = &(const struct clk_parent_data){
1095                                .hw = &gcc_gp1_clk_src.clkr.hw,
1096                        },
1097                        .num_parents = 1,
1098                        .flags = CLK_SET_RATE_PARENT,
1099                        .ops = &clk_branch2_ops,
1100                },
1101        },
1102};
1103
1104static struct clk_branch gcc_gp2_clk = {
1105        .halt_reg = 0x65000,
1106        .halt_check = BRANCH_HALT,
1107        .clkr = {
1108                .enable_reg = 0x65000,
1109                .enable_mask = BIT(0),
1110                .hw.init = &(struct clk_init_data){
1111                        .name = "gcc_gp2_clk",
1112                        .parent_data = &(const struct clk_parent_data){
1113                                .hw = &gcc_gp2_clk_src.clkr.hw,
1114                        },
1115                        .num_parents = 1,
1116                        .flags = CLK_SET_RATE_PARENT,
1117                        .ops = &clk_branch2_ops,
1118                },
1119        },
1120};
1121
1122static struct clk_branch gcc_gp3_clk = {
1123        .halt_reg = 0x66000,
1124        .halt_check = BRANCH_HALT,
1125        .clkr = {
1126                .enable_reg = 0x66000,
1127                .enable_mask = BIT(0),
1128                .hw.init = &(struct clk_init_data){
1129                        .name = "gcc_gp3_clk",
1130                        .parent_data = &(const struct clk_parent_data){
1131                                .hw = &gcc_gp3_clk_src.clkr.hw,
1132                        },
1133                        .num_parents = 1,
1134                        .flags = CLK_SET_RATE_PARENT,
1135                        .ops = &clk_branch2_ops,
1136                },
1137        },
1138};
1139
1140static struct clk_branch gcc_gpu_gpll0_clk_src = {
1141        .halt_check = BRANCH_HALT_DELAY,
1142        .clkr = {
1143                .enable_reg = 0x52000,
1144                .enable_mask = BIT(15),
1145                .hw.init = &(struct clk_init_data){
1146                        .name = "gcc_gpu_gpll0_clk_src",
1147                        .parent_data = &(const struct clk_parent_data){
1148                                .hw = &gpll0.clkr.hw,
1149                        },
1150                        .num_parents = 1,
1151                        .ops = &clk_branch2_ops,
1152                },
1153        },
1154};
1155
1156static struct clk_branch gcc_gpu_gpll0_div_clk_src = {
1157        .halt_check = BRANCH_HALT_DELAY,
1158        .clkr = {
1159                .enable_reg = 0x52000,
1160                .enable_mask = BIT(16),
1161                .hw.init = &(struct clk_init_data){
1162                        .name = "gcc_gpu_gpll0_div_clk_src",
1163                        .parent_data = &(const struct clk_parent_data){
1164                                .hw = &gcc_pll0_main_div_cdiv.hw,
1165                        },
1166                        .num_parents = 1,
1167                        .ops = &clk_branch2_ops,
1168                },
1169        },
1170};
1171
1172static struct clk_branch gcc_gpu_memnoc_gfx_clk = {
1173        .halt_reg = 0x7100c,
1174        .halt_check = BRANCH_VOTED,
1175        .clkr = {
1176                .enable_reg = 0x7100c,
1177                .enable_mask = BIT(0),
1178                .hw.init = &(struct clk_init_data){
1179                        .name = "gcc_gpu_memnoc_gfx_clk",
1180                        .ops = &clk_branch2_ops,
1181                },
1182        },
1183};
1184
1185static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = {
1186        .halt_reg = 0x71018,
1187        .halt_check = BRANCH_HALT,
1188        .clkr = {
1189                .enable_reg = 0x71018,
1190                .enable_mask = BIT(0),
1191                .hw.init = &(struct clk_init_data){
1192                        .name = "gcc_gpu_snoc_dvm_gfx_clk",
1193                        .ops = &clk_branch2_ops,
1194                },
1195        },
1196};
1197
1198static struct clk_branch gcc_npu_axi_clk = {
1199        .halt_reg = 0x4d008,
1200        .halt_check = BRANCH_HALT,
1201        .clkr = {
1202                .enable_reg = 0x4d008,
1203                .enable_mask = BIT(0),
1204                .hw.init = &(struct clk_init_data){
1205                        .name = "gcc_npu_axi_clk",
1206                        .ops = &clk_branch2_ops,
1207                },
1208        },
1209};
1210
1211static struct clk_branch gcc_npu_bwmon_axi_clk = {
1212        .halt_reg = 0x73008,
1213        .halt_check = BRANCH_HALT,
1214        .clkr = {
1215                .enable_reg = 0x73008,
1216                .enable_mask = BIT(0),
1217                .hw.init = &(struct clk_init_data){
1218                        .name = "gcc_npu_bwmon_axi_clk",
1219                        .ops = &clk_branch2_ops,
1220                },
1221        },
1222};
1223
1224static struct clk_branch gcc_npu_bwmon_dma_cfg_ahb_clk = {
1225        .halt_reg = 0x73018,
1226        .halt_check = BRANCH_HALT,
1227        .clkr = {
1228                .enable_reg = 0x73018,
1229                .enable_mask = BIT(0),
1230                .hw.init = &(struct clk_init_data){
1231                        .name = "gcc_npu_bwmon_dma_cfg_ahb_clk",
1232                        .ops = &clk_branch2_ops,
1233                },
1234        },
1235};
1236
1237static struct clk_branch gcc_npu_bwmon_dsp_cfg_ahb_clk = {
1238        .halt_reg = 0x7301c,
1239        .halt_check = BRANCH_HALT,
1240        .clkr = {
1241                .enable_reg = 0x7301c,
1242                .enable_mask = BIT(0),
1243                .hw.init = &(struct clk_init_data){
1244                        .name = "gcc_npu_bwmon_dsp_cfg_ahb_clk",
1245                        .ops = &clk_branch2_ops,
1246                },
1247        },
1248};
1249
1250static struct clk_branch gcc_npu_cfg_ahb_clk = {
1251        .halt_reg = 0x4d004,
1252        .halt_check = BRANCH_HALT,
1253        .hwcg_reg = 0x4d004,
1254        .hwcg_bit = 1,
1255        .clkr = {
1256                .enable_reg = 0x4d004,
1257                .enable_mask = BIT(0),
1258                .hw.init = &(struct clk_init_data){
1259                        .name = "gcc_npu_cfg_ahb_clk",
1260                        .ops = &clk_branch2_ops,
1261                },
1262        },
1263};
1264
1265static struct clk_branch gcc_npu_dma_clk = {
1266        .halt_reg = 0x4d1a0,
1267        .halt_check = BRANCH_HALT,
1268        .hwcg_reg = 0x4d1a0,
1269        .hwcg_bit = 1,
1270        .clkr = {
1271                .enable_reg = 0x4d1a0,
1272                .enable_mask = BIT(0),
1273                .hw.init = &(struct clk_init_data){
1274                        .name = "gcc_npu_dma_clk",
1275                        .ops = &clk_branch2_ops,
1276                },
1277        },
1278};
1279
1280static struct clk_branch gcc_npu_gpll0_clk_src = {
1281        .halt_check = BRANCH_HALT_DELAY,
1282        .clkr = {
1283                .enable_reg = 0x52000,
1284                .enable_mask = BIT(25),
1285                .hw.init = &(struct clk_init_data){
1286                        .name = "gcc_npu_gpll0_clk_src",
1287                        .parent_data = &(const struct clk_parent_data){
1288                                .hw = &gpll0.clkr.hw,
1289                        },
1290                        .num_parents = 1,
1291                        .ops = &clk_branch2_ops,
1292                },
1293        },
1294};
1295
1296static struct clk_branch gcc_npu_gpll0_div_clk_src = {
1297        .halt_check = BRANCH_HALT_DELAY,
1298        .clkr = {
1299                .enable_reg = 0x52000,
1300                .enable_mask = BIT(26),
1301                .hw.init = &(struct clk_init_data){
1302                        .name = "gcc_npu_gpll0_div_clk_src",
1303                        .parent_data = &(const struct clk_parent_data){
1304                                .hw = &gcc_pll0_main_div_cdiv.hw,
1305                        },
1306                        .num_parents = 1,
1307                        .flags = CLK_SET_RATE_PARENT,
1308                        .ops = &clk_branch2_ops,
1309                },
1310        },
1311};
1312
1313static struct clk_branch gcc_pdm2_clk = {
1314        .halt_reg = 0x3300c,
1315        .halt_check = BRANCH_HALT,
1316        .clkr = {
1317                .enable_reg = 0x3300c,
1318                .enable_mask = BIT(0),
1319                .hw.init = &(struct clk_init_data){
1320                        .name = "gcc_pdm2_clk",
1321                        .parent_data = &(const struct clk_parent_data){
1322                                .hw = &gcc_pdm2_clk_src.clkr.hw,
1323                        },
1324                        .num_parents = 1,
1325                        .flags = CLK_SET_RATE_PARENT,
1326                        .ops = &clk_branch2_ops,
1327                },
1328        },
1329};
1330
1331static struct clk_branch gcc_pdm_ahb_clk = {
1332        .halt_reg = 0x33004,
1333        .halt_check = BRANCH_HALT,
1334        .hwcg_reg = 0x33004,
1335        .hwcg_bit = 1,
1336        .clkr = {
1337                .enable_reg = 0x33004,
1338                .enable_mask = BIT(0),
1339                .hw.init = &(struct clk_init_data){
1340                        .name = "gcc_pdm_ahb_clk",
1341                        .ops = &clk_branch2_ops,
1342                },
1343        },
1344};
1345
1346static struct clk_branch gcc_pdm_xo4_clk = {
1347        .halt_reg = 0x33008,
1348        .halt_check = BRANCH_HALT,
1349        .clkr = {
1350                .enable_reg = 0x33008,
1351                .enable_mask = BIT(0),
1352                .hw.init = &(struct clk_init_data){
1353                        .name = "gcc_pdm_xo4_clk",
1354                        .ops = &clk_branch2_ops,
1355                },
1356        },
1357};
1358
1359static struct clk_branch gcc_prng_ahb_clk = {
1360        .halt_reg = 0x34004,
1361        .halt_check = BRANCH_HALT_VOTED,
1362        .hwcg_reg = 0x34004,
1363        .hwcg_bit = 1,
1364        .clkr = {
1365                .enable_reg = 0x52000,
1366                .enable_mask = BIT(13),
1367                .hw.init = &(struct clk_init_data){
1368                        .name = "gcc_prng_ahb_clk",
1369                        .ops = &clk_branch2_ops,
1370                },
1371        },
1372};
1373
1374static struct clk_branch gcc_qspi_cnoc_periph_ahb_clk = {
1375        .halt_reg = 0x4b004,
1376        .halt_check = BRANCH_HALT,
1377        .hwcg_reg = 0x4b004,
1378        .hwcg_bit = 1,
1379        .clkr = {
1380                .enable_reg = 0x4b004,
1381                .enable_mask = BIT(0),
1382                .hw.init = &(struct clk_init_data){
1383                        .name = "gcc_qspi_cnoc_periph_ahb_clk",
1384                        .ops = &clk_branch2_ops,
1385                },
1386        },
1387};
1388
1389static struct clk_branch gcc_qspi_core_clk = {
1390        .halt_reg = 0x4b008,
1391        .halt_check = BRANCH_HALT,
1392        .clkr = {
1393                .enable_reg = 0x4b008,
1394                .enable_mask = BIT(0),
1395                .hw.init = &(struct clk_init_data){
1396                        .name = "gcc_qspi_core_clk",
1397                        .parent_data = &(const struct clk_parent_data){
1398                                .hw = &gcc_qspi_core_clk_src.clkr.hw,
1399                        },
1400                        .num_parents = 1,
1401                        .flags = CLK_SET_RATE_PARENT,
1402                        .ops = &clk_branch2_ops,
1403                },
1404        },
1405};
1406
1407static struct clk_branch gcc_qupv3_wrap0_core_2x_clk = {
1408        .halt_reg = 0x17014,
1409        .halt_check = BRANCH_HALT_VOTED,
1410        .clkr = {
1411                .enable_reg = 0x52008,
1412                .enable_mask = BIT(9),
1413                .hw.init = &(struct clk_init_data){
1414                        .name = "gcc_qupv3_wrap0_core_2x_clk",
1415                        .ops = &clk_branch2_ops,
1416                },
1417        },
1418};
1419
1420static struct clk_branch gcc_qupv3_wrap0_core_clk = {
1421        .halt_reg = 0x1700c,
1422        .halt_check = BRANCH_HALT_VOTED,
1423        .clkr = {
1424                .enable_reg = 0x52008,
1425                .enable_mask = BIT(8),
1426                .hw.init = &(struct clk_init_data){
1427                        .name = "gcc_qupv3_wrap0_core_clk",
1428                        .ops = &clk_branch2_ops,
1429                },
1430        },
1431};
1432
1433static struct clk_branch gcc_qupv3_wrap0_s0_clk = {
1434        .halt_reg = 0x17030,
1435        .halt_check = BRANCH_HALT_VOTED,
1436        .clkr = {
1437                .enable_reg = 0x52008,
1438                .enable_mask = BIT(10),
1439                .hw.init = &(struct clk_init_data){
1440                        .name = "gcc_qupv3_wrap0_s0_clk",
1441                        .parent_data = &(const struct clk_parent_data){
1442                                .hw = &gcc_qupv3_wrap0_s0_clk_src.clkr.hw,
1443                        },
1444                        .num_parents = 1,
1445                        .flags = CLK_SET_RATE_PARENT,
1446                        .ops = &clk_branch2_ops,
1447                },
1448        },
1449};
1450
1451static struct clk_branch gcc_qupv3_wrap0_s1_clk = {
1452        .halt_reg = 0x17160,
1453        .halt_check = BRANCH_HALT_VOTED,
1454        .clkr = {
1455                .enable_reg = 0x52008,
1456                .enable_mask = BIT(11),
1457                .hw.init = &(struct clk_init_data){
1458                        .name = "gcc_qupv3_wrap0_s1_clk",
1459                        .parent_data = &(const struct clk_parent_data){
1460                                .hw = &gcc_qupv3_wrap0_s1_clk_src.clkr.hw,
1461                        },
1462                        .num_parents = 1,
1463                        .flags = CLK_SET_RATE_PARENT,
1464                        .ops = &clk_branch2_ops,
1465                },
1466        },
1467};
1468
1469static struct clk_branch gcc_qupv3_wrap0_s2_clk = {
1470        .halt_reg = 0x17290,
1471        .halt_check = BRANCH_HALT_VOTED,
1472        .clkr = {
1473                .enable_reg = 0x52008,
1474                .enable_mask = BIT(12),
1475                .hw.init = &(struct clk_init_data){
1476                        .name = "gcc_qupv3_wrap0_s2_clk",
1477                        .parent_data = &(const struct clk_parent_data){
1478                                .hw = &gcc_qupv3_wrap0_s2_clk_src.clkr.hw,
1479                        },
1480                        .num_parents = 1,
1481                        .flags = CLK_SET_RATE_PARENT,
1482                        .ops = &clk_branch2_ops,
1483                },
1484        },
1485};
1486
1487static struct clk_branch gcc_qupv3_wrap0_s3_clk = {
1488        .halt_reg = 0x173c0,
1489        .halt_check = BRANCH_HALT_VOTED,
1490        .clkr = {
1491                .enable_reg = 0x52008,
1492                .enable_mask = BIT(13),
1493                .hw.init = &(struct clk_init_data){
1494                        .name = "gcc_qupv3_wrap0_s3_clk",
1495                        .parent_data = &(const struct clk_parent_data){
1496                                .hw = &gcc_qupv3_wrap0_s3_clk_src.clkr.hw,
1497                        },
1498                        .num_parents = 1,
1499                        .flags = CLK_SET_RATE_PARENT,
1500                        .ops = &clk_branch2_ops,
1501                },
1502        },
1503};
1504
1505static struct clk_branch gcc_qupv3_wrap0_s4_clk = {
1506        .halt_reg = 0x174f0,
1507        .halt_check = BRANCH_HALT_VOTED,
1508        .clkr = {
1509                .enable_reg = 0x52008,
1510                .enable_mask = BIT(14),
1511                .hw.init = &(struct clk_init_data){
1512                        .name = "gcc_qupv3_wrap0_s4_clk",
1513                        .parent_data = &(const struct clk_parent_data){
1514                                .hw = &gcc_qupv3_wrap0_s4_clk_src.clkr.hw,
1515                        },
1516                        .num_parents = 1,
1517                        .flags = CLK_SET_RATE_PARENT,
1518                        .ops = &clk_branch2_ops,
1519                },
1520        },
1521};
1522
1523static struct clk_branch gcc_qupv3_wrap0_s5_clk = {
1524        .halt_reg = 0x17620,
1525        .halt_check = BRANCH_HALT_VOTED,
1526        .clkr = {
1527                .enable_reg = 0x52008,
1528                .enable_mask = BIT(15),
1529                .hw.init = &(struct clk_init_data){
1530                        .name = "gcc_qupv3_wrap0_s5_clk",
1531                        .parent_data = &(const struct clk_parent_data){
1532                                .hw = &gcc_qupv3_wrap0_s5_clk_src.clkr.hw,
1533                        },
1534                        .num_parents = 1,
1535                        .flags = CLK_SET_RATE_PARENT,
1536                        .ops = &clk_branch2_ops,
1537                },
1538        },
1539};
1540
1541static struct clk_branch gcc_qupv3_wrap1_core_2x_clk = {
1542        .halt_reg = 0x18004,
1543        .halt_check = BRANCH_HALT_VOTED,
1544        .clkr = {
1545                .enable_reg = 0x52008,
1546                .enable_mask = BIT(18),
1547                .hw.init = &(struct clk_init_data){
1548                        .name = "gcc_qupv3_wrap1_core_2x_clk",
1549                        .ops = &clk_branch2_ops,
1550                },
1551        },
1552};
1553
1554static struct clk_branch gcc_qupv3_wrap1_core_clk = {
1555        .halt_reg = 0x18008,
1556        .halt_check = BRANCH_HALT_VOTED,
1557        .clkr = {
1558                .enable_reg = 0x52008,
1559                .enable_mask = BIT(19),
1560                .hw.init = &(struct clk_init_data){
1561                        .name = "gcc_qupv3_wrap1_core_clk",
1562                        .ops = &clk_branch2_ops,
1563                },
1564        },
1565};
1566
1567static struct clk_branch gcc_qupv3_wrap1_s0_clk = {
1568        .halt_reg = 0x18014,
1569        .halt_check = BRANCH_HALT_VOTED,
1570        .clkr = {
1571                .enable_reg = 0x52008,
1572                .enable_mask = BIT(22),
1573                .hw.init = &(struct clk_init_data){
1574                        .name = "gcc_qupv3_wrap1_s0_clk",
1575                        .parent_data = &(const struct clk_parent_data){
1576                                .hw = &gcc_qupv3_wrap1_s0_clk_src.clkr.hw,
1577                        },
1578                        .num_parents = 1,
1579                        .flags = CLK_SET_RATE_PARENT,
1580                        .ops = &clk_branch2_ops,
1581                },
1582        },
1583};
1584
1585static struct clk_branch gcc_qupv3_wrap1_s1_clk = {
1586        .halt_reg = 0x18144,
1587        .halt_check = BRANCH_HALT_VOTED,
1588        .clkr = {
1589                .enable_reg = 0x52008,
1590                .enable_mask = BIT(23),
1591                .hw.init = &(struct clk_init_data){
1592                        .name = "gcc_qupv3_wrap1_s1_clk",
1593                        .parent_data = &(const struct clk_parent_data){
1594                                .hw = &gcc_qupv3_wrap1_s1_clk_src.clkr.hw,
1595                        },
1596                        .num_parents = 1,
1597                        .flags = CLK_SET_RATE_PARENT,
1598                        .ops = &clk_branch2_ops,
1599                },
1600        },
1601};
1602
1603static struct clk_branch gcc_qupv3_wrap1_s2_clk = {
1604        .halt_reg = 0x18274,
1605        .halt_check = BRANCH_HALT_VOTED,
1606        .clkr = {
1607                .enable_reg = 0x52008,
1608                .enable_mask = BIT(24),
1609                .hw.init = &(struct clk_init_data){
1610                        .name = "gcc_qupv3_wrap1_s2_clk",
1611                        .parent_data = &(const struct clk_parent_data){
1612                                .hw = &gcc_qupv3_wrap1_s2_clk_src.clkr.hw,
1613                        },
1614                        .num_parents = 1,
1615                        .flags = CLK_SET_RATE_PARENT,
1616                        .ops = &clk_branch2_ops,
1617                },
1618        },
1619};
1620
1621static struct clk_branch gcc_qupv3_wrap1_s3_clk = {
1622        .halt_reg = 0x183a4,
1623        .halt_check = BRANCH_HALT_VOTED,
1624        .clkr = {
1625                .enable_reg = 0x52008,
1626                .enable_mask = BIT(25),
1627                .hw.init = &(struct clk_init_data){
1628                        .name = "gcc_qupv3_wrap1_s3_clk",
1629                        .parent_data = &(const struct clk_parent_data){
1630                                .hw = &gcc_qupv3_wrap1_s3_clk_src.clkr.hw,
1631                        },
1632                        .num_parents = 1,
1633                        .flags = CLK_SET_RATE_PARENT,
1634                        .ops = &clk_branch2_ops,
1635                },
1636        },
1637};
1638
1639static struct clk_branch gcc_qupv3_wrap1_s4_clk = {
1640        .halt_reg = 0x184d4,
1641        .halt_check = BRANCH_HALT_VOTED,
1642        .clkr = {
1643                .enable_reg = 0x52008,
1644                .enable_mask = BIT(26),
1645                .hw.init = &(struct clk_init_data){
1646                        .name = "gcc_qupv3_wrap1_s4_clk",
1647                        .parent_data = &(const struct clk_parent_data){
1648                                .hw = &gcc_qupv3_wrap1_s4_clk_src.clkr.hw,
1649                        },
1650                        .num_parents = 1,
1651                        .flags = CLK_SET_RATE_PARENT,
1652                        .ops = &clk_branch2_ops,
1653                },
1654        },
1655};
1656
1657static struct clk_branch gcc_qupv3_wrap1_s5_clk = {
1658        .halt_reg = 0x18604,
1659        .halt_check = BRANCH_HALT_VOTED,
1660        .clkr = {
1661                .enable_reg = 0x52008,
1662                .enable_mask = BIT(27),
1663                .hw.init = &(struct clk_init_data){
1664                        .name = "gcc_qupv3_wrap1_s5_clk",
1665                        .parent_data = &(const struct clk_parent_data){
1666                                .hw = &gcc_qupv3_wrap1_s5_clk_src.clkr.hw,
1667                        },
1668                        .num_parents = 1,
1669                        .flags = CLK_SET_RATE_PARENT,
1670                        .ops = &clk_branch2_ops,
1671                },
1672        },
1673};
1674
1675static struct clk_branch gcc_qupv3_wrap_0_m_ahb_clk = {
1676        .halt_reg = 0x17004,
1677        .halt_check = BRANCH_HALT_VOTED,
1678        .clkr = {
1679                .enable_reg = 0x52008,
1680                .enable_mask = BIT(6),
1681                .hw.init = &(struct clk_init_data){
1682                        .name = "gcc_qupv3_wrap_0_m_ahb_clk",
1683                        .ops = &clk_branch2_ops,
1684                },
1685        },
1686};
1687
1688static struct clk_branch gcc_qupv3_wrap_0_s_ahb_clk = {
1689        .halt_reg = 0x17008,
1690        .halt_check = BRANCH_HALT_VOTED,
1691        .hwcg_reg = 0x17008,
1692        .hwcg_bit = 1,
1693        .clkr = {
1694                .enable_reg = 0x52008,
1695                .enable_mask = BIT(7),
1696                .hw.init = &(struct clk_init_data){
1697                        .name = "gcc_qupv3_wrap_0_s_ahb_clk",
1698                        .ops = &clk_branch2_ops,
1699                },
1700        },
1701};
1702
1703static struct clk_branch gcc_qupv3_wrap_1_m_ahb_clk = {
1704        .halt_reg = 0x1800c,
1705        .halt_check = BRANCH_HALT_VOTED,
1706        .clkr = {
1707                .enable_reg = 0x52008,
1708                .enable_mask = BIT(20),
1709                .hw.init = &(struct clk_init_data){
1710                        .name = "gcc_qupv3_wrap_1_m_ahb_clk",
1711                        .ops = &clk_branch2_ops,
1712                },
1713        },
1714};
1715
1716static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = {
1717        .halt_reg = 0x18010,
1718        .halt_check = BRANCH_HALT_VOTED,
1719        .hwcg_reg = 0x18010,
1720        .hwcg_bit = 1,
1721        .clkr = {
1722                .enable_reg = 0x52008,
1723                .enable_mask = BIT(21),
1724                .hw.init = &(struct clk_init_data){
1725                        .name = "gcc_qupv3_wrap_1_s_ahb_clk",
1726                        .ops = &clk_branch2_ops,
1727                },
1728        },
1729};
1730
1731static struct clk_branch gcc_sdcc1_ahb_clk = {
1732        .halt_reg = 0x12008,
1733        .halt_check = BRANCH_HALT,
1734        .clkr = {
1735                .enable_reg = 0x12008,
1736                .enable_mask = BIT(0),
1737                .hw.init = &(struct clk_init_data){
1738                        .name = "gcc_sdcc1_ahb_clk",
1739                        .ops = &clk_branch2_ops,
1740                },
1741        },
1742};
1743
1744static struct clk_branch gcc_sdcc1_apps_clk = {
1745        .halt_reg = 0x1200c,
1746        .halt_check = BRANCH_HALT,
1747        .clkr = {
1748                .enable_reg = 0x1200c,
1749                .enable_mask = BIT(0),
1750                .hw.init = &(struct clk_init_data){
1751                        .name = "gcc_sdcc1_apps_clk",
1752                        .parent_data = &(const struct clk_parent_data){
1753                                .hw = &gcc_sdcc1_apps_clk_src.clkr.hw,
1754                        },
1755                        .num_parents = 1,
1756                        .flags = CLK_SET_RATE_PARENT,
1757                        .ops = &clk_branch2_ops,
1758                },
1759        },
1760};
1761
1762static struct clk_branch gcc_sdcc1_ice_core_clk = {
1763        .halt_reg = 0x12040,
1764        .halt_check = BRANCH_HALT,
1765        .clkr = {
1766                .enable_reg = 0x12040,
1767                .enable_mask = BIT(0),
1768                .hw.init = &(struct clk_init_data){
1769                        .name = "gcc_sdcc1_ice_core_clk",
1770                        .parent_data = &(const struct clk_parent_data){
1771                                .hw = &gcc_sdcc1_ice_core_clk_src.clkr.hw,
1772                        },
1773                        .num_parents = 1,
1774                        .flags = CLK_SET_RATE_PARENT,
1775                        .ops = &clk_branch2_ops,
1776                },
1777        },
1778};
1779
1780static struct clk_branch gcc_sdcc2_ahb_clk = {
1781        .halt_reg = 0x14008,
1782        .halt_check = BRANCH_HALT,
1783        .clkr = {
1784                .enable_reg = 0x14008,
1785                .enable_mask = BIT(0),
1786                .hw.init = &(struct clk_init_data){
1787                        .name = "gcc_sdcc2_ahb_clk",
1788                        .ops = &clk_branch2_ops,
1789                },
1790        },
1791};
1792
1793static struct clk_branch gcc_sdcc2_apps_clk = {
1794        .halt_reg = 0x14004,
1795        .halt_check = BRANCH_HALT,
1796        .clkr = {
1797                .enable_reg = 0x14004,
1798                .enable_mask = BIT(0),
1799                .hw.init = &(struct clk_init_data){
1800                        .name = "gcc_sdcc2_apps_clk",
1801                        .parent_data = &(const struct clk_parent_data){
1802                                .hw = &gcc_sdcc2_apps_clk_src.clkr.hw,
1803                        },
1804                        .num_parents = 1,
1805                        .flags = CLK_SET_RATE_PARENT,
1806                        .ops = &clk_branch2_ops,
1807                },
1808        },
1809};
1810
1811/* For CPUSS functionality the SYS NOC clock needs to be left enabled */
1812static struct clk_branch gcc_sys_noc_cpuss_ahb_clk = {
1813        .halt_reg = 0x4144,
1814        .halt_check = BRANCH_HALT_VOTED,
1815        .clkr = {
1816                .enable_reg = 0x52000,
1817                .enable_mask = BIT(0),
1818                .hw.init = &(struct clk_init_data){
1819                        .name = "gcc_sys_noc_cpuss_ahb_clk",
1820                        .parent_data = &(const struct clk_parent_data){
1821                                .hw = &gcc_cpuss_ahb_clk_src.clkr.hw,
1822                        },
1823                        .num_parents = 1,
1824                        .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
1825                        .ops = &clk_branch2_ops,
1826                },
1827        },
1828};
1829
1830static struct clk_branch gcc_ufs_mem_clkref_clk = {
1831        .halt_reg = 0x8c000,
1832        .halt_check = BRANCH_HALT,
1833        .clkr = {
1834                .enable_reg = 0x8c000,
1835                .enable_mask = BIT(0),
1836                .hw.init = &(struct clk_init_data){
1837                        .name = "gcc_ufs_mem_clkref_clk",
1838                        .ops = &clk_branch2_ops,
1839                },
1840        },
1841};
1842
1843static struct clk_branch gcc_ufs_phy_ahb_clk = {
1844        .halt_reg = 0x77014,
1845        .halt_check = BRANCH_HALT,
1846        .hwcg_reg = 0x77014,
1847        .hwcg_bit = 1,
1848        .clkr = {
1849                .enable_reg = 0x77014,
1850                .enable_mask = BIT(0),
1851                .hw.init = &(struct clk_init_data){
1852                        .name = "gcc_ufs_phy_ahb_clk",
1853                        .ops = &clk_branch2_ops,
1854                },
1855        },
1856};
1857
1858static struct clk_branch gcc_ufs_phy_axi_clk = {
1859        .halt_reg = 0x77038,
1860        .halt_check = BRANCH_HALT,
1861        .hwcg_reg = 0x77038,
1862        .hwcg_bit = 1,
1863        .clkr = {
1864                .enable_reg = 0x77038,
1865                .enable_mask = BIT(0),
1866                .hw.init = &(struct clk_init_data){
1867                        .name = "gcc_ufs_phy_axi_clk",
1868                        .parent_data = &(const struct clk_parent_data){
1869                                .hw = &gcc_ufs_phy_axi_clk_src.clkr.hw,
1870                        },
1871                        .num_parents = 1,
1872                        .flags = CLK_SET_RATE_PARENT,
1873                        .ops = &clk_branch2_ops,
1874                },
1875        },
1876};
1877
1878static struct clk_branch gcc_ufs_phy_ice_core_clk = {
1879        .halt_reg = 0x77090,
1880        .halt_check = BRANCH_HALT,
1881        .hwcg_reg = 0x77090,
1882        .hwcg_bit = 1,
1883        .clkr = {
1884                .enable_reg = 0x77090,
1885                .enable_mask = BIT(0),
1886                .hw.init = &(struct clk_init_data){
1887                        .name = "gcc_ufs_phy_ice_core_clk",
1888                        .parent_data = &(const struct clk_parent_data){
1889                                .hw = &gcc_ufs_phy_ice_core_clk_src.clkr.hw,
1890                        },
1891                        .num_parents = 1,
1892                        .flags = CLK_SET_RATE_PARENT,
1893                        .ops = &clk_branch2_ops,
1894                },
1895        },
1896};
1897
1898static struct clk_branch gcc_ufs_phy_phy_aux_clk = {
1899        .halt_reg = 0x77094,
1900        .halt_check = BRANCH_HALT,
1901        .hwcg_reg = 0x77094,
1902        .hwcg_bit = 1,
1903        .clkr = {
1904                .enable_reg = 0x77094,
1905                .enable_mask = BIT(0),
1906                .hw.init = &(struct clk_init_data){
1907                        .name = "gcc_ufs_phy_phy_aux_clk",
1908                        .parent_data = &(const struct clk_parent_data){
1909                                .hw = &gcc_ufs_phy_phy_aux_clk_src.clkr.hw,
1910                        },
1911                        .num_parents = 1,
1912                        .flags = CLK_SET_RATE_PARENT,
1913                        .ops = &clk_branch2_ops,
1914                },
1915        },
1916};
1917
1918static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = {
1919        .halt_reg = 0x7701c,
1920        .halt_check = BRANCH_HALT_SKIP,
1921        .clkr = {
1922                .enable_reg = 0x7701c,
1923                .enable_mask = BIT(0),
1924                .hw.init = &(struct clk_init_data){
1925                        .name = "gcc_ufs_phy_rx_symbol_0_clk",
1926                        .ops = &clk_branch2_ops,
1927                },
1928        },
1929};
1930
1931static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = {
1932        .halt_reg = 0x77018,
1933        .halt_check = BRANCH_HALT_SKIP,
1934        .clkr = {
1935                .enable_reg = 0x77018,
1936                .enable_mask = BIT(0),
1937                .hw.init = &(struct clk_init_data){
1938                        .name = "gcc_ufs_phy_tx_symbol_0_clk",
1939                        .ops = &clk_branch2_ops,
1940                },
1941        },
1942};
1943
1944static struct clk_branch gcc_ufs_phy_unipro_core_clk = {
1945        .halt_reg = 0x7708c,
1946        .halt_check = BRANCH_HALT,
1947        .hwcg_reg = 0x7708c,
1948        .hwcg_bit = 1,
1949        .clkr = {
1950                .enable_reg = 0x7708c,
1951                .enable_mask = BIT(0),
1952                .hw.init = &(struct clk_init_data){
1953                        .name = "gcc_ufs_phy_unipro_core_clk",
1954                        .parent_data = &(const struct clk_parent_data){
1955                                .hw = &gcc_ufs_phy_unipro_core_clk_src.clkr.hw,
1956                        },
1957                        .num_parents = 1,
1958                        .flags = CLK_SET_RATE_PARENT,
1959                        .ops = &clk_branch2_ops,
1960                },
1961        },
1962};
1963
1964static struct clk_branch gcc_usb30_prim_master_clk = {
1965        .halt_reg = 0xf010,
1966        .halt_check = BRANCH_HALT,
1967        .clkr = {
1968                .enable_reg = 0xf010,
1969                .enable_mask = BIT(0),
1970                .hw.init = &(struct clk_init_data){
1971                        .name = "gcc_usb30_prim_master_clk",
1972                        .parent_data = &(const struct clk_parent_data){
1973                                .hw = &gcc_usb30_prim_master_clk_src.clkr.hw,
1974                        },
1975                        .num_parents = 1,
1976                        .flags = CLK_SET_RATE_PARENT,
1977                        .ops = &clk_branch2_ops,
1978                },
1979        },
1980};
1981
1982static struct clk_branch gcc_usb30_prim_mock_utmi_clk = {
1983        .halt_reg = 0xf018,
1984        .halt_check = BRANCH_HALT,
1985        .clkr = {
1986                .enable_reg = 0xf018,
1987                .enable_mask = BIT(0),
1988                .hw.init = &(struct clk_init_data){
1989                        .name = "gcc_usb30_prim_mock_utmi_clk",
1990                        .parent_data = &(const struct clk_parent_data){
1991                                .hw =
1992                                &gcc_usb30_prim_mock_utmi_clk_src.clkr.hw,
1993                        },
1994                        .num_parents = 1,
1995                        .flags = CLK_SET_RATE_PARENT,
1996                        .ops = &clk_branch2_ops,
1997                },
1998        },
1999};
2000
2001static struct clk_branch gcc_usb30_prim_sleep_clk = {
2002        .halt_reg = 0xf014,
2003        .halt_check = BRANCH_HALT,
2004        .clkr = {
2005                .enable_reg = 0xf014,
2006                .enable_mask = BIT(0),
2007                .hw.init = &(struct clk_init_data){
2008                        .name = "gcc_usb30_prim_sleep_clk",
2009                        .ops = &clk_branch2_ops,
2010                },
2011        },
2012};
2013
2014static struct clk_branch gcc_usb3_prim_clkref_clk = {
2015        .halt_reg = 0x8c010,
2016        .halt_check = BRANCH_HALT,
2017        .clkr = {
2018                .enable_reg = 0x8c010,
2019                .enable_mask = BIT(0),
2020                .hw.init = &(struct clk_init_data){
2021                        .name = "gcc_usb3_prim_clkref_clk",
2022                        .ops = &clk_branch2_ops,
2023                },
2024        },
2025};
2026
2027static struct clk_branch gcc_usb3_prim_phy_aux_clk = {
2028        .halt_reg = 0xf050,
2029        .halt_check = BRANCH_HALT,
2030        .clkr = {
2031                .enable_reg = 0xf050,
2032                .enable_mask = BIT(0),
2033                .hw.init = &(struct clk_init_data){
2034                        .name = "gcc_usb3_prim_phy_aux_clk",
2035                        .parent_data = &(const struct clk_parent_data){
2036                                .hw = &gcc_usb3_prim_phy_aux_clk_src.clkr.hw,
2037                        },
2038                        .num_parents = 1,
2039                        .flags = CLK_SET_RATE_PARENT,
2040                        .ops = &clk_branch2_ops,
2041                },
2042        },
2043};
2044
2045static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = {
2046        .halt_reg = 0xf054,
2047        .halt_check = BRANCH_HALT,
2048        .clkr = {
2049                .enable_reg = 0xf054,
2050                .enable_mask = BIT(0),
2051                .hw.init = &(struct clk_init_data){
2052                        .name = "gcc_usb3_prim_phy_com_aux_clk",
2053                        .parent_data = &(const struct clk_parent_data){
2054                                .hw = &gcc_usb3_prim_phy_aux_clk_src.clkr.hw,
2055                        },
2056                        .num_parents = 1,
2057                        .flags = CLK_SET_RATE_PARENT,
2058                        .ops = &clk_branch2_ops,
2059                },
2060        },
2061};
2062
2063static struct clk_branch gcc_usb3_prim_phy_pipe_clk = {
2064        .halt_reg = 0xf058,
2065        .halt_check = BRANCH_HALT_SKIP,
2066        .clkr = {
2067                .enable_reg = 0xf058,
2068                .enable_mask = BIT(0),
2069                .hw.init = &(struct clk_init_data){
2070                        .name = "gcc_usb3_prim_phy_pipe_clk",
2071                        .ops = &clk_branch2_ops,
2072                },
2073        },
2074};
2075
2076static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = {
2077        .halt_reg = 0x6a004,
2078        .halt_check = BRANCH_HALT,
2079        .hwcg_reg = 0x6a004,
2080        .hwcg_bit = 1,
2081        .clkr = {
2082                .enable_reg = 0x6a004,
2083                .enable_mask = BIT(0),
2084                .hw.init = &(struct clk_init_data){
2085                        .name = "gcc_usb_phy_cfg_ahb2phy_clk",
2086                        .ops = &clk_branch2_ops,
2087                },
2088        },
2089};
2090
2091static struct clk_branch gcc_video_axi_clk = {
2092        .halt_reg = 0xb01c,
2093        .halt_check = BRANCH_HALT,
2094        .clkr = {
2095                .enable_reg = 0xb01c,
2096                .enable_mask = BIT(0),
2097                .hw.init = &(struct clk_init_data){
2098                        .name = "gcc_video_axi_clk",
2099                        .ops = &clk_branch2_ops,
2100                },
2101        },
2102};
2103
2104static struct clk_branch gcc_video_gpll0_div_clk_src = {
2105        .halt_check = BRANCH_HALT_DELAY,
2106        .clkr = {
2107                .enable_reg = 0x52000,
2108                .enable_mask = BIT(20),
2109                .hw.init = &(struct clk_init_data){
2110                        .name = "gcc_video_gpll0_div_clk_src",
2111                        .parent_data = &(const struct clk_parent_data){
2112                                .hw = &gcc_pll0_main_div_cdiv.hw,
2113                        },
2114                        .num_parents = 1,
2115                        .flags = CLK_SET_RATE_PARENT,
2116                        .ops = &clk_branch2_ops,
2117                },
2118        },
2119};
2120
2121static struct clk_branch gcc_video_throttle_axi_clk = {
2122        .halt_reg = 0xb07c,
2123        .halt_check = BRANCH_HALT,
2124        .hwcg_reg = 0xb07c,
2125        .hwcg_bit = 1,
2126        .clkr = {
2127                .enable_reg = 0xb07c,
2128                .enable_mask = BIT(0),
2129                .hw.init = &(struct clk_init_data){
2130                        .name = "gcc_video_throttle_axi_clk",
2131                        .ops = &clk_branch2_ops,
2132                },
2133        },
2134};
2135
2136static struct clk_branch gcc_mss_cfg_ahb_clk = {
2137        .halt_reg = 0x8a000,
2138        .halt_check = BRANCH_HALT,
2139        .clkr = {
2140                .enable_reg = 0x8a000,
2141                .enable_mask = BIT(0),
2142                .hw.init = &(struct clk_init_data){
2143                        .name = "gcc_mss_cfg_ahb_clk",
2144                        .ops = &clk_branch2_ops,
2145                },
2146        },
2147};
2148
2149static struct clk_branch gcc_mss_mfab_axis_clk = {
2150        .halt_reg = 0x8a004,
2151        .halt_check = BRANCH_HALT_VOTED,
2152        .clkr = {
2153                .enable_reg = 0x8a004,
2154                .enable_mask = BIT(0),
2155                .hw.init = &(struct clk_init_data){
2156                        .name = "gcc_mss_mfab_axis_clk",
2157                        .ops = &clk_branch2_ops,
2158                },
2159        },
2160};
2161
2162static struct clk_branch gcc_mss_nav_axi_clk = {
2163        .halt_reg = 0x8a00c,
2164        .halt_check = BRANCH_HALT_VOTED,
2165        .clkr = {
2166                .enable_reg = 0x8a00c,
2167                .enable_mask = BIT(0),
2168                .hw.init = &(struct clk_init_data){
2169                        .name = "gcc_mss_nav_axi_clk",
2170                        .ops = &clk_branch2_ops,
2171                },
2172        },
2173};
2174
2175static struct clk_branch gcc_mss_snoc_axi_clk = {
2176        .halt_reg = 0x8a150,
2177        .halt_check = BRANCH_HALT,
2178        .clkr = {
2179                .enable_reg = 0x8a150,
2180                .enable_mask = BIT(0),
2181                .hw.init = &(struct clk_init_data){
2182                        .name = "gcc_mss_snoc_axi_clk",
2183                        .ops = &clk_branch2_ops,
2184                },
2185        },
2186};
2187
2188static struct clk_branch gcc_mss_q6_memnoc_axi_clk = {
2189        .halt_reg = 0x8a154,
2190        .halt_check = BRANCH_HALT,
2191        .clkr = {
2192                .enable_reg = 0x8a154,
2193                .enable_mask = BIT(0),
2194                .hw.init = &(struct clk_init_data){
2195                        .name = "gcc_mss_q6_memnoc_axi_clk",
2196                        .ops = &clk_branch2_ops,
2197                },
2198        },
2199};
2200
2201static struct clk_branch gcc_lpass_cfg_noc_sway_clk = {
2202        .halt_reg = 0x47018,
2203        .halt_check = BRANCH_HALT_DELAY,
2204        .clkr = {
2205                .enable_reg = 0x47018,
2206                .enable_mask = BIT(0),
2207                .hw.init = &(struct clk_init_data){
2208                        .name = "gcc_lpass_cfg_noc_sway_clk",
2209                        .ops = &clk_branch2_ops,
2210                },
2211        },
2212};
2213
2214static struct gdsc ufs_phy_gdsc = {
2215        .gdscr = 0x77004,
2216        .pd = {
2217                .name = "ufs_phy_gdsc",
2218        },
2219        .pwrsts = PWRSTS_OFF_ON,
2220};
2221
2222static struct gdsc usb30_prim_gdsc = {
2223        .gdscr = 0x0f004,
2224        .pd = {
2225                .name = "usb30_prim_gdsc",
2226        },
2227        .pwrsts = PWRSTS_OFF_ON,
2228};
2229
2230static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = {
2231        .gdscr = 0x7d040,
2232        .pd = {
2233                .name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc",
2234        },
2235        .pwrsts = PWRSTS_OFF_ON,
2236        .flags = VOTABLE,
2237};
2238
2239static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = {
2240        .gdscr = 0x7d044,
2241        .pd = {
2242                .name = "hlos1_vote_mmnoc_mmu_tbu_sf_gdsc",
2243        },
2244        .pwrsts = PWRSTS_OFF_ON,
2245        .flags = VOTABLE,
2246};
2247
2248static struct gdsc *gcc_sc7180_gdscs[] = {
2249        [UFS_PHY_GDSC] = &ufs_phy_gdsc,
2250        [USB30_PRIM_GDSC] = &usb30_prim_gdsc,
2251        [HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC] =
2252                                        &hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc,
2253        [HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC] =
2254                                        &hlos1_vote_mmnoc_mmu_tbu_sf_gdsc,
2255};
2256
2257
2258static struct clk_hw *gcc_sc7180_hws[] = {
2259        [GCC_GPLL0_MAIN_DIV_CDIV] = &gcc_pll0_main_div_cdiv.hw,
2260};
2261
2262static struct clk_regmap *gcc_sc7180_clocks[] = {
2263        [GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr,
2264        [GCC_AGGRE_USB3_PRIM_AXI_CLK] = &gcc_aggre_usb3_prim_axi_clk.clkr,
2265        [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
2266        [GCC_CAMERA_HF_AXI_CLK] = &gcc_camera_hf_axi_clk.clkr,
2267        [GCC_CAMERA_THROTTLE_HF_AXI_CLK] = &gcc_camera_throttle_hf_axi_clk.clkr,
2268        [GCC_CE1_AHB_CLK] = &gcc_ce1_ahb_clk.clkr,
2269        [GCC_CE1_AXI_CLK] = &gcc_ce1_axi_clk.clkr,
2270        [GCC_CE1_CLK] = &gcc_ce1_clk.clkr,
2271        [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr,
2272        [GCC_CPUSS_AHB_CLK] = &gcc_cpuss_ahb_clk.clkr,
2273        [GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr,
2274        [GCC_CPUSS_RBCPR_CLK] = &gcc_cpuss_rbcpr_clk.clkr,
2275        [GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr,
2276        [GCC_DISP_GPLL0_CLK_SRC] = &gcc_disp_gpll0_clk_src.clkr,
2277        [GCC_DISP_GPLL0_DIV_CLK_SRC] = &gcc_disp_gpll0_div_clk_src.clkr,
2278        [GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr,
2279        [GCC_DISP_THROTTLE_HF_AXI_CLK] = &gcc_disp_throttle_hf_axi_clk.clkr,
2280        [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
2281        [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr,
2282        [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
2283        [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr,
2284        [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
2285        [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr,
2286        [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr,
2287        [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr,
2288        [GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr,
2289        [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr,
2290        [GCC_NPU_AXI_CLK] = &gcc_npu_axi_clk.clkr,
2291        [GCC_NPU_BWMON_AXI_CLK] = &gcc_npu_bwmon_axi_clk.clkr,
2292        [GCC_NPU_BWMON_DMA_CFG_AHB_CLK] = &gcc_npu_bwmon_dma_cfg_ahb_clk.clkr,
2293        [GCC_NPU_BWMON_DSP_CFG_AHB_CLK] = &gcc_npu_bwmon_dsp_cfg_ahb_clk.clkr,
2294        [GCC_NPU_CFG_AHB_CLK] = &gcc_npu_cfg_ahb_clk.clkr,
2295        [GCC_NPU_DMA_CLK] = &gcc_npu_dma_clk.clkr,
2296        [GCC_NPU_GPLL0_CLK_SRC] = &gcc_npu_gpll0_clk_src.clkr,
2297        [GCC_NPU_GPLL0_DIV_CLK_SRC] = &gcc_npu_gpll0_div_clk_src.clkr,
2298        [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
2299        [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr,
2300        [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
2301        [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr,
2302        [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
2303        [GCC_QSPI_CNOC_PERIPH_AHB_CLK] = &gcc_qspi_cnoc_periph_ahb_clk.clkr,
2304        [GCC_QSPI_CORE_CLK] = &gcc_qspi_core_clk.clkr,
2305        [GCC_QSPI_CORE_CLK_SRC] = &gcc_qspi_core_clk_src.clkr,
2306        [GCC_QUPV3_WRAP0_CORE_2X_CLK] = &gcc_qupv3_wrap0_core_2x_clk.clkr,
2307        [GCC_QUPV3_WRAP0_CORE_CLK] = &gcc_qupv3_wrap0_core_clk.clkr,
2308        [GCC_QUPV3_WRAP0_S0_CLK] = &gcc_qupv3_wrap0_s0_clk.clkr,
2309        [GCC_QUPV3_WRAP0_S0_CLK_SRC] = &gcc_qupv3_wrap0_s0_clk_src.clkr,
2310        [GCC_QUPV3_WRAP0_S1_CLK] = &gcc_qupv3_wrap0_s1_clk.clkr,
2311        [GCC_QUPV3_WRAP0_S1_CLK_SRC] = &gcc_qupv3_wrap0_s1_clk_src.clkr,
2312        [GCC_QUPV3_WRAP0_S2_CLK] = &gcc_qupv3_wrap0_s2_clk.clkr,
2313        [GCC_QUPV3_WRAP0_S2_CLK_SRC] = &gcc_qupv3_wrap0_s2_clk_src.clkr,
2314        [GCC_QUPV3_WRAP0_S3_CLK] = &gcc_qupv3_wrap0_s3_clk.clkr,
2315        [GCC_QUPV3_WRAP0_S3_CLK_SRC] = &gcc_qupv3_wrap0_s3_clk_src.clkr,
2316        [GCC_QUPV3_WRAP0_S4_CLK] = &gcc_qupv3_wrap0_s4_clk.clkr,
2317        [GCC_QUPV3_WRAP0_S4_CLK_SRC] = &gcc_qupv3_wrap0_s4_clk_src.clkr,
2318        [GCC_QUPV3_WRAP0_S5_CLK] = &gcc_qupv3_wrap0_s5_clk.clkr,
2319        [GCC_QUPV3_WRAP0_S5_CLK_SRC] = &gcc_qupv3_wrap0_s5_clk_src.clkr,
2320        [GCC_QUPV3_WRAP1_CORE_2X_CLK] = &gcc_qupv3_wrap1_core_2x_clk.clkr,
2321        [GCC_QUPV3_WRAP1_CORE_CLK] = &gcc_qupv3_wrap1_core_clk.clkr,
2322        [GCC_QUPV3_WRAP1_S0_CLK] = &gcc_qupv3_wrap1_s0_clk.clkr,
2323        [GCC_QUPV3_WRAP1_S0_CLK_SRC] = &gcc_qupv3_wrap1_s0_clk_src.clkr,
2324        [GCC_QUPV3_WRAP1_S1_CLK] = &gcc_qupv3_wrap1_s1_clk.clkr,
2325        [GCC_QUPV3_WRAP1_S1_CLK_SRC] = &gcc_qupv3_wrap1_s1_clk_src.clkr,
2326        [GCC_QUPV3_WRAP1_S2_CLK] = &gcc_qupv3_wrap1_s2_clk.clkr,
2327        [GCC_QUPV3_WRAP1_S2_CLK_SRC] = &gcc_qupv3_wrap1_s2_clk_src.clkr,
2328        [GCC_QUPV3_WRAP1_S3_CLK] = &gcc_qupv3_wrap1_s3_clk.clkr,
2329        [GCC_QUPV3_WRAP1_S3_CLK_SRC] = &gcc_qupv3_wrap1_s3_clk_src.clkr,
2330        [GCC_QUPV3_WRAP1_S4_CLK] = &gcc_qupv3_wrap1_s4_clk.clkr,
2331        [GCC_QUPV3_WRAP1_S4_CLK_SRC] = &gcc_qupv3_wrap1_s4_clk_src.clkr,
2332        [GCC_QUPV3_WRAP1_S5_CLK] = &gcc_qupv3_wrap1_s5_clk.clkr,
2333        [GCC_QUPV3_WRAP1_S5_CLK_SRC] = &gcc_qupv3_wrap1_s5_clk_src.clkr,
2334        [GCC_QUPV3_WRAP_0_M_AHB_CLK] = &gcc_qupv3_wrap_0_m_ahb_clk.clkr,
2335        [GCC_QUPV3_WRAP_0_S_AHB_CLK] = &gcc_qupv3_wrap_0_s_ahb_clk.clkr,
2336        [GCC_QUPV3_WRAP_1_M_AHB_CLK] = &gcc_qupv3_wrap_1_m_ahb_clk.clkr,
2337        [GCC_QUPV3_WRAP_1_S_AHB_CLK] = &gcc_qupv3_wrap_1_s_ahb_clk.clkr,
2338        [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
2339        [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
2340        [GCC_SDCC1_APPS_CLK_SRC] = &gcc_sdcc1_apps_clk_src.clkr,
2341        [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
2342        [GCC_SDCC1_ICE_CORE_CLK_SRC] = &gcc_sdcc1_ice_core_clk_src.clkr,
2343        [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
2344        [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
2345        [GCC_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr,
2346        [GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr,
2347        [GCC_UFS_MEM_CLKREF_CLK] = &gcc_ufs_mem_clkref_clk.clkr,
2348        [GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr,
2349        [GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr,
2350        [GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr,
2351        [GCC_UFS_PHY_ICE_CORE_CLK] = &gcc_ufs_phy_ice_core_clk.clkr,
2352        [GCC_UFS_PHY_ICE_CORE_CLK_SRC] = &gcc_ufs_phy_ice_core_clk_src.clkr,
2353        [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr,
2354        [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr,
2355        [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr,
2356        [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr,
2357        [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr,
2358        [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] =
2359                &gcc_ufs_phy_unipro_core_clk_src.clkr,
2360        [GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr,
2361        [GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr,
2362        [GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr,
2363        [GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] =
2364                &gcc_usb30_prim_mock_utmi_clk_src.clkr,
2365        [GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr,
2366        [GCC_USB3_PRIM_CLKREF_CLK] = &gcc_usb3_prim_clkref_clk.clkr,
2367        [GCC_USB3_PRIM_PHY_AUX_CLK] = &gcc_usb3_prim_phy_aux_clk.clkr,
2368        [GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr,
2369        [GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr,
2370        [GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr,
2371        [GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr,
2372        [GCC_VIDEO_AXI_CLK] = &gcc_video_axi_clk.clkr,
2373        [GCC_VIDEO_GPLL0_DIV_CLK_SRC] = &gcc_video_gpll0_div_clk_src.clkr,
2374        [GCC_VIDEO_THROTTLE_AXI_CLK] = &gcc_video_throttle_axi_clk.clkr,
2375        [GPLL0] = &gpll0.clkr,
2376        [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr,
2377        [GPLL6] = &gpll6.clkr,
2378        [GPLL7] = &gpll7.clkr,
2379        [GPLL4] = &gpll4.clkr,
2380        [GPLL1] = &gpll1.clkr,
2381        [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
2382        [GCC_MSS_MFAB_AXIS_CLK] = &gcc_mss_mfab_axis_clk.clkr,
2383        [GCC_MSS_NAV_AXI_CLK] = &gcc_mss_nav_axi_clk.clkr,
2384        [GCC_MSS_Q6_MEMNOC_AXI_CLK] = &gcc_mss_q6_memnoc_axi_clk.clkr,
2385        [GCC_MSS_SNOC_AXI_CLK] = &gcc_mss_snoc_axi_clk.clkr,
2386        [GCC_SEC_CTRL_CLK_SRC] = &gcc_sec_ctrl_clk_src.clkr,
2387        [GCC_LPASS_CFG_NOC_SWAY_CLK] = &gcc_lpass_cfg_noc_sway_clk.clkr,
2388};
2389
2390static const struct qcom_reset_map gcc_sc7180_resets[] = {
2391        [GCC_QUSB2PHY_PRIM_BCR] = { 0x26000 },
2392        [GCC_QUSB2PHY_SEC_BCR] = { 0x26004 },
2393        [GCC_UFS_PHY_BCR] = { 0x77000 },
2394        [GCC_USB30_PRIM_BCR] = { 0xf000 },
2395        [GCC_USB3_PHY_PRIM_BCR] = { 0x50000 },
2396        [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
2397        [GCC_USB3_PHY_SEC_BCR] = { 0x5000c },
2398        [GCC_USB3_DP_PHY_PRIM_BCR] = { 0x50008 },
2399        [GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
2400        [GCC_USB3_DP_PHY_SEC_BCR] = { 0x50014 },
2401        [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
2402};
2403
2404static struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
2405        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk_src),
2406        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk_src),
2407        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk_src),
2408        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk_src),
2409        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk_src),
2410        DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk_src),
2411        DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk_src),
2412        DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk_src),
2413        DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk_src),
2414        DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk_src),
2415        DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk_src),
2416        DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk_src),
2417};
2418
2419static const struct regmap_config gcc_sc7180_regmap_config = {
2420        .reg_bits = 32,
2421        .reg_stride = 4,
2422        .val_bits = 32,
2423        .max_register = 0x18208c,
2424        .fast_io = true,
2425};
2426
2427static const struct qcom_cc_desc gcc_sc7180_desc = {
2428        .config = &gcc_sc7180_regmap_config,
2429        .clk_hws = gcc_sc7180_hws,
2430        .num_clk_hws = ARRAY_SIZE(gcc_sc7180_hws),
2431        .clks = gcc_sc7180_clocks,
2432        .num_clks = ARRAY_SIZE(gcc_sc7180_clocks),
2433        .resets = gcc_sc7180_resets,
2434        .num_resets = ARRAY_SIZE(gcc_sc7180_resets),
2435        .gdscs = gcc_sc7180_gdscs,
2436        .num_gdscs = ARRAY_SIZE(gcc_sc7180_gdscs),
2437};
2438
2439static const struct of_device_id gcc_sc7180_match_table[] = {
2440        { .compatible = "qcom,gcc-sc7180" },
2441        { }
2442};
2443MODULE_DEVICE_TABLE(of, gcc_sc7180_match_table);
2444
2445static int gcc_sc7180_probe(struct platform_device *pdev)
2446{
2447        struct regmap *regmap;
2448        int ret;
2449
2450        regmap = qcom_cc_map(pdev, &gcc_sc7180_desc);
2451        if (IS_ERR(regmap))
2452                return PTR_ERR(regmap);
2453
2454        /*
2455         * Disable the GPLL0 active input to MM blocks, NPU
2456         * and GPU via MISC registers.
2457         */
2458        regmap_update_bits(regmap, 0x09ffc, 0x3, 0x3);
2459        regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);
2460        regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
2461
2462        /*
2463         * Keep the clocks always-ON
2464         * GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK,
2465         * GCC_DISP_AHB_CLK, GCC_GPU_CFG_AHB_CLK
2466         */
2467        regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0));
2468        regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0));
2469        regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0));
2470        regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0));
2471        regmap_update_bits(regmap, 0x0b02c, BIT(0), BIT(0));
2472        regmap_update_bits(regmap, 0x0b028, BIT(0), BIT(0));
2473        regmap_update_bits(regmap, 0x0b030, BIT(0), BIT(0));
2474        regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
2475
2476        ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
2477                                        ARRAY_SIZE(gcc_dfs_clocks));
2478        if (ret)
2479                return ret;
2480
2481        return qcom_cc_really_probe(pdev, &gcc_sc7180_desc, regmap);
2482}
2483
2484static struct platform_driver gcc_sc7180_driver = {
2485        .probe = gcc_sc7180_probe,
2486        .driver = {
2487                .name = "gcc-sc7180",
2488                .of_match_table = gcc_sc7180_match_table,
2489        },
2490};
2491
2492static int __init gcc_sc7180_init(void)
2493{
2494        return platform_driver_register(&gcc_sc7180_driver);
2495}
2496core_initcall(gcc_sc7180_init);
2497
2498static void __exit gcc_sc7180_exit(void)
2499{
2500        platform_driver_unregister(&gcc_sc7180_driver);
2501}
2502module_exit(gcc_sc7180_exit);
2503
2504MODULE_DESCRIPTION("QTI GCC SC7180 Driver");
2505MODULE_LICENSE("GPL v2");
2506