Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 /*
0003  * Amlogic Meson-G12A Clock Controller Driver
0004  *
0005  * Copyright (c) 2016 Baylibre SAS.
0006  * Author: Michael Turquette <mturquette@baylibre.com>
0007  *
0008  * Copyright (c) 2018 Amlogic, inc.
0009  * Author: Qiufang Dai <qiufang.dai@amlogic.com>
0010  * Author: Jian Hu <jian.hu@amlogic.com>
0011  */
0012 
0013 #include <linux/clk-provider.h>
0014 #include <linux/init.h>
0015 #include <linux/of_device.h>
0016 #include <linux/platform_device.h>
0017 #include <linux/clk.h>
0018 #include <linux/module.h>
0019 
0020 #include "clk-mpll.h"
0021 #include "clk-pll.h"
0022 #include "clk-regmap.h"
0023 #include "clk-cpu-dyndiv.h"
0024 #include "vid-pll-div.h"
0025 #include "meson-eeclk.h"
0026 #include "g12a.h"
0027 
0028 static DEFINE_SPINLOCK(meson_clk_lock);
0029 
0030 static struct clk_regmap g12a_fixed_pll_dco = {
0031     .data = &(struct meson_clk_pll_data){
0032         .en = {
0033             .reg_off = HHI_FIX_PLL_CNTL0,
0034             .shift   = 28,
0035             .width   = 1,
0036         },
0037         .m = {
0038             .reg_off = HHI_FIX_PLL_CNTL0,
0039             .shift   = 0,
0040             .width   = 8,
0041         },
0042         .n = {
0043             .reg_off = HHI_FIX_PLL_CNTL0,
0044             .shift   = 10,
0045             .width   = 5,
0046         },
0047         .frac = {
0048             .reg_off = HHI_FIX_PLL_CNTL1,
0049             .shift   = 0,
0050             .width   = 17,
0051         },
0052         .l = {
0053             .reg_off = HHI_FIX_PLL_CNTL0,
0054             .shift   = 31,
0055             .width   = 1,
0056         },
0057         .rst = {
0058             .reg_off = HHI_FIX_PLL_CNTL0,
0059             .shift   = 29,
0060             .width   = 1,
0061         },
0062     },
0063     .hw.init = &(struct clk_init_data){
0064         .name = "fixed_pll_dco",
0065         .ops = &meson_clk_pll_ro_ops,
0066         .parent_data = &(const struct clk_parent_data) {
0067             .fw_name = "xtal",
0068         },
0069         .num_parents = 1,
0070     },
0071 };
0072 
0073 static struct clk_regmap g12a_fixed_pll = {
0074     .data = &(struct clk_regmap_div_data){
0075         .offset = HHI_FIX_PLL_CNTL0,
0076         .shift = 16,
0077         .width = 2,
0078         .flags = CLK_DIVIDER_POWER_OF_TWO,
0079     },
0080     .hw.init = &(struct clk_init_data){
0081         .name = "fixed_pll",
0082         .ops = &clk_regmap_divider_ro_ops,
0083         .parent_hws = (const struct clk_hw *[]) {
0084             &g12a_fixed_pll_dco.hw
0085         },
0086         .num_parents = 1,
0087         /*
0088          * This clock won't ever change at runtime so
0089          * CLK_SET_RATE_PARENT is not required
0090          */
0091     },
0092 };
0093 
0094 static const struct pll_mult_range g12a_sys_pll_mult_range = {
0095     .min = 128,
0096     .max = 250,
0097 };
0098 
0099 static struct clk_regmap g12a_sys_pll_dco = {
0100     .data = &(struct meson_clk_pll_data){
0101         .en = {
0102             .reg_off = HHI_SYS_PLL_CNTL0,
0103             .shift   = 28,
0104             .width   = 1,
0105         },
0106         .m = {
0107             .reg_off = HHI_SYS_PLL_CNTL0,
0108             .shift   = 0,
0109             .width   = 8,
0110         },
0111         .n = {
0112             .reg_off = HHI_SYS_PLL_CNTL0,
0113             .shift   = 10,
0114             .width   = 5,
0115         },
0116         .l = {
0117             .reg_off = HHI_SYS_PLL_CNTL0,
0118             .shift   = 31,
0119             .width   = 1,
0120         },
0121         .rst = {
0122             .reg_off = HHI_SYS_PLL_CNTL0,
0123             .shift   = 29,
0124             .width   = 1,
0125         },
0126         .range = &g12a_sys_pll_mult_range,
0127     },
0128     .hw.init = &(struct clk_init_data){
0129         .name = "sys_pll_dco",
0130         .ops = &meson_clk_pll_ops,
0131         .parent_data = &(const struct clk_parent_data) {
0132             .fw_name = "xtal",
0133         },
0134         .num_parents = 1,
0135         /* This clock feeds the CPU, avoid disabling it */
0136         .flags = CLK_IS_CRITICAL,
0137     },
0138 };
0139 
0140 static struct clk_regmap g12a_sys_pll = {
0141     .data = &(struct clk_regmap_div_data){
0142         .offset = HHI_SYS_PLL_CNTL0,
0143         .shift = 16,
0144         .width = 3,
0145         .flags = CLK_DIVIDER_POWER_OF_TWO,
0146     },
0147     .hw.init = &(struct clk_init_data){
0148         .name = "sys_pll",
0149         .ops = &clk_regmap_divider_ops,
0150         .parent_hws = (const struct clk_hw *[]) {
0151             &g12a_sys_pll_dco.hw
0152         },
0153         .num_parents = 1,
0154         .flags = CLK_SET_RATE_PARENT,
0155     },
0156 };
0157 
0158 static struct clk_regmap g12b_sys1_pll_dco = {
0159     .data = &(struct meson_clk_pll_data){
0160         .en = {
0161             .reg_off = HHI_SYS1_PLL_CNTL0,
0162             .shift   = 28,
0163             .width   = 1,
0164         },
0165         .m = {
0166             .reg_off = HHI_SYS1_PLL_CNTL0,
0167             .shift   = 0,
0168             .width   = 8,
0169         },
0170         .n = {
0171             .reg_off = HHI_SYS1_PLL_CNTL0,
0172             .shift   = 10,
0173             .width   = 5,
0174         },
0175         .l = {
0176             .reg_off = HHI_SYS1_PLL_CNTL0,
0177             .shift   = 31,
0178             .width   = 1,
0179         },
0180         .rst = {
0181             .reg_off = HHI_SYS1_PLL_CNTL0,
0182             .shift   = 29,
0183             .width   = 1,
0184         },
0185         .range = &g12a_sys_pll_mult_range,
0186     },
0187     .hw.init = &(struct clk_init_data){
0188         .name = "sys1_pll_dco",
0189         .ops = &meson_clk_pll_ops,
0190         .parent_data = &(const struct clk_parent_data) {
0191             .fw_name = "xtal",
0192         },
0193         .num_parents = 1,
0194         /* This clock feeds the CPU, avoid disabling it */
0195         .flags = CLK_IS_CRITICAL,
0196     },
0197 };
0198 
0199 static struct clk_regmap g12b_sys1_pll = {
0200     .data = &(struct clk_regmap_div_data){
0201         .offset = HHI_SYS1_PLL_CNTL0,
0202         .shift = 16,
0203         .width = 3,
0204         .flags = CLK_DIVIDER_POWER_OF_TWO,
0205     },
0206     .hw.init = &(struct clk_init_data){
0207         .name = "sys1_pll",
0208         .ops = &clk_regmap_divider_ops,
0209         .parent_hws = (const struct clk_hw *[]) {
0210             &g12b_sys1_pll_dco.hw
0211         },
0212         .num_parents = 1,
0213         .flags = CLK_SET_RATE_PARENT,
0214     },
0215 };
0216 
0217 static struct clk_regmap g12a_sys_pll_div16_en = {
0218     .data = &(struct clk_regmap_gate_data){
0219         .offset = HHI_SYS_CPU_CLK_CNTL1,
0220         .bit_idx = 24,
0221     },
0222     .hw.init = &(struct clk_init_data) {
0223         .name = "sys_pll_div16_en",
0224         .ops = &clk_regmap_gate_ro_ops,
0225         .parent_hws = (const struct clk_hw *[]) { &g12a_sys_pll.hw },
0226         .num_parents = 1,
0227         /*
0228          * This clock is used to debug the sys_pll range
0229          * Linux should not change it at runtime
0230          */
0231     },
0232 };
0233 
0234 static struct clk_regmap g12b_sys1_pll_div16_en = {
0235     .data = &(struct clk_regmap_gate_data){
0236         .offset = HHI_SYS_CPUB_CLK_CNTL1,
0237         .bit_idx = 24,
0238     },
0239     .hw.init = &(struct clk_init_data) {
0240         .name = "sys1_pll_div16_en",
0241         .ops = &clk_regmap_gate_ro_ops,
0242         .parent_hws = (const struct clk_hw *[]) {
0243             &g12b_sys1_pll.hw
0244         },
0245         .num_parents = 1,
0246         /*
0247          * This clock is used to debug the sys_pll range
0248          * Linux should not change it at runtime
0249          */
0250     },
0251 };
0252 
0253 static struct clk_fixed_factor g12a_sys_pll_div16 = {
0254     .mult = 1,
0255     .div = 16,
0256     .hw.init = &(struct clk_init_data){
0257         .name = "sys_pll_div16",
0258         .ops = &clk_fixed_factor_ops,
0259         .parent_hws = (const struct clk_hw *[]) {
0260             &g12a_sys_pll_div16_en.hw
0261         },
0262         .num_parents = 1,
0263     },
0264 };
0265 
0266 static struct clk_fixed_factor g12b_sys1_pll_div16 = {
0267     .mult = 1,
0268     .div = 16,
0269     .hw.init = &(struct clk_init_data){
0270         .name = "sys1_pll_div16",
0271         .ops = &clk_fixed_factor_ops,
0272         .parent_hws = (const struct clk_hw *[]) {
0273             &g12b_sys1_pll_div16_en.hw
0274         },
0275         .num_parents = 1,
0276     },
0277 };
0278 
0279 static struct clk_fixed_factor g12a_fclk_div2_div = {
0280     .mult = 1,
0281     .div = 2,
0282     .hw.init = &(struct clk_init_data){
0283         .name = "fclk_div2_div",
0284         .ops = &clk_fixed_factor_ops,
0285         .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
0286         .num_parents = 1,
0287     },
0288 };
0289 
0290 static struct clk_regmap g12a_fclk_div2 = {
0291     .data = &(struct clk_regmap_gate_data){
0292         .offset = HHI_FIX_PLL_CNTL1,
0293         .bit_idx = 24,
0294     },
0295     .hw.init = &(struct clk_init_data){
0296         .name = "fclk_div2",
0297         .ops = &clk_regmap_gate_ops,
0298         .parent_hws = (const struct clk_hw *[]) {
0299             &g12a_fclk_div2_div.hw
0300         },
0301         .num_parents = 1,
0302         /*
0303          * Similar to fclk_div3, it seems that this clock is used by
0304          * the resident firmware and is required by the platform to
0305          * operate correctly.
0306          * Until the following condition are met, we need this clock to
0307          * be marked as critical:
0308          * a) Mark the clock used by a firmware resource, if possible
0309          * b) CCF has a clock hand-off mechanism to make the sure the
0310          *    clock stays on until the proper driver comes along
0311          */
0312         .flags = CLK_IS_CRITICAL,
0313     },
0314 };
0315 
0316 static struct clk_fixed_factor g12a_fclk_div3_div = {
0317     .mult = 1,
0318     .div = 3,
0319     .hw.init = &(struct clk_init_data){
0320         .name = "fclk_div3_div",
0321         .ops = &clk_fixed_factor_ops,
0322         .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
0323         .num_parents = 1,
0324     },
0325 };
0326 
0327 static struct clk_regmap g12a_fclk_div3 = {
0328     .data = &(struct clk_regmap_gate_data){
0329         .offset = HHI_FIX_PLL_CNTL1,
0330         .bit_idx = 20,
0331     },
0332     .hw.init = &(struct clk_init_data){
0333         .name = "fclk_div3",
0334         .ops = &clk_regmap_gate_ops,
0335         .parent_hws = (const struct clk_hw *[]) {
0336             &g12a_fclk_div3_div.hw
0337         },
0338         .num_parents = 1,
0339         /*
0340          * This clock is used by the resident firmware and is required
0341          * by the platform to operate correctly.
0342          * Until the following condition are met, we need this clock to
0343          * be marked as critical:
0344          * a) Mark the clock used by a firmware resource, if possible
0345          * b) CCF has a clock hand-off mechanism to make the sure the
0346          *    clock stays on until the proper driver comes along
0347          */
0348         .flags = CLK_IS_CRITICAL,
0349     },
0350 };
0351 
0352 /* Datasheet names this field as "premux0" */
0353 static struct clk_regmap g12a_cpu_clk_premux0 = {
0354     .data = &(struct clk_regmap_mux_data){
0355         .offset = HHI_SYS_CPU_CLK_CNTL0,
0356         .mask = 0x3,
0357         .shift = 0,
0358         .flags = CLK_MUX_ROUND_CLOSEST,
0359     },
0360     .hw.init = &(struct clk_init_data){
0361         .name = "cpu_clk_dyn0_sel",
0362         .ops = &clk_regmap_mux_ops,
0363         .parent_data = (const struct clk_parent_data []) {
0364             { .fw_name = "xtal", },
0365             { .hw = &g12a_fclk_div2.hw },
0366             { .hw = &g12a_fclk_div3.hw },
0367         },
0368         .num_parents = 3,
0369         .flags = CLK_SET_RATE_PARENT,
0370     },
0371 };
0372 
0373 /* Datasheet names this field as "premux1" */
0374 static struct clk_regmap g12a_cpu_clk_premux1 = {
0375     .data = &(struct clk_regmap_mux_data){
0376         .offset = HHI_SYS_CPU_CLK_CNTL0,
0377         .mask = 0x3,
0378         .shift = 16,
0379     },
0380     .hw.init = &(struct clk_init_data){
0381         .name = "cpu_clk_dyn1_sel",
0382         .ops = &clk_regmap_mux_ops,
0383         .parent_data = (const struct clk_parent_data []) {
0384             { .fw_name = "xtal", },
0385             { .hw = &g12a_fclk_div2.hw },
0386             { .hw = &g12a_fclk_div3.hw },
0387         },
0388         .num_parents = 3,
0389         /* This sub-tree is used a parking clock */
0390         .flags = CLK_SET_RATE_NO_REPARENT
0391     },
0392 };
0393 
0394 /* Datasheet names this field as "mux0_divn_tcnt" */
0395 static struct clk_regmap g12a_cpu_clk_mux0_div = {
0396     .data = &(struct meson_clk_cpu_dyndiv_data){
0397         .div = {
0398             .reg_off = HHI_SYS_CPU_CLK_CNTL0,
0399             .shift = 4,
0400             .width = 6,
0401         },
0402         .dyn = {
0403             .reg_off = HHI_SYS_CPU_CLK_CNTL0,
0404             .shift = 26,
0405             .width = 1,
0406         },
0407     },
0408     .hw.init = &(struct clk_init_data){
0409         .name = "cpu_clk_dyn0_div",
0410         .ops = &meson_clk_cpu_dyndiv_ops,
0411         .parent_hws = (const struct clk_hw *[]) {
0412             &g12a_cpu_clk_premux0.hw
0413         },
0414         .num_parents = 1,
0415         .flags = CLK_SET_RATE_PARENT,
0416     },
0417 };
0418 
0419 /* Datasheet names this field as "postmux0" */
0420 static struct clk_regmap g12a_cpu_clk_postmux0 = {
0421     .data = &(struct clk_regmap_mux_data){
0422         .offset = HHI_SYS_CPU_CLK_CNTL0,
0423         .mask = 0x1,
0424         .shift = 2,
0425         .flags = CLK_MUX_ROUND_CLOSEST,
0426     },
0427     .hw.init = &(struct clk_init_data){
0428         .name = "cpu_clk_dyn0",
0429         .ops = &clk_regmap_mux_ops,
0430         .parent_hws = (const struct clk_hw *[]) {
0431             &g12a_cpu_clk_premux0.hw,
0432             &g12a_cpu_clk_mux0_div.hw,
0433         },
0434         .num_parents = 2,
0435         .flags = CLK_SET_RATE_PARENT,
0436     },
0437 };
0438 
0439 /* Datasheet names this field as "Mux1_divn_tcnt" */
0440 static struct clk_regmap g12a_cpu_clk_mux1_div = {
0441     .data = &(struct clk_regmap_div_data){
0442         .offset = HHI_SYS_CPU_CLK_CNTL0,
0443         .shift = 20,
0444         .width = 6,
0445     },
0446     .hw.init = &(struct clk_init_data){
0447         .name = "cpu_clk_dyn1_div",
0448         .ops = &clk_regmap_divider_ro_ops,
0449         .parent_hws = (const struct clk_hw *[]) {
0450             &g12a_cpu_clk_premux1.hw
0451         },
0452         .num_parents = 1,
0453     },
0454 };
0455 
0456 /* Datasheet names this field as "postmux1" */
0457 static struct clk_regmap g12a_cpu_clk_postmux1 = {
0458     .data = &(struct clk_regmap_mux_data){
0459         .offset = HHI_SYS_CPU_CLK_CNTL0,
0460         .mask = 0x1,
0461         .shift = 18,
0462     },
0463     .hw.init = &(struct clk_init_data){
0464         .name = "cpu_clk_dyn1",
0465         .ops = &clk_regmap_mux_ops,
0466         .parent_hws = (const struct clk_hw *[]) {
0467             &g12a_cpu_clk_premux1.hw,
0468             &g12a_cpu_clk_mux1_div.hw,
0469         },
0470         .num_parents = 2,
0471         /* This sub-tree is used a parking clock */
0472         .flags = CLK_SET_RATE_NO_REPARENT,
0473     },
0474 };
0475 
0476 /* Datasheet names this field as "Final_dyn_mux_sel" */
0477 static struct clk_regmap g12a_cpu_clk_dyn = {
0478     .data = &(struct clk_regmap_mux_data){
0479         .offset = HHI_SYS_CPU_CLK_CNTL0,
0480         .mask = 0x1,
0481         .shift = 10,
0482         .flags = CLK_MUX_ROUND_CLOSEST,
0483     },
0484     .hw.init = &(struct clk_init_data){
0485         .name = "cpu_clk_dyn",
0486         .ops = &clk_regmap_mux_ops,
0487         .parent_hws = (const struct clk_hw *[]) {
0488             &g12a_cpu_clk_postmux0.hw,
0489             &g12a_cpu_clk_postmux1.hw,
0490         },
0491         .num_parents = 2,
0492         .flags = CLK_SET_RATE_PARENT,
0493     },
0494 };
0495 
0496 /* Datasheet names this field as "Final_mux_sel" */
0497 static struct clk_regmap g12a_cpu_clk = {
0498     .data = &(struct clk_regmap_mux_data){
0499         .offset = HHI_SYS_CPU_CLK_CNTL0,
0500         .mask = 0x1,
0501         .shift = 11,
0502         .flags = CLK_MUX_ROUND_CLOSEST,
0503     },
0504     .hw.init = &(struct clk_init_data){
0505         .name = "cpu_clk",
0506         .ops = &clk_regmap_mux_ops,
0507         .parent_hws = (const struct clk_hw *[]) {
0508             &g12a_cpu_clk_dyn.hw,
0509             &g12a_sys_pll.hw,
0510         },
0511         .num_parents = 2,
0512         .flags = CLK_SET_RATE_PARENT,
0513     },
0514 };
0515 
0516 /* Datasheet names this field as "Final_mux_sel" */
0517 static struct clk_regmap g12b_cpu_clk = {
0518     .data = &(struct clk_regmap_mux_data){
0519         .offset = HHI_SYS_CPU_CLK_CNTL0,
0520         .mask = 0x1,
0521         .shift = 11,
0522         .flags = CLK_MUX_ROUND_CLOSEST,
0523     },
0524     .hw.init = &(struct clk_init_data){
0525         .name = "cpu_clk",
0526         .ops = &clk_regmap_mux_ops,
0527         .parent_hws = (const struct clk_hw *[]) {
0528             &g12a_cpu_clk_dyn.hw,
0529             &g12b_sys1_pll.hw
0530         },
0531         .num_parents = 2,
0532         .flags = CLK_SET_RATE_PARENT,
0533     },
0534 };
0535 
0536 /* Datasheet names this field as "premux0" */
0537 static struct clk_regmap g12b_cpub_clk_premux0 = {
0538     .data = &(struct clk_regmap_mux_data){
0539         .offset = HHI_SYS_CPUB_CLK_CNTL,
0540         .mask = 0x3,
0541         .shift = 0,
0542         .flags = CLK_MUX_ROUND_CLOSEST,
0543     },
0544     .hw.init = &(struct clk_init_data){
0545         .name = "cpub_clk_dyn0_sel",
0546         .ops = &clk_regmap_mux_ops,
0547         .parent_data = (const struct clk_parent_data []) {
0548             { .fw_name = "xtal", },
0549             { .hw = &g12a_fclk_div2.hw },
0550             { .hw = &g12a_fclk_div3.hw },
0551         },
0552         .num_parents = 3,
0553         .flags = CLK_SET_RATE_PARENT,
0554     },
0555 };
0556 
0557 /* Datasheet names this field as "mux0_divn_tcnt" */
0558 static struct clk_regmap g12b_cpub_clk_mux0_div = {
0559     .data = &(struct meson_clk_cpu_dyndiv_data){
0560         .div = {
0561             .reg_off = HHI_SYS_CPUB_CLK_CNTL,
0562             .shift = 4,
0563             .width = 6,
0564         },
0565         .dyn = {
0566             .reg_off = HHI_SYS_CPUB_CLK_CNTL,
0567             .shift = 26,
0568             .width = 1,
0569         },
0570     },
0571     .hw.init = &(struct clk_init_data){
0572         .name = "cpub_clk_dyn0_div",
0573         .ops = &meson_clk_cpu_dyndiv_ops,
0574         .parent_hws = (const struct clk_hw *[]) {
0575             &g12b_cpub_clk_premux0.hw
0576         },
0577         .num_parents = 1,
0578         .flags = CLK_SET_RATE_PARENT,
0579     },
0580 };
0581 
0582 /* Datasheet names this field as "postmux0" */
0583 static struct clk_regmap g12b_cpub_clk_postmux0 = {
0584     .data = &(struct clk_regmap_mux_data){
0585         .offset = HHI_SYS_CPUB_CLK_CNTL,
0586         .mask = 0x1,
0587         .shift = 2,
0588         .flags = CLK_MUX_ROUND_CLOSEST,
0589     },
0590     .hw.init = &(struct clk_init_data){
0591         .name = "cpub_clk_dyn0",
0592         .ops = &clk_regmap_mux_ops,
0593         .parent_hws = (const struct clk_hw *[]) {
0594             &g12b_cpub_clk_premux0.hw,
0595             &g12b_cpub_clk_mux0_div.hw
0596         },
0597         .num_parents = 2,
0598         .flags = CLK_SET_RATE_PARENT,
0599     },
0600 };
0601 
0602 /* Datasheet names this field as "premux1" */
0603 static struct clk_regmap g12b_cpub_clk_premux1 = {
0604     .data = &(struct clk_regmap_mux_data){
0605         .offset = HHI_SYS_CPUB_CLK_CNTL,
0606         .mask = 0x3,
0607         .shift = 16,
0608     },
0609     .hw.init = &(struct clk_init_data){
0610         .name = "cpub_clk_dyn1_sel",
0611         .ops = &clk_regmap_mux_ops,
0612         .parent_data = (const struct clk_parent_data []) {
0613             { .fw_name = "xtal", },
0614             { .hw = &g12a_fclk_div2.hw },
0615             { .hw = &g12a_fclk_div3.hw },
0616         },
0617         .num_parents = 3,
0618         /* This sub-tree is used a parking clock */
0619         .flags = CLK_SET_RATE_NO_REPARENT,
0620     },
0621 };
0622 
0623 /* Datasheet names this field as "Mux1_divn_tcnt" */
0624 static struct clk_regmap g12b_cpub_clk_mux1_div = {
0625     .data = &(struct clk_regmap_div_data){
0626         .offset = HHI_SYS_CPUB_CLK_CNTL,
0627         .shift = 20,
0628         .width = 6,
0629     },
0630     .hw.init = &(struct clk_init_data){
0631         .name = "cpub_clk_dyn1_div",
0632         .ops = &clk_regmap_divider_ro_ops,
0633         .parent_hws = (const struct clk_hw *[]) {
0634             &g12b_cpub_clk_premux1.hw
0635         },
0636         .num_parents = 1,
0637     },
0638 };
0639 
0640 /* Datasheet names this field as "postmux1" */
0641 static struct clk_regmap g12b_cpub_clk_postmux1 = {
0642     .data = &(struct clk_regmap_mux_data){
0643         .offset = HHI_SYS_CPUB_CLK_CNTL,
0644         .mask = 0x1,
0645         .shift = 18,
0646     },
0647     .hw.init = &(struct clk_init_data){
0648         .name = "cpub_clk_dyn1",
0649         .ops = &clk_regmap_mux_ops,
0650         .parent_hws = (const struct clk_hw *[]) {
0651             &g12b_cpub_clk_premux1.hw,
0652             &g12b_cpub_clk_mux1_div.hw
0653         },
0654         .num_parents = 2,
0655         /* This sub-tree is used a parking clock */
0656         .flags = CLK_SET_RATE_NO_REPARENT,
0657     },
0658 };
0659 
0660 /* Datasheet names this field as "Final_dyn_mux_sel" */
0661 static struct clk_regmap g12b_cpub_clk_dyn = {
0662     .data = &(struct clk_regmap_mux_data){
0663         .offset = HHI_SYS_CPUB_CLK_CNTL,
0664         .mask = 0x1,
0665         .shift = 10,
0666         .flags = CLK_MUX_ROUND_CLOSEST,
0667     },
0668     .hw.init = &(struct clk_init_data){
0669         .name = "cpub_clk_dyn",
0670         .ops = &clk_regmap_mux_ops,
0671         .parent_hws = (const struct clk_hw *[]) {
0672             &g12b_cpub_clk_postmux0.hw,
0673             &g12b_cpub_clk_postmux1.hw
0674         },
0675         .num_parents = 2,
0676         .flags = CLK_SET_RATE_PARENT,
0677     },
0678 };
0679 
0680 /* Datasheet names this field as "Final_mux_sel" */
0681 static struct clk_regmap g12b_cpub_clk = {
0682     .data = &(struct clk_regmap_mux_data){
0683         .offset = HHI_SYS_CPUB_CLK_CNTL,
0684         .mask = 0x1,
0685         .shift = 11,
0686         .flags = CLK_MUX_ROUND_CLOSEST,
0687     },
0688     .hw.init = &(struct clk_init_data){
0689         .name = "cpub_clk",
0690         .ops = &clk_regmap_mux_ops,
0691         .parent_hws = (const struct clk_hw *[]) {
0692             &g12b_cpub_clk_dyn.hw,
0693             &g12a_sys_pll.hw
0694         },
0695         .num_parents = 2,
0696         .flags = CLK_SET_RATE_PARENT,
0697     },
0698 };
0699 
0700 static struct clk_regmap sm1_gp1_pll;
0701 
0702 /* Datasheet names this field as "premux0" */
0703 static struct clk_regmap sm1_dsu_clk_premux0 = {
0704     .data = &(struct clk_regmap_mux_data){
0705         .offset = HHI_SYS_CPU_CLK_CNTL5,
0706         .mask = 0x3,
0707         .shift = 0,
0708     },
0709     .hw.init = &(struct clk_init_data){
0710         .name = "dsu_clk_dyn0_sel",
0711         .ops = &clk_regmap_mux_ro_ops,
0712         .parent_data = (const struct clk_parent_data []) {
0713             { .fw_name = "xtal", },
0714             { .hw = &g12a_fclk_div2.hw },
0715             { .hw = &g12a_fclk_div3.hw },
0716             { .hw = &sm1_gp1_pll.hw },
0717         },
0718         .num_parents = 4,
0719     },
0720 };
0721 
0722 /* Datasheet names this field as "premux1" */
0723 static struct clk_regmap sm1_dsu_clk_premux1 = {
0724     .data = &(struct clk_regmap_mux_data){
0725         .offset = HHI_SYS_CPU_CLK_CNTL5,
0726         .mask = 0x3,
0727         .shift = 16,
0728     },
0729     .hw.init = &(struct clk_init_data){
0730         .name = "dsu_clk_dyn1_sel",
0731         .ops = &clk_regmap_mux_ro_ops,
0732         .parent_data = (const struct clk_parent_data []) {
0733             { .fw_name = "xtal", },
0734             { .hw = &g12a_fclk_div2.hw },
0735             { .hw = &g12a_fclk_div3.hw },
0736             { .hw = &sm1_gp1_pll.hw },
0737         },
0738         .num_parents = 4,
0739     },
0740 };
0741 
0742 /* Datasheet names this field as "Mux0_divn_tcnt" */
0743 static struct clk_regmap sm1_dsu_clk_mux0_div = {
0744     .data = &(struct clk_regmap_div_data){
0745         .offset = HHI_SYS_CPU_CLK_CNTL5,
0746         .shift = 4,
0747         .width = 6,
0748     },
0749     .hw.init = &(struct clk_init_data){
0750         .name = "dsu_clk_dyn0_div",
0751         .ops = &clk_regmap_divider_ro_ops,
0752         .parent_hws = (const struct clk_hw *[]) {
0753             &sm1_dsu_clk_premux0.hw
0754         },
0755         .num_parents = 1,
0756     },
0757 };
0758 
0759 /* Datasheet names this field as "postmux0" */
0760 static struct clk_regmap sm1_dsu_clk_postmux0 = {
0761     .data = &(struct clk_regmap_mux_data){
0762         .offset = HHI_SYS_CPU_CLK_CNTL5,
0763         .mask = 0x1,
0764         .shift = 2,
0765     },
0766     .hw.init = &(struct clk_init_data){
0767         .name = "dsu_clk_dyn0",
0768         .ops = &clk_regmap_mux_ro_ops,
0769         .parent_hws = (const struct clk_hw *[]) {
0770             &sm1_dsu_clk_premux0.hw,
0771             &sm1_dsu_clk_mux0_div.hw,
0772         },
0773         .num_parents = 2,
0774     },
0775 };
0776 
0777 /* Datasheet names this field as "Mux1_divn_tcnt" */
0778 static struct clk_regmap sm1_dsu_clk_mux1_div = {
0779     .data = &(struct clk_regmap_div_data){
0780         .offset = HHI_SYS_CPU_CLK_CNTL5,
0781         .shift = 20,
0782         .width = 6,
0783     },
0784     .hw.init = &(struct clk_init_data){
0785         .name = "dsu_clk_dyn1_div",
0786         .ops = &clk_regmap_divider_ro_ops,
0787         .parent_hws = (const struct clk_hw *[]) {
0788             &sm1_dsu_clk_premux1.hw
0789         },
0790         .num_parents = 1,
0791     },
0792 };
0793 
0794 /* Datasheet names this field as "postmux1" */
0795 static struct clk_regmap sm1_dsu_clk_postmux1 = {
0796     .data = &(struct clk_regmap_mux_data){
0797         .offset = HHI_SYS_CPU_CLK_CNTL5,
0798         .mask = 0x1,
0799         .shift = 18,
0800     },
0801     .hw.init = &(struct clk_init_data){
0802         .name = "dsu_clk_dyn1",
0803         .ops = &clk_regmap_mux_ro_ops,
0804         .parent_hws = (const struct clk_hw *[]) {
0805             &sm1_dsu_clk_premux1.hw,
0806             &sm1_dsu_clk_mux1_div.hw,
0807         },
0808         .num_parents = 2,
0809     },
0810 };
0811 
0812 /* Datasheet names this field as "Final_dyn_mux_sel" */
0813 static struct clk_regmap sm1_dsu_clk_dyn = {
0814     .data = &(struct clk_regmap_mux_data){
0815         .offset = HHI_SYS_CPU_CLK_CNTL5,
0816         .mask = 0x1,
0817         .shift = 10,
0818     },
0819     .hw.init = &(struct clk_init_data){
0820         .name = "dsu_clk_dyn",
0821         .ops = &clk_regmap_mux_ro_ops,
0822         .parent_hws = (const struct clk_hw *[]) {
0823             &sm1_dsu_clk_postmux0.hw,
0824             &sm1_dsu_clk_postmux1.hw,
0825         },
0826         .num_parents = 2,
0827     },
0828 };
0829 
0830 /* Datasheet names this field as "Final_mux_sel" */
0831 static struct clk_regmap sm1_dsu_final_clk = {
0832     .data = &(struct clk_regmap_mux_data){
0833         .offset = HHI_SYS_CPU_CLK_CNTL5,
0834         .mask = 0x1,
0835         .shift = 11,
0836     },
0837     .hw.init = &(struct clk_init_data){
0838         .name = "dsu_clk_final",
0839         .ops = &clk_regmap_mux_ro_ops,
0840         .parent_hws = (const struct clk_hw *[]) {
0841             &sm1_dsu_clk_dyn.hw,
0842             &g12a_sys_pll.hw,
0843         },
0844         .num_parents = 2,
0845     },
0846 };
0847 
0848 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 0 */
0849 static struct clk_regmap sm1_cpu1_clk = {
0850     .data = &(struct clk_regmap_mux_data){
0851         .offset = HHI_SYS_CPU_CLK_CNTL6,
0852         .mask = 0x1,
0853         .shift = 24,
0854     },
0855     .hw.init = &(struct clk_init_data){
0856         .name = "cpu1_clk",
0857         .ops = &clk_regmap_mux_ro_ops,
0858         .parent_hws = (const struct clk_hw *[]) {
0859             &g12a_cpu_clk.hw,
0860             /* This CPU also have a dedicated clock tree */
0861         },
0862         .num_parents = 1,
0863     },
0864 };
0865 
0866 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 1 */
0867 static struct clk_regmap sm1_cpu2_clk = {
0868     .data = &(struct clk_regmap_mux_data){
0869         .offset = HHI_SYS_CPU_CLK_CNTL6,
0870         .mask = 0x1,
0871         .shift = 25,
0872     },
0873     .hw.init = &(struct clk_init_data){
0874         .name = "cpu2_clk",
0875         .ops = &clk_regmap_mux_ro_ops,
0876         .parent_hws = (const struct clk_hw *[]) {
0877             &g12a_cpu_clk.hw,
0878             /* This CPU also have a dedicated clock tree */
0879         },
0880         .num_parents = 1,
0881     },
0882 };
0883 
0884 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 2 */
0885 static struct clk_regmap sm1_cpu3_clk = {
0886     .data = &(struct clk_regmap_mux_data){
0887         .offset = HHI_SYS_CPU_CLK_CNTL6,
0888         .mask = 0x1,
0889         .shift = 26,
0890     },
0891     .hw.init = &(struct clk_init_data){
0892         .name = "cpu3_clk",
0893         .ops = &clk_regmap_mux_ro_ops,
0894         .parent_hws = (const struct clk_hw *[]) {
0895             &g12a_cpu_clk.hw,
0896             /* This CPU also have a dedicated clock tree */
0897         },
0898         .num_parents = 1,
0899     },
0900 };
0901 
0902 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 4 */
0903 static struct clk_regmap sm1_dsu_clk = {
0904     .data = &(struct clk_regmap_mux_data){
0905         .offset = HHI_SYS_CPU_CLK_CNTL6,
0906         .mask = 0x1,
0907         .shift = 27,
0908     },
0909     .hw.init = &(struct clk_init_data){
0910         .name = "dsu_clk",
0911         .ops = &clk_regmap_mux_ro_ops,
0912         .parent_hws = (const struct clk_hw *[]) {
0913             &g12a_cpu_clk.hw,
0914             &sm1_dsu_final_clk.hw,
0915         },
0916         .num_parents = 2,
0917     },
0918 };
0919 
0920 static int g12a_cpu_clk_mux_notifier_cb(struct notifier_block *nb,
0921                     unsigned long event, void *data)
0922 {
0923     if (event == POST_RATE_CHANGE || event == PRE_RATE_CHANGE) {
0924         /* Wait for clock propagation before/after changing the mux */
0925         udelay(100);
0926         return NOTIFY_OK;
0927     }
0928 
0929     return NOTIFY_DONE;
0930 }
0931 
0932 static struct notifier_block g12a_cpu_clk_mux_nb = {
0933     .notifier_call = g12a_cpu_clk_mux_notifier_cb,
0934 };
0935 
0936 struct g12a_cpu_clk_postmux_nb_data {
0937     struct notifier_block nb;
0938     struct clk_hw *xtal;
0939     struct clk_hw *cpu_clk_dyn;
0940     struct clk_hw *cpu_clk_postmux0;
0941     struct clk_hw *cpu_clk_postmux1;
0942     struct clk_hw *cpu_clk_premux1;
0943 };
0944 
0945 static int g12a_cpu_clk_postmux_notifier_cb(struct notifier_block *nb,
0946                         unsigned long event, void *data)
0947 {
0948     struct g12a_cpu_clk_postmux_nb_data *nb_data =
0949         container_of(nb, struct g12a_cpu_clk_postmux_nb_data, nb);
0950 
0951     switch (event) {
0952     case PRE_RATE_CHANGE:
0953         /*
0954          * This notifier means cpu_clk_postmux0 clock will be changed
0955          * to feed cpu_clk, this is the current path :
0956          * cpu_clk
0957          *    \- cpu_clk_dyn
0958          *          \- cpu_clk_postmux0
0959          *                \- cpu_clk_muxX_div
0960          *                      \- cpu_clk_premux0
0961          *              \- fclk_div3 or fclk_div2
0962          *      OR
0963          *                \- cpu_clk_premux0
0964          *          \- fclk_div3 or fclk_div2
0965          */
0966 
0967         /* Setup cpu_clk_premux1 to xtal */
0968         clk_hw_set_parent(nb_data->cpu_clk_premux1,
0969                   nb_data->xtal);
0970 
0971         /* Setup cpu_clk_postmux1 to bypass divider */
0972         clk_hw_set_parent(nb_data->cpu_clk_postmux1,
0973                   nb_data->cpu_clk_premux1);
0974 
0975         /* Switch to parking clk on cpu_clk_postmux1 */
0976         clk_hw_set_parent(nb_data->cpu_clk_dyn,
0977                   nb_data->cpu_clk_postmux1);
0978 
0979         /*
0980          * Now, cpu_clk is 24MHz in the current path :
0981          * cpu_clk
0982          *    \- cpu_clk_dyn
0983          *          \- cpu_clk_postmux1
0984          *                \- cpu_clk_premux1
0985          *                      \- xtal
0986          */
0987 
0988         udelay(100);
0989 
0990         return NOTIFY_OK;
0991 
0992     case POST_RATE_CHANGE:
0993         /*
0994          * The cpu_clk_postmux0 has ben updated, now switch back
0995          * cpu_clk_dyn to cpu_clk_postmux0 and take the changes
0996          * in account.
0997          */
0998 
0999         /* 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 
1025 static 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 
1033 static 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 
1041 struct 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 
1048 static 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 
1108 static 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 */
1116 static 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 */
1124 static 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 
1131 static 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 
1150 static 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 
1169 static 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 
1182 static 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 
1195 static 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 
1210 static 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 
1229 static 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 
1244 static 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 
1263 static 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 
1278 static 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 
1297 static 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 
1322 static 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 
1341 static 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 
1354 static 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 
1367 static 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 
1380 static 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 
1393 static 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 
1406 static 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 
1419 static 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 
1432 static u32 mux_table_cpub[] = { 1, 2, 3, 4, 5, 6, 7 };
1433 static 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 
1456 static 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 
1476 static 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 
1499 static 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 
1519 static 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 
1542 static 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 
1562 static 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 
1585 static 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 
1605 static 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  */
1613 static 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 
1622 static 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 
1668 static 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 
1687 static 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 
1732 static 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  */
1753 static 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 
1762 static 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 
1809 static 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  */
1833 static 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 */
1849 static const struct pll_params_table g12a_pcie_pll_table[] = {
1850     PLL_PARAMS(150, 1),
1851     {0, 0},
1852 };
1853 
1854 static 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 
1900 static 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 
1914 static 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 
1934 static 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 
1948 static 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 
1996 static 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 
2014 static 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 
2032 static 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 
2050 static 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 
2061 static 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 
2076 static 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 
2087 static 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 
2102 static 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 
2113 static 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 
2128 static 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 
2141 static 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 
2156 static 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 
2169 static 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 
2186 static 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 
2199 static const struct reg_sequence g12a_mpll0_init_regs[] = {
2200     { .reg = HHI_MPLL_CNTL2,    .def = 0x40000033 },
2201 };
2202 
2203 static 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 
2239 static 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 
2253 static const struct reg_sequence g12a_mpll1_init_regs[] = {
2254     { .reg = HHI_MPLL_CNTL4,    .def = 0x40000033 },
2255 };
2256 
2257 static 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 
2293 static 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 
2307 static const struct reg_sequence g12a_mpll2_init_regs[] = {
2308     { .reg = HHI_MPLL_CNTL6,    .def = 0x40000033 },
2309 };
2310 
2311 static 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 
2347 static 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 
2361 static const struct reg_sequence g12a_mpll3_init_regs[] = {
2362     { .reg = HHI_MPLL_CNTL8,    .def = 0x40000033 },
2363 };
2364 
2365 static 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 
2401 static 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 
2415 static u32 mux_table_clk81[]    = { 0, 2, 3, 4, 5, 6, 7 };
2416 static 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 
2426 static 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 
2441 static 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 
2458 static 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 
2474 static 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 */
2489 static 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 
2504 static 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 
2521 static 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 */
2538 static 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 
2553 static 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 
2570 static 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 */
2587 static 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 
2602 static 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 
2619 static 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 
2637 static 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 
2659 static const struct clk_hw *g12a_vid_pll_parent_hws[] = {
2660     &g12a_vid_pll_div.hw,
2661     &g12a_hdmi_pll.hw,
2662 };
2663 
2664 static 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 
2683 static 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 
2701 static 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 
2712 static 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 
2727 static 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 
2742 static 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 
2756 static 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 
2771 static 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 
2786 static 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 
2800 static 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 
2824 static 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 
2834 static 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 
2850 static 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 
2868 static 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 
2884 static 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 
2900 static 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 
2918 static 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 
2934 static 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 
2950 static 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 
2968 static 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 
2986 static 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 
2997 static 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 
3012 static 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 
3029 static 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 
3045 static 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 
3060 static 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 
3077 static 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 
3093 static 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 
3115 static 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 
3129 static 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 
3140 static 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 
3155 static 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 
3170 static 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 
3184 static 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 
3198 static 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 
3215 static 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 
3232 static 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 
3246 static 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 
3260 static 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 
3274 static 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 
3288 static 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 
3302 static 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 
3316 static 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 
3330 static 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 
3344 static 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 
3358 static 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 
3372 static 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 
3386 static 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 
3400 static 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 
3413 static 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 
3426 static 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 
3439 static 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 
3452 static 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 
3465 static 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 
3478 static 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 
3491 static 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 
3504 static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
3505 static 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 
3518 static 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 
3534 static 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 
3550 static 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 */
3567 static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
3568 static 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 
3581 static 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 
3597 static 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 
3613 static 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 
3629 static 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 
3645 static 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 
3663 static 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 
3674 static 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 
3690 static 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 
3707 static 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 
3725 static 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 
3732 static 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 
3748 static 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 
3763 static 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  */
3783 static 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 
3794 static 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 
3815 static 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 
3832 static 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 
3848 static 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 
3869 static 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 
3886 static 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 
3902 static const struct clk_hw *g12a_mali_parent_hws[] = {
3903     &g12a_mali_0.hw,
3904     &g12a_mali_1.hw,
3905 };
3906 
3907 static 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 
3922 static 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 
3938 static 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 
3955 static 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 
3964 static 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 
3978 static 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 
3995 static 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 
4011 static 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 
4025 static 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 
4042 static 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 
4060 static 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 
4071 static 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 
4085 static 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 
4102 static 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 
4118 static 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 
4132 static 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 
4149 static 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 */
4172 static MESON_GATE(g12a_ddr,         HHI_GCLK_MPEG0, 0);
4173 static MESON_GATE(g12a_dos,         HHI_GCLK_MPEG0, 1);
4174 static MESON_GATE(g12a_audio_locker,        HHI_GCLK_MPEG0, 2);
4175 static MESON_GATE(g12a_mipi_dsi_host,       HHI_GCLK_MPEG0, 3);
4176 static MESON_GATE(g12a_eth_phy,         HHI_GCLK_MPEG0, 4);
4177 static MESON_GATE(g12a_isa,         HHI_GCLK_MPEG0, 5);
4178 static MESON_GATE(g12a_pl301,           HHI_GCLK_MPEG0, 6);
4179 static MESON_GATE(g12a_periphs,         HHI_GCLK_MPEG0, 7);
4180 static MESON_GATE(g12a_spicc_0,         HHI_GCLK_MPEG0, 8);
4181 static MESON_GATE(g12a_i2c,         HHI_GCLK_MPEG0, 9);
4182 static MESON_GATE(g12a_sana,            HHI_GCLK_MPEG0, 10);
4183 static MESON_GATE(g12a_sd,          HHI_GCLK_MPEG0, 11);
4184 static MESON_GATE(g12a_rng0,            HHI_GCLK_MPEG0, 12);
4185 static MESON_GATE(g12a_uart0,           HHI_GCLK_MPEG0, 13);
4186 static MESON_GATE(g12a_spicc_1,         HHI_GCLK_MPEG0, 14);
4187 static MESON_GATE(g12a_hiu_reg,         HHI_GCLK_MPEG0, 19);
4188 static MESON_GATE(g12a_mipi_dsi_phy,        HHI_GCLK_MPEG0, 20);
4189 static MESON_GATE(g12a_assist_misc,     HHI_GCLK_MPEG0, 23);
4190 static MESON_GATE(g12a_emmc_a,          HHI_GCLK_MPEG0, 4);
4191 static MESON_GATE(g12a_emmc_b,          HHI_GCLK_MPEG0, 25);
4192 static MESON_GATE(g12a_emmc_c,          HHI_GCLK_MPEG0, 26);
4193 static MESON_GATE(g12a_audio_codec,     HHI_GCLK_MPEG0, 28);
4194 
4195 static MESON_GATE(g12a_audio,           HHI_GCLK_MPEG1, 0);
4196 static MESON_GATE(g12a_eth_core,        HHI_GCLK_MPEG1, 3);
4197 static MESON_GATE(g12a_demux,           HHI_GCLK_MPEG1, 4);
4198 static MESON_GATE(g12a_audio_ififo,     HHI_GCLK_MPEG1, 11);
4199 static MESON_GATE(g12a_adc,         HHI_GCLK_MPEG1, 13);
4200 static MESON_GATE(g12a_uart1,           HHI_GCLK_MPEG1, 16);
4201 static MESON_GATE(g12a_g2d,         HHI_GCLK_MPEG1, 20);
4202 static MESON_GATE(g12a_reset,           HHI_GCLK_MPEG1, 23);
4203 static MESON_GATE(g12a_pcie_comb,       HHI_GCLK_MPEG1, 24);
4204 static MESON_GATE(g12a_parser,          HHI_GCLK_MPEG1, 25);
4205 static MESON_GATE(g12a_usb_general,     HHI_GCLK_MPEG1, 26);
4206 static MESON_GATE(g12a_pcie_phy,        HHI_GCLK_MPEG1, 27);
4207 static MESON_GATE(g12a_ahb_arb0,        HHI_GCLK_MPEG1, 29);
4208 
4209 static MESON_GATE(g12a_ahb_data_bus,        HHI_GCLK_MPEG2, 1);
4210 static MESON_GATE(g12a_ahb_ctrl_bus,        HHI_GCLK_MPEG2, 2);
4211 static MESON_GATE(g12a_htx_hdcp22,      HHI_GCLK_MPEG2, 3);
4212 static MESON_GATE(g12a_htx_pclk,        HHI_GCLK_MPEG2, 4);
4213 static MESON_GATE(g12a_bt656,           HHI_GCLK_MPEG2, 6);
4214 static MESON_GATE(g12a_usb1_to_ddr,     HHI_GCLK_MPEG2, 8);
4215 static MESON_GATE(g12a_mmc_pclk,        HHI_GCLK_MPEG2, 11);
4216 static MESON_GATE(g12a_uart2,           HHI_GCLK_MPEG2, 15);
4217 static MESON_GATE(g12a_vpu_intr,        HHI_GCLK_MPEG2, 25);
4218 static MESON_GATE(g12a_gic,         HHI_GCLK_MPEG2, 30);
4219 
4220 static MESON_GATE(g12a_vclk2_venci0,        HHI_GCLK_OTHER, 1);
4221 static MESON_GATE(g12a_vclk2_venci1,        HHI_GCLK_OTHER, 2);
4222 static MESON_GATE(g12a_vclk2_vencp0,        HHI_GCLK_OTHER, 3);
4223 static MESON_GATE(g12a_vclk2_vencp1,        HHI_GCLK_OTHER, 4);
4224 static MESON_GATE(g12a_vclk2_venct0,        HHI_GCLK_OTHER, 5);
4225 static MESON_GATE(g12a_vclk2_venct1,        HHI_GCLK_OTHER, 6);
4226 static MESON_GATE(g12a_vclk2_other,     HHI_GCLK_OTHER, 7);
4227 static MESON_GATE(g12a_vclk2_enci,      HHI_GCLK_OTHER, 8);
4228 static MESON_GATE(g12a_vclk2_encp,      HHI_GCLK_OTHER, 9);
4229 static MESON_GATE(g12a_dac_clk,         HHI_GCLK_OTHER, 10);
4230 static MESON_GATE(g12a_aoclk_gate,      HHI_GCLK_OTHER, 14);
4231 static MESON_GATE(g12a_iec958_gate,     HHI_GCLK_OTHER, 16);
4232 static MESON_GATE(g12a_enc480p,         HHI_GCLK_OTHER, 20);
4233 static MESON_GATE(g12a_rng1,            HHI_GCLK_OTHER, 21);
4234 static MESON_GATE(g12a_vclk2_enct,      HHI_GCLK_OTHER, 22);
4235 static MESON_GATE(g12a_vclk2_encl,      HHI_GCLK_OTHER, 23);
4236 static MESON_GATE(g12a_vclk2_venclmmc,      HHI_GCLK_OTHER, 24);
4237 static MESON_GATE(g12a_vclk2_vencl,     HHI_GCLK_OTHER, 25);
4238 static MESON_GATE(g12a_vclk2_other1,        HHI_GCLK_OTHER, 26);
4239 
4240 static MESON_GATE_RO(g12a_dma,          HHI_GCLK_OTHER2, 0);
4241 static MESON_GATE_RO(g12a_efuse,        HHI_GCLK_OTHER2, 1);
4242 static MESON_GATE_RO(g12a_rom_boot,     HHI_GCLK_OTHER2, 2);
4243 static MESON_GATE_RO(g12a_reset_sec,        HHI_GCLK_OTHER2, 3);
4244 static MESON_GATE_RO(g12a_sec_ahb_apb3,     HHI_GCLK_OTHER2, 4);
4245 
4246 /* Array of all clocks provided by this provider */
4247 static 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 
4476 static 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 
4740 static 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 */
4990 static 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 
5236 static const struct reg_sequence g12a_init_regs[] = {
5237     { .reg = HHI_MPLL_CNTL0,    .def = 0x00000543 },
5238 };
5239 
5240 #define DVFS_CON_ID "dvfs"
5241 
5242 static 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 
5275 static 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 
5352 static 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 
5384 struct meson_g12a_data {
5385     const struct meson_eeclkc_data eeclkc_data;
5386     int (*dvfs_setup)(struct platform_device *pdev);
5387 };
5388 
5389 static 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 
5412 static 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 
5423 static 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 
5432 static 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 
5441 static 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 };
5456 MODULE_DEVICE_TABLE(of, clkc_match_table);
5457 
5458 static 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 
5466 module_platform_driver(g12a_driver);
5467 MODULE_LICENSE("GPL v2");