cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

g12a.c (147598B)


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