root/drivers/clk/meson/g12a.c

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

DEFINITIONS

This source file includes following definitions.
  1. g12a_cpu_clk_mux_notifier_cb
  2. g12a_cpu_clk_postmux_notifier_cb
  3. g12a_sys_pll_notifier_cb
  4. meson_g12a_dvfs_setup_common
  5. meson_g12b_dvfs_setup
  6. meson_g12a_dvfs_setup
  7. meson_g12a_probe

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  * Amlogic Meson-G12A Clock Controller Driver
   4  *
   5  * Copyright (c) 2016 Baylibre SAS.
   6  * Author: Michael Turquette <mturquette@baylibre.com>
   7  *
   8  * Copyright (c) 2018 Amlogic, inc.
   9  * Author: Qiufang Dai <qiufang.dai@amlogic.com>
  10  * Author: Jian Hu <jian.hu@amlogic.com>
  11  */
  12 
  13 #include <linux/clk-provider.h>
  14 #include <linux/init.h>
  15 #include <linux/of_device.h>
  16 #include <linux/platform_device.h>
  17 #include <linux/clk.h>
  18 
  19 #include "clk-mpll.h"
  20 #include "clk-pll.h"
  21 #include "clk-regmap.h"
  22 #include "clk-cpu-dyndiv.h"
  23 #include "vid-pll-div.h"
  24 #include "meson-eeclk.h"
  25 #include "g12a.h"
  26 
  27 static DEFINE_SPINLOCK(meson_clk_lock);
  28 
  29 static struct clk_regmap g12a_fixed_pll_dco = {
  30         .data = &(struct meson_clk_pll_data){
  31                 .en = {
  32                         .reg_off = HHI_FIX_PLL_CNTL0,
  33                         .shift   = 28,
  34                         .width   = 1,
  35                 },
  36                 .m = {
  37                         .reg_off = HHI_FIX_PLL_CNTL0,
  38                         .shift   = 0,
  39                         .width   = 8,
  40                 },
  41                 .n = {
  42                         .reg_off = HHI_FIX_PLL_CNTL0,
  43                         .shift   = 10,
  44                         .width   = 5,
  45                 },
  46                 .frac = {
  47                         .reg_off = HHI_FIX_PLL_CNTL1,
  48                         .shift   = 0,
  49                         .width   = 17,
  50                 },
  51                 .l = {
  52                         .reg_off = HHI_FIX_PLL_CNTL0,
  53                         .shift   = 31,
  54                         .width   = 1,
  55                 },
  56                 .rst = {
  57                         .reg_off = HHI_FIX_PLL_CNTL0,
  58                         .shift   = 29,
  59                         .width   = 1,
  60                 },
  61         },
  62         .hw.init = &(struct clk_init_data){
  63                 .name = "fixed_pll_dco",
  64                 .ops = &meson_clk_pll_ro_ops,
  65                 .parent_data = &(const struct clk_parent_data) {
  66                         .fw_name = "xtal",
  67                 },
  68                 .num_parents = 1,
  69         },
  70 };
  71 
  72 static struct clk_regmap g12a_fixed_pll = {
  73         .data = &(struct clk_regmap_div_data){
  74                 .offset = HHI_FIX_PLL_CNTL0,
  75                 .shift = 16,
  76                 .width = 2,
  77                 .flags = CLK_DIVIDER_POWER_OF_TWO,
  78         },
  79         .hw.init = &(struct clk_init_data){
  80                 .name = "fixed_pll",
  81                 .ops = &clk_regmap_divider_ro_ops,
  82                 .parent_hws = (const struct clk_hw *[]) {
  83                         &g12a_fixed_pll_dco.hw
  84                 },
  85                 .num_parents = 1,
  86                 /*
  87                  * This clock won't ever change at runtime so
  88                  * CLK_SET_RATE_PARENT is not required
  89                  */
  90         },
  91 };
  92 
  93 static const struct pll_mult_range g12a_sys_pll_mult_range = {
  94         .min = 128,
  95         .max = 250,
  96 };
  97 
  98 static struct clk_regmap g12a_sys_pll_dco = {
  99         .data = &(struct meson_clk_pll_data){
 100                 .en = {
 101                         .reg_off = HHI_SYS_PLL_CNTL0,
 102                         .shift   = 28,
 103                         .width   = 1,
 104                 },
 105                 .m = {
 106                         .reg_off = HHI_SYS_PLL_CNTL0,
 107                         .shift   = 0,
 108                         .width   = 8,
 109                 },
 110                 .n = {
 111                         .reg_off = HHI_SYS_PLL_CNTL0,
 112                         .shift   = 10,
 113                         .width   = 5,
 114                 },
 115                 .l = {
 116                         .reg_off = HHI_SYS_PLL_CNTL0,
 117                         .shift   = 31,
 118                         .width   = 1,
 119                 },
 120                 .rst = {
 121                         .reg_off = HHI_SYS_PLL_CNTL0,
 122                         .shift   = 29,
 123                         .width   = 1,
 124                 },
 125                 .range = &g12a_sys_pll_mult_range,
 126         },
 127         .hw.init = &(struct clk_init_data){
 128                 .name = "sys_pll_dco",
 129                 .ops = &meson_clk_pll_ops,
 130                 .parent_data = &(const struct clk_parent_data) {
 131                         .fw_name = "xtal",
 132                 },
 133                 .num_parents = 1,
 134                 /* This clock feeds the CPU, avoid disabling it */
 135                 .flags = CLK_IS_CRITICAL,
 136         },
 137 };
 138 
 139 static struct clk_regmap g12a_sys_pll = {
 140         .data = &(struct clk_regmap_div_data){
 141                 .offset = HHI_SYS_PLL_CNTL0,
 142                 .shift = 16,
 143                 .width = 3,
 144                 .flags = CLK_DIVIDER_POWER_OF_TWO,
 145         },
 146         .hw.init = &(struct clk_init_data){
 147                 .name = "sys_pll",
 148                 .ops = &clk_regmap_divider_ops,
 149                 .parent_hws = (const struct clk_hw *[]) {
 150                         &g12a_sys_pll_dco.hw
 151                 },
 152                 .num_parents = 1,
 153                 .flags = CLK_SET_RATE_PARENT,
 154         },
 155 };
 156 
 157 static struct clk_regmap g12b_sys1_pll_dco = {
 158         .data = &(struct meson_clk_pll_data){
 159                 .en = {
 160                         .reg_off = HHI_SYS1_PLL_CNTL0,
 161                         .shift   = 28,
 162                         .width   = 1,
 163                 },
 164                 .m = {
 165                         .reg_off = HHI_SYS1_PLL_CNTL0,
 166                         .shift   = 0,
 167                         .width   = 8,
 168                 },
 169                 .n = {
 170                         .reg_off = HHI_SYS1_PLL_CNTL0,
 171                         .shift   = 10,
 172                         .width   = 5,
 173                 },
 174                 .l = {
 175                         .reg_off = HHI_SYS1_PLL_CNTL0,
 176                         .shift   = 31,
 177                         .width   = 1,
 178                 },
 179                 .rst = {
 180                         .reg_off = HHI_SYS1_PLL_CNTL0,
 181                         .shift   = 29,
 182                         .width   = 1,
 183                 },
 184                 .range = &g12a_sys_pll_mult_range,
 185         },
 186         .hw.init = &(struct clk_init_data){
 187                 .name = "sys1_pll_dco",
 188                 .ops = &meson_clk_pll_ops,
 189                 .parent_data = &(const struct clk_parent_data) {
 190                         .fw_name = "xtal",
 191                 },
 192                 .num_parents = 1,
 193                 /* This clock feeds the CPU, avoid disabling it */
 194                 .flags = CLK_IS_CRITICAL,
 195         },
 196 };
 197 
 198 static struct clk_regmap g12b_sys1_pll = {
 199         .data = &(struct clk_regmap_div_data){
 200                 .offset = HHI_SYS1_PLL_CNTL0,
 201                 .shift = 16,
 202                 .width = 3,
 203                 .flags = CLK_DIVIDER_POWER_OF_TWO,
 204         },
 205         .hw.init = &(struct clk_init_data){
 206                 .name = "sys1_pll",
 207                 .ops = &clk_regmap_divider_ops,
 208                 .parent_hws = (const struct clk_hw *[]) {
 209                         &g12b_sys1_pll_dco.hw
 210                 },
 211                 .num_parents = 1,
 212                 .flags = CLK_SET_RATE_PARENT,
 213         },
 214 };
 215 
 216 static struct clk_regmap g12a_sys_pll_div16_en = {
 217         .data = &(struct clk_regmap_gate_data){
 218                 .offset = HHI_SYS_CPU_CLK_CNTL1,
 219                 .bit_idx = 24,
 220         },
 221         .hw.init = &(struct clk_init_data) {
 222                 .name = "sys_pll_div16_en",
 223                 .ops = &clk_regmap_gate_ro_ops,
 224                 .parent_hws = (const struct clk_hw *[]) { &g12a_sys_pll.hw },
 225                 .num_parents = 1,
 226                 /*
 227                  * This clock is used to debug the sys_pll range
 228                  * Linux should not change it at runtime
 229                  */
 230         },
 231 };
 232 
 233 static struct clk_regmap g12b_sys1_pll_div16_en = {
 234         .data = &(struct clk_regmap_gate_data){
 235                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
 236                 .bit_idx = 24,
 237         },
 238         .hw.init = &(struct clk_init_data) {
 239                 .name = "sys1_pll_div16_en",
 240                 .ops = &clk_regmap_gate_ro_ops,
 241                 .parent_hws = (const struct clk_hw *[]) {
 242                         &g12b_sys1_pll.hw
 243                 },
 244                 .num_parents = 1,
 245                 /*
 246                  * This clock is used to debug the sys_pll range
 247                  * Linux should not change it at runtime
 248                  */
 249         },
 250 };
 251 
 252 static struct clk_fixed_factor g12a_sys_pll_div16 = {
 253         .mult = 1,
 254         .div = 16,
 255         .hw.init = &(struct clk_init_data){
 256                 .name = "sys_pll_div16",
 257                 .ops = &clk_fixed_factor_ops,
 258                 .parent_hws = (const struct clk_hw *[]) {
 259                         &g12a_sys_pll_div16_en.hw
 260                 },
 261                 .num_parents = 1,
 262         },
 263 };
 264 
 265 static struct clk_fixed_factor g12b_sys1_pll_div16 = {
 266         .mult = 1,
 267         .div = 16,
 268         .hw.init = &(struct clk_init_data){
 269                 .name = "sys1_pll_div16",
 270                 .ops = &clk_fixed_factor_ops,
 271                 .parent_hws = (const struct clk_hw *[]) {
 272                         &g12b_sys1_pll_div16_en.hw
 273                 },
 274                 .num_parents = 1,
 275         },
 276 };
 277 
 278 static struct clk_fixed_factor g12a_fclk_div2_div = {
 279         .mult = 1,
 280         .div = 2,
 281         .hw.init = &(struct clk_init_data){
 282                 .name = "fclk_div2_div",
 283                 .ops = &clk_fixed_factor_ops,
 284                 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
 285                 .num_parents = 1,
 286         },
 287 };
 288 
 289 static struct clk_regmap g12a_fclk_div2 = {
 290         .data = &(struct clk_regmap_gate_data){
 291                 .offset = HHI_FIX_PLL_CNTL1,
 292                 .bit_idx = 24,
 293         },
 294         .hw.init = &(struct clk_init_data){
 295                 .name = "fclk_div2",
 296                 .ops = &clk_regmap_gate_ops,
 297                 .parent_hws = (const struct clk_hw *[]) {
 298                         &g12a_fclk_div2_div.hw
 299                 },
 300                 .num_parents = 1,
 301         },
 302 };
 303 
 304 static struct clk_fixed_factor g12a_fclk_div3_div = {
 305         .mult = 1,
 306         .div = 3,
 307         .hw.init = &(struct clk_init_data){
 308                 .name = "fclk_div3_div",
 309                 .ops = &clk_fixed_factor_ops,
 310                 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
 311                 .num_parents = 1,
 312         },
 313 };
 314 
 315 static struct clk_regmap g12a_fclk_div3 = {
 316         .data = &(struct clk_regmap_gate_data){
 317                 .offset = HHI_FIX_PLL_CNTL1,
 318                 .bit_idx = 20,
 319         },
 320         .hw.init = &(struct clk_init_data){
 321                 .name = "fclk_div3",
 322                 .ops = &clk_regmap_gate_ops,
 323                 .parent_hws = (const struct clk_hw *[]) {
 324                         &g12a_fclk_div3_div.hw
 325                 },
 326                 .num_parents = 1,
 327                 /*
 328                  * This clock is used by the resident firmware and is required
 329                  * by the platform to operate correctly.
 330                  * Until the following condition are met, we need this clock to
 331                  * be marked as critical:
 332                  * a) Mark the clock used by a firmware resource, if possible
 333                  * b) CCF has a clock hand-off mechanism to make the sure the
 334                  *    clock stays on until the proper driver comes along
 335                  */
 336                 .flags = CLK_IS_CRITICAL,
 337         },
 338 };
 339 
 340 /* Datasheet names this field as "premux0" */
 341 static struct clk_regmap g12a_cpu_clk_premux0 = {
 342         .data = &(struct clk_regmap_mux_data){
 343                 .offset = HHI_SYS_CPU_CLK_CNTL0,
 344                 .mask = 0x3,
 345                 .shift = 0,
 346                 .flags = CLK_MUX_ROUND_CLOSEST,
 347         },
 348         .hw.init = &(struct clk_init_data){
 349                 .name = "cpu_clk_dyn0_sel",
 350                 .ops = &clk_regmap_mux_ops,
 351                 .parent_data = (const struct clk_parent_data []) {
 352                         { .fw_name = "xtal", },
 353                         { .hw = &g12a_fclk_div2.hw },
 354                         { .hw = &g12a_fclk_div3.hw },
 355                 },
 356                 .num_parents = 3,
 357                 .flags = CLK_SET_RATE_PARENT,
 358         },
 359 };
 360 
 361 /* Datasheet names this field as "premux1" */
 362 static struct clk_regmap g12a_cpu_clk_premux1 = {
 363         .data = &(struct clk_regmap_mux_data){
 364                 .offset = HHI_SYS_CPU_CLK_CNTL0,
 365                 .mask = 0x3,
 366                 .shift = 16,
 367         },
 368         .hw.init = &(struct clk_init_data){
 369                 .name = "cpu_clk_dyn1_sel",
 370                 .ops = &clk_regmap_mux_ops,
 371                 .parent_data = (const struct clk_parent_data []) {
 372                         { .fw_name = "xtal", },
 373                         { .hw = &g12a_fclk_div2.hw },
 374                         { .hw = &g12a_fclk_div3.hw },
 375                 },
 376                 .num_parents = 3,
 377                 /* This sub-tree is used a parking clock */
 378                 .flags = CLK_SET_RATE_NO_REPARENT
 379         },
 380 };
 381 
 382 /* Datasheet names this field as "mux0_divn_tcnt" */
 383 static struct clk_regmap g12a_cpu_clk_mux0_div = {
 384         .data = &(struct meson_clk_cpu_dyndiv_data){
 385                 .div = {
 386                         .reg_off = HHI_SYS_CPU_CLK_CNTL0,
 387                         .shift = 4,
 388                         .width = 6,
 389                 },
 390                 .dyn = {
 391                         .reg_off = HHI_SYS_CPU_CLK_CNTL0,
 392                         .shift = 26,
 393                         .width = 1,
 394                 },
 395         },
 396         .hw.init = &(struct clk_init_data){
 397                 .name = "cpu_clk_dyn0_div",
 398                 .ops = &meson_clk_cpu_dyndiv_ops,
 399                 .parent_hws = (const struct clk_hw *[]) {
 400                         &g12a_cpu_clk_premux0.hw
 401                 },
 402                 .num_parents = 1,
 403                 .flags = CLK_SET_RATE_PARENT,
 404         },
 405 };
 406 
 407 /* Datasheet names this field as "postmux0" */
 408 static struct clk_regmap g12a_cpu_clk_postmux0 = {
 409         .data = &(struct clk_regmap_mux_data){
 410                 .offset = HHI_SYS_CPU_CLK_CNTL0,
 411                 .mask = 0x1,
 412                 .shift = 2,
 413                 .flags = CLK_MUX_ROUND_CLOSEST,
 414         },
 415         .hw.init = &(struct clk_init_data){
 416                 .name = "cpu_clk_dyn0",
 417                 .ops = &clk_regmap_mux_ops,
 418                 .parent_hws = (const struct clk_hw *[]) {
 419                         &g12a_cpu_clk_premux0.hw,
 420                         &g12a_cpu_clk_mux0_div.hw,
 421                 },
 422                 .num_parents = 2,
 423                 .flags = CLK_SET_RATE_PARENT,
 424         },
 425 };
 426 
 427 /* Datasheet names this field as "Mux1_divn_tcnt" */
 428 static struct clk_regmap g12a_cpu_clk_mux1_div = {
 429         .data = &(struct clk_regmap_div_data){
 430                 .offset = HHI_SYS_CPU_CLK_CNTL0,
 431                 .shift = 20,
 432                 .width = 6,
 433         },
 434         .hw.init = &(struct clk_init_data){
 435                 .name = "cpu_clk_dyn1_div",
 436                 .ops = &clk_regmap_divider_ro_ops,
 437                 .parent_hws = (const struct clk_hw *[]) {
 438                         &g12a_cpu_clk_premux1.hw
 439                 },
 440                 .num_parents = 1,
 441         },
 442 };
 443 
 444 /* Datasheet names this field as "postmux1" */
 445 static struct clk_regmap g12a_cpu_clk_postmux1 = {
 446         .data = &(struct clk_regmap_mux_data){
 447                 .offset = HHI_SYS_CPU_CLK_CNTL0,
 448                 .mask = 0x1,
 449                 .shift = 18,
 450         },
 451         .hw.init = &(struct clk_init_data){
 452                 .name = "cpu_clk_dyn1",
 453                 .ops = &clk_regmap_mux_ops,
 454                 .parent_hws = (const struct clk_hw *[]) {
 455                         &g12a_cpu_clk_premux1.hw,
 456                         &g12a_cpu_clk_mux1_div.hw,
 457                 },
 458                 .num_parents = 2,
 459                 /* This sub-tree is used a parking clock */
 460                 .flags = CLK_SET_RATE_NO_REPARENT,
 461         },
 462 };
 463 
 464 /* Datasheet names this field as "Final_dyn_mux_sel" */
 465 static struct clk_regmap g12a_cpu_clk_dyn = {
 466         .data = &(struct clk_regmap_mux_data){
 467                 .offset = HHI_SYS_CPU_CLK_CNTL0,
 468                 .mask = 0x1,
 469                 .shift = 10,
 470                 .flags = CLK_MUX_ROUND_CLOSEST,
 471         },
 472         .hw.init = &(struct clk_init_data){
 473                 .name = "cpu_clk_dyn",
 474                 .ops = &clk_regmap_mux_ops,
 475                 .parent_hws = (const struct clk_hw *[]) {
 476                         &g12a_cpu_clk_postmux0.hw,
 477                         &g12a_cpu_clk_postmux1.hw,
 478                 },
 479                 .num_parents = 2,
 480                 .flags = CLK_SET_RATE_PARENT,
 481         },
 482 };
 483 
 484 /* Datasheet names this field as "Final_mux_sel" */
 485 static struct clk_regmap g12a_cpu_clk = {
 486         .data = &(struct clk_regmap_mux_data){
 487                 .offset = HHI_SYS_CPU_CLK_CNTL0,
 488                 .mask = 0x1,
 489                 .shift = 11,
 490                 .flags = CLK_MUX_ROUND_CLOSEST,
 491         },
 492         .hw.init = &(struct clk_init_data){
 493                 .name = "cpu_clk",
 494                 .ops = &clk_regmap_mux_ops,
 495                 .parent_hws = (const struct clk_hw *[]) {
 496                         &g12a_cpu_clk_dyn.hw,
 497                         &g12a_sys_pll.hw,
 498                 },
 499                 .num_parents = 2,
 500                 .flags = CLK_SET_RATE_PARENT,
 501         },
 502 };
 503 
 504 /* Datasheet names this field as "Final_mux_sel" */
 505 static struct clk_regmap g12b_cpu_clk = {
 506         .data = &(struct clk_regmap_mux_data){
 507                 .offset = HHI_SYS_CPU_CLK_CNTL0,
 508                 .mask = 0x1,
 509                 .shift = 11,
 510                 .flags = CLK_MUX_ROUND_CLOSEST,
 511         },
 512         .hw.init = &(struct clk_init_data){
 513                 .name = "cpu_clk",
 514                 .ops = &clk_regmap_mux_ops,
 515                 .parent_hws = (const struct clk_hw *[]) {
 516                         &g12a_cpu_clk_dyn.hw,
 517                         &g12b_sys1_pll.hw
 518                 },
 519                 .num_parents = 2,
 520                 .flags = CLK_SET_RATE_PARENT,
 521         },
 522 };
 523 
 524 /* Datasheet names this field as "premux0" */
 525 static struct clk_regmap g12b_cpub_clk_premux0 = {
 526         .data = &(struct clk_regmap_mux_data){
 527                 .offset = HHI_SYS_CPUB_CLK_CNTL,
 528                 .mask = 0x3,
 529                 .shift = 0,
 530                 .flags = CLK_MUX_ROUND_CLOSEST,
 531         },
 532         .hw.init = &(struct clk_init_data){
 533                 .name = "cpub_clk_dyn0_sel",
 534                 .ops = &clk_regmap_mux_ops,
 535                 .parent_data = (const struct clk_parent_data []) {
 536                         { .fw_name = "xtal", },
 537                         { .hw = &g12a_fclk_div2.hw },
 538                         { .hw = &g12a_fclk_div3.hw },
 539                 },
 540                 .num_parents = 3,
 541                 .flags = CLK_SET_RATE_PARENT,
 542         },
 543 };
 544 
 545 /* Datasheet names this field as "mux0_divn_tcnt" */
 546 static struct clk_regmap g12b_cpub_clk_mux0_div = {
 547         .data = &(struct meson_clk_cpu_dyndiv_data){
 548                 .div = {
 549                         .reg_off = HHI_SYS_CPUB_CLK_CNTL,
 550                         .shift = 4,
 551                         .width = 6,
 552                 },
 553                 .dyn = {
 554                         .reg_off = HHI_SYS_CPUB_CLK_CNTL,
 555                         .shift = 26,
 556                         .width = 1,
 557                 },
 558         },
 559         .hw.init = &(struct clk_init_data){
 560                 .name = "cpub_clk_dyn0_div",
 561                 .ops = &meson_clk_cpu_dyndiv_ops,
 562                 .parent_hws = (const struct clk_hw *[]) {
 563                         &g12b_cpub_clk_premux0.hw
 564                 },
 565                 .num_parents = 1,
 566                 .flags = CLK_SET_RATE_PARENT,
 567         },
 568 };
 569 
 570 /* Datasheet names this field as "postmux0" */
 571 static struct clk_regmap g12b_cpub_clk_postmux0 = {
 572         .data = &(struct clk_regmap_mux_data){
 573                 .offset = HHI_SYS_CPUB_CLK_CNTL,
 574                 .mask = 0x1,
 575                 .shift = 2,
 576                 .flags = CLK_MUX_ROUND_CLOSEST,
 577         },
 578         .hw.init = &(struct clk_init_data){
 579                 .name = "cpub_clk_dyn0",
 580                 .ops = &clk_regmap_mux_ops,
 581                 .parent_hws = (const struct clk_hw *[]) {
 582                         &g12b_cpub_clk_premux0.hw,
 583                         &g12b_cpub_clk_mux0_div.hw
 584                 },
 585                 .num_parents = 2,
 586                 .flags = CLK_SET_RATE_PARENT,
 587         },
 588 };
 589 
 590 /* Datasheet names this field as "premux1" */
 591 static struct clk_regmap g12b_cpub_clk_premux1 = {
 592         .data = &(struct clk_regmap_mux_data){
 593                 .offset = HHI_SYS_CPUB_CLK_CNTL,
 594                 .mask = 0x3,
 595                 .shift = 16,
 596         },
 597         .hw.init = &(struct clk_init_data){
 598                 .name = "cpub_clk_dyn1_sel",
 599                 .ops = &clk_regmap_mux_ops,
 600                 .parent_data = (const struct clk_parent_data []) {
 601                         { .fw_name = "xtal", },
 602                         { .hw = &g12a_fclk_div2.hw },
 603                         { .hw = &g12a_fclk_div3.hw },
 604                 },
 605                 .num_parents = 3,
 606                 /* This sub-tree is used a parking clock */
 607                 .flags = CLK_SET_RATE_NO_REPARENT,
 608         },
 609 };
 610 
 611 /* Datasheet names this field as "Mux1_divn_tcnt" */
 612 static struct clk_regmap g12b_cpub_clk_mux1_div = {
 613         .data = &(struct clk_regmap_div_data){
 614                 .offset = HHI_SYS_CPUB_CLK_CNTL,
 615                 .shift = 20,
 616                 .width = 6,
 617         },
 618         .hw.init = &(struct clk_init_data){
 619                 .name = "cpub_clk_dyn1_div",
 620                 .ops = &clk_regmap_divider_ro_ops,
 621                 .parent_hws = (const struct clk_hw *[]) {
 622                         &g12b_cpub_clk_premux1.hw
 623                 },
 624                 .num_parents = 1,
 625         },
 626 };
 627 
 628 /* Datasheet names this field as "postmux1" */
 629 static struct clk_regmap g12b_cpub_clk_postmux1 = {
 630         .data = &(struct clk_regmap_mux_data){
 631                 .offset = HHI_SYS_CPUB_CLK_CNTL,
 632                 .mask = 0x1,
 633                 .shift = 18,
 634         },
 635         .hw.init = &(struct clk_init_data){
 636                 .name = "cpub_clk_dyn1",
 637                 .ops = &clk_regmap_mux_ops,
 638                 .parent_hws = (const struct clk_hw *[]) {
 639                         &g12b_cpub_clk_premux1.hw,
 640                         &g12b_cpub_clk_mux1_div.hw
 641                 },
 642                 .num_parents = 2,
 643                 /* This sub-tree is used a parking clock */
 644                 .flags = CLK_SET_RATE_NO_REPARENT,
 645         },
 646 };
 647 
 648 /* Datasheet names this field as "Final_dyn_mux_sel" */
 649 static struct clk_regmap g12b_cpub_clk_dyn = {
 650         .data = &(struct clk_regmap_mux_data){
 651                 .offset = HHI_SYS_CPUB_CLK_CNTL,
 652                 .mask = 0x1,
 653                 .shift = 10,
 654                 .flags = CLK_MUX_ROUND_CLOSEST,
 655         },
 656         .hw.init = &(struct clk_init_data){
 657                 .name = "cpub_clk_dyn",
 658                 .ops = &clk_regmap_mux_ops,
 659                 .parent_hws = (const struct clk_hw *[]) {
 660                         &g12b_cpub_clk_postmux0.hw,
 661                         &g12b_cpub_clk_postmux1.hw
 662                 },
 663                 .num_parents = 2,
 664                 .flags = CLK_SET_RATE_PARENT,
 665         },
 666 };
 667 
 668 /* Datasheet names this field as "Final_mux_sel" */
 669 static struct clk_regmap g12b_cpub_clk = {
 670         .data = &(struct clk_regmap_mux_data){
 671                 .offset = HHI_SYS_CPUB_CLK_CNTL,
 672                 .mask = 0x1,
 673                 .shift = 11,
 674                 .flags = CLK_MUX_ROUND_CLOSEST,
 675         },
 676         .hw.init = &(struct clk_init_data){
 677                 .name = "cpub_clk",
 678                 .ops = &clk_regmap_mux_ops,
 679                 .parent_hws = (const struct clk_hw *[]) {
 680                         &g12b_cpub_clk_dyn.hw,
 681                         &g12a_sys_pll.hw
 682                 },
 683                 .num_parents = 2,
 684                 .flags = CLK_SET_RATE_PARENT,
 685         },
 686 };
 687 
 688 static struct clk_regmap sm1_gp1_pll;
 689 
 690 /* Datasheet names this field as "premux0" */
 691 static struct clk_regmap sm1_dsu_clk_premux0 = {
 692         .data = &(struct clk_regmap_mux_data){
 693                 .offset = HHI_SYS_CPU_CLK_CNTL5,
 694                 .mask = 0x3,
 695                 .shift = 0,
 696         },
 697         .hw.init = &(struct clk_init_data){
 698                 .name = "dsu_clk_dyn0_sel",
 699                 .ops = &clk_regmap_mux_ro_ops,
 700                 .parent_data = (const struct clk_parent_data []) {
 701                         { .fw_name = "xtal", },
 702                         { .hw = &g12a_fclk_div2.hw },
 703                         { .hw = &g12a_fclk_div3.hw },
 704                         { .hw = &sm1_gp1_pll.hw },
 705                 },
 706                 .num_parents = 4,
 707         },
 708 };
 709 
 710 /* Datasheet names this field as "premux1" */
 711 static struct clk_regmap sm1_dsu_clk_premux1 = {
 712         .data = &(struct clk_regmap_mux_data){
 713                 .offset = HHI_SYS_CPU_CLK_CNTL5,
 714                 .mask = 0x3,
 715                 .shift = 16,
 716         },
 717         .hw.init = &(struct clk_init_data){
 718                 .name = "dsu_clk_dyn1_sel",
 719                 .ops = &clk_regmap_mux_ro_ops,
 720                 .parent_data = (const struct clk_parent_data []) {
 721                         { .fw_name = "xtal", },
 722                         { .hw = &g12a_fclk_div2.hw },
 723                         { .hw = &g12a_fclk_div3.hw },
 724                         { .hw = &sm1_gp1_pll.hw },
 725                 },
 726                 .num_parents = 4,
 727         },
 728 };
 729 
 730 /* Datasheet names this field as "Mux0_divn_tcnt" */
 731 static struct clk_regmap sm1_dsu_clk_mux0_div = {
 732         .data = &(struct clk_regmap_div_data){
 733                 .offset = HHI_SYS_CPU_CLK_CNTL5,
 734                 .shift = 4,
 735                 .width = 6,
 736         },
 737         .hw.init = &(struct clk_init_data){
 738                 .name = "dsu_clk_dyn0_div",
 739                 .ops = &clk_regmap_divider_ro_ops,
 740                 .parent_hws = (const struct clk_hw *[]) {
 741                         &sm1_dsu_clk_premux0.hw
 742                 },
 743                 .num_parents = 1,
 744         },
 745 };
 746 
 747 /* Datasheet names this field as "postmux0" */
 748 static struct clk_regmap sm1_dsu_clk_postmux0 = {
 749         .data = &(struct clk_regmap_mux_data){
 750                 .offset = HHI_SYS_CPU_CLK_CNTL5,
 751                 .mask = 0x1,
 752                 .shift = 2,
 753         },
 754         .hw.init = &(struct clk_init_data){
 755                 .name = "dsu_clk_dyn0",
 756                 .ops = &clk_regmap_mux_ro_ops,
 757                 .parent_hws = (const struct clk_hw *[]) {
 758                         &sm1_dsu_clk_premux0.hw,
 759                         &sm1_dsu_clk_mux0_div.hw,
 760                 },
 761                 .num_parents = 2,
 762         },
 763 };
 764 
 765 /* Datasheet names this field as "Mux1_divn_tcnt" */
 766 static struct clk_regmap sm1_dsu_clk_mux1_div = {
 767         .data = &(struct clk_regmap_div_data){
 768                 .offset = HHI_SYS_CPU_CLK_CNTL5,
 769                 .shift = 20,
 770                 .width = 6,
 771         },
 772         .hw.init = &(struct clk_init_data){
 773                 .name = "dsu_clk_dyn1_div",
 774                 .ops = &clk_regmap_divider_ro_ops,
 775                 .parent_hws = (const struct clk_hw *[]) {
 776                         &sm1_dsu_clk_premux1.hw
 777                 },
 778                 .num_parents = 1,
 779         },
 780 };
 781 
 782 /* Datasheet names this field as "postmux1" */
 783 static struct clk_regmap sm1_dsu_clk_postmux1 = {
 784         .data = &(struct clk_regmap_mux_data){
 785                 .offset = HHI_SYS_CPU_CLK_CNTL5,
 786                 .mask = 0x1,
 787                 .shift = 18,
 788         },
 789         .hw.init = &(struct clk_init_data){
 790                 .name = "dsu_clk_dyn1",
 791                 .ops = &clk_regmap_mux_ro_ops,
 792                 .parent_hws = (const struct clk_hw *[]) {
 793                         &sm1_dsu_clk_premux1.hw,
 794                         &sm1_dsu_clk_mux1_div.hw,
 795                 },
 796                 .num_parents = 2,
 797         },
 798 };
 799 
 800 /* Datasheet names this field as "Final_dyn_mux_sel" */
 801 static struct clk_regmap sm1_dsu_clk_dyn = {
 802         .data = &(struct clk_regmap_mux_data){
 803                 .offset = HHI_SYS_CPU_CLK_CNTL5,
 804                 .mask = 0x1,
 805                 .shift = 10,
 806         },
 807         .hw.init = &(struct clk_init_data){
 808                 .name = "dsu_clk_dyn",
 809                 .ops = &clk_regmap_mux_ro_ops,
 810                 .parent_hws = (const struct clk_hw *[]) {
 811                         &sm1_dsu_clk_postmux0.hw,
 812                         &sm1_dsu_clk_postmux1.hw,
 813                 },
 814                 .num_parents = 2,
 815         },
 816 };
 817 
 818 /* Datasheet names this field as "Final_mux_sel" */
 819 static struct clk_regmap sm1_dsu_final_clk = {
 820         .data = &(struct clk_regmap_mux_data){
 821                 .offset = HHI_SYS_CPU_CLK_CNTL5,
 822                 .mask = 0x1,
 823                 .shift = 11,
 824         },
 825         .hw.init = &(struct clk_init_data){
 826                 .name = "dsu_clk_final",
 827                 .ops = &clk_regmap_mux_ro_ops,
 828                 .parent_hws = (const struct clk_hw *[]) {
 829                         &sm1_dsu_clk_dyn.hw,
 830                         &g12a_sys_pll.hw,
 831                 },
 832                 .num_parents = 2,
 833         },
 834 };
 835 
 836 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 0 */
 837 static struct clk_regmap sm1_cpu1_clk = {
 838         .data = &(struct clk_regmap_mux_data){
 839                 .offset = HHI_SYS_CPU_CLK_CNTL6,
 840                 .mask = 0x1,
 841                 .shift = 24,
 842         },
 843         .hw.init = &(struct clk_init_data){
 844                 .name = "cpu1_clk",
 845                 .ops = &clk_regmap_mux_ro_ops,
 846                 .parent_hws = (const struct clk_hw *[]) {
 847                         &g12a_cpu_clk.hw,
 848                         /* This CPU also have a dedicated clock tree */
 849                 },
 850                 .num_parents = 1,
 851         },
 852 };
 853 
 854 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 1 */
 855 static struct clk_regmap sm1_cpu2_clk = {
 856         .data = &(struct clk_regmap_mux_data){
 857                 .offset = HHI_SYS_CPU_CLK_CNTL6,
 858                 .mask = 0x1,
 859                 .shift = 25,
 860         },
 861         .hw.init = &(struct clk_init_data){
 862                 .name = "cpu2_clk",
 863                 .ops = &clk_regmap_mux_ro_ops,
 864                 .parent_hws = (const struct clk_hw *[]) {
 865                         &g12a_cpu_clk.hw,
 866                         /* This CPU also have a dedicated clock tree */
 867                 },
 868                 .num_parents = 1,
 869         },
 870 };
 871 
 872 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 2 */
 873 static struct clk_regmap sm1_cpu3_clk = {
 874         .data = &(struct clk_regmap_mux_data){
 875                 .offset = HHI_SYS_CPU_CLK_CNTL6,
 876                 .mask = 0x1,
 877                 .shift = 26,
 878         },
 879         .hw.init = &(struct clk_init_data){
 880                 .name = "cpu3_clk",
 881                 .ops = &clk_regmap_mux_ro_ops,
 882                 .parent_hws = (const struct clk_hw *[]) {
 883                         &g12a_cpu_clk.hw,
 884                         /* This CPU also have a dedicated clock tree */
 885                 },
 886                 .num_parents = 1,
 887         },
 888 };
 889 
 890 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 4 */
 891 static struct clk_regmap sm1_dsu_clk = {
 892         .data = &(struct clk_regmap_mux_data){
 893                 .offset = HHI_SYS_CPU_CLK_CNTL6,
 894                 .mask = 0x1,
 895                 .shift = 27,
 896         },
 897         .hw.init = &(struct clk_init_data){
 898                 .name = "dsu_clk",
 899                 .ops = &clk_regmap_mux_ro_ops,
 900                 .parent_hws = (const struct clk_hw *[]) {
 901                         &g12a_cpu_clk.hw,
 902                         &sm1_dsu_final_clk.hw,
 903                 },
 904                 .num_parents = 2,
 905         },
 906 };
 907 
 908 static int g12a_cpu_clk_mux_notifier_cb(struct notifier_block *nb,
 909                                         unsigned long event, void *data)
 910 {
 911         if (event == POST_RATE_CHANGE || event == PRE_RATE_CHANGE) {
 912                 /* Wait for clock propagation before/after changing the mux */
 913                 udelay(100);
 914                 return NOTIFY_OK;
 915         }
 916 
 917         return NOTIFY_DONE;
 918 }
 919 
 920 static struct notifier_block g12a_cpu_clk_mux_nb = {
 921         .notifier_call = g12a_cpu_clk_mux_notifier_cb,
 922 };
 923 
 924 struct g12a_cpu_clk_postmux_nb_data {
 925         struct notifier_block nb;
 926         struct clk_hw *xtal;
 927         struct clk_hw *cpu_clk_dyn;
 928         struct clk_hw *cpu_clk_postmux0;
 929         struct clk_hw *cpu_clk_postmux1;
 930         struct clk_hw *cpu_clk_premux1;
 931 };
 932 
 933 static int g12a_cpu_clk_postmux_notifier_cb(struct notifier_block *nb,
 934                                             unsigned long event, void *data)
 935 {
 936         struct g12a_cpu_clk_postmux_nb_data *nb_data =
 937                 container_of(nb, struct g12a_cpu_clk_postmux_nb_data, nb);
 938 
 939         switch (event) {
 940         case PRE_RATE_CHANGE:
 941                 /*
 942                  * This notifier means cpu_clk_postmux0 clock will be changed
 943                  * to feed cpu_clk, this is the current path :
 944                  * cpu_clk
 945                  *    \- cpu_clk_dyn
 946                  *          \- cpu_clk_postmux0
 947                  *                \- cpu_clk_muxX_div
 948                  *                      \- cpu_clk_premux0
 949                  *                              \- fclk_div3 or fclk_div2
 950                  *              OR
 951                  *                \- cpu_clk_premux0
 952                  *                      \- fclk_div3 or fclk_div2
 953                  */
 954 
 955                 /* Setup cpu_clk_premux1 to xtal */
 956                 clk_hw_set_parent(nb_data->cpu_clk_premux1,
 957                                   nb_data->xtal);
 958 
 959                 /* Setup cpu_clk_postmux1 to bypass divider */
 960                 clk_hw_set_parent(nb_data->cpu_clk_postmux1,
 961                                   nb_data->cpu_clk_premux1);
 962 
 963                 /* Switch to parking clk on cpu_clk_postmux1 */
 964                 clk_hw_set_parent(nb_data->cpu_clk_dyn,
 965                                   nb_data->cpu_clk_postmux1);
 966 
 967                 /*
 968                  * Now, cpu_clk is 24MHz in the current path :
 969                  * cpu_clk
 970                  *    \- cpu_clk_dyn
 971                  *          \- cpu_clk_postmux1
 972                  *                \- cpu_clk_premux1
 973                  *                      \- xtal
 974                  */
 975 
 976                 udelay(100);
 977 
 978                 return NOTIFY_OK;
 979 
 980         case POST_RATE_CHANGE:
 981                 /*
 982                  * The cpu_clk_postmux0 has ben updated, now switch back
 983                  * cpu_clk_dyn to cpu_clk_postmux0 and take the changes
 984                  * in account.
 985                  */
 986 
 987                 /* Configure cpu_clk_dyn back to cpu_clk_postmux0 */
 988                 clk_hw_set_parent(nb_data->cpu_clk_dyn,
 989                                   nb_data->cpu_clk_postmux0);
 990 
 991                 /*
 992                  * new path :
 993                  * cpu_clk
 994                  *    \- cpu_clk_dyn
 995                  *          \- cpu_clk_postmux0
 996                  *                \- cpu_clk_muxX_div
 997                  *                      \- cpu_clk_premux0
 998                  *                              \- fclk_div3 or fclk_div2
 999                  *              OR
1000                  *                \- cpu_clk_premux0
1001                  *                      \- fclk_div3 or fclk_div2
1002                  */
1003 
1004                 udelay(100);
1005 
1006                 return NOTIFY_OK;
1007 
1008         default:
1009                 return NOTIFY_DONE;
1010         }
1011 }
1012 
1013 static struct g12a_cpu_clk_postmux_nb_data g12a_cpu_clk_postmux0_nb_data = {
1014         .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1015         .cpu_clk_postmux0 = &g12a_cpu_clk_postmux0.hw,
1016         .cpu_clk_postmux1 = &g12a_cpu_clk_postmux1.hw,
1017         .cpu_clk_premux1 = &g12a_cpu_clk_premux1.hw,
1018         .nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
1019 };
1020 
1021 static struct g12a_cpu_clk_postmux_nb_data g12b_cpub_clk_postmux0_nb_data = {
1022         .cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
1023         .cpu_clk_postmux0 = &g12b_cpub_clk_postmux0.hw,
1024         .cpu_clk_postmux1 = &g12b_cpub_clk_postmux1.hw,
1025         .cpu_clk_premux1 = &g12b_cpub_clk_premux1.hw,
1026         .nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
1027 };
1028 
1029 struct g12a_sys_pll_nb_data {
1030         struct notifier_block nb;
1031         struct clk_hw *sys_pll;
1032         struct clk_hw *cpu_clk;
1033         struct clk_hw *cpu_clk_dyn;
1034 };
1035 
1036 static int g12a_sys_pll_notifier_cb(struct notifier_block *nb,
1037                                     unsigned long event, void *data)
1038 {
1039         struct g12a_sys_pll_nb_data *nb_data =
1040                 container_of(nb, struct g12a_sys_pll_nb_data, nb);
1041 
1042         switch (event) {
1043         case PRE_RATE_CHANGE:
1044                 /*
1045                  * This notifier means sys_pll clock will be changed
1046                  * to feed cpu_clk, this the current path :
1047                  * cpu_clk
1048                  *    \- sys_pll
1049                  *          \- sys_pll_dco
1050                  */
1051 
1052                 /* Configure cpu_clk to use cpu_clk_dyn */
1053                 clk_hw_set_parent(nb_data->cpu_clk,
1054                                   nb_data->cpu_clk_dyn);
1055 
1056                 /*
1057                  * Now, cpu_clk uses the dyn path
1058                  * cpu_clk
1059                  *    \- cpu_clk_dyn
1060                  *          \- cpu_clk_dynX
1061                  *                \- cpu_clk_dynX_sel
1062                  *                   \- cpu_clk_dynX_div
1063                  *                      \- xtal/fclk_div2/fclk_div3
1064                  *                   \- xtal/fclk_div2/fclk_div3
1065                  */
1066 
1067                 udelay(100);
1068 
1069                 return NOTIFY_OK;
1070 
1071         case POST_RATE_CHANGE:
1072                 /*
1073                  * The sys_pll has ben updated, now switch back cpu_clk to
1074                  * sys_pll
1075                  */
1076 
1077                 /* Configure cpu_clk to use sys_pll */
1078                 clk_hw_set_parent(nb_data->cpu_clk,
1079                                   nb_data->sys_pll);
1080 
1081                 udelay(100);
1082 
1083                 /* new path :
1084                  * cpu_clk
1085                  *    \- sys_pll
1086                  *          \- sys_pll_dco
1087                  */
1088 
1089                 return NOTIFY_OK;
1090 
1091         default:
1092                 return NOTIFY_DONE;
1093         }
1094 }
1095 
1096 static struct g12a_sys_pll_nb_data g12a_sys_pll_nb_data = {
1097         .sys_pll = &g12a_sys_pll.hw,
1098         .cpu_clk = &g12a_cpu_clk.hw,
1099         .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1100         .nb.notifier_call = g12a_sys_pll_notifier_cb,
1101 };
1102 
1103 /* G12B first CPU cluster uses sys1_pll */
1104 static struct g12a_sys_pll_nb_data g12b_cpu_clk_sys1_pll_nb_data = {
1105         .sys_pll = &g12b_sys1_pll.hw,
1106         .cpu_clk = &g12b_cpu_clk.hw,
1107         .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1108         .nb.notifier_call = g12a_sys_pll_notifier_cb,
1109 };
1110 
1111 /* G12B second CPU cluster uses sys_pll */
1112 static struct g12a_sys_pll_nb_data g12b_cpub_clk_sys_pll_nb_data = {
1113         .sys_pll = &g12a_sys_pll.hw,
1114         .cpu_clk = &g12b_cpub_clk.hw,
1115         .cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
1116         .nb.notifier_call = g12a_sys_pll_notifier_cb,
1117 };
1118 
1119 static struct clk_regmap g12a_cpu_clk_div16_en = {
1120         .data = &(struct clk_regmap_gate_data){
1121                 .offset = HHI_SYS_CPU_CLK_CNTL1,
1122                 .bit_idx = 1,
1123         },
1124         .hw.init = &(struct clk_init_data) {
1125                 .name = "cpu_clk_div16_en",
1126                 .ops = &clk_regmap_gate_ro_ops,
1127                 .parent_hws = (const struct clk_hw *[]) {
1128                         &g12a_cpu_clk.hw
1129                 },
1130                 .num_parents = 1,
1131                 /*
1132                  * This clock is used to debug the cpu_clk range
1133                  * Linux should not change it at runtime
1134                  */
1135         },
1136 };
1137 
1138 static struct clk_regmap g12b_cpub_clk_div16_en = {
1139         .data = &(struct clk_regmap_gate_data){
1140                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
1141                 .bit_idx = 1,
1142         },
1143         .hw.init = &(struct clk_init_data) {
1144                 .name = "cpub_clk_div16_en",
1145                 .ops = &clk_regmap_gate_ro_ops,
1146                 .parent_hws = (const struct clk_hw *[]) {
1147                         &g12b_cpub_clk.hw
1148                 },
1149                 .num_parents = 1,
1150                 /*
1151                  * This clock is used to debug the cpu_clk range
1152                  * Linux should not change it at runtime
1153                  */
1154         },
1155 };
1156 
1157 static struct clk_fixed_factor g12a_cpu_clk_div16 = {
1158         .mult = 1,
1159         .div = 16,
1160         .hw.init = &(struct clk_init_data){
1161                 .name = "cpu_clk_div16",
1162                 .ops = &clk_fixed_factor_ops,
1163                 .parent_hws = (const struct clk_hw *[]) {
1164                         &g12a_cpu_clk_div16_en.hw
1165                 },
1166                 .num_parents = 1,
1167         },
1168 };
1169 
1170 static struct clk_fixed_factor g12b_cpub_clk_div16 = {
1171         .mult = 1,
1172         .div = 16,
1173         .hw.init = &(struct clk_init_data){
1174                 .name = "cpub_clk_div16",
1175                 .ops = &clk_fixed_factor_ops,
1176                 .parent_hws = (const struct clk_hw *[]) {
1177                         &g12b_cpub_clk_div16_en.hw
1178                 },
1179                 .num_parents = 1,
1180         },
1181 };
1182 
1183 static struct clk_regmap g12a_cpu_clk_apb_div = {
1184         .data = &(struct clk_regmap_div_data){
1185                 .offset = HHI_SYS_CPU_CLK_CNTL1,
1186                 .shift = 3,
1187                 .width = 3,
1188                 .flags = CLK_DIVIDER_POWER_OF_TWO,
1189         },
1190         .hw.init = &(struct clk_init_data){
1191                 .name = "cpu_clk_apb_div",
1192                 .ops = &clk_regmap_divider_ro_ops,
1193                 .parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
1194                 .num_parents = 1,
1195         },
1196 };
1197 
1198 static struct clk_regmap g12a_cpu_clk_apb = {
1199         .data = &(struct clk_regmap_gate_data){
1200                 .offset = HHI_SYS_CPU_CLK_CNTL1,
1201                 .bit_idx = 1,
1202         },
1203         .hw.init = &(struct clk_init_data) {
1204                 .name = "cpu_clk_apb",
1205                 .ops = &clk_regmap_gate_ro_ops,
1206                 .parent_hws = (const struct clk_hw *[]) {
1207                         &g12a_cpu_clk_apb_div.hw
1208                 },
1209                 .num_parents = 1,
1210                 /*
1211                  * This clock is set by the ROM monitor code,
1212                  * Linux should not change it at runtime
1213                  */
1214         },
1215 };
1216 
1217 static struct clk_regmap g12a_cpu_clk_atb_div = {
1218         .data = &(struct clk_regmap_div_data){
1219                 .offset = HHI_SYS_CPU_CLK_CNTL1,
1220                 .shift = 6,
1221                 .width = 3,
1222                 .flags = CLK_DIVIDER_POWER_OF_TWO,
1223         },
1224         .hw.init = &(struct clk_init_data){
1225                 .name = "cpu_clk_atb_div",
1226                 .ops = &clk_regmap_divider_ro_ops,
1227                 .parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
1228                 .num_parents = 1,
1229         },
1230 };
1231 
1232 static struct clk_regmap g12a_cpu_clk_atb = {
1233         .data = &(struct clk_regmap_gate_data){
1234                 .offset = HHI_SYS_CPU_CLK_CNTL1,
1235                 .bit_idx = 17,
1236         },
1237         .hw.init = &(struct clk_init_data) {
1238                 .name = "cpu_clk_atb",
1239                 .ops = &clk_regmap_gate_ro_ops,
1240                 .parent_hws = (const struct clk_hw *[]) {
1241                         &g12a_cpu_clk_atb_div.hw
1242                 },
1243                 .num_parents = 1,
1244                 /*
1245                  * This clock is set by the ROM monitor code,
1246                  * Linux should not change it at runtime
1247                  */
1248         },
1249 };
1250 
1251 static struct clk_regmap g12a_cpu_clk_axi_div = {
1252         .data = &(struct clk_regmap_div_data){
1253                 .offset = HHI_SYS_CPU_CLK_CNTL1,
1254                 .shift = 9,
1255                 .width = 3,
1256                 .flags = CLK_DIVIDER_POWER_OF_TWO,
1257         },
1258         .hw.init = &(struct clk_init_data){
1259                 .name = "cpu_clk_axi_div",
1260                 .ops = &clk_regmap_divider_ro_ops,
1261                 .parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
1262                 .num_parents = 1,
1263         },
1264 };
1265 
1266 static struct clk_regmap g12a_cpu_clk_axi = {
1267         .data = &(struct clk_regmap_gate_data){
1268                 .offset = HHI_SYS_CPU_CLK_CNTL1,
1269                 .bit_idx = 18,
1270         },
1271         .hw.init = &(struct clk_init_data) {
1272                 .name = "cpu_clk_axi",
1273                 .ops = &clk_regmap_gate_ro_ops,
1274                 .parent_hws = (const struct clk_hw *[]) {
1275                         &g12a_cpu_clk_axi_div.hw
1276                 },
1277                 .num_parents = 1,
1278                 /*
1279                  * This clock is set by the ROM monitor code,
1280                  * Linux should not change it at runtime
1281                  */
1282         },
1283 };
1284 
1285 static struct clk_regmap g12a_cpu_clk_trace_div = {
1286         .data = &(struct clk_regmap_div_data){
1287                 .offset = HHI_SYS_CPU_CLK_CNTL1,
1288                 .shift = 20,
1289                 .width = 3,
1290                 .flags = CLK_DIVIDER_POWER_OF_TWO,
1291         },
1292         .hw.init = &(struct clk_init_data){
1293                 .name = "cpu_clk_trace_div",
1294                 .ops = &clk_regmap_divider_ro_ops,
1295                 .parent_data = &(const struct clk_parent_data) {
1296                         /*
1297                          * Note:
1298                          * G12A and G12B have different cpu_clks (with
1299                          * different struct clk_hw). We fallback to the global
1300                          * naming string mechanism so cpu_clk_trace_div picks
1301                          * up the appropriate one.
1302                          */
1303                         .name = "cpu_clk",
1304                         .index = -1,
1305                 },
1306                 .num_parents = 1,
1307         },
1308 };
1309 
1310 static struct clk_regmap g12a_cpu_clk_trace = {
1311         .data = &(struct clk_regmap_gate_data){
1312                 .offset = HHI_SYS_CPU_CLK_CNTL1,
1313                 .bit_idx = 23,
1314         },
1315         .hw.init = &(struct clk_init_data) {
1316                 .name = "cpu_clk_trace",
1317                 .ops = &clk_regmap_gate_ro_ops,
1318                 .parent_hws = (const struct clk_hw *[]) {
1319                         &g12a_cpu_clk_trace_div.hw
1320                 },
1321                 .num_parents = 1,
1322                 /*
1323                  * This clock is set by the ROM monitor code,
1324                  * Linux should not change it at runtime
1325                  */
1326         },
1327 };
1328 
1329 static struct clk_fixed_factor g12b_cpub_clk_div2 = {
1330         .mult = 1,
1331         .div = 2,
1332         .hw.init = &(struct clk_init_data){
1333                 .name = "cpub_clk_div2",
1334                 .ops = &clk_fixed_factor_ops,
1335                 .parent_hws = (const struct clk_hw *[]) {
1336                         &g12b_cpub_clk.hw
1337                 },
1338                 .num_parents = 1,
1339         },
1340 };
1341 
1342 static struct clk_fixed_factor g12b_cpub_clk_div3 = {
1343         .mult = 1,
1344         .div = 3,
1345         .hw.init = &(struct clk_init_data){
1346                 .name = "cpub_clk_div3",
1347                 .ops = &clk_fixed_factor_ops,
1348                 .parent_hws = (const struct clk_hw *[]) {
1349                         &g12b_cpub_clk.hw
1350                 },
1351                 .num_parents = 1,
1352         },
1353 };
1354 
1355 static struct clk_fixed_factor g12b_cpub_clk_div4 = {
1356         .mult = 1,
1357         .div = 4,
1358         .hw.init = &(struct clk_init_data){
1359                 .name = "cpub_clk_div4",
1360                 .ops = &clk_fixed_factor_ops,
1361                 .parent_hws = (const struct clk_hw *[]) {
1362                         &g12b_cpub_clk.hw
1363                 },
1364                 .num_parents = 1,
1365         },
1366 };
1367 
1368 static struct clk_fixed_factor g12b_cpub_clk_div5 = {
1369         .mult = 1,
1370         .div = 5,
1371         .hw.init = &(struct clk_init_data){
1372                 .name = "cpub_clk_div5",
1373                 .ops = &clk_fixed_factor_ops,
1374                 .parent_hws = (const struct clk_hw *[]) {
1375                         &g12b_cpub_clk.hw
1376                 },
1377                 .num_parents = 1,
1378         },
1379 };
1380 
1381 static struct clk_fixed_factor g12b_cpub_clk_div6 = {
1382         .mult = 1,
1383         .div = 6,
1384         .hw.init = &(struct clk_init_data){
1385                 .name = "cpub_clk_div6",
1386                 .ops = &clk_fixed_factor_ops,
1387                 .parent_hws = (const struct clk_hw *[]) {
1388                         &g12b_cpub_clk.hw
1389                 },
1390                 .num_parents = 1,
1391         },
1392 };
1393 
1394 static struct clk_fixed_factor g12b_cpub_clk_div7 = {
1395         .mult = 1,
1396         .div = 7,
1397         .hw.init = &(struct clk_init_data){
1398                 .name = "cpub_clk_div7",
1399                 .ops = &clk_fixed_factor_ops,
1400                 .parent_hws = (const struct clk_hw *[]) {
1401                         &g12b_cpub_clk.hw
1402                 },
1403                 .num_parents = 1,
1404         },
1405 };
1406 
1407 static struct clk_fixed_factor g12b_cpub_clk_div8 = {
1408         .mult = 1,
1409         .div = 8,
1410         .hw.init = &(struct clk_init_data){
1411                 .name = "cpub_clk_div8",
1412                 .ops = &clk_fixed_factor_ops,
1413                 .parent_hws = (const struct clk_hw *[]) {
1414                         &g12b_cpub_clk.hw
1415                 },
1416                 .num_parents = 1,
1417         },
1418 };
1419 
1420 static u32 mux_table_cpub[] = { 1, 2, 3, 4, 5, 6, 7 };
1421 static struct clk_regmap g12b_cpub_clk_apb_sel = {
1422         .data = &(struct clk_regmap_mux_data){
1423                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
1424                 .mask = 7,
1425                 .shift = 3,
1426                 .table = mux_table_cpub,
1427         },
1428         .hw.init = &(struct clk_init_data){
1429                 .name = "cpub_clk_apb_sel",
1430                 .ops = &clk_regmap_mux_ro_ops,
1431                 .parent_hws = (const struct clk_hw *[]) {
1432                         &g12b_cpub_clk_div2.hw,
1433                         &g12b_cpub_clk_div3.hw,
1434                         &g12b_cpub_clk_div4.hw,
1435                         &g12b_cpub_clk_div5.hw,
1436                         &g12b_cpub_clk_div6.hw,
1437                         &g12b_cpub_clk_div7.hw,
1438                         &g12b_cpub_clk_div8.hw
1439                 },
1440                 .num_parents = 7,
1441         },
1442 };
1443 
1444 static struct clk_regmap g12b_cpub_clk_apb = {
1445         .data = &(struct clk_regmap_gate_data){
1446                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
1447                 .bit_idx = 16,
1448                 .flags = CLK_GATE_SET_TO_DISABLE,
1449         },
1450         .hw.init = &(struct clk_init_data) {
1451                 .name = "cpub_clk_apb",
1452                 .ops = &clk_regmap_gate_ro_ops,
1453                 .parent_hws = (const struct clk_hw *[]) {
1454                         &g12b_cpub_clk_apb_sel.hw
1455                 },
1456                 .num_parents = 1,
1457                 /*
1458                  * This clock is set by the ROM monitor code,
1459                  * Linux should not change it at runtime
1460                  */
1461         },
1462 };
1463 
1464 static struct clk_regmap g12b_cpub_clk_atb_sel = {
1465         .data = &(struct clk_regmap_mux_data){
1466                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
1467                 .mask = 7,
1468                 .shift = 6,
1469                 .table = mux_table_cpub,
1470         },
1471         .hw.init = &(struct clk_init_data){
1472                 .name = "cpub_clk_atb_sel",
1473                 .ops = &clk_regmap_mux_ro_ops,
1474                 .parent_hws = (const struct clk_hw *[]) {
1475                         &g12b_cpub_clk_div2.hw,
1476                         &g12b_cpub_clk_div3.hw,
1477                         &g12b_cpub_clk_div4.hw,
1478                         &g12b_cpub_clk_div5.hw,
1479                         &g12b_cpub_clk_div6.hw,
1480                         &g12b_cpub_clk_div7.hw,
1481                         &g12b_cpub_clk_div8.hw
1482                 },
1483                 .num_parents = 7,
1484         },
1485 };
1486 
1487 static struct clk_regmap g12b_cpub_clk_atb = {
1488         .data = &(struct clk_regmap_gate_data){
1489                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
1490                 .bit_idx = 17,
1491                 .flags = CLK_GATE_SET_TO_DISABLE,
1492         },
1493         .hw.init = &(struct clk_init_data) {
1494                 .name = "cpub_clk_atb",
1495                 .ops = &clk_regmap_gate_ro_ops,
1496                 .parent_hws = (const struct clk_hw *[]) {
1497                         &g12b_cpub_clk_atb_sel.hw
1498                 },
1499                 .num_parents = 1,
1500                 /*
1501                  * This clock is set by the ROM monitor code,
1502                  * Linux should not change it at runtime
1503                  */
1504         },
1505 };
1506 
1507 static struct clk_regmap g12b_cpub_clk_axi_sel = {
1508         .data = &(struct clk_regmap_mux_data){
1509                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
1510                 .mask = 7,
1511                 .shift = 9,
1512                 .table = mux_table_cpub,
1513         },
1514         .hw.init = &(struct clk_init_data){
1515                 .name = "cpub_clk_axi_sel",
1516                 .ops = &clk_regmap_mux_ro_ops,
1517                 .parent_hws = (const struct clk_hw *[]) {
1518                         &g12b_cpub_clk_div2.hw,
1519                         &g12b_cpub_clk_div3.hw,
1520                         &g12b_cpub_clk_div4.hw,
1521                         &g12b_cpub_clk_div5.hw,
1522                         &g12b_cpub_clk_div6.hw,
1523                         &g12b_cpub_clk_div7.hw,
1524                         &g12b_cpub_clk_div8.hw
1525                 },
1526                 .num_parents = 7,
1527         },
1528 };
1529 
1530 static struct clk_regmap g12b_cpub_clk_axi = {
1531         .data = &(struct clk_regmap_gate_data){
1532                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
1533                 .bit_idx = 18,
1534                 .flags = CLK_GATE_SET_TO_DISABLE,
1535         },
1536         .hw.init = &(struct clk_init_data) {
1537                 .name = "cpub_clk_axi",
1538                 .ops = &clk_regmap_gate_ro_ops,
1539                 .parent_hws = (const struct clk_hw *[]) {
1540                         &g12b_cpub_clk_axi_sel.hw
1541                 },
1542                 .num_parents = 1,
1543                 /*
1544                  * This clock is set by the ROM monitor code,
1545                  * Linux should not change it at runtime
1546                  */
1547         },
1548 };
1549 
1550 static struct clk_regmap g12b_cpub_clk_trace_sel = {
1551         .data = &(struct clk_regmap_mux_data){
1552                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
1553                 .mask = 7,
1554                 .shift = 20,
1555                 .table = mux_table_cpub,
1556         },
1557         .hw.init = &(struct clk_init_data){
1558                 .name = "cpub_clk_trace_sel",
1559                 .ops = &clk_regmap_mux_ro_ops,
1560                 .parent_hws = (const struct clk_hw *[]) {
1561                         &g12b_cpub_clk_div2.hw,
1562                         &g12b_cpub_clk_div3.hw,
1563                         &g12b_cpub_clk_div4.hw,
1564                         &g12b_cpub_clk_div5.hw,
1565                         &g12b_cpub_clk_div6.hw,
1566                         &g12b_cpub_clk_div7.hw,
1567                         &g12b_cpub_clk_div8.hw
1568                 },
1569                 .num_parents = 7,
1570         },
1571 };
1572 
1573 static struct clk_regmap g12b_cpub_clk_trace = {
1574         .data = &(struct clk_regmap_gate_data){
1575                 .offset = HHI_SYS_CPUB_CLK_CNTL1,
1576                 .bit_idx = 23,
1577                 .flags = CLK_GATE_SET_TO_DISABLE,
1578         },
1579         .hw.init = &(struct clk_init_data) {
1580                 .name = "cpub_clk_trace",
1581                 .ops = &clk_regmap_gate_ro_ops,
1582                 .parent_hws = (const struct clk_hw *[]) {
1583                         &g12b_cpub_clk_trace_sel.hw
1584                 },
1585                 .num_parents = 1,
1586                 /*
1587                  * This clock is set by the ROM monitor code,
1588                  * Linux should not change it at runtime
1589                  */
1590         },
1591 };
1592 
1593 static const struct pll_mult_range g12a_gp0_pll_mult_range = {
1594         .min = 55,
1595         .max = 255,
1596 };
1597 
1598 /*
1599  * Internal gp0 pll emulation configuration parameters
1600  */
1601 static const struct reg_sequence g12a_gp0_init_regs[] = {
1602         { .reg = HHI_GP0_PLL_CNTL1,     .def = 0x00000000 },
1603         { .reg = HHI_GP0_PLL_CNTL2,     .def = 0x00000000 },
1604         { .reg = HHI_GP0_PLL_CNTL3,     .def = 0x48681c00 },
1605         { .reg = HHI_GP0_PLL_CNTL4,     .def = 0x33771290 },
1606         { .reg = HHI_GP0_PLL_CNTL5,     .def = 0x39272000 },
1607         { .reg = HHI_GP0_PLL_CNTL6,     .def = 0x56540000 },
1608 };
1609 
1610 static struct clk_regmap g12a_gp0_pll_dco = {
1611         .data = &(struct meson_clk_pll_data){
1612                 .en = {
1613                         .reg_off = HHI_GP0_PLL_CNTL0,
1614                         .shift   = 28,
1615                         .width   = 1,
1616                 },
1617                 .m = {
1618                         .reg_off = HHI_GP0_PLL_CNTL0,
1619                         .shift   = 0,
1620                         .width   = 8,
1621                 },
1622                 .n = {
1623                         .reg_off = HHI_GP0_PLL_CNTL0,
1624                         .shift   = 10,
1625                         .width   = 5,
1626                 },
1627                 .frac = {
1628                         .reg_off = HHI_GP0_PLL_CNTL1,
1629                         .shift   = 0,
1630                         .width   = 17,
1631                 },
1632                 .l = {
1633                         .reg_off = HHI_GP0_PLL_CNTL0,
1634                         .shift   = 31,
1635                         .width   = 1,
1636                 },
1637                 .rst = {
1638                         .reg_off = HHI_GP0_PLL_CNTL0,
1639                         .shift   = 29,
1640                         .width   = 1,
1641                 },
1642                 .range = &g12a_gp0_pll_mult_range,
1643                 .init_regs = g12a_gp0_init_regs,
1644                 .init_count = ARRAY_SIZE(g12a_gp0_init_regs),
1645         },
1646         .hw.init = &(struct clk_init_data){
1647                 .name = "gp0_pll_dco",
1648                 .ops = &meson_clk_pll_ops,
1649                 .parent_data = &(const struct clk_parent_data) {
1650                         .fw_name = "xtal",
1651                 },
1652                 .num_parents = 1,
1653         },
1654 };
1655 
1656 static struct clk_regmap g12a_gp0_pll = {
1657         .data = &(struct clk_regmap_div_data){
1658                 .offset = HHI_GP0_PLL_CNTL0,
1659                 .shift = 16,
1660                 .width = 3,
1661                 .flags = (CLK_DIVIDER_POWER_OF_TWO |
1662                           CLK_DIVIDER_ROUND_CLOSEST),
1663         },
1664         .hw.init = &(struct clk_init_data){
1665                 .name = "gp0_pll",
1666                 .ops = &clk_regmap_divider_ops,
1667                 .parent_hws = (const struct clk_hw *[]) {
1668                         &g12a_gp0_pll_dco.hw
1669                 },
1670                 .num_parents = 1,
1671                 .flags = CLK_SET_RATE_PARENT,
1672         },
1673 };
1674 
1675 static struct clk_regmap sm1_gp1_pll_dco = {
1676         .data = &(struct meson_clk_pll_data){
1677                 .en = {
1678                         .reg_off = HHI_GP1_PLL_CNTL0,
1679                         .shift   = 28,
1680                         .width   = 1,
1681                 },
1682                 .m = {
1683                         .reg_off = HHI_GP1_PLL_CNTL0,
1684                         .shift   = 0,
1685                         .width   = 8,
1686                 },
1687                 .n = {
1688                         .reg_off = HHI_GP1_PLL_CNTL0,
1689                         .shift   = 10,
1690                         .width   = 5,
1691                 },
1692                 .frac = {
1693                         .reg_off = HHI_GP1_PLL_CNTL1,
1694                         .shift   = 0,
1695                         .width   = 17,
1696                 },
1697                 .l = {
1698                         .reg_off = HHI_GP1_PLL_CNTL0,
1699                         .shift   = 31,
1700                         .width   = 1,
1701                 },
1702                 .rst = {
1703                         .reg_off = HHI_GP1_PLL_CNTL0,
1704                         .shift   = 29,
1705                         .width   = 1,
1706                 },
1707         },
1708         .hw.init = &(struct clk_init_data){
1709                 .name = "gp1_pll_dco",
1710                 .ops = &meson_clk_pll_ro_ops,
1711                 .parent_data = &(const struct clk_parent_data) {
1712                         .fw_name = "xtal",
1713                 },
1714                 .num_parents = 1,
1715                 /* This clock feeds the DSU, avoid disabling it */
1716                 .flags = CLK_IS_CRITICAL,
1717         },
1718 };
1719 
1720 static struct clk_regmap sm1_gp1_pll = {
1721         .data = &(struct clk_regmap_div_data){
1722                 .offset = HHI_GP1_PLL_CNTL0,
1723                 .shift = 16,
1724                 .width = 3,
1725                 .flags = (CLK_DIVIDER_POWER_OF_TWO |
1726                           CLK_DIVIDER_ROUND_CLOSEST),
1727         },
1728         .hw.init = &(struct clk_init_data){
1729                 .name = "gp1_pll",
1730                 .ops = &clk_regmap_divider_ro_ops,
1731                 .parent_hws = (const struct clk_hw *[]) {
1732                         &sm1_gp1_pll_dco.hw
1733                 },
1734                 .num_parents = 1,
1735         },
1736 };
1737 
1738 /*
1739  * Internal hifi pll emulation configuration parameters
1740  */
1741 static const struct reg_sequence g12a_hifi_init_regs[] = {
1742         { .reg = HHI_HIFI_PLL_CNTL1,    .def = 0x00000000 },
1743         { .reg = HHI_HIFI_PLL_CNTL2,    .def = 0x00000000 },
1744         { .reg = HHI_HIFI_PLL_CNTL3,    .def = 0x6a285c00 },
1745         { .reg = HHI_HIFI_PLL_CNTL4,    .def = 0x65771290 },
1746         { .reg = HHI_HIFI_PLL_CNTL5,    .def = 0x39272000 },
1747         { .reg = HHI_HIFI_PLL_CNTL6,    .def = 0x56540000 },
1748 };
1749 
1750 static struct clk_regmap g12a_hifi_pll_dco = {
1751         .data = &(struct meson_clk_pll_data){
1752                 .en = {
1753                         .reg_off = HHI_HIFI_PLL_CNTL0,
1754                         .shift   = 28,
1755                         .width   = 1,
1756                 },
1757                 .m = {
1758                         .reg_off = HHI_HIFI_PLL_CNTL0,
1759                         .shift   = 0,
1760                         .width   = 8,
1761                 },
1762                 .n = {
1763                         .reg_off = HHI_HIFI_PLL_CNTL0,
1764                         .shift   = 10,
1765                         .width   = 5,
1766                 },
1767                 .frac = {
1768                         .reg_off = HHI_HIFI_PLL_CNTL1,
1769                         .shift   = 0,
1770                         .width   = 17,
1771                 },
1772                 .l = {
1773                         .reg_off = HHI_HIFI_PLL_CNTL0,
1774                         .shift   = 31,
1775                         .width   = 1,
1776                 },
1777                 .rst = {
1778                         .reg_off = HHI_HIFI_PLL_CNTL0,
1779                         .shift   = 29,
1780                         .width   = 1,
1781                 },
1782                 .range = &g12a_gp0_pll_mult_range,
1783                 .init_regs = g12a_hifi_init_regs,
1784                 .init_count = ARRAY_SIZE(g12a_hifi_init_regs),
1785                 .flags = CLK_MESON_PLL_ROUND_CLOSEST,
1786         },
1787         .hw.init = &(struct clk_init_data){
1788                 .name = "hifi_pll_dco",
1789                 .ops = &meson_clk_pll_ops,
1790                 .parent_data = &(const struct clk_parent_data) {
1791                         .fw_name = "xtal",
1792                 },
1793                 .num_parents = 1,
1794         },
1795 };
1796 
1797 static struct clk_regmap g12a_hifi_pll = {
1798         .data = &(struct clk_regmap_div_data){
1799                 .offset = HHI_HIFI_PLL_CNTL0,
1800                 .shift = 16,
1801                 .width = 2,
1802                 .flags = (CLK_DIVIDER_POWER_OF_TWO |
1803                           CLK_DIVIDER_ROUND_CLOSEST),
1804         },
1805         .hw.init = &(struct clk_init_data){
1806                 .name = "hifi_pll",
1807                 .ops = &clk_regmap_divider_ops,
1808                 .parent_hws = (const struct clk_hw *[]) {
1809                         &g12a_hifi_pll_dco.hw
1810                 },
1811                 .num_parents = 1,
1812                 .flags = CLK_SET_RATE_PARENT,
1813         },
1814 };
1815 
1816 /*
1817  * The Meson G12A PCIE PLL is fined tuned to deliver a very precise
1818  * 100MHz reference clock for the PCIe Analog PHY, and thus requires
1819  * a strict register sequence to enable the PLL.
1820  */
1821 static const struct reg_sequence g12a_pcie_pll_init_regs[] = {
1822         { .reg = HHI_PCIE_PLL_CNTL0,    .def = 0x20090496 },
1823         { .reg = HHI_PCIE_PLL_CNTL0,    .def = 0x30090496 },
1824         { .reg = HHI_PCIE_PLL_CNTL1,    .def = 0x00000000 },
1825         { .reg = HHI_PCIE_PLL_CNTL2,    .def = 0x00001100 },
1826         { .reg = HHI_PCIE_PLL_CNTL3,    .def = 0x10058e00 },
1827         { .reg = HHI_PCIE_PLL_CNTL4,    .def = 0x000100c0 },
1828         { .reg = HHI_PCIE_PLL_CNTL5,    .def = 0x68000048 },
1829         { .reg = HHI_PCIE_PLL_CNTL5,    .def = 0x68000068, .delay_us = 20 },
1830         { .reg = HHI_PCIE_PLL_CNTL4,    .def = 0x008100c0, .delay_us = 10 },
1831         { .reg = HHI_PCIE_PLL_CNTL0,    .def = 0x34090496 },
1832         { .reg = HHI_PCIE_PLL_CNTL0,    .def = 0x14090496, .delay_us = 10 },
1833         { .reg = HHI_PCIE_PLL_CNTL2,    .def = 0x00001000 },
1834 };
1835 
1836 /* Keep a single entry table for recalc/round_rate() ops */
1837 static const struct pll_params_table g12a_pcie_pll_table[] = {
1838         PLL_PARAMS(150, 1),
1839         {0, 0},
1840 };
1841 
1842 static struct clk_regmap g12a_pcie_pll_dco = {
1843         .data = &(struct meson_clk_pll_data){
1844                 .en = {
1845                         .reg_off = HHI_PCIE_PLL_CNTL0,
1846                         .shift   = 28,
1847                         .width   = 1,
1848                 },
1849                 .m = {
1850                         .reg_off = HHI_PCIE_PLL_CNTL0,
1851                         .shift   = 0,
1852                         .width   = 8,
1853                 },
1854                 .n = {
1855                         .reg_off = HHI_PCIE_PLL_CNTL0,
1856                         .shift   = 10,
1857                         .width   = 5,
1858                 },
1859                 .frac = {
1860                         .reg_off = HHI_PCIE_PLL_CNTL1,
1861                         .shift   = 0,
1862                         .width   = 12,
1863                 },
1864                 .l = {
1865                         .reg_off = HHI_PCIE_PLL_CNTL0,
1866                         .shift   = 31,
1867                         .width   = 1,
1868                 },
1869                 .rst = {
1870                         .reg_off = HHI_PCIE_PLL_CNTL0,
1871                         .shift   = 29,
1872                         .width   = 1,
1873                 },
1874                 .table = g12a_pcie_pll_table,
1875                 .init_regs = g12a_pcie_pll_init_regs,
1876                 .init_count = ARRAY_SIZE(g12a_pcie_pll_init_regs),
1877         },
1878         .hw.init = &(struct clk_init_data){
1879                 .name = "pcie_pll_dco",
1880                 .ops = &meson_clk_pcie_pll_ops,
1881                 .parent_data = &(const struct clk_parent_data) {
1882                         .fw_name = "xtal",
1883                 },
1884                 .num_parents = 1,
1885         },
1886 };
1887 
1888 static struct clk_fixed_factor g12a_pcie_pll_dco_div2 = {
1889         .mult = 1,
1890         .div = 2,
1891         .hw.init = &(struct clk_init_data){
1892                 .name = "pcie_pll_dco_div2",
1893                 .ops = &clk_fixed_factor_ops,
1894                 .parent_hws = (const struct clk_hw *[]) {
1895                         &g12a_pcie_pll_dco.hw
1896                 },
1897                 .num_parents = 1,
1898                 .flags = CLK_SET_RATE_PARENT,
1899         },
1900 };
1901 
1902 static struct clk_regmap g12a_pcie_pll_od = {
1903         .data = &(struct clk_regmap_div_data){
1904                 .offset = HHI_PCIE_PLL_CNTL0,
1905                 .shift = 16,
1906                 .width = 5,
1907                 .flags = CLK_DIVIDER_ROUND_CLOSEST |
1908                          CLK_DIVIDER_ONE_BASED |
1909                          CLK_DIVIDER_ALLOW_ZERO,
1910         },
1911         .hw.init = &(struct clk_init_data){
1912                 .name = "pcie_pll_od",
1913                 .ops = &clk_regmap_divider_ops,
1914                 .parent_hws = (const struct clk_hw *[]) {
1915                         &g12a_pcie_pll_dco_div2.hw
1916                 },
1917                 .num_parents = 1,
1918                 .flags = CLK_SET_RATE_PARENT,
1919         },
1920 };
1921 
1922 static struct clk_fixed_factor g12a_pcie_pll = {
1923         .mult = 1,
1924         .div = 2,
1925         .hw.init = &(struct clk_init_data){
1926                 .name = "pcie_pll_pll",
1927                 .ops = &clk_fixed_factor_ops,
1928                 .parent_hws = (const struct clk_hw *[]) {
1929                         &g12a_pcie_pll_od.hw
1930                 },
1931                 .num_parents = 1,
1932                 .flags = CLK_SET_RATE_PARENT,
1933         },
1934 };
1935 
1936 static struct clk_regmap g12a_hdmi_pll_dco = {
1937         .data = &(struct meson_clk_pll_data){
1938                 .en = {
1939                         .reg_off = HHI_HDMI_PLL_CNTL0,
1940                         .shift   = 28,
1941                         .width   = 1,
1942                 },
1943                 .m = {
1944                         .reg_off = HHI_HDMI_PLL_CNTL0,
1945                         .shift   = 0,
1946                         .width   = 8,
1947                 },
1948                 .n = {
1949                         .reg_off = HHI_HDMI_PLL_CNTL0,
1950                         .shift   = 10,
1951                         .width   = 5,
1952                 },
1953                 .frac = {
1954                         .reg_off = HHI_HDMI_PLL_CNTL1,
1955                         .shift   = 0,
1956                         .width   = 16,
1957                 },
1958                 .l = {
1959                         .reg_off = HHI_HDMI_PLL_CNTL0,
1960                         .shift   = 30,
1961                         .width   = 1,
1962                 },
1963                 .rst = {
1964                         .reg_off = HHI_HDMI_PLL_CNTL0,
1965                         .shift   = 29,
1966                         .width   = 1,
1967                 },
1968         },
1969         .hw.init = &(struct clk_init_data){
1970                 .name = "hdmi_pll_dco",
1971                 .ops = &meson_clk_pll_ro_ops,
1972                 .parent_data = &(const struct clk_parent_data) {
1973                         .fw_name = "xtal",
1974                 },
1975                 .num_parents = 1,
1976                 /*
1977                  * Display directly handle hdmi pll registers ATM, we need
1978                  * NOCACHE to keep our view of the clock as accurate as possible
1979                  */
1980                 .flags = CLK_GET_RATE_NOCACHE,
1981         },
1982 };
1983 
1984 static struct clk_regmap g12a_hdmi_pll_od = {
1985         .data = &(struct clk_regmap_div_data){
1986                 .offset = HHI_HDMI_PLL_CNTL0,
1987                 .shift = 16,
1988                 .width = 2,
1989                 .flags = CLK_DIVIDER_POWER_OF_TWO,
1990         },
1991         .hw.init = &(struct clk_init_data){
1992                 .name = "hdmi_pll_od",
1993                 .ops = &clk_regmap_divider_ro_ops,
1994                 .parent_hws = (const struct clk_hw *[]) {
1995                         &g12a_hdmi_pll_dco.hw
1996                 },
1997                 .num_parents = 1,
1998                 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
1999         },
2000 };
2001 
2002 static struct clk_regmap g12a_hdmi_pll_od2 = {
2003         .data = &(struct clk_regmap_div_data){
2004                 .offset = HHI_HDMI_PLL_CNTL0,
2005                 .shift = 18,
2006                 .width = 2,
2007                 .flags = CLK_DIVIDER_POWER_OF_TWO,
2008         },
2009         .hw.init = &(struct clk_init_data){
2010                 .name = "hdmi_pll_od2",
2011                 .ops = &clk_regmap_divider_ro_ops,
2012                 .parent_hws = (const struct clk_hw *[]) {
2013                         &g12a_hdmi_pll_od.hw
2014                 },
2015                 .num_parents = 1,
2016                 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2017         },
2018 };
2019 
2020 static struct clk_regmap g12a_hdmi_pll = {
2021         .data = &(struct clk_regmap_div_data){
2022                 .offset = HHI_HDMI_PLL_CNTL0,
2023                 .shift = 20,
2024                 .width = 2,
2025                 .flags = CLK_DIVIDER_POWER_OF_TWO,
2026         },
2027         .hw.init = &(struct clk_init_data){
2028                 .name = "hdmi_pll",
2029                 .ops = &clk_regmap_divider_ro_ops,
2030                 .parent_hws = (const struct clk_hw *[]) {
2031                         &g12a_hdmi_pll_od2.hw
2032                 },
2033                 .num_parents = 1,
2034                 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2035         },
2036 };
2037 
2038 static struct clk_fixed_factor g12a_fclk_div4_div = {
2039         .mult = 1,
2040         .div = 4,
2041         .hw.init = &(struct clk_init_data){
2042                 .name = "fclk_div4_div",
2043                 .ops = &clk_fixed_factor_ops,
2044                 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2045                 .num_parents = 1,
2046         },
2047 };
2048 
2049 static struct clk_regmap g12a_fclk_div4 = {
2050         .data = &(struct clk_regmap_gate_data){
2051                 .offset = HHI_FIX_PLL_CNTL1,
2052                 .bit_idx = 21,
2053         },
2054         .hw.init = &(struct clk_init_data){
2055                 .name = "fclk_div4",
2056                 .ops = &clk_regmap_gate_ops,
2057                 .parent_hws = (const struct clk_hw *[]) {
2058                         &g12a_fclk_div4_div.hw
2059                 },
2060                 .num_parents = 1,
2061         },
2062 };
2063 
2064 static struct clk_fixed_factor g12a_fclk_div5_div = {
2065         .mult = 1,
2066         .div = 5,
2067         .hw.init = &(struct clk_init_data){
2068                 .name = "fclk_div5_div",
2069                 .ops = &clk_fixed_factor_ops,
2070                 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2071                 .num_parents = 1,
2072         },
2073 };
2074 
2075 static struct clk_regmap g12a_fclk_div5 = {
2076         .data = &(struct clk_regmap_gate_data){
2077                 .offset = HHI_FIX_PLL_CNTL1,
2078                 .bit_idx = 22,
2079         },
2080         .hw.init = &(struct clk_init_data){
2081                 .name = "fclk_div5",
2082                 .ops = &clk_regmap_gate_ops,
2083                 .parent_hws = (const struct clk_hw *[]) {
2084                         &g12a_fclk_div5_div.hw
2085                 },
2086                 .num_parents = 1,
2087         },
2088 };
2089 
2090 static struct clk_fixed_factor g12a_fclk_div7_div = {
2091         .mult = 1,
2092         .div = 7,
2093         .hw.init = &(struct clk_init_data){
2094                 .name = "fclk_div7_div",
2095                 .ops = &clk_fixed_factor_ops,
2096                 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2097                 .num_parents = 1,
2098         },
2099 };
2100 
2101 static struct clk_regmap g12a_fclk_div7 = {
2102         .data = &(struct clk_regmap_gate_data){
2103                 .offset = HHI_FIX_PLL_CNTL1,
2104                 .bit_idx = 23,
2105         },
2106         .hw.init = &(struct clk_init_data){
2107                 .name = "fclk_div7",
2108                 .ops = &clk_regmap_gate_ops,
2109                 .parent_hws = (const struct clk_hw *[]) {
2110                         &g12a_fclk_div7_div.hw
2111                 },
2112                 .num_parents = 1,
2113         },
2114 };
2115 
2116 static struct clk_fixed_factor g12a_fclk_div2p5_div = {
2117         .mult = 1,
2118         .div = 5,
2119         .hw.init = &(struct clk_init_data){
2120                 .name = "fclk_div2p5_div",
2121                 .ops = &clk_fixed_factor_ops,
2122                 .parent_hws = (const struct clk_hw *[]) {
2123                         &g12a_fixed_pll_dco.hw
2124                 },
2125                 .num_parents = 1,
2126         },
2127 };
2128 
2129 static struct clk_regmap g12a_fclk_div2p5 = {
2130         .data = &(struct clk_regmap_gate_data){
2131                 .offset = HHI_FIX_PLL_CNTL1,
2132                 .bit_idx = 25,
2133         },
2134         .hw.init = &(struct clk_init_data){
2135                 .name = "fclk_div2p5",
2136                 .ops = &clk_regmap_gate_ops,
2137                 .parent_hws = (const struct clk_hw *[]) {
2138                         &g12a_fclk_div2p5_div.hw
2139                 },
2140                 .num_parents = 1,
2141         },
2142 };
2143 
2144 static struct clk_fixed_factor g12a_mpll_50m_div = {
2145         .mult = 1,
2146         .div = 80,
2147         .hw.init = &(struct clk_init_data){
2148                 .name = "mpll_50m_div",
2149                 .ops = &clk_fixed_factor_ops,
2150                 .parent_hws = (const struct clk_hw *[]) {
2151                         &g12a_fixed_pll_dco.hw
2152                 },
2153                 .num_parents = 1,
2154         },
2155 };
2156 
2157 static struct clk_regmap g12a_mpll_50m = {
2158         .data = &(struct clk_regmap_mux_data){
2159                 .offset = HHI_FIX_PLL_CNTL3,
2160                 .mask = 0x1,
2161                 .shift = 5,
2162         },
2163         .hw.init = &(struct clk_init_data){
2164                 .name = "mpll_50m",
2165                 .ops = &clk_regmap_mux_ro_ops,
2166                 .parent_data = (const struct clk_parent_data []) {
2167                         { .fw_name = "xtal", },
2168                         { .hw = &g12a_mpll_50m_div.hw },
2169                 },
2170                 .num_parents = 2,
2171         },
2172 };
2173 
2174 static struct clk_fixed_factor g12a_mpll_prediv = {
2175         .mult = 1,
2176         .div = 2,
2177         .hw.init = &(struct clk_init_data){
2178                 .name = "mpll_prediv",
2179                 .ops = &clk_fixed_factor_ops,
2180                 .parent_hws = (const struct clk_hw *[]) {
2181                         &g12a_fixed_pll_dco.hw
2182                 },
2183                 .num_parents = 1,
2184         },
2185 };
2186 
2187 static const struct reg_sequence g12a_mpll0_init_regs[] = {
2188         { .reg = HHI_MPLL_CNTL2,        .def = 0x40000033 },
2189 };
2190 
2191 static struct clk_regmap g12a_mpll0_div = {
2192         .data = &(struct meson_clk_mpll_data){
2193                 .sdm = {
2194                         .reg_off = HHI_MPLL_CNTL1,
2195                         .shift   = 0,
2196                         .width   = 14,
2197                 },
2198                 .sdm_en = {
2199                         .reg_off = HHI_MPLL_CNTL1,
2200                         .shift   = 30,
2201                         .width   = 1,
2202                 },
2203                 .n2 = {
2204                         .reg_off = HHI_MPLL_CNTL1,
2205                         .shift   = 20,
2206                         .width   = 9,
2207                 },
2208                 .ssen = {
2209                         .reg_off = HHI_MPLL_CNTL1,
2210                         .shift   = 29,
2211                         .width   = 1,
2212                 },
2213                 .lock = &meson_clk_lock,
2214                 .init_regs = g12a_mpll0_init_regs,
2215                 .init_count = ARRAY_SIZE(g12a_mpll0_init_regs),
2216         },
2217         .hw.init = &(struct clk_init_data){
2218                 .name = "mpll0_div",
2219                 .ops = &meson_clk_mpll_ops,
2220                 .parent_hws = (const struct clk_hw *[]) {
2221                         &g12a_mpll_prediv.hw
2222                 },
2223                 .num_parents = 1,
2224         },
2225 };
2226 
2227 static struct clk_regmap g12a_mpll0 = {
2228         .data = &(struct clk_regmap_gate_data){
2229                 .offset = HHI_MPLL_CNTL1,
2230                 .bit_idx = 31,
2231         },
2232         .hw.init = &(struct clk_init_data){
2233                 .name = "mpll0",
2234                 .ops = &clk_regmap_gate_ops,
2235                 .parent_hws = (const struct clk_hw *[]) { &g12a_mpll0_div.hw },
2236                 .num_parents = 1,
2237                 .flags = CLK_SET_RATE_PARENT,
2238         },
2239 };
2240 
2241 static const struct reg_sequence g12a_mpll1_init_regs[] = {
2242         { .reg = HHI_MPLL_CNTL4,        .def = 0x40000033 },
2243 };
2244 
2245 static struct clk_regmap g12a_mpll1_div = {
2246         .data = &(struct meson_clk_mpll_data){
2247                 .sdm = {
2248                         .reg_off = HHI_MPLL_CNTL3,
2249                         .shift   = 0,
2250                         .width   = 14,
2251                 },
2252                 .sdm_en = {
2253                         .reg_off = HHI_MPLL_CNTL3,
2254                         .shift   = 30,
2255                         .width   = 1,
2256                 },
2257                 .n2 = {
2258                         .reg_off = HHI_MPLL_CNTL3,
2259                         .shift   = 20,
2260                         .width   = 9,
2261                 },
2262                 .ssen = {
2263                         .reg_off = HHI_MPLL_CNTL3,
2264                         .shift   = 29,
2265                         .width   = 1,
2266                 },
2267                 .lock = &meson_clk_lock,
2268                 .init_regs = g12a_mpll1_init_regs,
2269                 .init_count = ARRAY_SIZE(g12a_mpll1_init_regs),
2270         },
2271         .hw.init = &(struct clk_init_data){
2272                 .name = "mpll1_div",
2273                 .ops = &meson_clk_mpll_ops,
2274                 .parent_hws = (const struct clk_hw *[]) {
2275                         &g12a_mpll_prediv.hw
2276                 },
2277                 .num_parents = 1,
2278         },
2279 };
2280 
2281 static struct clk_regmap g12a_mpll1 = {
2282         .data = &(struct clk_regmap_gate_data){
2283                 .offset = HHI_MPLL_CNTL3,
2284                 .bit_idx = 31,
2285         },
2286         .hw.init = &(struct clk_init_data){
2287                 .name = "mpll1",
2288                 .ops = &clk_regmap_gate_ops,
2289                 .parent_hws = (const struct clk_hw *[]) { &g12a_mpll1_div.hw },
2290                 .num_parents = 1,
2291                 .flags = CLK_SET_RATE_PARENT,
2292         },
2293 };
2294 
2295 static const struct reg_sequence g12a_mpll2_init_regs[] = {
2296         { .reg = HHI_MPLL_CNTL6,        .def = 0x40000033 },
2297 };
2298 
2299 static struct clk_regmap g12a_mpll2_div = {
2300         .data = &(struct meson_clk_mpll_data){
2301                 .sdm = {
2302                         .reg_off = HHI_MPLL_CNTL5,
2303                         .shift   = 0,
2304                         .width   = 14,
2305                 },
2306                 .sdm_en = {
2307                         .reg_off = HHI_MPLL_CNTL5,
2308                         .shift   = 30,
2309                         .width   = 1,
2310                 },
2311                 .n2 = {
2312                         .reg_off = HHI_MPLL_CNTL5,
2313                         .shift   = 20,
2314                         .width   = 9,
2315                 },
2316                 .ssen = {
2317                         .reg_off = HHI_MPLL_CNTL5,
2318                         .shift   = 29,
2319                         .width   = 1,
2320                 },
2321                 .lock = &meson_clk_lock,
2322                 .init_regs = g12a_mpll2_init_regs,
2323                 .init_count = ARRAY_SIZE(g12a_mpll2_init_regs),
2324         },
2325         .hw.init = &(struct clk_init_data){
2326                 .name = "mpll2_div",
2327                 .ops = &meson_clk_mpll_ops,
2328                 .parent_hws = (const struct clk_hw *[]) {
2329                         &g12a_mpll_prediv.hw
2330                 },
2331                 .num_parents = 1,
2332         },
2333 };
2334 
2335 static struct clk_regmap g12a_mpll2 = {
2336         .data = &(struct clk_regmap_gate_data){
2337                 .offset = HHI_MPLL_CNTL5,
2338                 .bit_idx = 31,
2339         },
2340         .hw.init = &(struct clk_init_data){
2341                 .name = "mpll2",
2342                 .ops = &clk_regmap_gate_ops,
2343                 .parent_hws = (const struct clk_hw *[]) { &g12a_mpll2_div.hw },
2344                 .num_parents = 1,
2345                 .flags = CLK_SET_RATE_PARENT,
2346         },
2347 };
2348 
2349 static const struct reg_sequence g12a_mpll3_init_regs[] = {
2350         { .reg = HHI_MPLL_CNTL8,        .def = 0x40000033 },
2351 };
2352 
2353 static struct clk_regmap g12a_mpll3_div = {
2354         .data = &(struct meson_clk_mpll_data){
2355                 .sdm = {
2356                         .reg_off = HHI_MPLL_CNTL7,
2357                         .shift   = 0,
2358                         .width   = 14,
2359                 },
2360                 .sdm_en = {
2361                         .reg_off = HHI_MPLL_CNTL7,
2362                         .shift   = 30,
2363                         .width   = 1,
2364                 },
2365                 .n2 = {
2366                         .reg_off = HHI_MPLL_CNTL7,
2367                         .shift   = 20,
2368                         .width   = 9,
2369                 },
2370                 .ssen = {
2371                         .reg_off = HHI_MPLL_CNTL7,
2372                         .shift   = 29,
2373                         .width   = 1,
2374                 },
2375                 .lock = &meson_clk_lock,
2376                 .init_regs = g12a_mpll3_init_regs,
2377                 .init_count = ARRAY_SIZE(g12a_mpll3_init_regs),
2378         },
2379         .hw.init = &(struct clk_init_data){
2380                 .name = "mpll3_div",
2381                 .ops = &meson_clk_mpll_ops,
2382                 .parent_hws = (const struct clk_hw *[]) {
2383                         &g12a_mpll_prediv.hw
2384                 },
2385                 .num_parents = 1,
2386         },
2387 };
2388 
2389 static struct clk_regmap g12a_mpll3 = {
2390         .data = &(struct clk_regmap_gate_data){
2391                 .offset = HHI_MPLL_CNTL7,
2392                 .bit_idx = 31,
2393         },
2394         .hw.init = &(struct clk_init_data){
2395                 .name = "mpll3",
2396                 .ops = &clk_regmap_gate_ops,
2397                 .parent_hws = (const struct clk_hw *[]) { &g12a_mpll3_div.hw },
2398                 .num_parents = 1,
2399                 .flags = CLK_SET_RATE_PARENT,
2400         },
2401 };
2402 
2403 static u32 mux_table_clk81[]    = { 0, 2, 3, 4, 5, 6, 7 };
2404 static const struct clk_parent_data clk81_parent_data[] = {
2405         { .fw_name = "xtal", },
2406         { .hw = &g12a_fclk_div7.hw },
2407         { .hw = &g12a_mpll1.hw },
2408         { .hw = &g12a_mpll2.hw },
2409         { .hw = &g12a_fclk_div4.hw },
2410         { .hw = &g12a_fclk_div3.hw },
2411         { .hw = &g12a_fclk_div5.hw },
2412 };
2413 
2414 static struct clk_regmap g12a_mpeg_clk_sel = {
2415         .data = &(struct clk_regmap_mux_data){
2416                 .offset = HHI_MPEG_CLK_CNTL,
2417                 .mask = 0x7,
2418                 .shift = 12,
2419                 .table = mux_table_clk81,
2420         },
2421         .hw.init = &(struct clk_init_data){
2422                 .name = "mpeg_clk_sel",
2423                 .ops = &clk_regmap_mux_ro_ops,
2424                 .parent_data = clk81_parent_data,
2425                 .num_parents = ARRAY_SIZE(clk81_parent_data),
2426         },
2427 };
2428 
2429 static struct clk_regmap g12a_mpeg_clk_div = {
2430         .data = &(struct clk_regmap_div_data){
2431                 .offset = HHI_MPEG_CLK_CNTL,
2432                 .shift = 0,
2433                 .width = 7,
2434         },
2435         .hw.init = &(struct clk_init_data){
2436                 .name = "mpeg_clk_div",
2437                 .ops = &clk_regmap_divider_ops,
2438                 .parent_hws = (const struct clk_hw *[]) {
2439                         &g12a_mpeg_clk_sel.hw
2440                 },
2441                 .num_parents = 1,
2442                 .flags = CLK_SET_RATE_PARENT,
2443         },
2444 };
2445 
2446 static struct clk_regmap g12a_clk81 = {
2447         .data = &(struct clk_regmap_gate_data){
2448                 .offset = HHI_MPEG_CLK_CNTL,
2449                 .bit_idx = 7,
2450         },
2451         .hw.init = &(struct clk_init_data){
2452                 .name = "clk81",
2453                 .ops = &clk_regmap_gate_ops,
2454                 .parent_hws = (const struct clk_hw *[]) {
2455                         &g12a_mpeg_clk_div.hw
2456                 },
2457                 .num_parents = 1,
2458                 .flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
2459         },
2460 };
2461 
2462 static const struct clk_parent_data g12a_sd_emmc_clk0_parent_data[] = {
2463         { .fw_name = "xtal", },
2464         { .hw = &g12a_fclk_div2.hw },
2465         { .hw = &g12a_fclk_div3.hw },
2466         { .hw = &g12a_fclk_div5.hw },
2467         { .hw = &g12a_fclk_div7.hw },
2468         /*
2469          * Following these parent clocks, we should also have had mpll2, mpll3
2470          * and gp0_pll but these clocks are too precious to be used here. All
2471          * the necessary rates for MMC and NAND operation can be acheived using
2472          * g12a_ee_core or fclk_div clocks
2473          */
2474 };
2475 
2476 /* SDIO clock */
2477 static struct clk_regmap g12a_sd_emmc_a_clk0_sel = {
2478         .data = &(struct clk_regmap_mux_data){
2479                 .offset = HHI_SD_EMMC_CLK_CNTL,
2480                 .mask = 0x7,
2481                 .shift = 9,
2482         },
2483         .hw.init = &(struct clk_init_data) {
2484                 .name = "sd_emmc_a_clk0_sel",
2485                 .ops = &clk_regmap_mux_ops,
2486                 .parent_data = g12a_sd_emmc_clk0_parent_data,
2487                 .num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2488                 .flags = CLK_SET_RATE_PARENT,
2489         },
2490 };
2491 
2492 static struct clk_regmap g12a_sd_emmc_a_clk0_div = {
2493         .data = &(struct clk_regmap_div_data){
2494                 .offset = HHI_SD_EMMC_CLK_CNTL,
2495                 .shift = 0,
2496                 .width = 7,
2497         },
2498         .hw.init = &(struct clk_init_data) {
2499                 .name = "sd_emmc_a_clk0_div",
2500                 .ops = &clk_regmap_divider_ops,
2501                 .parent_hws = (const struct clk_hw *[]) {
2502                         &g12a_sd_emmc_a_clk0_sel.hw
2503                 },
2504                 .num_parents = 1,
2505                 .flags = CLK_SET_RATE_PARENT,
2506         },
2507 };
2508 
2509 static struct clk_regmap g12a_sd_emmc_a_clk0 = {
2510         .data = &(struct clk_regmap_gate_data){
2511                 .offset = HHI_SD_EMMC_CLK_CNTL,
2512                 .bit_idx = 7,
2513         },
2514         .hw.init = &(struct clk_init_data){
2515                 .name = "sd_emmc_a_clk0",
2516                 .ops = &clk_regmap_gate_ops,
2517                 .parent_hws = (const struct clk_hw *[]) {
2518                         &g12a_sd_emmc_a_clk0_div.hw
2519                 },
2520                 .num_parents = 1,
2521                 .flags = CLK_SET_RATE_PARENT,
2522         },
2523 };
2524 
2525 /* SDcard clock */
2526 static struct clk_regmap g12a_sd_emmc_b_clk0_sel = {
2527         .data = &(struct clk_regmap_mux_data){
2528                 .offset = HHI_SD_EMMC_CLK_CNTL,
2529                 .mask = 0x7,
2530                 .shift = 25,
2531         },
2532         .hw.init = &(struct clk_init_data) {
2533                 .name = "sd_emmc_b_clk0_sel",
2534                 .ops = &clk_regmap_mux_ops,
2535                 .parent_data = g12a_sd_emmc_clk0_parent_data,
2536                 .num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2537                 .flags = CLK_SET_RATE_PARENT,
2538         },
2539 };
2540 
2541 static struct clk_regmap g12a_sd_emmc_b_clk0_div = {
2542         .data = &(struct clk_regmap_div_data){
2543                 .offset = HHI_SD_EMMC_CLK_CNTL,
2544                 .shift = 16,
2545                 .width = 7,
2546         },
2547         .hw.init = &(struct clk_init_data) {
2548                 .name = "sd_emmc_b_clk0_div",
2549                 .ops = &clk_regmap_divider_ops,
2550                 .parent_hws = (const struct clk_hw *[]) {
2551                         &g12a_sd_emmc_b_clk0_sel.hw
2552                 },
2553                 .num_parents = 1,
2554                 .flags = CLK_SET_RATE_PARENT,
2555         },
2556 };
2557 
2558 static struct clk_regmap g12a_sd_emmc_b_clk0 = {
2559         .data = &(struct clk_regmap_gate_data){
2560                 .offset = HHI_SD_EMMC_CLK_CNTL,
2561                 .bit_idx = 23,
2562         },
2563         .hw.init = &(struct clk_init_data){
2564                 .name = "sd_emmc_b_clk0",
2565                 .ops = &clk_regmap_gate_ops,
2566                 .parent_hws = (const struct clk_hw *[]) {
2567                         &g12a_sd_emmc_b_clk0_div.hw
2568                 },
2569                 .num_parents = 1,
2570                 .flags = CLK_SET_RATE_PARENT,
2571         },
2572 };
2573 
2574 /* EMMC/NAND clock */
2575 static struct clk_regmap g12a_sd_emmc_c_clk0_sel = {
2576         .data = &(struct clk_regmap_mux_data){
2577                 .offset = HHI_NAND_CLK_CNTL,
2578                 .mask = 0x7,
2579                 .shift = 9,
2580         },
2581         .hw.init = &(struct clk_init_data) {
2582                 .name = "sd_emmc_c_clk0_sel",
2583                 .ops = &clk_regmap_mux_ops,
2584                 .parent_data = g12a_sd_emmc_clk0_parent_data,
2585                 .num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2586                 .flags = CLK_SET_RATE_PARENT,
2587         },
2588 };
2589 
2590 static struct clk_regmap g12a_sd_emmc_c_clk0_div = {
2591         .data = &(struct clk_regmap_div_data){
2592                 .offset = HHI_NAND_CLK_CNTL,
2593                 .shift = 0,
2594                 .width = 7,
2595         },
2596         .hw.init = &(struct clk_init_data) {
2597                 .name = "sd_emmc_c_clk0_div",
2598                 .ops = &clk_regmap_divider_ops,
2599                 .parent_hws = (const struct clk_hw *[]) {
2600                         &g12a_sd_emmc_c_clk0_sel.hw
2601                 },
2602                 .num_parents = 1,
2603                 .flags = CLK_SET_RATE_PARENT,
2604         },
2605 };
2606 
2607 static struct clk_regmap g12a_sd_emmc_c_clk0 = {
2608         .data = &(struct clk_regmap_gate_data){
2609                 .offset = HHI_NAND_CLK_CNTL,
2610                 .bit_idx = 7,
2611         },
2612         .hw.init = &(struct clk_init_data){
2613                 .name = "sd_emmc_c_clk0",
2614                 .ops = &clk_regmap_gate_ops,
2615                 .parent_hws = (const struct clk_hw *[]) {
2616                         &g12a_sd_emmc_c_clk0_div.hw
2617                 },
2618                 .num_parents = 1,
2619                 .flags = CLK_SET_RATE_PARENT,
2620         },
2621 };
2622 
2623 /* Video Clocks */
2624 
2625 static struct clk_regmap g12a_vid_pll_div = {
2626         .data = &(struct meson_vid_pll_div_data){
2627                 .val = {
2628                         .reg_off = HHI_VID_PLL_CLK_DIV,
2629                         .shift   = 0,
2630                         .width   = 15,
2631                 },
2632                 .sel = {
2633                         .reg_off = HHI_VID_PLL_CLK_DIV,
2634                         .shift   = 16,
2635                         .width   = 2,
2636                 },
2637         },
2638         .hw.init = &(struct clk_init_data) {
2639                 .name = "vid_pll_div",
2640                 .ops = &meson_vid_pll_div_ro_ops,
2641                 .parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_pll.hw },
2642                 .num_parents = 1,
2643                 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2644         },
2645 };
2646 
2647 static const struct clk_hw *g12a_vid_pll_parent_hws[] = {
2648         &g12a_vid_pll_div.hw,
2649         &g12a_hdmi_pll.hw,
2650 };
2651 
2652 static struct clk_regmap g12a_vid_pll_sel = {
2653         .data = &(struct clk_regmap_mux_data){
2654                 .offset = HHI_VID_PLL_CLK_DIV,
2655                 .mask = 0x1,
2656                 .shift = 18,
2657         },
2658         .hw.init = &(struct clk_init_data){
2659                 .name = "vid_pll_sel",
2660                 .ops = &clk_regmap_mux_ops,
2661                 /*
2662                  * bit 18 selects from 2 possible parents:
2663                  * vid_pll_div or hdmi_pll
2664                  */
2665                 .parent_hws = g12a_vid_pll_parent_hws,
2666                 .num_parents = ARRAY_SIZE(g12a_vid_pll_parent_hws),
2667                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2668         },
2669 };
2670 
2671 static struct clk_regmap g12a_vid_pll = {
2672         .data = &(struct clk_regmap_gate_data){
2673                 .offset = HHI_VID_PLL_CLK_DIV,
2674                 .bit_idx = 19,
2675         },
2676         .hw.init = &(struct clk_init_data) {
2677                 .name = "vid_pll",
2678                 .ops = &clk_regmap_gate_ops,
2679                 .parent_hws = (const struct clk_hw *[]) {
2680                         &g12a_vid_pll_sel.hw
2681                 },
2682                 .num_parents = 1,
2683                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2684         },
2685 };
2686 
2687 /* VPU Clock */
2688 
2689 static const struct clk_hw *g12a_vpu_parent_hws[] = {
2690         &g12a_fclk_div3.hw,
2691         &g12a_fclk_div4.hw,
2692         &g12a_fclk_div5.hw,
2693         &g12a_fclk_div7.hw,
2694         &g12a_mpll1.hw,
2695         &g12a_vid_pll.hw,
2696         &g12a_hifi_pll.hw,
2697         &g12a_gp0_pll.hw,
2698 };
2699 
2700 static struct clk_regmap g12a_vpu_0_sel = {
2701         .data = &(struct clk_regmap_mux_data){
2702                 .offset = HHI_VPU_CLK_CNTL,
2703                 .mask = 0x7,
2704                 .shift = 9,
2705         },
2706         .hw.init = &(struct clk_init_data){
2707                 .name = "vpu_0_sel",
2708                 .ops = &clk_regmap_mux_ops,
2709                 .parent_hws = g12a_vpu_parent_hws,
2710                 .num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
2711                 .flags = CLK_SET_RATE_NO_REPARENT,
2712         },
2713 };
2714 
2715 static struct clk_regmap g12a_vpu_0_div = {
2716         .data = &(struct clk_regmap_div_data){
2717                 .offset = HHI_VPU_CLK_CNTL,
2718                 .shift = 0,
2719                 .width = 7,
2720         },
2721         .hw.init = &(struct clk_init_data){
2722                 .name = "vpu_0_div",
2723                 .ops = &clk_regmap_divider_ops,
2724                 .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_sel.hw },
2725                 .num_parents = 1,
2726                 .flags = CLK_SET_RATE_PARENT,
2727         },
2728 };
2729 
2730 static struct clk_regmap g12a_vpu_0 = {
2731         .data = &(struct clk_regmap_gate_data){
2732                 .offset = HHI_VPU_CLK_CNTL,
2733                 .bit_idx = 8,
2734         },
2735         .hw.init = &(struct clk_init_data) {
2736                 .name = "vpu_0",
2737                 .ops = &clk_regmap_gate_ops,
2738                 .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_div.hw },
2739                 .num_parents = 1,
2740                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2741         },
2742 };
2743 
2744 static struct clk_regmap g12a_vpu_1_sel = {
2745         .data = &(struct clk_regmap_mux_data){
2746                 .offset = HHI_VPU_CLK_CNTL,
2747                 .mask = 0x7,
2748                 .shift = 25,
2749         },
2750         .hw.init = &(struct clk_init_data){
2751                 .name = "vpu_1_sel",
2752                 .ops = &clk_regmap_mux_ops,
2753                 .parent_hws = g12a_vpu_parent_hws,
2754                 .num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
2755                 .flags = CLK_SET_RATE_NO_REPARENT,
2756         },
2757 };
2758 
2759 static struct clk_regmap g12a_vpu_1_div = {
2760         .data = &(struct clk_regmap_div_data){
2761                 .offset = HHI_VPU_CLK_CNTL,
2762                 .shift = 16,
2763                 .width = 7,
2764         },
2765         .hw.init = &(struct clk_init_data){
2766                 .name = "vpu_1_div",
2767                 .ops = &clk_regmap_divider_ops,
2768                 .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_sel.hw },
2769                 .num_parents = 1,
2770                 .flags = CLK_SET_RATE_PARENT,
2771         },
2772 };
2773 
2774 static struct clk_regmap g12a_vpu_1 = {
2775         .data = &(struct clk_regmap_gate_data){
2776                 .offset = HHI_VPU_CLK_CNTL,
2777                 .bit_idx = 24,
2778         },
2779         .hw.init = &(struct clk_init_data) {
2780                 .name = "vpu_1",
2781                 .ops = &clk_regmap_gate_ops,
2782                 .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_div.hw },
2783                 .num_parents = 1,
2784                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2785         },
2786 };
2787 
2788 static struct clk_regmap g12a_vpu = {
2789         .data = &(struct clk_regmap_mux_data){
2790                 .offset = HHI_VPU_CLK_CNTL,
2791                 .mask = 1,
2792                 .shift = 31,
2793         },
2794         .hw.init = &(struct clk_init_data){
2795                 .name = "vpu",
2796                 .ops = &clk_regmap_mux_ops,
2797                 /*
2798                  * bit 31 selects from 2 possible parents:
2799                  * vpu_0 or vpu_1
2800                  */
2801                 .parent_hws = (const struct clk_hw *[]) {
2802                         &g12a_vpu_0.hw,
2803                         &g12a_vpu_1.hw,
2804                 },
2805                 .num_parents = 2,
2806                 .flags = CLK_SET_RATE_NO_REPARENT,
2807         },
2808 };
2809 
2810 /* VDEC clocks */
2811 
2812 static const struct clk_hw *g12a_vdec_parent_hws[] = {
2813         &g12a_fclk_div2p5.hw,
2814         &g12a_fclk_div3.hw,
2815         &g12a_fclk_div4.hw,
2816         &g12a_fclk_div5.hw,
2817         &g12a_fclk_div7.hw,
2818         &g12a_hifi_pll.hw,
2819         &g12a_gp0_pll.hw,
2820 };
2821 
2822 static struct clk_regmap g12a_vdec_1_sel = {
2823         .data = &(struct clk_regmap_mux_data){
2824                 .offset = HHI_VDEC_CLK_CNTL,
2825                 .mask = 0x7,
2826                 .shift = 9,
2827                 .flags = CLK_MUX_ROUND_CLOSEST,
2828         },
2829         .hw.init = &(struct clk_init_data){
2830                 .name = "vdec_1_sel",
2831                 .ops = &clk_regmap_mux_ops,
2832                 .parent_hws = g12a_vdec_parent_hws,
2833                 .num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
2834                 .flags = CLK_SET_RATE_PARENT,
2835         },
2836 };
2837 
2838 static struct clk_regmap g12a_vdec_1_div = {
2839         .data = &(struct clk_regmap_div_data){
2840                 .offset = HHI_VDEC_CLK_CNTL,
2841                 .shift = 0,
2842                 .width = 7,
2843                 .flags = CLK_DIVIDER_ROUND_CLOSEST,
2844         },
2845         .hw.init = &(struct clk_init_data){
2846                 .name = "vdec_1_div",
2847                 .ops = &clk_regmap_divider_ops,
2848                 .parent_hws = (const struct clk_hw *[]) {
2849                         &g12a_vdec_1_sel.hw
2850                 },
2851                 .num_parents = 1,
2852                 .flags = CLK_SET_RATE_PARENT,
2853         },
2854 };
2855 
2856 static struct clk_regmap g12a_vdec_1 = {
2857         .data = &(struct clk_regmap_gate_data){
2858                 .offset = HHI_VDEC_CLK_CNTL,
2859                 .bit_idx = 8,
2860         },
2861         .hw.init = &(struct clk_init_data) {
2862                 .name = "vdec_1",
2863                 .ops = &clk_regmap_gate_ops,
2864                 .parent_hws = (const struct clk_hw *[]) {
2865                         &g12a_vdec_1_div.hw
2866                 },
2867                 .num_parents = 1,
2868                 .flags = CLK_SET_RATE_PARENT,
2869         },
2870 };
2871 
2872 static struct clk_regmap g12a_vdec_hevcf_sel = {
2873         .data = &(struct clk_regmap_mux_data){
2874                 .offset = HHI_VDEC2_CLK_CNTL,
2875                 .mask = 0x7,
2876                 .shift = 9,
2877                 .flags = CLK_MUX_ROUND_CLOSEST,
2878         },
2879         .hw.init = &(struct clk_init_data){
2880                 .name = "vdec_hevcf_sel",
2881                 .ops = &clk_regmap_mux_ops,
2882                 .parent_hws = g12a_vdec_parent_hws,
2883                 .num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
2884                 .flags = CLK_SET_RATE_PARENT,
2885         },
2886 };
2887 
2888 static struct clk_regmap g12a_vdec_hevcf_div = {
2889         .data = &(struct clk_regmap_div_data){
2890                 .offset = HHI_VDEC2_CLK_CNTL,
2891                 .shift = 0,
2892                 .width = 7,
2893                 .flags = CLK_DIVIDER_ROUND_CLOSEST,
2894         },
2895         .hw.init = &(struct clk_init_data){
2896                 .name = "vdec_hevcf_div",
2897                 .ops = &clk_regmap_divider_ops,
2898                 .parent_hws = (const struct clk_hw *[]) {
2899                         &g12a_vdec_hevcf_sel.hw
2900                 },
2901                 .num_parents = 1,
2902                 .flags = CLK_SET_RATE_PARENT,
2903         },
2904 };
2905 
2906 static struct clk_regmap g12a_vdec_hevcf = {
2907         .data = &(struct clk_regmap_gate_data){
2908                 .offset = HHI_VDEC2_CLK_CNTL,
2909                 .bit_idx = 8,
2910         },
2911         .hw.init = &(struct clk_init_data) {
2912                 .name = "vdec_hevcf",
2913                 .ops = &clk_regmap_gate_ops,
2914                 .parent_hws = (const struct clk_hw *[]) {
2915                         &g12a_vdec_hevcf_div.hw
2916                 },
2917                 .num_parents = 1,
2918                 .flags = CLK_SET_RATE_PARENT,
2919         },
2920 };
2921 
2922 static struct clk_regmap g12a_vdec_hevc_sel = {
2923         .data = &(struct clk_regmap_mux_data){
2924                 .offset = HHI_VDEC2_CLK_CNTL,
2925                 .mask = 0x7,
2926                 .shift = 25,
2927                 .flags = CLK_MUX_ROUND_CLOSEST,
2928         },
2929         .hw.init = &(struct clk_init_data){
2930                 .name = "vdec_hevc_sel",
2931                 .ops = &clk_regmap_mux_ops,
2932                 .parent_hws = g12a_vdec_parent_hws,
2933                 .num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
2934                 .flags = CLK_SET_RATE_PARENT,
2935         },
2936 };
2937 
2938 static struct clk_regmap g12a_vdec_hevc_div = {
2939         .data = &(struct clk_regmap_div_data){
2940                 .offset = HHI_VDEC2_CLK_CNTL,
2941                 .shift = 16,
2942                 .width = 7,
2943                 .flags = CLK_DIVIDER_ROUND_CLOSEST,
2944         },
2945         .hw.init = &(struct clk_init_data){
2946                 .name = "vdec_hevc_div",
2947                 .ops = &clk_regmap_divider_ops,
2948                 .parent_hws = (const struct clk_hw *[]) {
2949                         &g12a_vdec_hevc_sel.hw
2950                 },
2951                 .num_parents = 1,
2952                 .flags = CLK_SET_RATE_PARENT,
2953         },
2954 };
2955 
2956 static struct clk_regmap g12a_vdec_hevc = {
2957         .data = &(struct clk_regmap_gate_data){
2958                 .offset = HHI_VDEC2_CLK_CNTL,
2959                 .bit_idx = 24,
2960         },
2961         .hw.init = &(struct clk_init_data) {
2962                 .name = "vdec_hevc",
2963                 .ops = &clk_regmap_gate_ops,
2964                 .parent_hws = (const struct clk_hw *[]) {
2965                         &g12a_vdec_hevc_div.hw
2966                 },
2967                 .num_parents = 1,
2968                 .flags = CLK_SET_RATE_PARENT,
2969         },
2970 };
2971 
2972 /* VAPB Clock */
2973 
2974 static const struct clk_hw *g12a_vapb_parent_hws[] = {
2975         &g12a_fclk_div4.hw,
2976         &g12a_fclk_div3.hw,
2977         &g12a_fclk_div5.hw,
2978         &g12a_fclk_div7.hw,
2979         &g12a_mpll1.hw,
2980         &g12a_vid_pll.hw,
2981         &g12a_mpll2.hw,
2982         &g12a_fclk_div2p5.hw,
2983 };
2984 
2985 static struct clk_regmap g12a_vapb_0_sel = {
2986         .data = &(struct clk_regmap_mux_data){
2987                 .offset = HHI_VAPBCLK_CNTL,
2988                 .mask = 0x3,
2989                 .shift = 9,
2990         },
2991         .hw.init = &(struct clk_init_data){
2992                 .name = "vapb_0_sel",
2993                 .ops = &clk_regmap_mux_ops,
2994                 .parent_hws = g12a_vapb_parent_hws,
2995                 .num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
2996                 .flags = CLK_SET_RATE_NO_REPARENT,
2997         },
2998 };
2999 
3000 static struct clk_regmap g12a_vapb_0_div = {
3001         .data = &(struct clk_regmap_div_data){
3002                 .offset = HHI_VAPBCLK_CNTL,
3003                 .shift = 0,
3004                 .width = 7,
3005         },
3006         .hw.init = &(struct clk_init_data){
3007                 .name = "vapb_0_div",
3008                 .ops = &clk_regmap_divider_ops,
3009                 .parent_hws = (const struct clk_hw *[]) {
3010                         &g12a_vapb_0_sel.hw
3011                 },
3012                 .num_parents = 1,
3013                 .flags = CLK_SET_RATE_PARENT,
3014         },
3015 };
3016 
3017 static struct clk_regmap g12a_vapb_0 = {
3018         .data = &(struct clk_regmap_gate_data){
3019                 .offset = HHI_VAPBCLK_CNTL,
3020                 .bit_idx = 8,
3021         },
3022         .hw.init = &(struct clk_init_data) {
3023                 .name = "vapb_0",
3024                 .ops = &clk_regmap_gate_ops,
3025                 .parent_hws = (const struct clk_hw *[]) {
3026                         &g12a_vapb_0_div.hw
3027                 },
3028                 .num_parents = 1,
3029                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3030         },
3031 };
3032 
3033 static struct clk_regmap g12a_vapb_1_sel = {
3034         .data = &(struct clk_regmap_mux_data){
3035                 .offset = HHI_VAPBCLK_CNTL,
3036                 .mask = 0x3,
3037                 .shift = 25,
3038         },
3039         .hw.init = &(struct clk_init_data){
3040                 .name = "vapb_1_sel",
3041                 .ops = &clk_regmap_mux_ops,
3042                 .parent_hws = g12a_vapb_parent_hws,
3043                 .num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
3044                 .flags = CLK_SET_RATE_NO_REPARENT,
3045         },
3046 };
3047 
3048 static struct clk_regmap g12a_vapb_1_div = {
3049         .data = &(struct clk_regmap_div_data){
3050                 .offset = HHI_VAPBCLK_CNTL,
3051                 .shift = 16,
3052                 .width = 7,
3053         },
3054         .hw.init = &(struct clk_init_data){
3055                 .name = "vapb_1_div",
3056                 .ops = &clk_regmap_divider_ops,
3057                 .parent_hws = (const struct clk_hw *[]) {
3058                         &g12a_vapb_1_sel.hw
3059                 },
3060                 .num_parents = 1,
3061                 .flags = CLK_SET_RATE_PARENT,
3062         },
3063 };
3064 
3065 static struct clk_regmap g12a_vapb_1 = {
3066         .data = &(struct clk_regmap_gate_data){
3067                 .offset = HHI_VAPBCLK_CNTL,
3068                 .bit_idx = 24,
3069         },
3070         .hw.init = &(struct clk_init_data) {
3071                 .name = "vapb_1",
3072                 .ops = &clk_regmap_gate_ops,
3073                 .parent_hws = (const struct clk_hw *[]) {
3074                         &g12a_vapb_1_div.hw
3075                 },
3076                 .num_parents = 1,
3077                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3078         },
3079 };
3080 
3081 static struct clk_regmap g12a_vapb_sel = {
3082         .data = &(struct clk_regmap_mux_data){
3083                 .offset = HHI_VAPBCLK_CNTL,
3084                 .mask = 1,
3085                 .shift = 31,
3086         },
3087         .hw.init = &(struct clk_init_data){
3088                 .name = "vapb_sel",
3089                 .ops = &clk_regmap_mux_ops,
3090                 /*
3091                  * bit 31 selects from 2 possible parents:
3092                  * vapb_0 or vapb_1
3093                  */
3094                 .parent_hws = (const struct clk_hw *[]) {
3095                         &g12a_vapb_0.hw,
3096                         &g12a_vapb_1.hw,
3097                 },
3098                 .num_parents = 2,
3099                 .flags = CLK_SET_RATE_NO_REPARENT,
3100         },
3101 };
3102 
3103 static struct clk_regmap g12a_vapb = {
3104         .data = &(struct clk_regmap_gate_data){
3105                 .offset = HHI_VAPBCLK_CNTL,
3106                 .bit_idx = 30,
3107         },
3108         .hw.init = &(struct clk_init_data) {
3109                 .name = "vapb",
3110                 .ops = &clk_regmap_gate_ops,
3111                 .parent_hws = (const struct clk_hw *[]) { &g12a_vapb_sel.hw },
3112                 .num_parents = 1,
3113                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3114         },
3115 };
3116 
3117 static const struct clk_hw *g12a_vclk_parent_hws[] = {
3118         &g12a_vid_pll.hw,
3119         &g12a_gp0_pll.hw,
3120         &g12a_hifi_pll.hw,
3121         &g12a_mpll1.hw,
3122         &g12a_fclk_div3.hw,
3123         &g12a_fclk_div4.hw,
3124         &g12a_fclk_div5.hw,
3125         &g12a_fclk_div7.hw,
3126 };
3127 
3128 static struct clk_regmap g12a_vclk_sel = {
3129         .data = &(struct clk_regmap_mux_data){
3130                 .offset = HHI_VID_CLK_CNTL,
3131                 .mask = 0x7,
3132                 .shift = 16,
3133         },
3134         .hw.init = &(struct clk_init_data){
3135                 .name = "vclk_sel",
3136                 .ops = &clk_regmap_mux_ops,
3137                 .parent_hws = g12a_vclk_parent_hws,
3138                 .num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
3139                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3140         },
3141 };
3142 
3143 static struct clk_regmap g12a_vclk2_sel = {
3144         .data = &(struct clk_regmap_mux_data){
3145                 .offset = HHI_VIID_CLK_CNTL,
3146                 .mask = 0x7,
3147                 .shift = 16,
3148         },
3149         .hw.init = &(struct clk_init_data){
3150                 .name = "vclk2_sel",
3151                 .ops = &clk_regmap_mux_ops,
3152                 .parent_hws = g12a_vclk_parent_hws,
3153                 .num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
3154                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3155         },
3156 };
3157 
3158 static struct clk_regmap g12a_vclk_input = {
3159         .data = &(struct clk_regmap_gate_data){
3160                 .offset = HHI_VID_CLK_DIV,
3161                 .bit_idx = 16,
3162         },
3163         .hw.init = &(struct clk_init_data) {
3164                 .name = "vclk_input",
3165                 .ops = &clk_regmap_gate_ops,
3166                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk_sel.hw },
3167                 .num_parents = 1,
3168                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3169         },
3170 };
3171 
3172 static struct clk_regmap g12a_vclk2_input = {
3173         .data = &(struct clk_regmap_gate_data){
3174                 .offset = HHI_VIID_CLK_DIV,
3175                 .bit_idx = 16,
3176         },
3177         .hw.init = &(struct clk_init_data) {
3178                 .name = "vclk2_input",
3179                 .ops = &clk_regmap_gate_ops,
3180                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_sel.hw },
3181                 .num_parents = 1,
3182                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3183         },
3184 };
3185 
3186 static struct clk_regmap g12a_vclk_div = {
3187         .data = &(struct clk_regmap_div_data){
3188                 .offset = HHI_VID_CLK_DIV,
3189                 .shift = 0,
3190                 .width = 8,
3191         },
3192         .hw.init = &(struct clk_init_data){
3193                 .name = "vclk_div",
3194                 .ops = &clk_regmap_divider_ops,
3195                 .parent_hws = (const struct clk_hw *[]) {
3196                         &g12a_vclk_input.hw
3197                 },
3198                 .num_parents = 1,
3199                 .flags = CLK_GET_RATE_NOCACHE,
3200         },
3201 };
3202 
3203 static struct clk_regmap g12a_vclk2_div = {
3204         .data = &(struct clk_regmap_div_data){
3205                 .offset = HHI_VIID_CLK_DIV,
3206                 .shift = 0,
3207                 .width = 8,
3208         },
3209         .hw.init = &(struct clk_init_data){
3210                 .name = "vclk2_div",
3211                 .ops = &clk_regmap_divider_ops,
3212                 .parent_hws = (const struct clk_hw *[]) {
3213                         &g12a_vclk2_input.hw
3214                 },
3215                 .num_parents = 1,
3216                 .flags = CLK_GET_RATE_NOCACHE,
3217         },
3218 };
3219 
3220 static struct clk_regmap g12a_vclk = {
3221         .data = &(struct clk_regmap_gate_data){
3222                 .offset = HHI_VID_CLK_CNTL,
3223                 .bit_idx = 19,
3224         },
3225         .hw.init = &(struct clk_init_data) {
3226                 .name = "vclk",
3227                 .ops = &clk_regmap_gate_ops,
3228                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk_div.hw },
3229                 .num_parents = 1,
3230                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3231         },
3232 };
3233 
3234 static struct clk_regmap g12a_vclk2 = {
3235         .data = &(struct clk_regmap_gate_data){
3236                 .offset = HHI_VIID_CLK_CNTL,
3237                 .bit_idx = 19,
3238         },
3239         .hw.init = &(struct clk_init_data) {
3240                 .name = "vclk2",
3241                 .ops = &clk_regmap_gate_ops,
3242                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_div.hw },
3243                 .num_parents = 1,
3244                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3245         },
3246 };
3247 
3248 static struct clk_regmap g12a_vclk_div1 = {
3249         .data = &(struct clk_regmap_gate_data){
3250                 .offset = HHI_VID_CLK_CNTL,
3251                 .bit_idx = 0,
3252         },
3253         .hw.init = &(struct clk_init_data) {
3254                 .name = "vclk_div1",
3255                 .ops = &clk_regmap_gate_ops,
3256                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3257                 .num_parents = 1,
3258                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3259         },
3260 };
3261 
3262 static struct clk_regmap g12a_vclk_div2_en = {
3263         .data = &(struct clk_regmap_gate_data){
3264                 .offset = HHI_VID_CLK_CNTL,
3265                 .bit_idx = 1,
3266         },
3267         .hw.init = &(struct clk_init_data) {
3268                 .name = "vclk_div2_en",
3269                 .ops = &clk_regmap_gate_ops,
3270                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3271                 .num_parents = 1,
3272                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3273         },
3274 };
3275 
3276 static struct clk_regmap g12a_vclk_div4_en = {
3277         .data = &(struct clk_regmap_gate_data){
3278                 .offset = HHI_VID_CLK_CNTL,
3279                 .bit_idx = 2,
3280         },
3281         .hw.init = &(struct clk_init_data) {
3282                 .name = "vclk_div4_en",
3283                 .ops = &clk_regmap_gate_ops,
3284                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3285                 .num_parents = 1,
3286                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3287         },
3288 };
3289 
3290 static struct clk_regmap g12a_vclk_div6_en = {
3291         .data = &(struct clk_regmap_gate_data){
3292                 .offset = HHI_VID_CLK_CNTL,
3293                 .bit_idx = 3,
3294         },
3295         .hw.init = &(struct clk_init_data) {
3296                 .name = "vclk_div6_en",
3297                 .ops = &clk_regmap_gate_ops,
3298                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3299                 .num_parents = 1,
3300                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3301         },
3302 };
3303 
3304 static struct clk_regmap g12a_vclk_div12_en = {
3305         .data = &(struct clk_regmap_gate_data){
3306                 .offset = HHI_VID_CLK_CNTL,
3307                 .bit_idx = 4,
3308         },
3309         .hw.init = &(struct clk_init_data) {
3310                 .name = "vclk_div12_en",
3311                 .ops = &clk_regmap_gate_ops,
3312                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3313                 .num_parents = 1,
3314                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3315         },
3316 };
3317 
3318 static struct clk_regmap g12a_vclk2_div1 = {
3319         .data = &(struct clk_regmap_gate_data){
3320                 .offset = HHI_VIID_CLK_CNTL,
3321                 .bit_idx = 0,
3322         },
3323         .hw.init = &(struct clk_init_data) {
3324                 .name = "vclk2_div1",
3325                 .ops = &clk_regmap_gate_ops,
3326                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3327                 .num_parents = 1,
3328                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3329         },
3330 };
3331 
3332 static struct clk_regmap g12a_vclk2_div2_en = {
3333         .data = &(struct clk_regmap_gate_data){
3334                 .offset = HHI_VIID_CLK_CNTL,
3335                 .bit_idx = 1,
3336         },
3337         .hw.init = &(struct clk_init_data) {
3338                 .name = "vclk2_div2_en",
3339                 .ops = &clk_regmap_gate_ops,
3340                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3341                 .num_parents = 1,
3342                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3343         },
3344 };
3345 
3346 static struct clk_regmap g12a_vclk2_div4_en = {
3347         .data = &(struct clk_regmap_gate_data){
3348                 .offset = HHI_VIID_CLK_CNTL,
3349                 .bit_idx = 2,
3350         },
3351         .hw.init = &(struct clk_init_data) {
3352                 .name = "vclk2_div4_en",
3353                 .ops = &clk_regmap_gate_ops,
3354                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3355                 .num_parents = 1,
3356                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3357         },
3358 };
3359 
3360 static struct clk_regmap g12a_vclk2_div6_en = {
3361         .data = &(struct clk_regmap_gate_data){
3362                 .offset = HHI_VIID_CLK_CNTL,
3363                 .bit_idx = 3,
3364         },
3365         .hw.init = &(struct clk_init_data) {
3366                 .name = "vclk2_div6_en",
3367                 .ops = &clk_regmap_gate_ops,
3368                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3369                 .num_parents = 1,
3370                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3371         },
3372 };
3373 
3374 static struct clk_regmap g12a_vclk2_div12_en = {
3375         .data = &(struct clk_regmap_gate_data){
3376                 .offset = HHI_VIID_CLK_CNTL,
3377                 .bit_idx = 4,
3378         },
3379         .hw.init = &(struct clk_init_data) {
3380                 .name = "vclk2_div12_en",
3381                 .ops = &clk_regmap_gate_ops,
3382                 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3383                 .num_parents = 1,
3384                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3385         },
3386 };
3387 
3388 static struct clk_fixed_factor g12a_vclk_div2 = {
3389         .mult = 1,
3390         .div = 2,
3391         .hw.init = &(struct clk_init_data){
3392                 .name = "vclk_div2",
3393                 .ops = &clk_fixed_factor_ops,
3394                 .parent_hws = (const struct clk_hw *[]) {
3395                         &g12a_vclk_div2_en.hw
3396                 },
3397                 .num_parents = 1,
3398         },
3399 };
3400 
3401 static struct clk_fixed_factor g12a_vclk_div4 = {
3402         .mult = 1,
3403         .div = 4,
3404         .hw.init = &(struct clk_init_data){
3405                 .name = "vclk_div4",
3406                 .ops = &clk_fixed_factor_ops,
3407                 .parent_hws = (const struct clk_hw *[]) {
3408                         &g12a_vclk_div4_en.hw
3409                 },
3410                 .num_parents = 1,
3411         },
3412 };
3413 
3414 static struct clk_fixed_factor g12a_vclk_div6 = {
3415         .mult = 1,
3416         .div = 6,
3417         .hw.init = &(struct clk_init_data){
3418                 .name = "vclk_div6",
3419                 .ops = &clk_fixed_factor_ops,
3420                 .parent_hws = (const struct clk_hw *[]) {
3421                         &g12a_vclk_div6_en.hw
3422                 },
3423                 .num_parents = 1,
3424         },
3425 };
3426 
3427 static struct clk_fixed_factor g12a_vclk_div12 = {
3428         .mult = 1,
3429         .div = 12,
3430         .hw.init = &(struct clk_init_data){
3431                 .name = "vclk_div12",
3432                 .ops = &clk_fixed_factor_ops,
3433                 .parent_hws = (const struct clk_hw *[]) {
3434                         &g12a_vclk_div12_en.hw
3435                 },
3436                 .num_parents = 1,
3437         },
3438 };
3439 
3440 static struct clk_fixed_factor g12a_vclk2_div2 = {
3441         .mult = 1,
3442         .div = 2,
3443         .hw.init = &(struct clk_init_data){
3444                 .name = "vclk2_div2",
3445                 .ops = &clk_fixed_factor_ops,
3446                 .parent_hws = (const struct clk_hw *[]) {
3447                         &g12a_vclk2_div2_en.hw
3448                 },
3449                 .num_parents = 1,
3450         },
3451 };
3452 
3453 static struct clk_fixed_factor g12a_vclk2_div4 = {
3454         .mult = 1,
3455         .div = 4,
3456         .hw.init = &(struct clk_init_data){
3457                 .name = "vclk2_div4",
3458                 .ops = &clk_fixed_factor_ops,
3459                 .parent_hws = (const struct clk_hw *[]) {
3460                         &g12a_vclk2_div4_en.hw
3461                 },
3462                 .num_parents = 1,
3463         },
3464 };
3465 
3466 static struct clk_fixed_factor g12a_vclk2_div6 = {
3467         .mult = 1,
3468         .div = 6,
3469         .hw.init = &(struct clk_init_data){
3470                 .name = "vclk2_div6",
3471                 .ops = &clk_fixed_factor_ops,
3472                 .parent_hws = (const struct clk_hw *[]) {
3473                         &g12a_vclk2_div6_en.hw
3474                 },
3475                 .num_parents = 1,
3476         },
3477 };
3478 
3479 static struct clk_fixed_factor g12a_vclk2_div12 = {
3480         .mult = 1,
3481         .div = 12,
3482         .hw.init = &(struct clk_init_data){
3483                 .name = "vclk2_div12",
3484                 .ops = &clk_fixed_factor_ops,
3485                 .parent_hws = (const struct clk_hw *[]) {
3486                         &g12a_vclk2_div12_en.hw
3487                 },
3488                 .num_parents = 1,
3489         },
3490 };
3491 
3492 static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
3493 static const struct clk_hw *g12a_cts_parent_hws[] = {
3494         &g12a_vclk_div1.hw,
3495         &g12a_vclk_div2.hw,
3496         &g12a_vclk_div4.hw,
3497         &g12a_vclk_div6.hw,
3498         &g12a_vclk_div12.hw,
3499         &g12a_vclk2_div1.hw,
3500         &g12a_vclk2_div2.hw,
3501         &g12a_vclk2_div4.hw,
3502         &g12a_vclk2_div6.hw,
3503         &g12a_vclk2_div12.hw,
3504 };
3505 
3506 static struct clk_regmap g12a_cts_enci_sel = {
3507         .data = &(struct clk_regmap_mux_data){
3508                 .offset = HHI_VID_CLK_DIV,
3509                 .mask = 0xf,
3510                 .shift = 28,
3511                 .table = mux_table_cts_sel,
3512         },
3513         .hw.init = &(struct clk_init_data){
3514                 .name = "cts_enci_sel",
3515                 .ops = &clk_regmap_mux_ops,
3516                 .parent_hws = g12a_cts_parent_hws,
3517                 .num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3518                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3519         },
3520 };
3521 
3522 static struct clk_regmap g12a_cts_encp_sel = {
3523         .data = &(struct clk_regmap_mux_data){
3524                 .offset = HHI_VID_CLK_DIV,
3525                 .mask = 0xf,
3526                 .shift = 20,
3527                 .table = mux_table_cts_sel,
3528         },
3529         .hw.init = &(struct clk_init_data){
3530                 .name = "cts_encp_sel",
3531                 .ops = &clk_regmap_mux_ops,
3532                 .parent_hws = g12a_cts_parent_hws,
3533                 .num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3534                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3535         },
3536 };
3537 
3538 static struct clk_regmap g12a_cts_vdac_sel = {
3539         .data = &(struct clk_regmap_mux_data){
3540                 .offset = HHI_VIID_CLK_DIV,
3541                 .mask = 0xf,
3542                 .shift = 28,
3543                 .table = mux_table_cts_sel,
3544         },
3545         .hw.init = &(struct clk_init_data){
3546                 .name = "cts_vdac_sel",
3547                 .ops = &clk_regmap_mux_ops,
3548                 .parent_hws = g12a_cts_parent_hws,
3549                 .num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3550                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3551         },
3552 };
3553 
3554 /* TOFIX: add support for cts_tcon */
3555 static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
3556 static const struct clk_hw *g12a_cts_hdmi_tx_parent_hws[] = {
3557         &g12a_vclk_div1.hw,
3558         &g12a_vclk_div2.hw,
3559         &g12a_vclk_div4.hw,
3560         &g12a_vclk_div6.hw,
3561         &g12a_vclk_div12.hw,
3562         &g12a_vclk2_div1.hw,
3563         &g12a_vclk2_div2.hw,
3564         &g12a_vclk2_div4.hw,
3565         &g12a_vclk2_div6.hw,
3566         &g12a_vclk2_div12.hw,
3567 };
3568 
3569 static struct clk_regmap g12a_hdmi_tx_sel = {
3570         .data = &(struct clk_regmap_mux_data){
3571                 .offset = HHI_HDMI_CLK_CNTL,
3572                 .mask = 0xf,
3573                 .shift = 16,
3574                 .table = mux_table_hdmi_tx_sel,
3575         },
3576         .hw.init = &(struct clk_init_data){
3577                 .name = "hdmi_tx_sel",
3578                 .ops = &clk_regmap_mux_ops,
3579                 .parent_hws = g12a_cts_hdmi_tx_parent_hws,
3580                 .num_parents = ARRAY_SIZE(g12a_cts_hdmi_tx_parent_hws),
3581                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3582         },
3583 };
3584 
3585 static struct clk_regmap g12a_cts_enci = {
3586         .data = &(struct clk_regmap_gate_data){
3587                 .offset = HHI_VID_CLK_CNTL2,
3588                 .bit_idx = 0,
3589         },
3590         .hw.init = &(struct clk_init_data) {
3591                 .name = "cts_enci",
3592                 .ops = &clk_regmap_gate_ops,
3593                 .parent_hws = (const struct clk_hw *[]) {
3594                         &g12a_cts_enci_sel.hw
3595                 },
3596                 .num_parents = 1,
3597                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3598         },
3599 };
3600 
3601 static struct clk_regmap g12a_cts_encp = {
3602         .data = &(struct clk_regmap_gate_data){
3603                 .offset = HHI_VID_CLK_CNTL2,
3604                 .bit_idx = 2,
3605         },
3606         .hw.init = &(struct clk_init_data) {
3607                 .name = "cts_encp",
3608                 .ops = &clk_regmap_gate_ops,
3609                 .parent_hws = (const struct clk_hw *[]) {
3610                         &g12a_cts_encp_sel.hw
3611                 },
3612                 .num_parents = 1,
3613                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3614         },
3615 };
3616 
3617 static struct clk_regmap g12a_cts_vdac = {
3618         .data = &(struct clk_regmap_gate_data){
3619                 .offset = HHI_VID_CLK_CNTL2,
3620                 .bit_idx = 4,
3621         },
3622         .hw.init = &(struct clk_init_data) {
3623                 .name = "cts_vdac",
3624                 .ops = &clk_regmap_gate_ops,
3625                 .parent_hws = (const struct clk_hw *[]) {
3626                         &g12a_cts_vdac_sel.hw
3627                 },
3628                 .num_parents = 1,
3629                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3630         },
3631 };
3632 
3633 static struct clk_regmap g12a_hdmi_tx = {
3634         .data = &(struct clk_regmap_gate_data){
3635                 .offset = HHI_VID_CLK_CNTL2,
3636                 .bit_idx = 5,
3637         },
3638         .hw.init = &(struct clk_init_data) {
3639                 .name = "hdmi_tx",
3640                 .ops = &clk_regmap_gate_ops,
3641                 .parent_hws = (const struct clk_hw *[]) {
3642                         &g12a_hdmi_tx_sel.hw
3643                 },
3644                 .num_parents = 1,
3645                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3646         },
3647 };
3648 
3649 /* HDMI Clocks */
3650 
3651 static const struct clk_parent_data g12a_hdmi_parent_data[] = {
3652         { .fw_name = "xtal", },
3653         { .hw = &g12a_fclk_div4.hw },
3654         { .hw = &g12a_fclk_div3.hw },
3655         { .hw = &g12a_fclk_div5.hw },
3656 };
3657 
3658 static struct clk_regmap g12a_hdmi_sel = {
3659         .data = &(struct clk_regmap_mux_data){
3660                 .offset = HHI_HDMI_CLK_CNTL,
3661                 .mask = 0x3,
3662                 .shift = 9,
3663                 .flags = CLK_MUX_ROUND_CLOSEST,
3664         },
3665         .hw.init = &(struct clk_init_data){
3666                 .name = "hdmi_sel",
3667                 .ops = &clk_regmap_mux_ops,
3668                 .parent_data = g12a_hdmi_parent_data,
3669                 .num_parents = ARRAY_SIZE(g12a_hdmi_parent_data),
3670                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3671         },
3672 };
3673 
3674 static struct clk_regmap g12a_hdmi_div = {
3675         .data = &(struct clk_regmap_div_data){
3676                 .offset = HHI_HDMI_CLK_CNTL,
3677                 .shift = 0,
3678                 .width = 7,
3679         },
3680         .hw.init = &(struct clk_init_data){
3681                 .name = "hdmi_div",
3682                 .ops = &clk_regmap_divider_ops,
3683                 .parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_sel.hw },
3684                 .num_parents = 1,
3685                 .flags = CLK_GET_RATE_NOCACHE,
3686         },
3687 };
3688 
3689 static struct clk_regmap g12a_hdmi = {
3690         .data = &(struct clk_regmap_gate_data){
3691                 .offset = HHI_HDMI_CLK_CNTL,
3692                 .bit_idx = 8,
3693         },
3694         .hw.init = &(struct clk_init_data) {
3695                 .name = "hdmi",
3696                 .ops = &clk_regmap_gate_ops,
3697                 .parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_div.hw },
3698                 .num_parents = 1,
3699                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3700         },
3701 };
3702 
3703 /*
3704  * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
3705  * muxed by a glitch-free switch.
3706  */
3707 static const struct clk_parent_data g12a_mali_0_1_parent_data[] = {
3708         { .fw_name = "xtal", },
3709         { .hw = &g12a_gp0_pll.hw },
3710         { .hw = &g12a_hifi_pll.hw },
3711         { .hw = &g12a_fclk_div2p5.hw },
3712         { .hw = &g12a_fclk_div3.hw },
3713         { .hw = &g12a_fclk_div4.hw },
3714         { .hw = &g12a_fclk_div5.hw },
3715         { .hw = &g12a_fclk_div7.hw },
3716 };
3717 
3718 static struct clk_regmap g12a_mali_0_sel = {
3719         .data = &(struct clk_regmap_mux_data){
3720                 .offset = HHI_MALI_CLK_CNTL,
3721                 .mask = 0x7,
3722                 .shift = 9,
3723         },
3724         .hw.init = &(struct clk_init_data){
3725                 .name = "mali_0_sel",
3726                 .ops = &clk_regmap_mux_ops,
3727                 .parent_data = g12a_mali_0_1_parent_data,
3728                 .num_parents = 8,
3729                 .flags = CLK_SET_RATE_NO_REPARENT,
3730         },
3731 };
3732 
3733 static struct clk_regmap g12a_mali_0_div = {
3734         .data = &(struct clk_regmap_div_data){
3735                 .offset = HHI_MALI_CLK_CNTL,
3736                 .shift = 0,
3737                 .width = 7,
3738         },
3739         .hw.init = &(struct clk_init_data){
3740                 .name = "mali_0_div",
3741                 .ops = &clk_regmap_divider_ops,
3742                 .parent_hws = (const struct clk_hw *[]) {
3743                         &g12a_mali_0_sel.hw
3744                 },
3745                 .num_parents = 1,
3746                 .flags = CLK_SET_RATE_NO_REPARENT,
3747         },
3748 };
3749 
3750 static struct clk_regmap g12a_mali_0 = {
3751         .data = &(struct clk_regmap_gate_data){
3752                 .offset = HHI_MALI_CLK_CNTL,
3753                 .bit_idx = 8,
3754         },
3755         .hw.init = &(struct clk_init_data){
3756                 .name = "mali_0",
3757                 .ops = &clk_regmap_gate_ops,
3758                 .parent_hws = (const struct clk_hw *[]) {
3759                         &g12a_mali_0_div.hw
3760                 },
3761                 .num_parents = 1,
3762                 .flags = CLK_SET_RATE_PARENT,
3763         },
3764 };
3765 
3766 static struct clk_regmap g12a_mali_1_sel = {
3767         .data = &(struct clk_regmap_mux_data){
3768                 .offset = HHI_MALI_CLK_CNTL,
3769                 .mask = 0x7,
3770                 .shift = 25,
3771         },
3772         .hw.init = &(struct clk_init_data){
3773                 .name = "mali_1_sel",
3774                 .ops = &clk_regmap_mux_ops,
3775                 .parent_data = g12a_mali_0_1_parent_data,
3776                 .num_parents = 8,
3777                 .flags = CLK_SET_RATE_NO_REPARENT,
3778         },
3779 };
3780 
3781 static struct clk_regmap g12a_mali_1_div = {
3782         .data = &(struct clk_regmap_div_data){
3783                 .offset = HHI_MALI_CLK_CNTL,
3784                 .shift = 16,
3785                 .width = 7,
3786         },
3787         .hw.init = &(struct clk_init_data){
3788                 .name = "mali_1_div",
3789                 .ops = &clk_regmap_divider_ops,
3790                 .parent_hws = (const struct clk_hw *[]) {
3791                         &g12a_mali_1_sel.hw
3792                 },
3793                 .num_parents = 1,
3794                 .flags = CLK_SET_RATE_NO_REPARENT,
3795         },
3796 };
3797 
3798 static struct clk_regmap g12a_mali_1 = {
3799         .data = &(struct clk_regmap_gate_data){
3800                 .offset = HHI_MALI_CLK_CNTL,
3801                 .bit_idx = 24,
3802         },
3803         .hw.init = &(struct clk_init_data){
3804                 .name = "mali_1",
3805                 .ops = &clk_regmap_gate_ops,
3806                 .parent_hws = (const struct clk_hw *[]) {
3807                         &g12a_mali_1_div.hw
3808                 },
3809                 .num_parents = 1,
3810                 .flags = CLK_SET_RATE_PARENT,
3811         },
3812 };
3813 
3814 static const struct clk_hw *g12a_mali_parent_hws[] = {
3815         &g12a_mali_0.hw,
3816         &g12a_mali_1.hw,
3817 };
3818 
3819 static struct clk_regmap g12a_mali = {
3820         .data = &(struct clk_regmap_mux_data){
3821                 .offset = HHI_MALI_CLK_CNTL,
3822                 .mask = 1,
3823                 .shift = 31,
3824         },
3825         .hw.init = &(struct clk_init_data){
3826                 .name = "mali",
3827                 .ops = &clk_regmap_mux_ops,
3828                 .parent_hws = g12a_mali_parent_hws,
3829                 .num_parents = 2,
3830                 .flags = CLK_SET_RATE_NO_REPARENT,
3831         },
3832 };
3833 
3834 static struct clk_regmap g12a_ts_div = {
3835         .data = &(struct clk_regmap_div_data){
3836                 .offset = HHI_TS_CLK_CNTL,
3837                 .shift = 0,
3838                 .width = 8,
3839         },
3840         .hw.init = &(struct clk_init_data){
3841                 .name = "ts_div",
3842                 .ops = &clk_regmap_divider_ro_ops,
3843                 .parent_data = &(const struct clk_parent_data) {
3844                         .fw_name = "xtal",
3845                 },
3846                 .num_parents = 1,
3847         },
3848 };
3849 
3850 static struct clk_regmap g12a_ts = {
3851         .data = &(struct clk_regmap_gate_data){
3852                 .offset = HHI_TS_CLK_CNTL,
3853                 .bit_idx = 8,
3854         },
3855         .hw.init = &(struct clk_init_data){
3856                 .name = "ts",
3857                 .ops = &clk_regmap_gate_ops,
3858                 .parent_hws = (const struct clk_hw *[]) {
3859                         &g12a_ts_div.hw
3860                 },
3861                 .num_parents = 1,
3862         },
3863 };
3864 
3865 #define MESON_GATE(_name, _reg, _bit) \
3866         MESON_PCLK(_name, _reg, _bit, &g12a_clk81.hw)
3867 
3868 #define MESON_GATE_RO(_name, _reg, _bit) \
3869         MESON_PCLK_RO(_name, _reg, _bit, &g12a_clk81.hw)
3870 
3871 /* Everything Else (EE) domain gates */
3872 static MESON_GATE(g12a_ddr,                     HHI_GCLK_MPEG0, 0);
3873 static MESON_GATE(g12a_dos,                     HHI_GCLK_MPEG0, 1);
3874 static MESON_GATE(g12a_audio_locker,            HHI_GCLK_MPEG0, 2);
3875 static MESON_GATE(g12a_mipi_dsi_host,           HHI_GCLK_MPEG0, 3);
3876 static MESON_GATE(g12a_eth_phy,                 HHI_GCLK_MPEG0, 4);
3877 static MESON_GATE(g12a_isa,                     HHI_GCLK_MPEG0, 5);
3878 static MESON_GATE(g12a_pl301,                   HHI_GCLK_MPEG0, 6);
3879 static MESON_GATE(g12a_periphs,                 HHI_GCLK_MPEG0, 7);
3880 static MESON_GATE(g12a_spicc_0,                 HHI_GCLK_MPEG0, 8);
3881 static MESON_GATE(g12a_i2c,                     HHI_GCLK_MPEG0, 9);
3882 static MESON_GATE(g12a_sana,                    HHI_GCLK_MPEG0, 10);
3883 static MESON_GATE(g12a_sd,                      HHI_GCLK_MPEG0, 11);
3884 static MESON_GATE(g12a_rng0,                    HHI_GCLK_MPEG0, 12);
3885 static MESON_GATE(g12a_uart0,                   HHI_GCLK_MPEG0, 13);
3886 static MESON_GATE(g12a_spicc_1,                 HHI_GCLK_MPEG0, 14);
3887 static MESON_GATE(g12a_hiu_reg,                 HHI_GCLK_MPEG0, 19);
3888 static MESON_GATE(g12a_mipi_dsi_phy,            HHI_GCLK_MPEG0, 20);
3889 static MESON_GATE(g12a_assist_misc,             HHI_GCLK_MPEG0, 23);
3890 static MESON_GATE(g12a_emmc_a,                  HHI_GCLK_MPEG0, 4);
3891 static MESON_GATE(g12a_emmc_b,                  HHI_GCLK_MPEG0, 25);
3892 static MESON_GATE(g12a_emmc_c,                  HHI_GCLK_MPEG0, 26);
3893 static MESON_GATE(g12a_audio_codec,             HHI_GCLK_MPEG0, 28);
3894 
3895 static MESON_GATE(g12a_audio,                   HHI_GCLK_MPEG1, 0);
3896 static MESON_GATE(g12a_eth_core,                HHI_GCLK_MPEG1, 3);
3897 static MESON_GATE(g12a_demux,                   HHI_GCLK_MPEG1, 4);
3898 static MESON_GATE(g12a_audio_ififo,             HHI_GCLK_MPEG1, 11);
3899 static MESON_GATE(g12a_adc,                     HHI_GCLK_MPEG1, 13);
3900 static MESON_GATE(g12a_uart1,                   HHI_GCLK_MPEG1, 16);
3901 static MESON_GATE(g12a_g2d,                     HHI_GCLK_MPEG1, 20);
3902 static MESON_GATE(g12a_reset,                   HHI_GCLK_MPEG1, 23);
3903 static MESON_GATE(g12a_pcie_comb,               HHI_GCLK_MPEG1, 24);
3904 static MESON_GATE(g12a_parser,                  HHI_GCLK_MPEG1, 25);
3905 static MESON_GATE(g12a_usb_general,             HHI_GCLK_MPEG1, 26);
3906 static MESON_GATE(g12a_pcie_phy,                HHI_GCLK_MPEG1, 27);
3907 static MESON_GATE(g12a_ahb_arb0,                HHI_GCLK_MPEG1, 29);
3908 
3909 static MESON_GATE(g12a_ahb_data_bus,            HHI_GCLK_MPEG2, 1);
3910 static MESON_GATE(g12a_ahb_ctrl_bus,            HHI_GCLK_MPEG2, 2);
3911 static MESON_GATE(g12a_htx_hdcp22,              HHI_GCLK_MPEG2, 3);
3912 static MESON_GATE(g12a_htx_pclk,                HHI_GCLK_MPEG2, 4);
3913 static MESON_GATE(g12a_bt656,                   HHI_GCLK_MPEG2, 6);
3914 static MESON_GATE(g12a_usb1_to_ddr,             HHI_GCLK_MPEG2, 8);
3915 static MESON_GATE(g12a_mmc_pclk,                HHI_GCLK_MPEG2, 11);
3916 static MESON_GATE(g12a_uart2,                   HHI_GCLK_MPEG2, 15);
3917 static MESON_GATE(g12a_vpu_intr,                HHI_GCLK_MPEG2, 25);
3918 static MESON_GATE(g12a_gic,                     HHI_GCLK_MPEG2, 30);
3919 
3920 static MESON_GATE(g12a_vclk2_venci0,            HHI_GCLK_OTHER, 1);
3921 static MESON_GATE(g12a_vclk2_venci1,            HHI_GCLK_OTHER, 2);
3922 static MESON_GATE(g12a_vclk2_vencp0,            HHI_GCLK_OTHER, 3);
3923 static MESON_GATE(g12a_vclk2_vencp1,            HHI_GCLK_OTHER, 4);
3924 static MESON_GATE(g12a_vclk2_venct0,            HHI_GCLK_OTHER, 5);
3925 static MESON_GATE(g12a_vclk2_venct1,            HHI_GCLK_OTHER, 6);
3926 static MESON_GATE(g12a_vclk2_other,             HHI_GCLK_OTHER, 7);
3927 static MESON_GATE(g12a_vclk2_enci,              HHI_GCLK_OTHER, 8);
3928 static MESON_GATE(g12a_vclk2_encp,              HHI_GCLK_OTHER, 9);
3929 static MESON_GATE(g12a_dac_clk,                 HHI_GCLK_OTHER, 10);
3930 static MESON_GATE(g12a_aoclk_gate,              HHI_GCLK_OTHER, 14);
3931 static MESON_GATE(g12a_iec958_gate,             HHI_GCLK_OTHER, 16);
3932 static MESON_GATE(g12a_enc480p,                 HHI_GCLK_OTHER, 20);
3933 static MESON_GATE(g12a_rng1,                    HHI_GCLK_OTHER, 21);
3934 static MESON_GATE(g12a_vclk2_enct,              HHI_GCLK_OTHER, 22);
3935 static MESON_GATE(g12a_vclk2_encl,              HHI_GCLK_OTHER, 23);
3936 static MESON_GATE(g12a_vclk2_venclmmc,          HHI_GCLK_OTHER, 24);
3937 static MESON_GATE(g12a_vclk2_vencl,             HHI_GCLK_OTHER, 25);
3938 static MESON_GATE(g12a_vclk2_other1,            HHI_GCLK_OTHER, 26);
3939 
3940 static MESON_GATE_RO(g12a_dma,                  HHI_GCLK_OTHER2, 0);
3941 static MESON_GATE_RO(g12a_efuse,                HHI_GCLK_OTHER2, 1);
3942 static MESON_GATE_RO(g12a_rom_boot,             HHI_GCLK_OTHER2, 2);
3943 static MESON_GATE_RO(g12a_reset_sec,            HHI_GCLK_OTHER2, 3);
3944 static MESON_GATE_RO(g12a_sec_ahb_apb3,         HHI_GCLK_OTHER2, 4);
3945 
3946 /* Array of all clocks provided by this provider */
3947 static struct clk_hw_onecell_data g12a_hw_onecell_data = {
3948         .hws = {
3949                 [CLKID_SYS_PLL]                 = &g12a_sys_pll.hw,
3950                 [CLKID_FIXED_PLL]               = &g12a_fixed_pll.hw,
3951                 [CLKID_FCLK_DIV2]               = &g12a_fclk_div2.hw,
3952                 [CLKID_FCLK_DIV3]               = &g12a_fclk_div3.hw,
3953                 [CLKID_FCLK_DIV4]               = &g12a_fclk_div4.hw,
3954                 [CLKID_FCLK_DIV5]               = &g12a_fclk_div5.hw,
3955                 [CLKID_FCLK_DIV7]               = &g12a_fclk_div7.hw,
3956                 [CLKID_FCLK_DIV2P5]             = &g12a_fclk_div2p5.hw,
3957                 [CLKID_GP0_PLL]                 = &g12a_gp0_pll.hw,
3958                 [CLKID_MPEG_SEL]                = &g12a_mpeg_clk_sel.hw,
3959                 [CLKID_MPEG_DIV]                = &g12a_mpeg_clk_div.hw,
3960                 [CLKID_CLK81]                   = &g12a_clk81.hw,
3961                 [CLKID_MPLL0]                   = &g12a_mpll0.hw,
3962                 [CLKID_MPLL1]                   = &g12a_mpll1.hw,
3963                 [CLKID_MPLL2]                   = &g12a_mpll2.hw,
3964                 [CLKID_MPLL3]                   = &g12a_mpll3.hw,
3965                 [CLKID_DDR]                     = &g12a_ddr.hw,
3966                 [CLKID_DOS]                     = &g12a_dos.hw,
3967                 [CLKID_AUDIO_LOCKER]            = &g12a_audio_locker.hw,
3968                 [CLKID_MIPI_DSI_HOST]           = &g12a_mipi_dsi_host.hw,
3969                 [CLKID_ETH_PHY]                 = &g12a_eth_phy.hw,
3970                 [CLKID_ISA]                     = &g12a_isa.hw,
3971                 [CLKID_PL301]                   = &g12a_pl301.hw,
3972                 [CLKID_PERIPHS]                 = &g12a_periphs.hw,
3973                 [CLKID_SPICC0]                  = &g12a_spicc_0.hw,
3974                 [CLKID_I2C]                     = &g12a_i2c.hw,
3975                 [CLKID_SANA]                    = &g12a_sana.hw,
3976                 [CLKID_SD]                      = &g12a_sd.hw,
3977                 [CLKID_RNG0]                    = &g12a_rng0.hw,
3978                 [CLKID_UART0]                   = &g12a_uart0.hw,
3979                 [CLKID_SPICC1]                  = &g12a_spicc_1.hw,
3980                 [CLKID_HIU_IFACE]               = &g12a_hiu_reg.hw,
3981                 [CLKID_MIPI_DSI_PHY]            = &g12a_mipi_dsi_phy.hw,
3982                 [CLKID_ASSIST_MISC]             = &g12a_assist_misc.hw,
3983                 [CLKID_SD_EMMC_A]               = &g12a_emmc_a.hw,
3984                 [CLKID_SD_EMMC_B]               = &g12a_emmc_b.hw,
3985                 [CLKID_SD_EMMC_C]               = &g12a_emmc_c.hw,
3986                 [CLKID_AUDIO_CODEC]             = &g12a_audio_codec.hw,
3987                 [CLKID_AUDIO]                   = &g12a_audio.hw,
3988                 [CLKID_ETH]                     = &g12a_eth_core.hw,
3989                 [CLKID_DEMUX]                   = &g12a_demux.hw,
3990                 [CLKID_AUDIO_IFIFO]             = &g12a_audio_ififo.hw,
3991                 [CLKID_ADC]                     = &g12a_adc.hw,
3992                 [CLKID_UART1]                   = &g12a_uart1.hw,
3993                 [CLKID_G2D]                     = &g12a_g2d.hw,
3994                 [CLKID_RESET]                   = &g12a_reset.hw,
3995                 [CLKID_PCIE_COMB]               = &g12a_pcie_comb.hw,
3996                 [CLKID_PARSER]                  = &g12a_parser.hw,
3997                 [CLKID_USB]                     = &g12a_usb_general.hw,
3998                 [CLKID_PCIE_PHY]                = &g12a_pcie_phy.hw,
3999                 [CLKID_AHB_ARB0]                = &g12a_ahb_arb0.hw,
4000                 [CLKID_AHB_DATA_BUS]            = &g12a_ahb_data_bus.hw,
4001                 [CLKID_AHB_CTRL_BUS]            = &g12a_ahb_ctrl_bus.hw,
4002                 [CLKID_HTX_HDCP22]              = &g12a_htx_hdcp22.hw,
4003                 [CLKID_HTX_PCLK]                = &g12a_htx_pclk.hw,
4004                 [CLKID_BT656]                   = &g12a_bt656.hw,
4005                 [CLKID_USB1_DDR_BRIDGE]         = &g12a_usb1_to_ddr.hw,
4006                 [CLKID_MMC_PCLK]                = &g12a_mmc_pclk.hw,
4007                 [CLKID_UART2]                   = &g12a_uart2.hw,
4008                 [CLKID_VPU_INTR]                = &g12a_vpu_intr.hw,
4009                 [CLKID_GIC]                     = &g12a_gic.hw,
4010                 [CLKID_SD_EMMC_A_CLK0_SEL]      = &g12a_sd_emmc_a_clk0_sel.hw,
4011                 [CLKID_SD_EMMC_A_CLK0_DIV]      = &g12a_sd_emmc_a_clk0_div.hw,
4012                 [CLKID_SD_EMMC_A_CLK0]          = &g12a_sd_emmc_a_clk0.hw,
4013                 [CLKID_SD_EMMC_B_CLK0_SEL]      = &g12a_sd_emmc_b_clk0_sel.hw,
4014                 [CLKID_SD_EMMC_B_CLK0_DIV]      = &g12a_sd_emmc_b_clk0_div.hw,
4015                 [CLKID_SD_EMMC_B_CLK0]          = &g12a_sd_emmc_b_clk0.hw,
4016                 [CLKID_SD_EMMC_C_CLK0_SEL]      = &g12a_sd_emmc_c_clk0_sel.hw,
4017                 [CLKID_SD_EMMC_C_CLK0_DIV]      = &g12a_sd_emmc_c_clk0_div.hw,
4018                 [CLKID_SD_EMMC_C_CLK0]          = &g12a_sd_emmc_c_clk0.hw,
4019                 [CLKID_MPLL0_DIV]               = &g12a_mpll0_div.hw,
4020                 [CLKID_MPLL1_DIV]               = &g12a_mpll1_div.hw,
4021                 [CLKID_MPLL2_DIV]               = &g12a_mpll2_div.hw,
4022                 [CLKID_MPLL3_DIV]               = &g12a_mpll3_div.hw,
4023                 [CLKID_FCLK_DIV2_DIV]           = &g12a_fclk_div2_div.hw,
4024                 [CLKID_FCLK_DIV3_DIV]           = &g12a_fclk_div3_div.hw,
4025                 [CLKID_FCLK_DIV4_DIV]           = &g12a_fclk_div4_div.hw,
4026                 [CLKID_FCLK_DIV5_DIV]           = &g12a_fclk_div5_div.hw,
4027                 [CLKID_FCLK_DIV7_DIV]           = &g12a_fclk_div7_div.hw,
4028                 [CLKID_FCLK_DIV2P5_DIV]         = &g12a_fclk_div2p5_div.hw,
4029                 [CLKID_HIFI_PLL]                = &g12a_hifi_pll.hw,
4030                 [CLKID_VCLK2_VENCI0]            = &g12a_vclk2_venci0.hw,
4031                 [CLKID_VCLK2_VENCI1]            = &g12a_vclk2_venci1.hw,
4032                 [CLKID_VCLK2_VENCP0]            = &g12a_vclk2_vencp0.hw,
4033                 [CLKID_VCLK2_VENCP1]            = &g12a_vclk2_vencp1.hw,
4034                 [CLKID_VCLK2_VENCT0]            = &g12a_vclk2_venct0.hw,
4035                 [CLKID_VCLK2_VENCT1]            = &g12a_vclk2_venct1.hw,
4036                 [CLKID_VCLK2_OTHER]             = &g12a_vclk2_other.hw,
4037                 [CLKID_VCLK2_ENCI]              = &g12a_vclk2_enci.hw,
4038                 [CLKID_VCLK2_ENCP]              = &g12a_vclk2_encp.hw,
4039                 [CLKID_DAC_CLK]                 = &g12a_dac_clk.hw,
4040                 [CLKID_AOCLK]                   = &g12a_aoclk_gate.hw,
4041                 [CLKID_IEC958]                  = &g12a_iec958_gate.hw,
4042                 [CLKID_ENC480P]                 = &g12a_enc480p.hw,
4043                 [CLKID_RNG1]                    = &g12a_rng1.hw,
4044                 [CLKID_VCLK2_ENCT]              = &g12a_vclk2_enct.hw,
4045                 [CLKID_VCLK2_ENCL]              = &g12a_vclk2_encl.hw,
4046                 [CLKID_VCLK2_VENCLMMC]          = &g12a_vclk2_venclmmc.hw,
4047                 [CLKID_VCLK2_VENCL]             = &g12a_vclk2_vencl.hw,
4048                 [CLKID_VCLK2_OTHER1]            = &g12a_vclk2_other1.hw,
4049                 [CLKID_FIXED_PLL_DCO]           = &g12a_fixed_pll_dco.hw,
4050                 [CLKID_SYS_PLL_DCO]             = &g12a_sys_pll_dco.hw,
4051                 [CLKID_GP0_PLL_DCO]             = &g12a_gp0_pll_dco.hw,
4052                 [CLKID_HIFI_PLL_DCO]            = &g12a_hifi_pll_dco.hw,
4053                 [CLKID_DMA]                     = &g12a_dma.hw,
4054                 [CLKID_EFUSE]                   = &g12a_efuse.hw,
4055                 [CLKID_ROM_BOOT]                = &g12a_rom_boot.hw,
4056                 [CLKID_RESET_SEC]               = &g12a_reset_sec.hw,
4057                 [CLKID_SEC_AHB_APB3]            = &g12a_sec_ahb_apb3.hw,
4058                 [CLKID_MPLL_PREDIV]             = &g12a_mpll_prediv.hw,
4059                 [CLKID_VPU_0_SEL]               = &g12a_vpu_0_sel.hw,
4060                 [CLKID_VPU_0_DIV]               = &g12a_vpu_0_div.hw,
4061                 [CLKID_VPU_0]                   = &g12a_vpu_0.hw,
4062                 [CLKID_VPU_1_SEL]               = &g12a_vpu_1_sel.hw,
4063                 [CLKID_VPU_1_DIV]               = &g12a_vpu_1_div.hw,
4064                 [CLKID_VPU_1]                   = &g12a_vpu_1.hw,
4065                 [CLKID_VPU]                     = &g12a_vpu.hw,
4066                 [CLKID_VAPB_0_SEL]              = &g12a_vapb_0_sel.hw,
4067                 [CLKID_VAPB_0_DIV]              = &g12a_vapb_0_div.hw,
4068                 [CLKID_VAPB_0]                  = &g12a_vapb_0.hw,
4069                 [CLKID_VAPB_1_SEL]              = &g12a_vapb_1_sel.hw,
4070                 [CLKID_VAPB_1_DIV]              = &g12a_vapb_1_div.hw,
4071                 [CLKID_VAPB_1]                  = &g12a_vapb_1.hw,
4072                 [CLKID_VAPB_SEL]                = &g12a_vapb_sel.hw,
4073                 [CLKID_VAPB]                    = &g12a_vapb.hw,
4074                 [CLKID_HDMI_PLL_DCO]            = &g12a_hdmi_pll_dco.hw,
4075                 [CLKID_HDMI_PLL_OD]             = &g12a_hdmi_pll_od.hw,
4076                 [CLKID_HDMI_PLL_OD2]            = &g12a_hdmi_pll_od2.hw,
4077                 [CLKID_HDMI_PLL]                = &g12a_hdmi_pll.hw,
4078                 [CLKID_VID_PLL]                 = &g12a_vid_pll_div.hw,
4079                 [CLKID_VID_PLL_SEL]             = &g12a_vid_pll_sel.hw,
4080                 [CLKID_VID_PLL_DIV]             = &g12a_vid_pll.hw,
4081                 [CLKID_VCLK_SEL]                = &g12a_vclk_sel.hw,
4082                 [CLKID_VCLK2_SEL]               = &g12a_vclk2_sel.hw,
4083                 [CLKID_VCLK_INPUT]              = &g12a_vclk_input.hw,
4084                 [CLKID_VCLK2_INPUT]             = &g12a_vclk2_input.hw,
4085                 [CLKID_VCLK_DIV]                = &g12a_vclk_div.hw,
4086                 [CLKID_VCLK2_DIV]               = &g12a_vclk2_div.hw,
4087                 [CLKID_VCLK]                    = &g12a_vclk.hw,
4088                 [CLKID_VCLK2]                   = &g12a_vclk2.hw,
4089                 [CLKID_VCLK_DIV1]               = &g12a_vclk_div1.hw,
4090                 [CLKID_VCLK_DIV2_EN]            = &g12a_vclk_div2_en.hw,
4091                 [CLKID_VCLK_DIV4_EN]            = &g12a_vclk_div4_en.hw,
4092                 [CLKID_VCLK_DIV6_EN]            = &g12a_vclk_div6_en.hw,
4093                 [CLKID_VCLK_DIV12_EN]           = &g12a_vclk_div12_en.hw,
4094                 [CLKID_VCLK2_DIV1]              = &g12a_vclk2_div1.hw,
4095                 [CLKID_VCLK2_DIV2_EN]           = &g12a_vclk2_div2_en.hw,
4096                 [CLKID_VCLK2_DIV4_EN]           = &g12a_vclk2_div4_en.hw,
4097                 [CLKID_VCLK2_DIV6_EN]           = &g12a_vclk2_div6_en.hw,
4098                 [CLKID_VCLK2_DIV12_EN]          = &g12a_vclk2_div12_en.hw,
4099                 [CLKID_VCLK_DIV2]               = &g12a_vclk_div2.hw,
4100                 [CLKID_VCLK_DIV4]               = &g12a_vclk_div4.hw,
4101                 [CLKID_VCLK_DIV6]               = &g12a_vclk_div6.hw,
4102                 [CLKID_VCLK_DIV12]              = &g12a_vclk_div12.hw,
4103                 [CLKID_VCLK2_DIV2]              = &g12a_vclk2_div2.hw,
4104                 [CLKID_VCLK2_DIV4]              = &g12a_vclk2_div4.hw,
4105                 [CLKID_VCLK2_DIV6]              = &g12a_vclk2_div6.hw,
4106                 [CLKID_VCLK2_DIV12]             = &g12a_vclk2_div12.hw,
4107                 [CLKID_CTS_ENCI_SEL]            = &g12a_cts_enci_sel.hw,
4108                 [CLKID_CTS_ENCP_SEL]            = &g12a_cts_encp_sel.hw,
4109                 [CLKID_CTS_VDAC_SEL]            = &g12a_cts_vdac_sel.hw,
4110                 [CLKID_HDMI_TX_SEL]             = &g12a_hdmi_tx_sel.hw,
4111                 [CLKID_CTS_ENCI]                = &g12a_cts_enci.hw,
4112                 [CLKID_CTS_ENCP]                = &g12a_cts_encp.hw,
4113                 [CLKID_CTS_VDAC]                = &g12a_cts_vdac.hw,
4114                 [CLKID_HDMI_TX]                 = &g12a_hdmi_tx.hw,
4115                 [CLKID_HDMI_SEL]                = &g12a_hdmi_sel.hw,
4116                 [CLKID_HDMI_DIV]                = &g12a_hdmi_div.hw,
4117                 [CLKID_HDMI]                    = &g12a_hdmi.hw,
4118                 [CLKID_MALI_0_SEL]              = &g12a_mali_0_sel.hw,
4119                 [CLKID_MALI_0_DIV]              = &g12a_mali_0_div.hw,
4120                 [CLKID_MALI_0]                  = &g12a_mali_0.hw,
4121                 [CLKID_MALI_1_SEL]              = &g12a_mali_1_sel.hw,
4122                 [CLKID_MALI_1_DIV]              = &g12a_mali_1_div.hw,
4123                 [CLKID_MALI_1]                  = &g12a_mali_1.hw,
4124                 [CLKID_MALI]                    = &g12a_mali.hw,
4125                 [CLKID_MPLL_50M_DIV]            = &g12a_mpll_50m_div.hw,
4126                 [CLKID_MPLL_50M]                = &g12a_mpll_50m.hw,
4127                 [CLKID_SYS_PLL_DIV16_EN]        = &g12a_sys_pll_div16_en.hw,
4128                 [CLKID_SYS_PLL_DIV16]           = &g12a_sys_pll_div16.hw,
4129                 [CLKID_CPU_CLK_DYN0_SEL]        = &g12a_cpu_clk_premux0.hw,
4130                 [CLKID_CPU_CLK_DYN0_DIV]        = &g12a_cpu_clk_mux0_div.hw,
4131                 [CLKID_CPU_CLK_DYN0]            = &g12a_cpu_clk_postmux0.hw,
4132                 [CLKID_CPU_CLK_DYN1_SEL]        = &g12a_cpu_clk_premux1.hw,
4133                 [CLKID_CPU_CLK_DYN1_DIV]        = &g12a_cpu_clk_mux1_div.hw,
4134                 [CLKID_CPU_CLK_DYN1]            = &g12a_cpu_clk_postmux1.hw,
4135                 [CLKID_CPU_CLK_DYN]             = &g12a_cpu_clk_dyn.hw,
4136                 [CLKID_CPU_CLK]                 = &g12a_cpu_clk.hw,
4137                 [CLKID_CPU_CLK_DIV16_EN]        = &g12a_cpu_clk_div16_en.hw,
4138                 [CLKID_CPU_CLK_DIV16]           = &g12a_cpu_clk_div16.hw,
4139                 [CLKID_CPU_CLK_APB_DIV]         = &g12a_cpu_clk_apb_div.hw,
4140                 [CLKID_CPU_CLK_APB]             = &g12a_cpu_clk_apb.hw,
4141                 [CLKID_CPU_CLK_ATB_DIV]         = &g12a_cpu_clk_atb_div.hw,
4142                 [CLKID_CPU_CLK_ATB]             = &g12a_cpu_clk_atb.hw,
4143                 [CLKID_CPU_CLK_AXI_DIV]         = &g12a_cpu_clk_axi_div.hw,
4144                 [CLKID_CPU_CLK_AXI]             = &g12a_cpu_clk_axi.hw,
4145                 [CLKID_CPU_CLK_TRACE_DIV]       = &g12a_cpu_clk_trace_div.hw,
4146                 [CLKID_CPU_CLK_TRACE]           = &g12a_cpu_clk_trace.hw,
4147                 [CLKID_PCIE_PLL_DCO]            = &g12a_pcie_pll_dco.hw,
4148                 [CLKID_PCIE_PLL_DCO_DIV2]       = &g12a_pcie_pll_dco_div2.hw,
4149                 [CLKID_PCIE_PLL_OD]             = &g12a_pcie_pll_od.hw,
4150                 [CLKID_PCIE_PLL]                = &g12a_pcie_pll.hw,
4151                 [CLKID_VDEC_1_SEL]              = &g12a_vdec_1_sel.hw,
4152                 [CLKID_VDEC_1_DIV]              = &g12a_vdec_1_div.hw,
4153                 [CLKID_VDEC_1]                  = &g12a_vdec_1.hw,
4154                 [CLKID_VDEC_HEVC_SEL]           = &g12a_vdec_hevc_sel.hw,
4155                 [CLKID_VDEC_HEVC_DIV]           = &g12a_vdec_hevc_div.hw,
4156                 [CLKID_VDEC_HEVC]               = &g12a_vdec_hevc.hw,
4157                 [CLKID_VDEC_HEVCF_SEL]          = &g12a_vdec_hevcf_sel.hw,
4158                 [CLKID_VDEC_HEVCF_DIV]          = &g12a_vdec_hevcf_div.hw,
4159                 [CLKID_VDEC_HEVCF]              = &g12a_vdec_hevcf.hw,
4160                 [CLKID_TS_DIV]                  = &g12a_ts_div.hw,
4161                 [CLKID_TS]                      = &g12a_ts.hw,
4162                 [NR_CLKS]                       = NULL,
4163         },
4164         .num = NR_CLKS,
4165 };
4166 
4167 static struct clk_hw_onecell_data g12b_hw_onecell_data = {
4168         .hws = {
4169                 [CLKID_SYS_PLL]                 = &g12a_sys_pll.hw,
4170                 [CLKID_FIXED_PLL]               = &g12a_fixed_pll.hw,
4171                 [CLKID_FCLK_DIV2]               = &g12a_fclk_div2.hw,
4172                 [CLKID_FCLK_DIV3]               = &g12a_fclk_div3.hw,
4173                 [CLKID_FCLK_DIV4]               = &g12a_fclk_div4.hw,
4174                 [CLKID_FCLK_DIV5]               = &g12a_fclk_div5.hw,
4175                 [CLKID_FCLK_DIV7]               = &g12a_fclk_div7.hw,
4176                 [CLKID_FCLK_DIV2P5]             = &g12a_fclk_div2p5.hw,
4177                 [CLKID_GP0_PLL]                 = &g12a_gp0_pll.hw,
4178                 [CLKID_MPEG_SEL]                = &g12a_mpeg_clk_sel.hw,
4179                 [CLKID_MPEG_DIV]                = &g12a_mpeg_clk_div.hw,
4180                 [CLKID_CLK81]                   = &g12a_clk81.hw,
4181                 [CLKID_MPLL0]                   = &g12a_mpll0.hw,
4182                 [CLKID_MPLL1]                   = &g12a_mpll1.hw,
4183                 [CLKID_MPLL2]                   = &g12a_mpll2.hw,
4184                 [CLKID_MPLL3]                   = &g12a_mpll3.hw,
4185                 [CLKID_DDR]                     = &g12a_ddr.hw,
4186                 [CLKID_DOS]                     = &g12a_dos.hw,
4187                 [CLKID_AUDIO_LOCKER]            = &g12a_audio_locker.hw,
4188                 [CLKID_MIPI_DSI_HOST]           = &g12a_mipi_dsi_host.hw,
4189                 [CLKID_ETH_PHY]                 = &g12a_eth_phy.hw,
4190                 [CLKID_ISA]                     = &g12a_isa.hw,
4191                 [CLKID_PL301]                   = &g12a_pl301.hw,
4192                 [CLKID_PERIPHS]                 = &g12a_periphs.hw,
4193                 [CLKID_SPICC0]                  = &g12a_spicc_0.hw,
4194                 [CLKID_I2C]                     = &g12a_i2c.hw,
4195                 [CLKID_SANA]                    = &g12a_sana.hw,
4196                 [CLKID_SD]                      = &g12a_sd.hw,
4197                 [CLKID_RNG0]                    = &g12a_rng0.hw,
4198                 [CLKID_UART0]                   = &g12a_uart0.hw,
4199                 [CLKID_SPICC1]                  = &g12a_spicc_1.hw,
4200                 [CLKID_HIU_IFACE]               = &g12a_hiu_reg.hw,
4201                 [CLKID_MIPI_DSI_PHY]            = &g12a_mipi_dsi_phy.hw,
4202                 [CLKID_ASSIST_MISC]             = &g12a_assist_misc.hw,
4203                 [CLKID_SD_EMMC_A]               = &g12a_emmc_a.hw,
4204                 [CLKID_SD_EMMC_B]               = &g12a_emmc_b.hw,
4205                 [CLKID_SD_EMMC_C]               = &g12a_emmc_c.hw,
4206                 [CLKID_AUDIO_CODEC]             = &g12a_audio_codec.hw,
4207                 [CLKID_AUDIO]                   = &g12a_audio.hw,
4208                 [CLKID_ETH]                     = &g12a_eth_core.hw,
4209                 [CLKID_DEMUX]                   = &g12a_demux.hw,
4210                 [CLKID_AUDIO_IFIFO]             = &g12a_audio_ififo.hw,
4211                 [CLKID_ADC]                     = &g12a_adc.hw,
4212                 [CLKID_UART1]                   = &g12a_uart1.hw,
4213                 [CLKID_G2D]                     = &g12a_g2d.hw,
4214                 [CLKID_RESET]                   = &g12a_reset.hw,
4215                 [CLKID_PCIE_COMB]               = &g12a_pcie_comb.hw,
4216                 [CLKID_PARSER]                  = &g12a_parser.hw,
4217                 [CLKID_USB]                     = &g12a_usb_general.hw,
4218                 [CLKID_PCIE_PHY]                = &g12a_pcie_phy.hw,
4219                 [CLKID_AHB_ARB0]                = &g12a_ahb_arb0.hw,
4220                 [CLKID_AHB_DATA_BUS]            = &g12a_ahb_data_bus.hw,
4221                 [CLKID_AHB_CTRL_BUS]            = &g12a_ahb_ctrl_bus.hw,
4222                 [CLKID_HTX_HDCP22]              = &g12a_htx_hdcp22.hw,
4223                 [CLKID_HTX_PCLK]                = &g12a_htx_pclk.hw,
4224                 [CLKID_BT656]                   = &g12a_bt656.hw,
4225                 [CLKID_USB1_DDR_BRIDGE]         = &g12a_usb1_to_ddr.hw,
4226                 [CLKID_MMC_PCLK]                = &g12a_mmc_pclk.hw,
4227                 [CLKID_UART2]                   = &g12a_uart2.hw,
4228                 [CLKID_VPU_INTR]                = &g12a_vpu_intr.hw,
4229                 [CLKID_GIC]                     = &g12a_gic.hw,
4230                 [CLKID_SD_EMMC_A_CLK0_SEL]      = &g12a_sd_emmc_a_clk0_sel.hw,
4231                 [CLKID_SD_EMMC_A_CLK0_DIV]      = &g12a_sd_emmc_a_clk0_div.hw,
4232                 [CLKID_SD_EMMC_A_CLK0]          = &g12a_sd_emmc_a_clk0.hw,
4233                 [CLKID_SD_EMMC_B_CLK0_SEL]      = &g12a_sd_emmc_b_clk0_sel.hw,
4234                 [CLKID_SD_EMMC_B_CLK0_DIV]      = &g12a_sd_emmc_b_clk0_div.hw,
4235                 [CLKID_SD_EMMC_B_CLK0]          = &g12a_sd_emmc_b_clk0.hw,
4236                 [CLKID_SD_EMMC_C_CLK0_SEL]      = &g12a_sd_emmc_c_clk0_sel.hw,
4237                 [CLKID_SD_EMMC_C_CLK0_DIV]      = &g12a_sd_emmc_c_clk0_div.hw,
4238                 [CLKID_SD_EMMC_C_CLK0]          = &g12a_sd_emmc_c_clk0.hw,
4239                 [CLKID_MPLL0_DIV]               = &g12a_mpll0_div.hw,
4240                 [CLKID_MPLL1_DIV]               = &g12a_mpll1_div.hw,
4241                 [CLKID_MPLL2_DIV]               = &g12a_mpll2_div.hw,
4242                 [CLKID_MPLL3_DIV]               = &g12a_mpll3_div.hw,
4243                 [CLKID_FCLK_DIV2_DIV]           = &g12a_fclk_div2_div.hw,
4244                 [CLKID_FCLK_DIV3_DIV]           = &g12a_fclk_div3_div.hw,
4245                 [CLKID_FCLK_DIV4_DIV]           = &g12a_fclk_div4_div.hw,
4246                 [CLKID_FCLK_DIV5_DIV]           = &g12a_fclk_div5_div.hw,
4247                 [CLKID_FCLK_DIV7_DIV]           = &g12a_fclk_div7_div.hw,
4248                 [CLKID_FCLK_DIV2P5_DIV]         = &g12a_fclk_div2p5_div.hw,
4249                 [CLKID_HIFI_PLL]                = &g12a_hifi_pll.hw,
4250                 [CLKID_VCLK2_VENCI0]            = &g12a_vclk2_venci0.hw,
4251                 [CLKID_VCLK2_VENCI1]            = &g12a_vclk2_venci1.hw,
4252                 [CLKID_VCLK2_VENCP0]            = &g12a_vclk2_vencp0.hw,
4253                 [CLKID_VCLK2_VENCP1]            = &g12a_vclk2_vencp1.hw,
4254                 [CLKID_VCLK2_VENCT0]            = &g12a_vclk2_venct0.hw,
4255                 [CLKID_VCLK2_VENCT1]            = &g12a_vclk2_venct1.hw,
4256                 [CLKID_VCLK2_OTHER]             = &g12a_vclk2_other.hw,
4257                 [CLKID_VCLK2_ENCI]              = &g12a_vclk2_enci.hw,
4258                 [CLKID_VCLK2_ENCP]              = &g12a_vclk2_encp.hw,
4259                 [CLKID_DAC_CLK]                 = &g12a_dac_clk.hw,
4260                 [CLKID_AOCLK]                   = &g12a_aoclk_gate.hw,
4261                 [CLKID_IEC958]                  = &g12a_iec958_gate.hw,
4262                 [CLKID_ENC480P]                 = &g12a_enc480p.hw,
4263                 [CLKID_RNG1]                    = &g12a_rng1.hw,
4264                 [CLKID_VCLK2_ENCT]              = &g12a_vclk2_enct.hw,
4265                 [CLKID_VCLK2_ENCL]              = &g12a_vclk2_encl.hw,
4266                 [CLKID_VCLK2_VENCLMMC]          = &g12a_vclk2_venclmmc.hw,
4267                 [CLKID_VCLK2_VENCL]             = &g12a_vclk2_vencl.hw,
4268                 [CLKID_VCLK2_OTHER1]            = &g12a_vclk2_other1.hw,
4269                 [CLKID_FIXED_PLL_DCO]           = &g12a_fixed_pll_dco.hw,
4270                 [CLKID_SYS_PLL_DCO]             = &g12a_sys_pll_dco.hw,
4271                 [CLKID_GP0_PLL_DCO]             = &g12a_gp0_pll_dco.hw,
4272                 [CLKID_HIFI_PLL_DCO]            = &g12a_hifi_pll_dco.hw,
4273                 [CLKID_DMA]                     = &g12a_dma.hw,
4274                 [CLKID_EFUSE]                   = &g12a_efuse.hw,
4275                 [CLKID_ROM_BOOT]                = &g12a_rom_boot.hw,
4276                 [CLKID_RESET_SEC]               = &g12a_reset_sec.hw,
4277                 [CLKID_SEC_AHB_APB3]            = &g12a_sec_ahb_apb3.hw,
4278                 [CLKID_MPLL_PREDIV]             = &g12a_mpll_prediv.hw,
4279                 [CLKID_VPU_0_SEL]               = &g12a_vpu_0_sel.hw,
4280                 [CLKID_VPU_0_DIV]               = &g12a_vpu_0_div.hw,
4281                 [CLKID_VPU_0]                   = &g12a_vpu_0.hw,
4282                 [CLKID_VPU_1_SEL]               = &g12a_vpu_1_sel.hw,
4283                 [CLKID_VPU_1_DIV]               = &g12a_vpu_1_div.hw,
4284                 [CLKID_VPU_1]                   = &g12a_vpu_1.hw,
4285                 [CLKID_VPU]                     = &g12a_vpu.hw,
4286                 [CLKID_VAPB_0_SEL]              = &g12a_vapb_0_sel.hw,
4287                 [CLKID_VAPB_0_DIV]              = &g12a_vapb_0_div.hw,
4288                 [CLKID_VAPB_0]                  = &g12a_vapb_0.hw,
4289                 [CLKID_VAPB_1_SEL]              = &g12a_vapb_1_sel.hw,
4290                 [CLKID_VAPB_1_DIV]              = &g12a_vapb_1_div.hw,
4291                 [CLKID_VAPB_1]                  = &g12a_vapb_1.hw,
4292                 [CLKID_VAPB_SEL]                = &g12a_vapb_sel.hw,
4293                 [CLKID_VAPB]                    = &g12a_vapb.hw,
4294                 [CLKID_HDMI_PLL_DCO]            = &g12a_hdmi_pll_dco.hw,
4295                 [CLKID_HDMI_PLL_OD]             = &g12a_hdmi_pll_od.hw,
4296                 [CLKID_HDMI_PLL_OD2]            = &g12a_hdmi_pll_od2.hw,
4297                 [CLKID_HDMI_PLL]                = &g12a_hdmi_pll.hw,
4298                 [CLKID_VID_PLL]                 = &g12a_vid_pll_div.hw,
4299                 [CLKID_VID_PLL_SEL]             = &g12a_vid_pll_sel.hw,
4300                 [CLKID_VID_PLL_DIV]             = &g12a_vid_pll.hw,
4301                 [CLKID_VCLK_SEL]                = &g12a_vclk_sel.hw,
4302                 [CLKID_VCLK2_SEL]               = &g12a_vclk2_sel.hw,
4303                 [CLKID_VCLK_INPUT]              = &g12a_vclk_input.hw,
4304                 [CLKID_VCLK2_INPUT]             = &g12a_vclk2_input.hw,
4305                 [CLKID_VCLK_DIV]                = &g12a_vclk_div.hw,
4306                 [CLKID_VCLK2_DIV]               = &g12a_vclk2_div.hw,
4307                 [CLKID_VCLK]                    = &g12a_vclk.hw,
4308                 [CLKID_VCLK2]                   = &g12a_vclk2.hw,
4309                 [CLKID_VCLK_DIV1]               = &g12a_vclk_div1.hw,
4310                 [CLKID_VCLK_DIV2_EN]            = &g12a_vclk_div2_en.hw,
4311                 [CLKID_VCLK_DIV4_EN]            = &g12a_vclk_div4_en.hw,
4312                 [CLKID_VCLK_DIV6_EN]            = &g12a_vclk_div6_en.hw,
4313                 [CLKID_VCLK_DIV12_EN]           = &g12a_vclk_div12_en.hw,
4314                 [CLKID_VCLK2_DIV1]              = &g12a_vclk2_div1.hw,
4315                 [CLKID_VCLK2_DIV2_EN]           = &g12a_vclk2_div2_en.hw,
4316                 [CLKID_VCLK2_DIV4_EN]           = &g12a_vclk2_div4_en.hw,
4317                 [CLKID_VCLK2_DIV6_EN]           = &g12a_vclk2_div6_en.hw,
4318                 [CLKID_VCLK2_DIV12_EN]          = &g12a_vclk2_div12_en.hw,
4319                 [CLKID_VCLK_DIV2]               = &g12a_vclk_div2.hw,
4320                 [CLKID_VCLK_DIV4]               = &g12a_vclk_div4.hw,
4321                 [CLKID_VCLK_DIV6]               = &g12a_vclk_div6.hw,
4322                 [CLKID_VCLK_DIV12]              = &g12a_vclk_div12.hw,
4323                 [CLKID_VCLK2_DIV2]              = &g12a_vclk2_div2.hw,
4324                 [CLKID_VCLK2_DIV4]              = &g12a_vclk2_div4.hw,
4325                 [CLKID_VCLK2_DIV6]              = &g12a_vclk2_div6.hw,
4326                 [CLKID_VCLK2_DIV12]             = &g12a_vclk2_div12.hw,
4327                 [CLKID_CTS_ENCI_SEL]            = &g12a_cts_enci_sel.hw,
4328                 [CLKID_CTS_ENCP_SEL]            = &g12a_cts_encp_sel.hw,
4329                 [CLKID_CTS_VDAC_SEL]            = &g12a_cts_vdac_sel.hw,
4330                 [CLKID_HDMI_TX_SEL]             = &g12a_hdmi_tx_sel.hw,
4331                 [CLKID_CTS_ENCI]                = &g12a_cts_enci.hw,
4332                 [CLKID_CTS_ENCP]                = &g12a_cts_encp.hw,
4333                 [CLKID_CTS_VDAC]                = &g12a_cts_vdac.hw,
4334                 [CLKID_HDMI_TX]                 = &g12a_hdmi_tx.hw,
4335                 [CLKID_HDMI_SEL]                = &g12a_hdmi_sel.hw,
4336                 [CLKID_HDMI_DIV]                = &g12a_hdmi_div.hw,
4337                 [CLKID_HDMI]                    = &g12a_hdmi.hw,
4338                 [CLKID_MALI_0_SEL]              = &g12a_mali_0_sel.hw,
4339                 [CLKID_MALI_0_DIV]              = &g12a_mali_0_div.hw,
4340                 [CLKID_MALI_0]                  = &g12a_mali_0.hw,
4341                 [CLKID_MALI_1_SEL]              = &g12a_mali_1_sel.hw,
4342                 [CLKID_MALI_1_DIV]              = &g12a_mali_1_div.hw,
4343                 [CLKID_MALI_1]                  = &g12a_mali_1.hw,
4344                 [CLKID_MALI]                    = &g12a_mali.hw,
4345                 [CLKID_MPLL_50M_DIV]            = &g12a_mpll_50m_div.hw,
4346                 [CLKID_MPLL_50M]                = &g12a_mpll_50m.hw,
4347                 [CLKID_SYS_PLL_DIV16_EN]        = &g12a_sys_pll_div16_en.hw,
4348                 [CLKID_SYS_PLL_DIV16]           = &g12a_sys_pll_div16.hw,
4349                 [CLKID_CPU_CLK_DYN0_SEL]        = &g12a_cpu_clk_premux0.hw,
4350                 [CLKID_CPU_CLK_DYN0_DIV]        = &g12a_cpu_clk_mux0_div.hw,
4351                 [CLKID_CPU_CLK_DYN0]            = &g12a_cpu_clk_postmux0.hw,
4352                 [CLKID_CPU_CLK_DYN1_SEL]        = &g12a_cpu_clk_premux1.hw,
4353                 [CLKID_CPU_CLK_DYN1_DIV]        = &g12a_cpu_clk_mux1_div.hw,
4354                 [CLKID_CPU_CLK_DYN1]            = &g12a_cpu_clk_postmux1.hw,
4355                 [CLKID_CPU_CLK_DYN]             = &g12a_cpu_clk_dyn.hw,
4356                 [CLKID_CPU_CLK]                 = &g12b_cpu_clk.hw,
4357                 [CLKID_CPU_CLK_DIV16_EN]        = &g12a_cpu_clk_div16_en.hw,
4358                 [CLKID_CPU_CLK_DIV16]           = &g12a_cpu_clk_div16.hw,
4359                 [CLKID_CPU_CLK_APB_DIV]         = &g12a_cpu_clk_apb_div.hw,
4360                 [CLKID_CPU_CLK_APB]             = &g12a_cpu_clk_apb.hw,
4361                 [CLKID_CPU_CLK_ATB_DIV]         = &g12a_cpu_clk_atb_div.hw,
4362                 [CLKID_CPU_CLK_ATB]             = &g12a_cpu_clk_atb.hw,
4363                 [CLKID_CPU_CLK_AXI_DIV]         = &g12a_cpu_clk_axi_div.hw,
4364                 [CLKID_CPU_CLK_AXI]             = &g12a_cpu_clk_axi.hw,
4365                 [CLKID_CPU_CLK_TRACE_DIV]       = &g12a_cpu_clk_trace_div.hw,
4366                 [CLKID_CPU_CLK_TRACE]           = &g12a_cpu_clk_trace.hw,
4367                 [CLKID_PCIE_PLL_DCO]            = &g12a_pcie_pll_dco.hw,
4368                 [CLKID_PCIE_PLL_DCO_DIV2]       = &g12a_pcie_pll_dco_div2.hw,
4369                 [CLKID_PCIE_PLL_OD]             = &g12a_pcie_pll_od.hw,
4370                 [CLKID_PCIE_PLL]                = &g12a_pcie_pll.hw,
4371                 [CLKID_VDEC_1_SEL]              = &g12a_vdec_1_sel.hw,
4372                 [CLKID_VDEC_1_DIV]              = &g12a_vdec_1_div.hw,
4373                 [CLKID_VDEC_1]                  = &g12a_vdec_1.hw,
4374                 [CLKID_VDEC_HEVC_SEL]           = &g12a_vdec_hevc_sel.hw,
4375                 [CLKID_VDEC_HEVC_DIV]           = &g12a_vdec_hevc_div.hw,
4376                 [CLKID_VDEC_HEVC]               = &g12a_vdec_hevc.hw,
4377                 [CLKID_VDEC_HEVCF_SEL]          = &g12a_vdec_hevcf_sel.hw,
4378                 [CLKID_VDEC_HEVCF_DIV]          = &g12a_vdec_hevcf_div.hw,
4379                 [CLKID_VDEC_HEVCF]              = &g12a_vdec_hevcf.hw,
4380                 [CLKID_TS_DIV]                  = &g12a_ts_div.hw,
4381                 [CLKID_TS]                      = &g12a_ts.hw,
4382                 [CLKID_SYS1_PLL_DCO]            = &g12b_sys1_pll_dco.hw,
4383                 [CLKID_SYS1_PLL]                = &g12b_sys1_pll.hw,
4384                 [CLKID_SYS1_PLL_DIV16_EN]       = &g12b_sys1_pll_div16_en.hw,
4385                 [CLKID_SYS1_PLL_DIV16]          = &g12b_sys1_pll_div16.hw,
4386                 [CLKID_CPUB_CLK_DYN0_SEL]       = &g12b_cpub_clk_premux0.hw,
4387                 [CLKID_CPUB_CLK_DYN0_DIV]       = &g12b_cpub_clk_mux0_div.hw,
4388                 [CLKID_CPUB_CLK_DYN0]           = &g12b_cpub_clk_postmux0.hw,
4389                 [CLKID_CPUB_CLK_DYN1_SEL]       = &g12b_cpub_clk_premux1.hw,
4390                 [CLKID_CPUB_CLK_DYN1_DIV]       = &g12b_cpub_clk_mux1_div.hw,
4391                 [CLKID_CPUB_CLK_DYN1]           = &g12b_cpub_clk_postmux1.hw,
4392                 [CLKID_CPUB_CLK_DYN]            = &g12b_cpub_clk_dyn.hw,
4393                 [CLKID_CPUB_CLK]                = &g12b_cpub_clk.hw,
4394                 [CLKID_CPUB_CLK_DIV16_EN]       = &g12b_cpub_clk_div16_en.hw,
4395                 [CLKID_CPUB_CLK_DIV16]          = &g12b_cpub_clk_div16.hw,
4396                 [CLKID_CPUB_CLK_DIV2]           = &g12b_cpub_clk_div2.hw,
4397                 [CLKID_CPUB_CLK_DIV3]           = &g12b_cpub_clk_div3.hw,
4398                 [CLKID_CPUB_CLK_DIV4]           = &g12b_cpub_clk_div4.hw,
4399                 [CLKID_CPUB_CLK_DIV5]           = &g12b_cpub_clk_div5.hw,
4400                 [CLKID_CPUB_CLK_DIV6]           = &g12b_cpub_clk_div6.hw,
4401                 [CLKID_CPUB_CLK_DIV7]           = &g12b_cpub_clk_div7.hw,
4402                 [CLKID_CPUB_CLK_DIV8]           = &g12b_cpub_clk_div8.hw,
4403                 [CLKID_CPUB_CLK_APB_SEL]        = &g12b_cpub_clk_apb_sel.hw,
4404                 [CLKID_CPUB_CLK_APB]            = &g12b_cpub_clk_apb.hw,
4405                 [CLKID_CPUB_CLK_ATB_SEL]        = &g12b_cpub_clk_atb_sel.hw,
4406                 [CLKID_CPUB_CLK_ATB]            = &g12b_cpub_clk_atb.hw,
4407                 [CLKID_CPUB_CLK_AXI_SEL]        = &g12b_cpub_clk_axi_sel.hw,
4408                 [CLKID_CPUB_CLK_AXI]            = &g12b_cpub_clk_axi.hw,
4409                 [CLKID_CPUB_CLK_TRACE_SEL]      = &g12b_cpub_clk_trace_sel.hw,
4410                 [CLKID_CPUB_CLK_TRACE]          = &g12b_cpub_clk_trace.hw,
4411                 [NR_CLKS]                       = NULL,
4412         },
4413         .num = NR_CLKS,
4414 };
4415 
4416 static struct clk_hw_onecell_data sm1_hw_onecell_data = {
4417         .hws = {
4418                 [CLKID_SYS_PLL]                 = &g12a_sys_pll.hw,
4419                 [CLKID_FIXED_PLL]               = &g12a_fixed_pll.hw,
4420                 [CLKID_FCLK_DIV2]               = &g12a_fclk_div2.hw,
4421                 [CLKID_FCLK_DIV3]               = &g12a_fclk_div3.hw,
4422                 [CLKID_FCLK_DIV4]               = &g12a_fclk_div4.hw,
4423                 [CLKID_FCLK_DIV5]               = &g12a_fclk_div5.hw,
4424                 [CLKID_FCLK_DIV7]               = &g12a_fclk_div7.hw,
4425                 [CLKID_FCLK_DIV2P5]             = &g12a_fclk_div2p5.hw,
4426                 [CLKID_GP0_PLL]                 = &g12a_gp0_pll.hw,
4427                 [CLKID_MPEG_SEL]                = &g12a_mpeg_clk_sel.hw,
4428                 [CLKID_MPEG_DIV]                = &g12a_mpeg_clk_div.hw,
4429                 [CLKID_CLK81]                   = &g12a_clk81.hw,
4430                 [CLKID_MPLL0]                   = &g12a_mpll0.hw,
4431                 [CLKID_MPLL1]                   = &g12a_mpll1.hw,
4432                 [CLKID_MPLL2]                   = &g12a_mpll2.hw,
4433                 [CLKID_MPLL3]                   = &g12a_mpll3.hw,
4434                 [CLKID_DDR]                     = &g12a_ddr.hw,
4435                 [CLKID_DOS]                     = &g12a_dos.hw,
4436                 [CLKID_AUDIO_LOCKER]            = &g12a_audio_locker.hw,
4437                 [CLKID_MIPI_DSI_HOST]           = &g12a_mipi_dsi_host.hw,
4438                 [CLKID_ETH_PHY]                 = &g12a_eth_phy.hw,
4439                 [CLKID_ISA]                     = &g12a_isa.hw,
4440                 [CLKID_PL301]                   = &g12a_pl301.hw,
4441                 [CLKID_PERIPHS]                 = &g12a_periphs.hw,
4442                 [CLKID_SPICC0]                  = &g12a_spicc_0.hw,
4443                 [CLKID_I2C]                     = &g12a_i2c.hw,
4444                 [CLKID_SANA]                    = &g12a_sana.hw,
4445                 [CLKID_SD]                      = &g12a_sd.hw,
4446                 [CLKID_RNG0]                    = &g12a_rng0.hw,
4447                 [CLKID_UART0]                   = &g12a_uart0.hw,
4448                 [CLKID_SPICC1]                  = &g12a_spicc_1.hw,
4449                 [CLKID_HIU_IFACE]               = &g12a_hiu_reg.hw,
4450                 [CLKID_MIPI_DSI_PHY]            = &g12a_mipi_dsi_phy.hw,
4451                 [CLKID_ASSIST_MISC]             = &g12a_assist_misc.hw,
4452                 [CLKID_SD_EMMC_A]               = &g12a_emmc_a.hw,
4453                 [CLKID_SD_EMMC_B]               = &g12a_emmc_b.hw,
4454                 [CLKID_SD_EMMC_C]               = &g12a_emmc_c.hw,
4455                 [CLKID_AUDIO_CODEC]             = &g12a_audio_codec.hw,
4456                 [CLKID_AUDIO]                   = &g12a_audio.hw,
4457                 [CLKID_ETH]                     = &g12a_eth_core.hw,
4458                 [CLKID_DEMUX]                   = &g12a_demux.hw,
4459                 [CLKID_AUDIO_IFIFO]             = &g12a_audio_ififo.hw,
4460                 [CLKID_ADC]                     = &g12a_adc.hw,
4461                 [CLKID_UART1]                   = &g12a_uart1.hw,
4462                 [CLKID_G2D]                     = &g12a_g2d.hw,
4463                 [CLKID_RESET]                   = &g12a_reset.hw,
4464                 [CLKID_PCIE_COMB]               = &g12a_pcie_comb.hw,
4465                 [CLKID_PARSER]                  = &g12a_parser.hw,
4466                 [CLKID_USB]                     = &g12a_usb_general.hw,
4467                 [CLKID_PCIE_PHY]                = &g12a_pcie_phy.hw,
4468                 [CLKID_AHB_ARB0]                = &g12a_ahb_arb0.hw,
4469                 [CLKID_AHB_DATA_BUS]            = &g12a_ahb_data_bus.hw,
4470                 [CLKID_AHB_CTRL_BUS]            = &g12a_ahb_ctrl_bus.hw,
4471                 [CLKID_HTX_HDCP22]              = &g12a_htx_hdcp22.hw,
4472                 [CLKID_HTX_PCLK]                = &g12a_htx_pclk.hw,
4473                 [CLKID_BT656]                   = &g12a_bt656.hw,
4474                 [CLKID_USB1_DDR_BRIDGE]         = &g12a_usb1_to_ddr.hw,
4475                 [CLKID_MMC_PCLK]                = &g12a_mmc_pclk.hw,
4476                 [CLKID_UART2]                   = &g12a_uart2.hw,
4477                 [CLKID_VPU_INTR]                = &g12a_vpu_intr.hw,
4478                 [CLKID_GIC]                     = &g12a_gic.hw,
4479                 [CLKID_SD_EMMC_A_CLK0_SEL]      = &g12a_sd_emmc_a_clk0_sel.hw,
4480                 [CLKID_SD_EMMC_A_CLK0_DIV]      = &g12a_sd_emmc_a_clk0_div.hw,
4481                 [CLKID_SD_EMMC_A_CLK0]          = &g12a_sd_emmc_a_clk0.hw,
4482                 [CLKID_SD_EMMC_B_CLK0_SEL]      = &g12a_sd_emmc_b_clk0_sel.hw,
4483                 [CLKID_SD_EMMC_B_CLK0_DIV]      = &g12a_sd_emmc_b_clk0_div.hw,
4484                 [CLKID_SD_EMMC_B_CLK0]          = &g12a_sd_emmc_b_clk0.hw,
4485                 [CLKID_SD_EMMC_C_CLK0_SEL]      = &g12a_sd_emmc_c_clk0_sel.hw,
4486                 [CLKID_SD_EMMC_C_CLK0_DIV]      = &g12a_sd_emmc_c_clk0_div.hw,
4487                 [CLKID_SD_EMMC_C_CLK0]          = &g12a_sd_emmc_c_clk0.hw,
4488                 [CLKID_MPLL0_DIV]               = &g12a_mpll0_div.hw,
4489                 [CLKID_MPLL1_DIV]               = &g12a_mpll1_div.hw,
4490                 [CLKID_MPLL2_DIV]               = &g12a_mpll2_div.hw,
4491                 [CLKID_MPLL3_DIV]               = &g12a_mpll3_div.hw,
4492                 [CLKID_FCLK_DIV2_DIV]           = &g12a_fclk_div2_div.hw,
4493                 [CLKID_FCLK_DIV3_DIV]           = &g12a_fclk_div3_div.hw,
4494                 [CLKID_FCLK_DIV4_DIV]           = &g12a_fclk_div4_div.hw,
4495                 [CLKID_FCLK_DIV5_DIV]           = &g12a_fclk_div5_div.hw,
4496                 [CLKID_FCLK_DIV7_DIV]           = &g12a_fclk_div7_div.hw,
4497                 [CLKID_FCLK_DIV2P5_DIV]         = &g12a_fclk_div2p5_div.hw,
4498                 [CLKID_HIFI_PLL]                = &g12a_hifi_pll.hw,
4499                 [CLKID_VCLK2_VENCI0]            = &g12a_vclk2_venci0.hw,
4500                 [CLKID_VCLK2_VENCI1]            = &g12a_vclk2_venci1.hw,
4501                 [CLKID_VCLK2_VENCP0]            = &g12a_vclk2_vencp0.hw,
4502                 [CLKID_VCLK2_VENCP1]            = &g12a_vclk2_vencp1.hw,
4503                 [CLKID_VCLK2_VENCT0]            = &g12a_vclk2_venct0.hw,
4504                 [CLKID_VCLK2_VENCT1]            = &g12a_vclk2_venct1.hw,
4505                 [CLKID_VCLK2_OTHER]             = &g12a_vclk2_other.hw,
4506                 [CLKID_VCLK2_ENCI]              = &g12a_vclk2_enci.hw,
4507                 [CLKID_VCLK2_ENCP]              = &g12a_vclk2_encp.hw,
4508                 [CLKID_DAC_CLK]                 = &g12a_dac_clk.hw,
4509                 [CLKID_AOCLK]                   = &g12a_aoclk_gate.hw,
4510                 [CLKID_IEC958]                  = &g12a_iec958_gate.hw,
4511                 [CLKID_ENC480P]                 = &g12a_enc480p.hw,
4512                 [CLKID_RNG1]                    = &g12a_rng1.hw,
4513                 [CLKID_VCLK2_ENCT]              = &g12a_vclk2_enct.hw,
4514                 [CLKID_VCLK2_ENCL]              = &g12a_vclk2_encl.hw,
4515                 [CLKID_VCLK2_VENCLMMC]          = &g12a_vclk2_venclmmc.hw,
4516                 [CLKID_VCLK2_VENCL]             = &g12a_vclk2_vencl.hw,
4517                 [CLKID_VCLK2_OTHER1]            = &g12a_vclk2_other1.hw,
4518                 [CLKID_FIXED_PLL_DCO]           = &g12a_fixed_pll_dco.hw,
4519                 [CLKID_SYS_PLL_DCO]             = &g12a_sys_pll_dco.hw,
4520                 [CLKID_GP0_PLL_DCO]             = &g12a_gp0_pll_dco.hw,
4521                 [CLKID_HIFI_PLL_DCO]            = &g12a_hifi_pll_dco.hw,
4522                 [CLKID_DMA]                     = &g12a_dma.hw,
4523                 [CLKID_EFUSE]                   = &g12a_efuse.hw,
4524                 [CLKID_ROM_BOOT]                = &g12a_rom_boot.hw,
4525                 [CLKID_RESET_SEC]               = &g12a_reset_sec.hw,
4526                 [CLKID_SEC_AHB_APB3]            = &g12a_sec_ahb_apb3.hw,
4527                 [CLKID_MPLL_PREDIV]             = &g12a_mpll_prediv.hw,
4528                 [CLKID_VPU_0_SEL]               = &g12a_vpu_0_sel.hw,
4529                 [CLKID_VPU_0_DIV]               = &g12a_vpu_0_div.hw,
4530                 [CLKID_VPU_0]                   = &g12a_vpu_0.hw,
4531                 [CLKID_VPU_1_SEL]               = &g12a_vpu_1_sel.hw,
4532                 [CLKID_VPU_1_DIV]               = &g12a_vpu_1_div.hw,
4533                 [CLKID_VPU_1]                   = &g12a_vpu_1.hw,
4534                 [CLKID_VPU]                     = &g12a_vpu.hw,
4535                 [CLKID_VAPB_0_SEL]              = &g12a_vapb_0_sel.hw,
4536                 [CLKID_VAPB_0_DIV]              = &g12a_vapb_0_div.hw,
4537                 [CLKID_VAPB_0]                  = &g12a_vapb_0.hw,
4538                 [CLKID_VAPB_1_SEL]              = &g12a_vapb_1_sel.hw,
4539                 [CLKID_VAPB_1_DIV]              = &g12a_vapb_1_div.hw,
4540                 [CLKID_VAPB_1]                  = &g12a_vapb_1.hw,
4541                 [CLKID_VAPB_SEL]                = &g12a_vapb_sel.hw,
4542                 [CLKID_VAPB]                    = &g12a_vapb.hw,
4543                 [CLKID_HDMI_PLL_DCO]            = &g12a_hdmi_pll_dco.hw,
4544                 [CLKID_HDMI_PLL_OD]             = &g12a_hdmi_pll_od.hw,
4545                 [CLKID_HDMI_PLL_OD2]            = &g12a_hdmi_pll_od2.hw,
4546                 [CLKID_HDMI_PLL]                = &g12a_hdmi_pll.hw,
4547                 [CLKID_VID_PLL]                 = &g12a_vid_pll_div.hw,
4548                 [CLKID_VID_PLL_SEL]             = &g12a_vid_pll_sel.hw,
4549                 [CLKID_VID_PLL_DIV]             = &g12a_vid_pll.hw,
4550                 [CLKID_VCLK_SEL]                = &g12a_vclk_sel.hw,
4551                 [CLKID_VCLK2_SEL]               = &g12a_vclk2_sel.hw,
4552                 [CLKID_VCLK_INPUT]              = &g12a_vclk_input.hw,
4553                 [CLKID_VCLK2_INPUT]             = &g12a_vclk2_input.hw,
4554                 [CLKID_VCLK_DIV]                = &g12a_vclk_div.hw,
4555                 [CLKID_VCLK2_DIV]               = &g12a_vclk2_div.hw,
4556                 [CLKID_VCLK]                    = &g12a_vclk.hw,
4557                 [CLKID_VCLK2]                   = &g12a_vclk2.hw,
4558                 [CLKID_VCLK_DIV1]               = &g12a_vclk_div1.hw,
4559                 [CLKID_VCLK_DIV2_EN]            = &g12a_vclk_div2_en.hw,
4560                 [CLKID_VCLK_DIV4_EN]            = &g12a_vclk_div4_en.hw,
4561                 [CLKID_VCLK_DIV6_EN]            = &g12a_vclk_div6_en.hw,
4562                 [CLKID_VCLK_DIV12_EN]           = &g12a_vclk_div12_en.hw,
4563                 [CLKID_VCLK2_DIV1]              = &g12a_vclk2_div1.hw,
4564                 [CLKID_VCLK2_DIV2_EN]           = &g12a_vclk2_div2_en.hw,
4565                 [CLKID_VCLK2_DIV4_EN]           = &g12a_vclk2_div4_en.hw,
4566                 [CLKID_VCLK2_DIV6_EN]           = &g12a_vclk2_div6_en.hw,
4567                 [CLKID_VCLK2_DIV12_EN]          = &g12a_vclk2_div12_en.hw,
4568                 [CLKID_VCLK_DIV2]               = &g12a_vclk_div2.hw,
4569                 [CLKID_VCLK_DIV4]               = &g12a_vclk_div4.hw,
4570                 [CLKID_VCLK_DIV6]               = &g12a_vclk_div6.hw,
4571                 [CLKID_VCLK_DIV12]              = &g12a_vclk_div12.hw,
4572                 [CLKID_VCLK2_DIV2]              = &g12a_vclk2_div2.hw,
4573                 [CLKID_VCLK2_DIV4]              = &g12a_vclk2_div4.hw,
4574                 [CLKID_VCLK2_DIV6]              = &g12a_vclk2_div6.hw,
4575                 [CLKID_VCLK2_DIV12]             = &g12a_vclk2_div12.hw,
4576                 [CLKID_CTS_ENCI_SEL]            = &g12a_cts_enci_sel.hw,
4577                 [CLKID_CTS_ENCP_SEL]            = &g12a_cts_encp_sel.hw,
4578                 [CLKID_CTS_VDAC_SEL]            = &g12a_cts_vdac_sel.hw,
4579                 [CLKID_HDMI_TX_SEL]             = &g12a_hdmi_tx_sel.hw,
4580                 [CLKID_CTS_ENCI]                = &g12a_cts_enci.hw,
4581                 [CLKID_CTS_ENCP]                = &g12a_cts_encp.hw,
4582                 [CLKID_CTS_VDAC]                = &g12a_cts_vdac.hw,
4583                 [CLKID_HDMI_TX]                 = &g12a_hdmi_tx.hw,
4584                 [CLKID_HDMI_SEL]                = &g12a_hdmi_sel.hw,
4585                 [CLKID_HDMI_DIV]                = &g12a_hdmi_div.hw,
4586                 [CLKID_HDMI]                    = &g12a_hdmi.hw,
4587                 [CLKID_MALI_0_SEL]              = &g12a_mali_0_sel.hw,
4588                 [CLKID_MALI_0_DIV]              = &g12a_mali_0_div.hw,
4589                 [CLKID_MALI_0]                  = &g12a_mali_0.hw,
4590                 [CLKID_MALI_1_SEL]              = &g12a_mali_1_sel.hw,
4591                 [CLKID_MALI_1_DIV]              = &g12a_mali_1_div.hw,
4592                 [CLKID_MALI_1]                  = &g12a_mali_1.hw,
4593                 [CLKID_MALI]                    = &g12a_mali.hw,
4594                 [CLKID_MPLL_50M_DIV]            = &g12a_mpll_50m_div.hw,
4595                 [CLKID_MPLL_50M]                = &g12a_mpll_50m.hw,
4596                 [CLKID_SYS_PLL_DIV16_EN]        = &g12a_sys_pll_div16_en.hw,
4597                 [CLKID_SYS_PLL_DIV16]           = &g12a_sys_pll_div16.hw,
4598                 [CLKID_CPU_CLK_DYN0_SEL]        = &g12a_cpu_clk_premux0.hw,
4599                 [CLKID_CPU_CLK_DYN0_DIV]        = &g12a_cpu_clk_mux0_div.hw,
4600                 [CLKID_CPU_CLK_DYN0]            = &g12a_cpu_clk_postmux0.hw,
4601                 [CLKID_CPU_CLK_DYN1_SEL]        = &g12a_cpu_clk_premux1.hw,
4602                 [CLKID_CPU_CLK_DYN1_DIV]        = &g12a_cpu_clk_mux1_div.hw,
4603                 [CLKID_CPU_CLK_DYN1]            = &g12a_cpu_clk_postmux1.hw,
4604                 [CLKID_CPU_CLK_DYN]             = &g12a_cpu_clk_dyn.hw,
4605                 [CLKID_CPU_CLK]                 = &g12a_cpu_clk.hw,
4606                 [CLKID_CPU_CLK_DIV16_EN]        = &g12a_cpu_clk_div16_en.hw,
4607                 [CLKID_CPU_CLK_DIV16]           = &g12a_cpu_clk_div16.hw,
4608                 [CLKID_CPU_CLK_APB_DIV]         = &g12a_cpu_clk_apb_div.hw,
4609                 [CLKID_CPU_CLK_APB]             = &g12a_cpu_clk_apb.hw,
4610                 [CLKID_CPU_CLK_ATB_DIV]         = &g12a_cpu_clk_atb_div.hw,
4611                 [CLKID_CPU_CLK_ATB]             = &g12a_cpu_clk_atb.hw,
4612                 [CLKID_CPU_CLK_AXI_DIV]         = &g12a_cpu_clk_axi_div.hw,
4613                 [CLKID_CPU_CLK_AXI]             = &g12a_cpu_clk_axi.hw,
4614                 [CLKID_CPU_CLK_TRACE_DIV]       = &g12a_cpu_clk_trace_div.hw,
4615                 [CLKID_CPU_CLK_TRACE]           = &g12a_cpu_clk_trace.hw,
4616                 [CLKID_PCIE_PLL_DCO]            = &g12a_pcie_pll_dco.hw,
4617                 [CLKID_PCIE_PLL_DCO_DIV2]       = &g12a_pcie_pll_dco_div2.hw,
4618                 [CLKID_PCIE_PLL_OD]             = &g12a_pcie_pll_od.hw,
4619                 [CLKID_PCIE_PLL]                = &g12a_pcie_pll.hw,
4620                 [CLKID_VDEC_1_SEL]              = &g12a_vdec_1_sel.hw,
4621                 [CLKID_VDEC_1_DIV]              = &g12a_vdec_1_div.hw,
4622                 [CLKID_VDEC_1]                  = &g12a_vdec_1.hw,
4623                 [CLKID_VDEC_HEVC_SEL]           = &g12a_vdec_hevc_sel.hw,
4624                 [CLKID_VDEC_HEVC_DIV]           = &g12a_vdec_hevc_div.hw,
4625                 [CLKID_VDEC_HEVC]               = &g12a_vdec_hevc.hw,
4626                 [CLKID_VDEC_HEVCF_SEL]          = &g12a_vdec_hevcf_sel.hw,
4627                 [CLKID_VDEC_HEVCF_DIV]          = &g12a_vdec_hevcf_div.hw,
4628                 [CLKID_VDEC_HEVCF]              = &g12a_vdec_hevcf.hw,
4629                 [CLKID_TS_DIV]                  = &g12a_ts_div.hw,
4630                 [CLKID_TS]                      = &g12a_ts.hw,
4631                 [CLKID_GP1_PLL_DCO]             = &sm1_gp1_pll_dco.hw,
4632                 [CLKID_GP1_PLL]                 = &sm1_gp1_pll.hw,
4633                 [CLKID_DSU_CLK_DYN0_SEL]        = &sm1_dsu_clk_premux0.hw,
4634                 [CLKID_DSU_CLK_DYN0_DIV]        = &sm1_dsu_clk_premux1.hw,
4635                 [CLKID_DSU_CLK_DYN0]            = &sm1_dsu_clk_mux0_div.hw,
4636                 [CLKID_DSU_CLK_DYN1_SEL]        = &sm1_dsu_clk_postmux0.hw,
4637                 [CLKID_DSU_CLK_DYN1_DIV]        = &sm1_dsu_clk_mux1_div.hw,
4638                 [CLKID_DSU_CLK_DYN1]            = &sm1_dsu_clk_postmux1.hw,
4639                 [CLKID_DSU_CLK_DYN]             = &sm1_dsu_clk_dyn.hw,
4640                 [CLKID_DSU_CLK_FINAL]           = &sm1_dsu_final_clk.hw,
4641                 [CLKID_DSU_CLK]                 = &sm1_dsu_clk.hw,
4642                 [CLKID_CPU1_CLK]                = &sm1_cpu1_clk.hw,
4643                 [CLKID_CPU2_CLK]                = &sm1_cpu2_clk.hw,
4644                 [CLKID_CPU3_CLK]                = &sm1_cpu3_clk.hw,
4645                 [NR_CLKS]                       = NULL,
4646         },
4647         .num = NR_CLKS,
4648 };
4649 
4650 /* Convenience table to populate regmap in .probe */
4651 static struct clk_regmap *const g12a_clk_regmaps[] = {
4652         &g12a_clk81,
4653         &g12a_dos,
4654         &g12a_ddr,
4655         &g12a_audio_locker,
4656         &g12a_mipi_dsi_host,
4657         &g12a_eth_phy,
4658         &g12a_isa,
4659         &g12a_pl301,
4660         &g12a_periphs,
4661         &g12a_spicc_0,
4662         &g12a_i2c,
4663         &g12a_sana,
4664         &g12a_sd,
4665         &g12a_rng0,
4666         &g12a_uart0,
4667         &g12a_spicc_1,
4668         &g12a_hiu_reg,
4669         &g12a_mipi_dsi_phy,
4670         &g12a_assist_misc,
4671         &g12a_emmc_a,
4672         &g12a_emmc_b,
4673         &g12a_emmc_c,
4674         &g12a_audio_codec,
4675         &g12a_audio,
4676         &g12a_eth_core,
4677         &g12a_demux,
4678         &g12a_audio_ififo,
4679         &g12a_adc,
4680         &g12a_uart1,
4681         &g12a_g2d,
4682         &g12a_reset,
4683         &g12a_pcie_comb,
4684         &g12a_parser,
4685         &g12a_usb_general,
4686         &g12a_pcie_phy,
4687         &g12a_ahb_arb0,
4688         &g12a_ahb_data_bus,
4689         &g12a_ahb_ctrl_bus,
4690         &g12a_htx_hdcp22,
4691         &g12a_htx_pclk,
4692         &g12a_bt656,
4693         &g12a_usb1_to_ddr,
4694         &g12a_mmc_pclk,
4695         &g12a_uart2,
4696         &g12a_vpu_intr,
4697         &g12a_gic,
4698         &g12a_sd_emmc_a_clk0,
4699         &g12a_sd_emmc_b_clk0,
4700         &g12a_sd_emmc_c_clk0,
4701         &g12a_mpeg_clk_div,
4702         &g12a_sd_emmc_a_clk0_div,
4703         &g12a_sd_emmc_b_clk0_div,
4704         &g12a_sd_emmc_c_clk0_div,
4705         &g12a_mpeg_clk_sel,
4706         &g12a_sd_emmc_a_clk0_sel,
4707         &g12a_sd_emmc_b_clk0_sel,
4708         &g12a_sd_emmc_c_clk0_sel,
4709         &g12a_mpll0,
4710         &g12a_mpll1,
4711         &g12a_mpll2,
4712         &g12a_mpll3,
4713         &g12a_mpll0_div,
4714         &g12a_mpll1_div,
4715         &g12a_mpll2_div,
4716         &g12a_mpll3_div,
4717         &g12a_fixed_pll,
4718         &g12a_sys_pll,
4719         &g12a_gp0_pll,
4720         &g12a_hifi_pll,
4721         &g12a_vclk2_venci0,
4722         &g12a_vclk2_venci1,
4723         &g12a_vclk2_vencp0,
4724         &g12a_vclk2_vencp1,
4725         &g12a_vclk2_venct0,
4726         &g12a_vclk2_venct1,
4727         &g12a_vclk2_other,
4728         &g12a_vclk2_enci,
4729         &g12a_vclk2_encp,
4730         &g12a_dac_clk,
4731         &g12a_aoclk_gate,
4732         &g12a_iec958_gate,
4733         &g12a_enc480p,
4734         &g12a_rng1,
4735         &g12a_vclk2_enct,
4736         &g12a_vclk2_encl,
4737         &g12a_vclk2_venclmmc,
4738         &g12a_vclk2_vencl,
4739         &g12a_vclk2_other1,
4740         &g12a_fixed_pll_dco,
4741         &g12a_sys_pll_dco,
4742         &g12a_gp0_pll_dco,
4743         &g12a_hifi_pll_dco,
4744         &g12a_fclk_div2,
4745         &g12a_fclk_div3,
4746         &g12a_fclk_div4,
4747         &g12a_fclk_div5,
4748         &g12a_fclk_div7,
4749         &g12a_fclk_div2p5,
4750         &g12a_dma,
4751         &g12a_efuse,
4752         &g12a_rom_boot,
4753         &g12a_reset_sec,
4754         &g12a_sec_ahb_apb3,
4755         &g12a_vpu_0_sel,
4756         &g12a_vpu_0_div,
4757         &g12a_vpu_0,
4758         &g12a_vpu_1_sel,
4759         &g12a_vpu_1_div,
4760         &g12a_vpu_1,
4761         &g12a_vpu,
4762         &g12a_vapb_0_sel,
4763         &g12a_vapb_0_div,
4764         &g12a_vapb_0,
4765         &g12a_vapb_1_sel,
4766         &g12a_vapb_1_div,
4767         &g12a_vapb_1,
4768         &g12a_vapb_sel,
4769         &g12a_vapb,
4770         &g12a_hdmi_pll_dco,
4771         &g12a_hdmi_pll_od,
4772         &g12a_hdmi_pll_od2,
4773         &g12a_hdmi_pll,
4774         &g12a_vid_pll_div,
4775         &g12a_vid_pll_sel,
4776         &g12a_vid_pll,
4777         &g12a_vclk_sel,
4778         &g12a_vclk2_sel,
4779         &g12a_vclk_input,
4780         &g12a_vclk2_input,
4781         &g12a_vclk_div,
4782         &g12a_vclk2_div,
4783         &g12a_vclk,
4784         &g12a_vclk2,
4785         &g12a_vclk_div1,
4786         &g12a_vclk_div2_en,
4787         &g12a_vclk_div4_en,
4788         &g12a_vclk_div6_en,
4789         &g12a_vclk_div12_en,
4790         &g12a_vclk2_div1,
4791         &g12a_vclk2_div2_en,
4792         &g12a_vclk2_div4_en,
4793         &g12a_vclk2_div6_en,
4794         &g12a_vclk2_div12_en,
4795         &g12a_cts_enci_sel,
4796         &g12a_cts_encp_sel,
4797         &g12a_cts_vdac_sel,
4798         &g12a_hdmi_tx_sel,
4799         &g12a_cts_enci,
4800         &g12a_cts_encp,
4801         &g12a_cts_vdac,
4802         &g12a_hdmi_tx,
4803         &g12a_hdmi_sel,
4804         &g12a_hdmi_div,
4805         &g12a_hdmi,
4806         &g12a_mali_0_sel,
4807         &g12a_mali_0_div,
4808         &g12a_mali_0,
4809         &g12a_mali_1_sel,
4810         &g12a_mali_1_div,
4811         &g12a_mali_1,
4812         &g12a_mali,
4813         &g12a_mpll_50m,
4814         &g12a_sys_pll_div16_en,
4815         &g12a_cpu_clk_premux0,
4816         &g12a_cpu_clk_mux0_div,
4817         &g12a_cpu_clk_postmux0,
4818         &g12a_cpu_clk_premux1,
4819         &g12a_cpu_clk_mux1_div,
4820         &g12a_cpu_clk_postmux1,
4821         &g12a_cpu_clk_dyn,
4822         &g12a_cpu_clk,
4823         &g12a_cpu_clk_div16_en,
4824         &g12a_cpu_clk_apb_div,
4825         &g12a_cpu_clk_apb,
4826         &g12a_cpu_clk_atb_div,
4827         &g12a_cpu_clk_atb,
4828         &g12a_cpu_clk_axi_div,
4829         &g12a_cpu_clk_axi,
4830         &g12a_cpu_clk_trace_div,
4831         &g12a_cpu_clk_trace,
4832         &g12a_pcie_pll_od,
4833         &g12a_pcie_pll_dco,
4834         &g12a_vdec_1_sel,
4835         &g12a_vdec_1_div,
4836         &g12a_vdec_1,
4837         &g12a_vdec_hevc_sel,
4838         &g12a_vdec_hevc_div,
4839         &g12a_vdec_hevc,
4840         &g12a_vdec_hevcf_sel,
4841         &g12a_vdec_hevcf_div,
4842         &g12a_vdec_hevcf,
4843         &g12a_ts_div,
4844         &g12a_ts,
4845         &g12b_cpu_clk,
4846         &g12b_sys1_pll_dco,
4847         &g12b_sys1_pll,
4848         &g12b_sys1_pll_div16_en,
4849         &g12b_cpub_clk_premux0,
4850         &g12b_cpub_clk_mux0_div,
4851         &g12b_cpub_clk_postmux0,
4852         &g12b_cpub_clk_premux1,
4853         &g12b_cpub_clk_mux1_div,
4854         &g12b_cpub_clk_postmux1,
4855         &g12b_cpub_clk_dyn,
4856         &g12b_cpub_clk,
4857         &g12b_cpub_clk_div16_en,
4858         &g12b_cpub_clk_apb_sel,
4859         &g12b_cpub_clk_apb,
4860         &g12b_cpub_clk_atb_sel,
4861         &g12b_cpub_clk_atb,
4862         &g12b_cpub_clk_axi_sel,
4863         &g12b_cpub_clk_axi,
4864         &g12b_cpub_clk_trace_sel,
4865         &g12b_cpub_clk_trace,
4866         &sm1_gp1_pll_dco,
4867         &sm1_gp1_pll,
4868         &sm1_dsu_clk_premux0,
4869         &sm1_dsu_clk_premux1,
4870         &sm1_dsu_clk_mux0_div,
4871         &sm1_dsu_clk_postmux0,
4872         &sm1_dsu_clk_mux1_div,
4873         &sm1_dsu_clk_postmux1,
4874         &sm1_dsu_clk_dyn,
4875         &sm1_dsu_final_clk,
4876         &sm1_dsu_clk,
4877         &sm1_cpu1_clk,
4878         &sm1_cpu2_clk,
4879         &sm1_cpu3_clk,
4880 };
4881 
4882 static const struct reg_sequence g12a_init_regs[] = {
4883         { .reg = HHI_MPLL_CNTL0,        .def = 0x00000543 },
4884 };
4885 
4886 static int meson_g12a_dvfs_setup_common(struct platform_device *pdev,
4887                                         struct clk_hw **hws)
4888 {
4889         const char *notifier_clk_name;
4890         struct clk *notifier_clk;
4891         struct clk_hw *xtal;
4892         int ret;
4893 
4894         xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
4895 
4896         /* Setup clock notifier for cpu_clk_postmux0 */
4897         g12a_cpu_clk_postmux0_nb_data.xtal = xtal;
4898         notifier_clk_name = clk_hw_get_name(&g12a_cpu_clk_postmux0.hw);
4899         notifier_clk = __clk_lookup(notifier_clk_name);
4900         ret = clk_notifier_register(notifier_clk,
4901                                     &g12a_cpu_clk_postmux0_nb_data.nb);
4902         if (ret) {
4903                 dev_err(&pdev->dev, "failed to register the cpu_clk_postmux0 notifier\n");
4904                 return ret;
4905         }
4906 
4907         /* Setup clock notifier for cpu_clk_dyn mux */
4908         notifier_clk_name = clk_hw_get_name(&g12a_cpu_clk_dyn.hw);
4909         notifier_clk = __clk_lookup(notifier_clk_name);
4910         ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
4911         if (ret) {
4912                 dev_err(&pdev->dev, "failed to register the cpu_clk_dyn notifier\n");
4913                 return ret;
4914         }
4915 
4916         return 0;
4917 }
4918 
4919 static int meson_g12b_dvfs_setup(struct platform_device *pdev)
4920 {
4921         struct clk_hw **hws = g12b_hw_onecell_data.hws;
4922         const char *notifier_clk_name;
4923         struct clk *notifier_clk;
4924         struct clk_hw *xtal;
4925         int ret;
4926 
4927         ret = meson_g12a_dvfs_setup_common(pdev, hws);
4928         if (ret)
4929                 return ret;
4930 
4931         xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
4932 
4933         /* Setup clock notifier for cpu_clk mux */
4934         notifier_clk_name = clk_hw_get_name(&g12b_cpu_clk.hw);
4935         notifier_clk = __clk_lookup(notifier_clk_name);
4936         ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
4937         if (ret) {
4938                 dev_err(&pdev->dev, "failed to register the cpu_clk notifier\n");
4939                 return ret;
4940         }
4941 
4942         /* Setup clock notifier for sys1_pll */
4943         notifier_clk_name = clk_hw_get_name(&g12b_sys1_pll.hw);
4944         notifier_clk = __clk_lookup(notifier_clk_name);
4945         ret = clk_notifier_register(notifier_clk,
4946                                     &g12b_cpu_clk_sys1_pll_nb_data.nb);
4947         if (ret) {
4948                 dev_err(&pdev->dev, "failed to register the sys1_pll notifier\n");
4949                 return ret;
4950         }
4951 
4952         /* Add notifiers for the second CPU cluster */
4953 
4954         /* Setup clock notifier for cpub_clk_postmux0 */
4955         g12b_cpub_clk_postmux0_nb_data.xtal = xtal;
4956         notifier_clk_name = clk_hw_get_name(&g12b_cpub_clk_postmux0.hw);
4957         notifier_clk = __clk_lookup(notifier_clk_name);
4958         ret = clk_notifier_register(notifier_clk,
4959                                     &g12b_cpub_clk_postmux0_nb_data.nb);
4960         if (ret) {
4961                 dev_err(&pdev->dev, "failed to register the cpub_clk_postmux0 notifier\n");
4962                 return ret;
4963         }
4964 
4965         /* Setup clock notifier for cpub_clk_dyn mux */
4966         notifier_clk_name = clk_hw_get_name(&g12b_cpub_clk_dyn.hw);
4967         notifier_clk = __clk_lookup(notifier_clk_name);
4968         ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
4969         if (ret) {
4970                 dev_err(&pdev->dev, "failed to register the cpub_clk_dyn notifier\n");
4971                 return ret;
4972         }
4973 
4974         /* Setup clock notifier for cpub_clk mux */
4975         notifier_clk_name = clk_hw_get_name(&g12b_cpub_clk.hw);
4976         notifier_clk = __clk_lookup(notifier_clk_name);
4977         ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
4978         if (ret) {
4979                 dev_err(&pdev->dev, "failed to register the cpub_clk notifier\n");
4980                 return ret;
4981         }
4982 
4983         /* Setup clock notifier for sys_pll */
4984         notifier_clk_name = clk_hw_get_name(&g12a_sys_pll.hw);
4985         notifier_clk = __clk_lookup(notifier_clk_name);
4986         ret = clk_notifier_register(notifier_clk,
4987                                     &g12b_cpub_clk_sys_pll_nb_data.nb);
4988         if (ret) {
4989                 dev_err(&pdev->dev, "failed to register the sys_pll notifier\n");
4990                 return ret;
4991         }
4992 
4993         return 0;
4994 }
4995 
4996 static int meson_g12a_dvfs_setup(struct platform_device *pdev)
4997 {
4998         struct clk_hw **hws = g12a_hw_onecell_data.hws;
4999         const char *notifier_clk_name;
5000         struct clk *notifier_clk;
5001         int ret;
5002 
5003         ret = meson_g12a_dvfs_setup_common(pdev, hws);
5004         if (ret)
5005                 return ret;
5006 
5007         /* Setup clock notifier for cpu_clk mux */
5008         notifier_clk_name = clk_hw_get_name(&g12a_cpu_clk.hw);
5009         notifier_clk = __clk_lookup(notifier_clk_name);
5010         ret = clk_notifier_register(notifier_clk, &g12a_cpu_clk_mux_nb);
5011         if (ret) {
5012                 dev_err(&pdev->dev, "failed to register the cpu_clk notifier\n");
5013                 return ret;
5014         }
5015 
5016         /* Setup clock notifier for sys_pll */
5017         notifier_clk_name = clk_hw_get_name(&g12a_sys_pll.hw);
5018         notifier_clk = __clk_lookup(notifier_clk_name);
5019         ret = clk_notifier_register(notifier_clk, &g12a_sys_pll_nb_data.nb);
5020         if (ret) {
5021                 dev_err(&pdev->dev, "failed to register the sys_pll notifier\n");
5022                 return ret;
5023         }
5024 
5025         return 0;
5026 }
5027 
5028 struct meson_g12a_data {
5029         const struct meson_eeclkc_data eeclkc_data;
5030         int (*dvfs_setup)(struct platform_device *pdev);
5031 };
5032 
5033 static int meson_g12a_probe(struct platform_device *pdev)
5034 {
5035         const struct meson_eeclkc_data *eeclkc_data;
5036         const struct meson_g12a_data *g12a_data;
5037         int ret;
5038 
5039         eeclkc_data = of_device_get_match_data(&pdev->dev);
5040         if (!eeclkc_data)
5041                 return -EINVAL;
5042 
5043         ret = meson_eeclkc_probe(pdev);
5044         if (ret)
5045                 return ret;
5046 
5047         g12a_data = container_of(eeclkc_data, struct meson_g12a_data,
5048                                  eeclkc_data);
5049 
5050         if (g12a_data->dvfs_setup)
5051                 return g12a_data->dvfs_setup(pdev);
5052 
5053         return 0;
5054 }
5055 
5056 static const struct meson_g12a_data g12a_clkc_data = {
5057         .eeclkc_data = {
5058                 .regmap_clks = g12a_clk_regmaps,
5059                 .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
5060                 .hw_onecell_data = &g12a_hw_onecell_data,
5061                 .init_regs = g12a_init_regs,
5062                 .init_count = ARRAY_SIZE(g12a_init_regs),
5063         },
5064         .dvfs_setup = meson_g12a_dvfs_setup,
5065 };
5066 
5067 static const struct meson_g12a_data g12b_clkc_data = {
5068         .eeclkc_data = {
5069                 .regmap_clks = g12a_clk_regmaps,
5070                 .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
5071                 .hw_onecell_data = &g12b_hw_onecell_data,
5072         },
5073         .dvfs_setup = meson_g12b_dvfs_setup,
5074 };
5075 
5076 static const struct meson_g12a_data sm1_clkc_data = {
5077         .eeclkc_data = {
5078                 .regmap_clks = g12a_clk_regmaps,
5079                 .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
5080                 .hw_onecell_data = &sm1_hw_onecell_data,
5081         },
5082         .dvfs_setup = meson_g12a_dvfs_setup,
5083 };
5084 
5085 static const struct of_device_id clkc_match_table[] = {
5086         {
5087                 .compatible = "amlogic,g12a-clkc",
5088                 .data = &g12a_clkc_data.eeclkc_data
5089         },
5090         {
5091                 .compatible = "amlogic,g12b-clkc",
5092                 .data = &g12b_clkc_data.eeclkc_data
5093         },
5094         {
5095                 .compatible = "amlogic,sm1-clkc",
5096                 .data = &sm1_clkc_data.eeclkc_data
5097         },
5098         {}
5099 };
5100 
5101 static struct platform_driver g12a_driver = {
5102         .probe          = meson_g12a_probe,
5103         .driver         = {
5104                 .name   = "g12a-clkc",
5105                 .of_match_table = clkc_match_table,
5106         },
5107 };
5108 
5109 builtin_platform_driver(g12a_driver);

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