cachepc-linux

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

axg.c (53806B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * AmLogic Meson-AXG Clock Controller Driver
      4 *
      5 * Copyright (c) 2016 Baylibre SAS.
      6 * Author: Michael Turquette <mturquette@baylibre.com>
      7 *
      8 * Copyright (c) 2017 Amlogic, inc.
      9 * Author: Qiufang Dai <qiufang.dai@amlogic.com>
     10 */
     11
     12#include <linux/clk-provider.h>
     13#include <linux/init.h>
     14#include <linux/of_device.h>
     15#include <linux/platform_device.h>
     16#include <linux/module.h>
     17
     18#include "clk-regmap.h"
     19#include "clk-pll.h"
     20#include "clk-mpll.h"
     21#include "axg.h"
     22#include "meson-eeclk.h"
     23
     24static DEFINE_SPINLOCK(meson_clk_lock);
     25
     26static struct clk_regmap axg_fixed_pll_dco = {
     27	.data = &(struct meson_clk_pll_data){
     28		.en = {
     29			.reg_off = HHI_MPLL_CNTL,
     30			.shift   = 30,
     31			.width   = 1,
     32		},
     33		.m = {
     34			.reg_off = HHI_MPLL_CNTL,
     35			.shift   = 0,
     36			.width   = 9,
     37		},
     38		.n = {
     39			.reg_off = HHI_MPLL_CNTL,
     40			.shift   = 9,
     41			.width   = 5,
     42		},
     43		.frac = {
     44			.reg_off = HHI_MPLL_CNTL2,
     45			.shift   = 0,
     46			.width   = 12,
     47		},
     48		.l = {
     49			.reg_off = HHI_MPLL_CNTL,
     50			.shift   = 31,
     51			.width   = 1,
     52		},
     53		.rst = {
     54			.reg_off = HHI_MPLL_CNTL,
     55			.shift   = 29,
     56			.width   = 1,
     57		},
     58	},
     59	.hw.init = &(struct clk_init_data){
     60		.name = "fixed_pll_dco",
     61		.ops = &meson_clk_pll_ro_ops,
     62		.parent_data = &(const struct clk_parent_data) {
     63			.fw_name = "xtal",
     64		},
     65		.num_parents = 1,
     66	},
     67};
     68
     69static struct clk_regmap axg_fixed_pll = {
     70	.data = &(struct clk_regmap_div_data){
     71		.offset = HHI_MPLL_CNTL,
     72		.shift = 16,
     73		.width = 2,
     74		.flags = CLK_DIVIDER_POWER_OF_TWO,
     75	},
     76	.hw.init = &(struct clk_init_data){
     77		.name = "fixed_pll",
     78		.ops = &clk_regmap_divider_ro_ops,
     79		.parent_hws = (const struct clk_hw *[]) {
     80			&axg_fixed_pll_dco.hw
     81		},
     82		.num_parents = 1,
     83		/*
     84		 * This clock won't ever change at runtime so
     85		 * CLK_SET_RATE_PARENT is not required
     86		 */
     87	},
     88};
     89
     90static struct clk_regmap axg_sys_pll_dco = {
     91	.data = &(struct meson_clk_pll_data){
     92		.en = {
     93			.reg_off = HHI_SYS_PLL_CNTL,
     94			.shift   = 30,
     95			.width   = 1,
     96		},
     97		.m = {
     98			.reg_off = HHI_SYS_PLL_CNTL,
     99			.shift   = 0,
    100			.width   = 9,
    101		},
    102		.n = {
    103			.reg_off = HHI_SYS_PLL_CNTL,
    104			.shift   = 9,
    105			.width   = 5,
    106		},
    107		.l = {
    108			.reg_off = HHI_SYS_PLL_CNTL,
    109			.shift   = 31,
    110			.width   = 1,
    111		},
    112		.rst = {
    113			.reg_off = HHI_SYS_PLL_CNTL,
    114			.shift   = 29,
    115			.width   = 1,
    116		},
    117	},
    118	.hw.init = &(struct clk_init_data){
    119		.name = "sys_pll_dco",
    120		.ops = &meson_clk_pll_ro_ops,
    121		.parent_data = &(const struct clk_parent_data) {
    122			.fw_name = "xtal",
    123		},
    124		.num_parents = 1,
    125	},
    126};
    127
    128static struct clk_regmap axg_sys_pll = {
    129	.data = &(struct clk_regmap_div_data){
    130		.offset = HHI_SYS_PLL_CNTL,
    131		.shift = 16,
    132		.width = 2,
    133		.flags = CLK_DIVIDER_POWER_OF_TWO,
    134	},
    135	.hw.init = &(struct clk_init_data){
    136		.name = "sys_pll",
    137		.ops = &clk_regmap_divider_ro_ops,
    138		.parent_hws = (const struct clk_hw *[]) {
    139			&axg_sys_pll_dco.hw
    140		},
    141		.num_parents = 1,
    142		.flags = CLK_SET_RATE_PARENT,
    143	},
    144};
    145
    146static const struct pll_params_table axg_gp0_pll_params_table[] = {
    147	PLL_PARAMS(40, 1),
    148	PLL_PARAMS(41, 1),
    149	PLL_PARAMS(42, 1),
    150	PLL_PARAMS(43, 1),
    151	PLL_PARAMS(44, 1),
    152	PLL_PARAMS(45, 1),
    153	PLL_PARAMS(46, 1),
    154	PLL_PARAMS(47, 1),
    155	PLL_PARAMS(48, 1),
    156	PLL_PARAMS(49, 1),
    157	PLL_PARAMS(50, 1),
    158	PLL_PARAMS(51, 1),
    159	PLL_PARAMS(52, 1),
    160	PLL_PARAMS(53, 1),
    161	PLL_PARAMS(54, 1),
    162	PLL_PARAMS(55, 1),
    163	PLL_PARAMS(56, 1),
    164	PLL_PARAMS(57, 1),
    165	PLL_PARAMS(58, 1),
    166	PLL_PARAMS(59, 1),
    167	PLL_PARAMS(60, 1),
    168	PLL_PARAMS(61, 1),
    169	PLL_PARAMS(62, 1),
    170	PLL_PARAMS(63, 1),
    171	PLL_PARAMS(64, 1),
    172	PLL_PARAMS(65, 1),
    173	PLL_PARAMS(66, 1),
    174	PLL_PARAMS(67, 1),
    175	PLL_PARAMS(68, 1),
    176	{ /* sentinel */ },
    177};
    178
    179static const struct reg_sequence axg_gp0_init_regs[] = {
    180	{ .reg = HHI_GP0_PLL_CNTL1,	.def = 0xc084b000 },
    181	{ .reg = HHI_GP0_PLL_CNTL2,	.def = 0xb75020be },
    182	{ .reg = HHI_GP0_PLL_CNTL3,	.def = 0x0a59a288 },
    183	{ .reg = HHI_GP0_PLL_CNTL4,	.def = 0xc000004d },
    184	{ .reg = HHI_GP0_PLL_CNTL5,	.def = 0x00078000 },
    185};
    186
    187static struct clk_regmap axg_gp0_pll_dco = {
    188	.data = &(struct meson_clk_pll_data){
    189		.en = {
    190			.reg_off = HHI_GP0_PLL_CNTL,
    191			.shift   = 30,
    192			.width   = 1,
    193		},
    194		.m = {
    195			.reg_off = HHI_GP0_PLL_CNTL,
    196			.shift   = 0,
    197			.width   = 9,
    198		},
    199		.n = {
    200			.reg_off = HHI_GP0_PLL_CNTL,
    201			.shift   = 9,
    202			.width   = 5,
    203		},
    204		.frac = {
    205			.reg_off = HHI_GP0_PLL_CNTL1,
    206			.shift   = 0,
    207			.width   = 10,
    208		},
    209		.l = {
    210			.reg_off = HHI_GP0_PLL_CNTL,
    211			.shift   = 31,
    212			.width   = 1,
    213		},
    214		.rst = {
    215			.reg_off = HHI_GP0_PLL_CNTL,
    216			.shift   = 29,
    217			.width   = 1,
    218		},
    219		.table = axg_gp0_pll_params_table,
    220		.init_regs = axg_gp0_init_regs,
    221		.init_count = ARRAY_SIZE(axg_gp0_init_regs),
    222	},
    223	.hw.init = &(struct clk_init_data){
    224		.name = "gp0_pll_dco",
    225		.ops = &meson_clk_pll_ops,
    226		.parent_data = &(const struct clk_parent_data) {
    227			.fw_name = "xtal",
    228		},
    229		.num_parents = 1,
    230	},
    231};
    232
    233static struct clk_regmap axg_gp0_pll = {
    234	.data = &(struct clk_regmap_div_data){
    235		.offset = HHI_GP0_PLL_CNTL,
    236		.shift = 16,
    237		.width = 2,
    238		.flags = CLK_DIVIDER_POWER_OF_TWO,
    239	},
    240	.hw.init = &(struct clk_init_data){
    241		.name = "gp0_pll",
    242		.ops = &clk_regmap_divider_ops,
    243		.parent_hws = (const struct clk_hw *[]) {
    244			&axg_gp0_pll_dco.hw
    245		},
    246		.num_parents = 1,
    247		.flags = CLK_SET_RATE_PARENT,
    248	},
    249};
    250
    251static const struct reg_sequence axg_hifi_init_regs[] = {
    252	{ .reg = HHI_HIFI_PLL_CNTL1,	.def = 0xc084b000 },
    253	{ .reg = HHI_HIFI_PLL_CNTL2,	.def = 0xb75020be },
    254	{ .reg = HHI_HIFI_PLL_CNTL3,	.def = 0x0a6a3a88 },
    255	{ .reg = HHI_HIFI_PLL_CNTL4,	.def = 0xc000004d },
    256	{ .reg = HHI_HIFI_PLL_CNTL5,	.def = 0x00058000 },
    257};
    258
    259static struct clk_regmap axg_hifi_pll_dco = {
    260	.data = &(struct meson_clk_pll_data){
    261		.en = {
    262			.reg_off = HHI_HIFI_PLL_CNTL,
    263			.shift   = 30,
    264			.width   = 1,
    265		},
    266		.m = {
    267			.reg_off = HHI_HIFI_PLL_CNTL,
    268			.shift   = 0,
    269			.width   = 9,
    270		},
    271		.n = {
    272			.reg_off = HHI_HIFI_PLL_CNTL,
    273			.shift   = 9,
    274			.width   = 5,
    275		},
    276		.frac = {
    277			.reg_off = HHI_HIFI_PLL_CNTL5,
    278			.shift   = 0,
    279			.width   = 13,
    280		},
    281		.l = {
    282			.reg_off = HHI_HIFI_PLL_CNTL,
    283			.shift   = 31,
    284			.width   = 1,
    285		},
    286		.rst = {
    287			.reg_off = HHI_HIFI_PLL_CNTL,
    288			.shift   = 29,
    289			.width   = 1,
    290		},
    291		.table = axg_gp0_pll_params_table,
    292		.init_regs = axg_hifi_init_regs,
    293		.init_count = ARRAY_SIZE(axg_hifi_init_regs),
    294		.flags = CLK_MESON_PLL_ROUND_CLOSEST,
    295	},
    296	.hw.init = &(struct clk_init_data){
    297		.name = "hifi_pll_dco",
    298		.ops = &meson_clk_pll_ops,
    299		.parent_data = &(const struct clk_parent_data) {
    300			.fw_name = "xtal",
    301		},
    302		.num_parents = 1,
    303	},
    304};
    305
    306static struct clk_regmap axg_hifi_pll = {
    307	.data = &(struct clk_regmap_div_data){
    308		.offset = HHI_HIFI_PLL_CNTL,
    309		.shift = 16,
    310		.width = 2,
    311		.flags = CLK_DIVIDER_POWER_OF_TWO,
    312	},
    313	.hw.init = &(struct clk_init_data){
    314		.name = "hifi_pll",
    315		.ops = &clk_regmap_divider_ops,
    316		.parent_hws = (const struct clk_hw *[]) {
    317			&axg_hifi_pll_dco.hw
    318		},
    319		.num_parents = 1,
    320		.flags = CLK_SET_RATE_PARENT,
    321	},
    322};
    323
    324static struct clk_fixed_factor axg_fclk_div2_div = {
    325	.mult = 1,
    326	.div = 2,
    327	.hw.init = &(struct clk_init_data){
    328		.name = "fclk_div2_div",
    329		.ops = &clk_fixed_factor_ops,
    330		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
    331		.num_parents = 1,
    332	},
    333};
    334
    335static struct clk_regmap axg_fclk_div2 = {
    336	.data = &(struct clk_regmap_gate_data){
    337		.offset = HHI_MPLL_CNTL6,
    338		.bit_idx = 27,
    339	},
    340	.hw.init = &(struct clk_init_data){
    341		.name = "fclk_div2",
    342		.ops = &clk_regmap_gate_ops,
    343		.parent_hws = (const struct clk_hw *[]) {
    344			&axg_fclk_div2_div.hw
    345		},
    346		.num_parents = 1,
    347		.flags = CLK_IS_CRITICAL,
    348	},
    349};
    350
    351static struct clk_fixed_factor axg_fclk_div3_div = {
    352	.mult = 1,
    353	.div = 3,
    354	.hw.init = &(struct clk_init_data){
    355		.name = "fclk_div3_div",
    356		.ops = &clk_fixed_factor_ops,
    357		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
    358		.num_parents = 1,
    359	},
    360};
    361
    362static struct clk_regmap axg_fclk_div3 = {
    363	.data = &(struct clk_regmap_gate_data){
    364		.offset = HHI_MPLL_CNTL6,
    365		.bit_idx = 28,
    366	},
    367	.hw.init = &(struct clk_init_data){
    368		.name = "fclk_div3",
    369		.ops = &clk_regmap_gate_ops,
    370		.parent_hws = (const struct clk_hw *[]) {
    371			&axg_fclk_div3_div.hw
    372		},
    373		.num_parents = 1,
    374		/*
    375		 * FIXME:
    376		 * This clock, as fdiv2, is used by the SCPI FW and is required
    377		 * by the platform to operate correctly.
    378		 * Until the following condition are met, we need this clock to
    379		 * be marked as critical:
    380		 * a) The SCPI generic driver claims and enable all the clocks
    381		 *    it needs
    382		 * b) CCF has a clock hand-off mechanism to make the sure the
    383		 *    clock stays on until the proper driver comes along
    384		 */
    385		.flags = CLK_IS_CRITICAL,
    386	},
    387};
    388
    389static struct clk_fixed_factor axg_fclk_div4_div = {
    390	.mult = 1,
    391	.div = 4,
    392	.hw.init = &(struct clk_init_data){
    393		.name = "fclk_div4_div",
    394		.ops = &clk_fixed_factor_ops,
    395		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
    396		.num_parents = 1,
    397	},
    398};
    399
    400static struct clk_regmap axg_fclk_div4 = {
    401	.data = &(struct clk_regmap_gate_data){
    402		.offset = HHI_MPLL_CNTL6,
    403		.bit_idx = 29,
    404	},
    405	.hw.init = &(struct clk_init_data){
    406		.name = "fclk_div4",
    407		.ops = &clk_regmap_gate_ops,
    408		.parent_hws = (const struct clk_hw *[]) {
    409			&axg_fclk_div4_div.hw
    410		},
    411		.num_parents = 1,
    412	},
    413};
    414
    415static struct clk_fixed_factor axg_fclk_div5_div = {
    416	.mult = 1,
    417	.div = 5,
    418	.hw.init = &(struct clk_init_data){
    419		.name = "fclk_div5_div",
    420		.ops = &clk_fixed_factor_ops,
    421		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
    422		.num_parents = 1,
    423	},
    424};
    425
    426static struct clk_regmap axg_fclk_div5 = {
    427	.data = &(struct clk_regmap_gate_data){
    428		.offset = HHI_MPLL_CNTL6,
    429		.bit_idx = 30,
    430	},
    431	.hw.init = &(struct clk_init_data){
    432		.name = "fclk_div5",
    433		.ops = &clk_regmap_gate_ops,
    434		.parent_hws = (const struct clk_hw *[]) {
    435			&axg_fclk_div5_div.hw
    436		},
    437		.num_parents = 1,
    438	},
    439};
    440
    441static struct clk_fixed_factor axg_fclk_div7_div = {
    442	.mult = 1,
    443	.div = 7,
    444	.hw.init = &(struct clk_init_data){
    445		.name = "fclk_div7_div",
    446		.ops = &clk_fixed_factor_ops,
    447		.parent_hws = (const struct clk_hw *[]) {
    448			&axg_fixed_pll.hw
    449		},
    450		.num_parents = 1,
    451	},
    452};
    453
    454static struct clk_regmap axg_fclk_div7 = {
    455	.data = &(struct clk_regmap_gate_data){
    456		.offset = HHI_MPLL_CNTL6,
    457		.bit_idx = 31,
    458	},
    459	.hw.init = &(struct clk_init_data){
    460		.name = "fclk_div7",
    461		.ops = &clk_regmap_gate_ops,
    462		.parent_hws = (const struct clk_hw *[]) {
    463			&axg_fclk_div7_div.hw
    464		},
    465		.num_parents = 1,
    466	},
    467};
    468
    469static struct clk_regmap axg_mpll_prediv = {
    470	.data = &(struct clk_regmap_div_data){
    471		.offset = HHI_MPLL_CNTL5,
    472		.shift = 12,
    473		.width = 1,
    474	},
    475	.hw.init = &(struct clk_init_data){
    476		.name = "mpll_prediv",
    477		.ops = &clk_regmap_divider_ro_ops,
    478		.parent_hws = (const struct clk_hw *[]) {
    479			&axg_fixed_pll.hw
    480		},
    481		.num_parents = 1,
    482	},
    483};
    484
    485static struct clk_regmap axg_mpll0_div = {
    486	.data = &(struct meson_clk_mpll_data){
    487		.sdm = {
    488			.reg_off = HHI_MPLL_CNTL7,
    489			.shift   = 0,
    490			.width   = 14,
    491		},
    492		.sdm_en = {
    493			.reg_off = HHI_MPLL_CNTL7,
    494			.shift   = 15,
    495			.width	 = 1,
    496		},
    497		.n2 = {
    498			.reg_off = HHI_MPLL_CNTL7,
    499			.shift   = 16,
    500			.width   = 9,
    501		},
    502		.misc = {
    503			.reg_off = HHI_PLL_TOP_MISC,
    504			.shift   = 0,
    505			.width	 = 1,
    506		},
    507		.lock = &meson_clk_lock,
    508		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
    509	},
    510	.hw.init = &(struct clk_init_data){
    511		.name = "mpll0_div",
    512		.ops = &meson_clk_mpll_ops,
    513		.parent_hws = (const struct clk_hw *[]) {
    514			&axg_mpll_prediv.hw
    515		},
    516		.num_parents = 1,
    517	},
    518};
    519
    520static struct clk_regmap axg_mpll0 = {
    521	.data = &(struct clk_regmap_gate_data){
    522		.offset = HHI_MPLL_CNTL7,
    523		.bit_idx = 14,
    524	},
    525	.hw.init = &(struct clk_init_data){
    526		.name = "mpll0",
    527		.ops = &clk_regmap_gate_ops,
    528		.parent_hws = (const struct clk_hw *[]) {
    529			&axg_mpll0_div.hw
    530		},
    531		.num_parents = 1,
    532		.flags = CLK_SET_RATE_PARENT,
    533	},
    534};
    535
    536static struct clk_regmap axg_mpll1_div = {
    537	.data = &(struct meson_clk_mpll_data){
    538		.sdm = {
    539			.reg_off = HHI_MPLL_CNTL8,
    540			.shift   = 0,
    541			.width   = 14,
    542		},
    543		.sdm_en = {
    544			.reg_off = HHI_MPLL_CNTL8,
    545			.shift   = 15,
    546			.width	 = 1,
    547		},
    548		.n2 = {
    549			.reg_off = HHI_MPLL_CNTL8,
    550			.shift   = 16,
    551			.width   = 9,
    552		},
    553		.misc = {
    554			.reg_off = HHI_PLL_TOP_MISC,
    555			.shift   = 1,
    556			.width	 = 1,
    557		},
    558		.lock = &meson_clk_lock,
    559		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
    560	},
    561	.hw.init = &(struct clk_init_data){
    562		.name = "mpll1_div",
    563		.ops = &meson_clk_mpll_ops,
    564		.parent_hws = (const struct clk_hw *[]) {
    565			&axg_mpll_prediv.hw
    566		},
    567		.num_parents = 1,
    568	},
    569};
    570
    571static struct clk_regmap axg_mpll1 = {
    572	.data = &(struct clk_regmap_gate_data){
    573		.offset = HHI_MPLL_CNTL8,
    574		.bit_idx = 14,
    575	},
    576	.hw.init = &(struct clk_init_data){
    577		.name = "mpll1",
    578		.ops = &clk_regmap_gate_ops,
    579		.parent_hws = (const struct clk_hw *[]) {
    580			&axg_mpll1_div.hw
    581		},
    582		.num_parents = 1,
    583		.flags = CLK_SET_RATE_PARENT,
    584	},
    585};
    586
    587static struct clk_regmap axg_mpll2_div = {
    588	.data = &(struct meson_clk_mpll_data){
    589		.sdm = {
    590			.reg_off = HHI_MPLL_CNTL9,
    591			.shift   = 0,
    592			.width   = 14,
    593		},
    594		.sdm_en = {
    595			.reg_off = HHI_MPLL_CNTL9,
    596			.shift   = 15,
    597			.width	 = 1,
    598		},
    599		.n2 = {
    600			.reg_off = HHI_MPLL_CNTL9,
    601			.shift   = 16,
    602			.width   = 9,
    603		},
    604		.ssen = {
    605			.reg_off = HHI_MPLL_CNTL,
    606			.shift   = 25,
    607			.width	 = 1,
    608		},
    609		.misc = {
    610			.reg_off = HHI_PLL_TOP_MISC,
    611			.shift   = 2,
    612			.width	 = 1,
    613		},
    614		.lock = &meson_clk_lock,
    615		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
    616	},
    617	.hw.init = &(struct clk_init_data){
    618		.name = "mpll2_div",
    619		.ops = &meson_clk_mpll_ops,
    620		.parent_hws = (const struct clk_hw *[]) {
    621			&axg_mpll_prediv.hw
    622		},
    623		.num_parents = 1,
    624	},
    625};
    626
    627static struct clk_regmap axg_mpll2 = {
    628	.data = &(struct clk_regmap_gate_data){
    629		.offset = HHI_MPLL_CNTL9,
    630		.bit_idx = 14,
    631	},
    632	.hw.init = &(struct clk_init_data){
    633		.name = "mpll2",
    634		.ops = &clk_regmap_gate_ops,
    635		.parent_hws = (const struct clk_hw *[]) {
    636			&axg_mpll2_div.hw
    637		},
    638		.num_parents = 1,
    639		.flags = CLK_SET_RATE_PARENT,
    640	},
    641};
    642
    643static struct clk_regmap axg_mpll3_div = {
    644	.data = &(struct meson_clk_mpll_data){
    645		.sdm = {
    646			.reg_off = HHI_MPLL3_CNTL0,
    647			.shift   = 12,
    648			.width   = 14,
    649		},
    650		.sdm_en = {
    651			.reg_off = HHI_MPLL3_CNTL0,
    652			.shift   = 11,
    653			.width	 = 1,
    654		},
    655		.n2 = {
    656			.reg_off = HHI_MPLL3_CNTL0,
    657			.shift   = 2,
    658			.width   = 9,
    659		},
    660		.misc = {
    661			.reg_off = HHI_PLL_TOP_MISC,
    662			.shift   = 3,
    663			.width	 = 1,
    664		},
    665		.lock = &meson_clk_lock,
    666		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
    667	},
    668	.hw.init = &(struct clk_init_data){
    669		.name = "mpll3_div",
    670		.ops = &meson_clk_mpll_ops,
    671		.parent_hws = (const struct clk_hw *[]) {
    672			&axg_mpll_prediv.hw
    673		},
    674		.num_parents = 1,
    675	},
    676};
    677
    678static struct clk_regmap axg_mpll3 = {
    679	.data = &(struct clk_regmap_gate_data){
    680		.offset = HHI_MPLL3_CNTL0,
    681		.bit_idx = 0,
    682	},
    683	.hw.init = &(struct clk_init_data){
    684		.name = "mpll3",
    685		.ops = &clk_regmap_gate_ops,
    686		.parent_hws = (const struct clk_hw *[]) {
    687			&axg_mpll3_div.hw
    688		},
    689		.num_parents = 1,
    690		.flags = CLK_SET_RATE_PARENT,
    691	},
    692};
    693
    694static const struct pll_params_table axg_pcie_pll_params_table[] = {
    695	{
    696		.m = 200,
    697		.n = 3,
    698	},
    699	{ /* sentinel */ },
    700};
    701
    702static const struct reg_sequence axg_pcie_init_regs[] = {
    703	{ .reg = HHI_PCIE_PLL_CNTL1,	.def = 0x0084a2aa },
    704	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0xb75020be },
    705	{ .reg = HHI_PCIE_PLL_CNTL3,	.def = 0x0a47488e },
    706	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0xc000004d },
    707	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x00078000 },
    708	{ .reg = HHI_PCIE_PLL_CNTL6,	.def = 0x002323c6 },
    709	{ .reg = HHI_PCIE_PLL_CNTL,     .def = 0x400106c8 },
    710};
    711
    712static struct clk_regmap axg_pcie_pll_dco = {
    713	.data = &(struct meson_clk_pll_data){
    714		.en = {
    715			.reg_off = HHI_PCIE_PLL_CNTL,
    716			.shift   = 30,
    717			.width   = 1,
    718		},
    719		.m = {
    720			.reg_off = HHI_PCIE_PLL_CNTL,
    721			.shift   = 0,
    722			.width   = 9,
    723		},
    724		.n = {
    725			.reg_off = HHI_PCIE_PLL_CNTL,
    726			.shift   = 9,
    727			.width   = 5,
    728		},
    729		.frac = {
    730			.reg_off = HHI_PCIE_PLL_CNTL1,
    731			.shift   = 0,
    732			.width   = 12,
    733		},
    734		.l = {
    735			.reg_off = HHI_PCIE_PLL_CNTL,
    736			.shift   = 31,
    737			.width   = 1,
    738		},
    739		.rst = {
    740			.reg_off = HHI_PCIE_PLL_CNTL,
    741			.shift   = 29,
    742			.width   = 1,
    743		},
    744		.table = axg_pcie_pll_params_table,
    745		.init_regs = axg_pcie_init_regs,
    746		.init_count = ARRAY_SIZE(axg_pcie_init_regs),
    747	},
    748	.hw.init = &(struct clk_init_data){
    749		.name = "pcie_pll_dco",
    750		.ops = &meson_clk_pll_ops,
    751		.parent_data = &(const struct clk_parent_data) {
    752			.fw_name = "xtal",
    753		},
    754		.num_parents = 1,
    755	},
    756};
    757
    758static struct clk_regmap axg_pcie_pll_od = {
    759	.data = &(struct clk_regmap_div_data){
    760		.offset = HHI_PCIE_PLL_CNTL,
    761		.shift = 16,
    762		.width = 2,
    763		.flags = CLK_DIVIDER_POWER_OF_TWO,
    764	},
    765	.hw.init = &(struct clk_init_data){
    766		.name = "pcie_pll_od",
    767		.ops = &clk_regmap_divider_ops,
    768		.parent_hws = (const struct clk_hw *[]) {
    769			&axg_pcie_pll_dco.hw
    770		},
    771		.num_parents = 1,
    772		.flags = CLK_SET_RATE_PARENT,
    773	},
    774};
    775
    776static struct clk_regmap axg_pcie_pll = {
    777	.data = &(struct clk_regmap_div_data){
    778		.offset = HHI_PCIE_PLL_CNTL6,
    779		.shift = 6,
    780		.width = 2,
    781		.flags = CLK_DIVIDER_POWER_OF_TWO,
    782	},
    783	.hw.init = &(struct clk_init_data){
    784		.name = "pcie_pll",
    785		.ops = &clk_regmap_divider_ops,
    786		.parent_hws = (const struct clk_hw *[]) {
    787			&axg_pcie_pll_od.hw
    788		},
    789		.num_parents = 1,
    790		.flags = CLK_SET_RATE_PARENT,
    791	},
    792};
    793
    794static struct clk_regmap axg_pcie_mux = {
    795	.data = &(struct clk_regmap_mux_data){
    796		.offset = HHI_PCIE_PLL_CNTL6,
    797		.mask = 0x1,
    798		.shift = 2,
    799		/* skip the parent mpll3, reserved for debug */
    800		.table = (u32[]){ 1 },
    801	},
    802	.hw.init = &(struct clk_init_data){
    803		.name = "pcie_mux",
    804		.ops = &clk_regmap_mux_ops,
    805		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_pll.hw },
    806		.num_parents = 1,
    807		.flags = CLK_SET_RATE_PARENT,
    808	},
    809};
    810
    811static struct clk_regmap axg_pcie_ref = {
    812	.data = &(struct clk_regmap_mux_data){
    813		.offset = HHI_PCIE_PLL_CNTL6,
    814		.mask = 0x1,
    815		.shift = 1,
    816		/* skip the parent 0, reserved for debug */
    817		.table = (u32[]){ 1 },
    818	},
    819	.hw.init = &(struct clk_init_data){
    820		.name = "pcie_ref",
    821		.ops = &clk_regmap_mux_ops,
    822		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_mux.hw },
    823		.num_parents = 1,
    824		.flags = CLK_SET_RATE_PARENT,
    825	},
    826};
    827
    828static struct clk_regmap axg_pcie_cml_en0 = {
    829	.data = &(struct clk_regmap_gate_data){
    830		.offset = HHI_PCIE_PLL_CNTL6,
    831		.bit_idx = 4,
    832	},
    833	.hw.init = &(struct clk_init_data) {
    834		.name = "pcie_cml_en0",
    835		.ops = &clk_regmap_gate_ops,
    836		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
    837		.num_parents = 1,
    838		.flags = CLK_SET_RATE_PARENT,
    839
    840	},
    841};
    842
    843static struct clk_regmap axg_pcie_cml_en1 = {
    844	.data = &(struct clk_regmap_gate_data){
    845		.offset = HHI_PCIE_PLL_CNTL6,
    846		.bit_idx = 3,
    847	},
    848	.hw.init = &(struct clk_init_data) {
    849		.name = "pcie_cml_en1",
    850		.ops = &clk_regmap_gate_ops,
    851		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
    852		.num_parents = 1,
    853		.flags = CLK_SET_RATE_PARENT,
    854	},
    855};
    856
    857static u32 mux_table_clk81[]	= { 0, 2, 3, 4, 5, 6, 7 };
    858static const struct clk_parent_data clk81_parent_data[] = {
    859	{ .fw_name = "xtal", },
    860	{ .hw = &axg_fclk_div7.hw },
    861	{ .hw = &axg_mpll1.hw },
    862	{ .hw = &axg_mpll2.hw },
    863	{ .hw = &axg_fclk_div4.hw },
    864	{ .hw = &axg_fclk_div3.hw },
    865	{ .hw = &axg_fclk_div5.hw },
    866};
    867
    868static struct clk_regmap axg_mpeg_clk_sel = {
    869	.data = &(struct clk_regmap_mux_data){
    870		.offset = HHI_MPEG_CLK_CNTL,
    871		.mask = 0x7,
    872		.shift = 12,
    873		.table = mux_table_clk81,
    874	},
    875	.hw.init = &(struct clk_init_data){
    876		.name = "mpeg_clk_sel",
    877		.ops = &clk_regmap_mux_ro_ops,
    878		.parent_data = clk81_parent_data,
    879		.num_parents = ARRAY_SIZE(clk81_parent_data),
    880	},
    881};
    882
    883static struct clk_regmap axg_mpeg_clk_div = {
    884	.data = &(struct clk_regmap_div_data){
    885		.offset = HHI_MPEG_CLK_CNTL,
    886		.shift = 0,
    887		.width = 7,
    888	},
    889	.hw.init = &(struct clk_init_data){
    890		.name = "mpeg_clk_div",
    891		.ops = &clk_regmap_divider_ops,
    892		.parent_hws = (const struct clk_hw *[]) {
    893			&axg_mpeg_clk_sel.hw
    894		},
    895		.num_parents = 1,
    896		.flags = CLK_SET_RATE_PARENT,
    897	},
    898};
    899
    900static struct clk_regmap axg_clk81 = {
    901	.data = &(struct clk_regmap_gate_data){
    902		.offset = HHI_MPEG_CLK_CNTL,
    903		.bit_idx = 7,
    904	},
    905	.hw.init = &(struct clk_init_data){
    906		.name = "clk81",
    907		.ops = &clk_regmap_gate_ops,
    908		.parent_hws = (const struct clk_hw *[]) {
    909			&axg_mpeg_clk_div.hw
    910		},
    911		.num_parents = 1,
    912		.flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
    913	},
    914};
    915
    916static const struct clk_parent_data axg_sd_emmc_clk0_parent_data[] = {
    917	{ .fw_name = "xtal", },
    918	{ .hw = &axg_fclk_div2.hw },
    919	{ .hw = &axg_fclk_div3.hw },
    920	{ .hw = &axg_fclk_div5.hw },
    921	{ .hw = &axg_fclk_div7.hw },
    922	/*
    923	 * Following these parent clocks, we should also have had mpll2, mpll3
    924	 * and gp0_pll but these clocks are too precious to be used here. All
    925	 * the necessary rates for MMC and NAND operation can be acheived using
    926	 * xtal or fclk_div clocks
    927	 */
    928};
    929
    930/* SDcard clock */
    931static struct clk_regmap axg_sd_emmc_b_clk0_sel = {
    932	.data = &(struct clk_regmap_mux_data){
    933		.offset = HHI_SD_EMMC_CLK_CNTL,
    934		.mask = 0x7,
    935		.shift = 25,
    936	},
    937	.hw.init = &(struct clk_init_data) {
    938		.name = "sd_emmc_b_clk0_sel",
    939		.ops = &clk_regmap_mux_ops,
    940		.parent_data = axg_sd_emmc_clk0_parent_data,
    941		.num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
    942		.flags = CLK_SET_RATE_PARENT,
    943	},
    944};
    945
    946static struct clk_regmap axg_sd_emmc_b_clk0_div = {
    947	.data = &(struct clk_regmap_div_data){
    948		.offset = HHI_SD_EMMC_CLK_CNTL,
    949		.shift = 16,
    950		.width = 7,
    951		.flags = CLK_DIVIDER_ROUND_CLOSEST,
    952	},
    953	.hw.init = &(struct clk_init_data) {
    954		.name = "sd_emmc_b_clk0_div",
    955		.ops = &clk_regmap_divider_ops,
    956		.parent_hws = (const struct clk_hw *[]) {
    957			&axg_sd_emmc_b_clk0_sel.hw
    958		},
    959		.num_parents = 1,
    960		.flags = CLK_SET_RATE_PARENT,
    961	},
    962};
    963
    964static struct clk_regmap axg_sd_emmc_b_clk0 = {
    965	.data = &(struct clk_regmap_gate_data){
    966		.offset = HHI_SD_EMMC_CLK_CNTL,
    967		.bit_idx = 23,
    968	},
    969	.hw.init = &(struct clk_init_data){
    970		.name = "sd_emmc_b_clk0",
    971		.ops = &clk_regmap_gate_ops,
    972		.parent_hws = (const struct clk_hw *[]) {
    973			&axg_sd_emmc_b_clk0_div.hw
    974		},
    975		.num_parents = 1,
    976		.flags = CLK_SET_RATE_PARENT,
    977	},
    978};
    979
    980/* EMMC/NAND clock */
    981static struct clk_regmap axg_sd_emmc_c_clk0_sel = {
    982	.data = &(struct clk_regmap_mux_data){
    983		.offset = HHI_NAND_CLK_CNTL,
    984		.mask = 0x7,
    985		.shift = 9,
    986	},
    987	.hw.init = &(struct clk_init_data) {
    988		.name = "sd_emmc_c_clk0_sel",
    989		.ops = &clk_regmap_mux_ops,
    990		.parent_data = axg_sd_emmc_clk0_parent_data,
    991		.num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
    992		.flags = CLK_SET_RATE_PARENT,
    993	},
    994};
    995
    996static struct clk_regmap axg_sd_emmc_c_clk0_div = {
    997	.data = &(struct clk_regmap_div_data){
    998		.offset = HHI_NAND_CLK_CNTL,
    999		.shift = 0,
   1000		.width = 7,
   1001		.flags = CLK_DIVIDER_ROUND_CLOSEST,
   1002	},
   1003	.hw.init = &(struct clk_init_data) {
   1004		.name = "sd_emmc_c_clk0_div",
   1005		.ops = &clk_regmap_divider_ops,
   1006		.parent_hws = (const struct clk_hw *[]) {
   1007			&axg_sd_emmc_c_clk0_sel.hw
   1008		},
   1009		.num_parents = 1,
   1010		.flags = CLK_SET_RATE_PARENT,
   1011	},
   1012};
   1013
   1014static struct clk_regmap axg_sd_emmc_c_clk0 = {
   1015	.data = &(struct clk_regmap_gate_data){
   1016		.offset = HHI_NAND_CLK_CNTL,
   1017		.bit_idx = 7,
   1018	},
   1019	.hw.init = &(struct clk_init_data){
   1020		.name = "sd_emmc_c_clk0",
   1021		.ops = &clk_regmap_gate_ops,
   1022		.parent_hws = (const struct clk_hw *[]) {
   1023			&axg_sd_emmc_c_clk0_div.hw
   1024		},
   1025		.num_parents = 1,
   1026		.flags = CLK_SET_RATE_PARENT,
   1027	},
   1028};
   1029
   1030/* VPU Clock */
   1031
   1032static const struct clk_hw *axg_vpu_parent_hws[] = {
   1033	&axg_fclk_div4.hw,
   1034	&axg_fclk_div3.hw,
   1035	&axg_fclk_div5.hw,
   1036	&axg_fclk_div7.hw,
   1037};
   1038
   1039static struct clk_regmap axg_vpu_0_sel = {
   1040	.data = &(struct clk_regmap_mux_data){
   1041		.offset = HHI_VPU_CLK_CNTL,
   1042		.mask = 0x3,
   1043		.shift = 9,
   1044	},
   1045	.hw.init = &(struct clk_init_data){
   1046		.name = "vpu_0_sel",
   1047		.ops = &clk_regmap_mux_ops,
   1048		.parent_hws = axg_vpu_parent_hws,
   1049		.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
   1050		/* We need a specific parent for VPU clock source, let it be set in DT */
   1051		.flags = CLK_SET_RATE_NO_REPARENT,
   1052	},
   1053};
   1054
   1055static struct clk_regmap axg_vpu_0_div = {
   1056	.data = &(struct clk_regmap_div_data){
   1057		.offset = HHI_VPU_CLK_CNTL,
   1058		.shift = 0,
   1059		.width = 7,
   1060	},
   1061	.hw.init = &(struct clk_init_data){
   1062		.name = "vpu_0_div",
   1063		.ops = &clk_regmap_divider_ops,
   1064		.parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_sel.hw },
   1065		.num_parents = 1,
   1066		.flags = CLK_SET_RATE_PARENT,
   1067	},
   1068};
   1069
   1070static struct clk_regmap axg_vpu_0 = {
   1071	.data = &(struct clk_regmap_gate_data){
   1072		.offset = HHI_VPU_CLK_CNTL,
   1073		.bit_idx = 8,
   1074	},
   1075	.hw.init = &(struct clk_init_data) {
   1076		.name = "vpu_0",
   1077		.ops = &clk_regmap_gate_ops,
   1078		.parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_div.hw },
   1079		.num_parents = 1,
   1080		/*
   1081		 * We want to avoid CCF to disable the VPU clock if
   1082		 * display has been set by Bootloader
   1083		 */
   1084		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1085	},
   1086};
   1087
   1088static struct clk_regmap axg_vpu_1_sel = {
   1089	.data = &(struct clk_regmap_mux_data){
   1090		.offset = HHI_VPU_CLK_CNTL,
   1091		.mask = 0x3,
   1092		.shift = 25,
   1093	},
   1094	.hw.init = &(struct clk_init_data){
   1095		.name = "vpu_1_sel",
   1096		.ops = &clk_regmap_mux_ops,
   1097		.parent_hws = axg_vpu_parent_hws,
   1098		.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
   1099		/* We need a specific parent for VPU clock source, let it be set in DT */
   1100		.flags = CLK_SET_RATE_NO_REPARENT,
   1101	},
   1102};
   1103
   1104static struct clk_regmap axg_vpu_1_div = {
   1105	.data = &(struct clk_regmap_div_data){
   1106		.offset = HHI_VPU_CLK_CNTL,
   1107		.shift = 16,
   1108		.width = 7,
   1109	},
   1110	.hw.init = &(struct clk_init_data){
   1111		.name = "vpu_1_div",
   1112		.ops = &clk_regmap_divider_ops,
   1113		.parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_sel.hw },
   1114		.num_parents = 1,
   1115		.flags = CLK_SET_RATE_PARENT,
   1116	},
   1117};
   1118
   1119static struct clk_regmap axg_vpu_1 = {
   1120	.data = &(struct clk_regmap_gate_data){
   1121		.offset = HHI_VPU_CLK_CNTL,
   1122		.bit_idx = 24,
   1123	},
   1124	.hw.init = &(struct clk_init_data) {
   1125		.name = "vpu_1",
   1126		.ops = &clk_regmap_gate_ops,
   1127		.parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_div.hw },
   1128		.num_parents = 1,
   1129		/*
   1130		 * We want to avoid CCF to disable the VPU clock if
   1131		 * display has been set by Bootloader
   1132		 */
   1133		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1134	},
   1135};
   1136
   1137static struct clk_regmap axg_vpu = {
   1138	.data = &(struct clk_regmap_mux_data){
   1139		.offset = HHI_VPU_CLK_CNTL,
   1140		.mask = 1,
   1141		.shift = 31,
   1142	},
   1143	.hw.init = &(struct clk_init_data){
   1144		.name = "vpu",
   1145		.ops = &clk_regmap_mux_ops,
   1146		.parent_hws = (const struct clk_hw *[]) {
   1147			&axg_vpu_0.hw,
   1148			&axg_vpu_1.hw
   1149		},
   1150		.num_parents = 2,
   1151		.flags = CLK_SET_RATE_NO_REPARENT,
   1152	},
   1153};
   1154
   1155/* VAPB Clock */
   1156
   1157static struct clk_regmap axg_vapb_0_sel = {
   1158	.data = &(struct clk_regmap_mux_data){
   1159		.offset = HHI_VAPBCLK_CNTL,
   1160		.mask = 0x3,
   1161		.shift = 9,
   1162	},
   1163	.hw.init = &(struct clk_init_data){
   1164		.name = "vapb_0_sel",
   1165		.ops = &clk_regmap_mux_ops,
   1166		.parent_hws = axg_vpu_parent_hws,
   1167		.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
   1168		.flags = CLK_SET_RATE_NO_REPARENT,
   1169	},
   1170};
   1171
   1172static struct clk_regmap axg_vapb_0_div = {
   1173	.data = &(struct clk_regmap_div_data){
   1174		.offset = HHI_VAPBCLK_CNTL,
   1175		.shift = 0,
   1176		.width = 7,
   1177	},
   1178	.hw.init = &(struct clk_init_data){
   1179		.name = "vapb_0_div",
   1180		.ops = &clk_regmap_divider_ops,
   1181		.parent_hws = (const struct clk_hw *[]) {
   1182			&axg_vapb_0_sel.hw
   1183		},
   1184		.num_parents = 1,
   1185		.flags = CLK_SET_RATE_PARENT,
   1186	},
   1187};
   1188
   1189static struct clk_regmap axg_vapb_0 = {
   1190	.data = &(struct clk_regmap_gate_data){
   1191		.offset = HHI_VAPBCLK_CNTL,
   1192		.bit_idx = 8,
   1193	},
   1194	.hw.init = &(struct clk_init_data) {
   1195		.name = "vapb_0",
   1196		.ops = &clk_regmap_gate_ops,
   1197		.parent_hws = (const struct clk_hw *[]) {
   1198			&axg_vapb_0_div.hw
   1199		},
   1200		.num_parents = 1,
   1201		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1202	},
   1203};
   1204
   1205static struct clk_regmap axg_vapb_1_sel = {
   1206	.data = &(struct clk_regmap_mux_data){
   1207		.offset = HHI_VAPBCLK_CNTL,
   1208		.mask = 0x3,
   1209		.shift = 25,
   1210	},
   1211	.hw.init = &(struct clk_init_data){
   1212		.name = "vapb_1_sel",
   1213		.ops = &clk_regmap_mux_ops,
   1214		.parent_hws = axg_vpu_parent_hws,
   1215		.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
   1216		.flags = CLK_SET_RATE_NO_REPARENT,
   1217	},
   1218};
   1219
   1220static struct clk_regmap axg_vapb_1_div = {
   1221	.data = &(struct clk_regmap_div_data){
   1222		.offset = HHI_VAPBCLK_CNTL,
   1223		.shift = 16,
   1224		.width = 7,
   1225	},
   1226	.hw.init = &(struct clk_init_data){
   1227		.name = "vapb_1_div",
   1228		.ops = &clk_regmap_divider_ops,
   1229		.parent_hws = (const struct clk_hw *[]) {
   1230			&axg_vapb_1_sel.hw
   1231		},
   1232		.num_parents = 1,
   1233		.flags = CLK_SET_RATE_PARENT,
   1234	},
   1235};
   1236
   1237static struct clk_regmap axg_vapb_1 = {
   1238	.data = &(struct clk_regmap_gate_data){
   1239		.offset = HHI_VAPBCLK_CNTL,
   1240		.bit_idx = 24,
   1241	},
   1242	.hw.init = &(struct clk_init_data) {
   1243		.name = "vapb_1",
   1244		.ops = &clk_regmap_gate_ops,
   1245		.parent_hws = (const struct clk_hw *[]) {
   1246			&axg_vapb_1_div.hw
   1247		},
   1248		.num_parents = 1,
   1249		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1250	},
   1251};
   1252
   1253static struct clk_regmap axg_vapb_sel = {
   1254	.data = &(struct clk_regmap_mux_data){
   1255		.offset = HHI_VAPBCLK_CNTL,
   1256		.mask = 1,
   1257		.shift = 31,
   1258	},
   1259	.hw.init = &(struct clk_init_data){
   1260		.name = "vapb_sel",
   1261		.ops = &clk_regmap_mux_ops,
   1262		.parent_hws = (const struct clk_hw *[]) {
   1263			&axg_vapb_0.hw,
   1264			&axg_vapb_1.hw
   1265		},
   1266		.num_parents = 2,
   1267		.flags = CLK_SET_RATE_NO_REPARENT,
   1268	},
   1269};
   1270
   1271static struct clk_regmap axg_vapb = {
   1272	.data = &(struct clk_regmap_gate_data){
   1273		.offset = HHI_VAPBCLK_CNTL,
   1274		.bit_idx = 30,
   1275	},
   1276	.hw.init = &(struct clk_init_data) {
   1277		.name = "vapb",
   1278		.ops = &clk_regmap_gate_ops,
   1279		.parent_hws = (const struct clk_hw *[]) { &axg_vapb_sel.hw },
   1280		.num_parents = 1,
   1281		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1282	},
   1283};
   1284
   1285/* Video Clocks */
   1286
   1287static const struct clk_hw *axg_vclk_parent_hws[] = {
   1288	&axg_gp0_pll.hw,
   1289	&axg_fclk_div4.hw,
   1290	&axg_fclk_div3.hw,
   1291	&axg_fclk_div5.hw,
   1292	&axg_fclk_div2.hw,
   1293	&axg_fclk_div7.hw,
   1294	&axg_mpll1.hw,
   1295};
   1296
   1297static struct clk_regmap axg_vclk_sel = {
   1298	.data = &(struct clk_regmap_mux_data){
   1299		.offset = HHI_VID_CLK_CNTL,
   1300		.mask = 0x7,
   1301		.shift = 16,
   1302	},
   1303	.hw.init = &(struct clk_init_data){
   1304		.name = "vclk_sel",
   1305		.ops = &clk_regmap_mux_ops,
   1306		.parent_hws = axg_vclk_parent_hws,
   1307		.num_parents = ARRAY_SIZE(axg_vclk_parent_hws),
   1308		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
   1309	},
   1310};
   1311
   1312static struct clk_regmap axg_vclk2_sel = {
   1313	.data = &(struct clk_regmap_mux_data){
   1314		.offset = HHI_VIID_CLK_CNTL,
   1315		.mask = 0x7,
   1316		.shift = 16,
   1317	},
   1318	.hw.init = &(struct clk_init_data){
   1319		.name = "vclk2_sel",
   1320		.ops = &clk_regmap_mux_ops,
   1321		.parent_hws = axg_vclk_parent_hws,
   1322		.num_parents = ARRAY_SIZE(axg_vclk_parent_hws),
   1323		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
   1324	},
   1325};
   1326
   1327static struct clk_regmap axg_vclk_input = {
   1328	.data = &(struct clk_regmap_gate_data){
   1329		.offset = HHI_VID_CLK_DIV,
   1330		.bit_idx = 16,
   1331	},
   1332	.hw.init = &(struct clk_init_data) {
   1333		.name = "vclk_input",
   1334		.ops = &clk_regmap_gate_ops,
   1335		.parent_hws = (const struct clk_hw *[]) { &axg_vclk_sel.hw },
   1336		.num_parents = 1,
   1337		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1338	},
   1339};
   1340
   1341static struct clk_regmap axg_vclk2_input = {
   1342	.data = &(struct clk_regmap_gate_data){
   1343		.offset = HHI_VIID_CLK_DIV,
   1344		.bit_idx = 16,
   1345	},
   1346	.hw.init = &(struct clk_init_data) {
   1347		.name = "vclk2_input",
   1348		.ops = &clk_regmap_gate_ops,
   1349		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2_sel.hw },
   1350		.num_parents = 1,
   1351		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1352	},
   1353};
   1354
   1355static struct clk_regmap axg_vclk_div = {
   1356	.data = &(struct clk_regmap_div_data){
   1357		.offset = HHI_VID_CLK_DIV,
   1358		.shift = 0,
   1359		.width = 8,
   1360	},
   1361	.hw.init = &(struct clk_init_data){
   1362		.name = "vclk_div",
   1363		.ops = &clk_regmap_divider_ops,
   1364		.parent_hws = (const struct clk_hw *[]) {
   1365			&axg_vclk_input.hw
   1366		},
   1367		.num_parents = 1,
   1368		.flags = CLK_GET_RATE_NOCACHE,
   1369	},
   1370};
   1371
   1372static struct clk_regmap axg_vclk2_div = {
   1373	.data = &(struct clk_regmap_div_data){
   1374		.offset = HHI_VIID_CLK_DIV,
   1375		.shift = 0,
   1376		.width = 8,
   1377	},
   1378	.hw.init = &(struct clk_init_data){
   1379		.name = "vclk2_div",
   1380		.ops = &clk_regmap_divider_ops,
   1381		.parent_hws = (const struct clk_hw *[]) {
   1382			&axg_vclk2_input.hw
   1383		},
   1384		.num_parents = 1,
   1385		.flags = CLK_GET_RATE_NOCACHE,
   1386	},
   1387};
   1388
   1389static struct clk_regmap axg_vclk = {
   1390	.data = &(struct clk_regmap_gate_data){
   1391		.offset = HHI_VID_CLK_CNTL,
   1392		.bit_idx = 19,
   1393	},
   1394	.hw.init = &(struct clk_init_data) {
   1395		.name = "vclk",
   1396		.ops = &clk_regmap_gate_ops,
   1397		.parent_hws = (const struct clk_hw *[]) { &axg_vclk_div.hw },
   1398		.num_parents = 1,
   1399		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1400	},
   1401};
   1402
   1403static struct clk_regmap axg_vclk2 = {
   1404	.data = &(struct clk_regmap_gate_data){
   1405		.offset = HHI_VIID_CLK_CNTL,
   1406		.bit_idx = 19,
   1407	},
   1408	.hw.init = &(struct clk_init_data) {
   1409		.name = "vclk2",
   1410		.ops = &clk_regmap_gate_ops,
   1411		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2_div.hw },
   1412		.num_parents = 1,
   1413		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1414	},
   1415};
   1416
   1417static struct clk_regmap axg_vclk_div1 = {
   1418	.data = &(struct clk_regmap_gate_data){
   1419		.offset = HHI_VID_CLK_CNTL,
   1420		.bit_idx = 0,
   1421	},
   1422	.hw.init = &(struct clk_init_data) {
   1423		.name = "vclk_div1",
   1424		.ops = &clk_regmap_gate_ops,
   1425		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
   1426		.num_parents = 1,
   1427		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1428	},
   1429};
   1430
   1431static struct clk_regmap axg_vclk_div2_en = {
   1432	.data = &(struct clk_regmap_gate_data){
   1433		.offset = HHI_VID_CLK_CNTL,
   1434		.bit_idx = 1,
   1435	},
   1436	.hw.init = &(struct clk_init_data) {
   1437		.name = "vclk_div2_en",
   1438		.ops = &clk_regmap_gate_ops,
   1439		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
   1440		.num_parents = 1,
   1441		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1442	},
   1443};
   1444
   1445static struct clk_regmap axg_vclk_div4_en = {
   1446	.data = &(struct clk_regmap_gate_data){
   1447		.offset = HHI_VID_CLK_CNTL,
   1448		.bit_idx = 2,
   1449	},
   1450	.hw.init = &(struct clk_init_data) {
   1451		.name = "vclk_div4_en",
   1452		.ops = &clk_regmap_gate_ops,
   1453		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
   1454		.num_parents = 1,
   1455		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1456	},
   1457};
   1458
   1459static struct clk_regmap axg_vclk_div6_en = {
   1460	.data = &(struct clk_regmap_gate_data){
   1461		.offset = HHI_VID_CLK_CNTL,
   1462		.bit_idx = 3,
   1463	},
   1464	.hw.init = &(struct clk_init_data) {
   1465		.name = "vclk_div6_en",
   1466		.ops = &clk_regmap_gate_ops,
   1467		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
   1468		.num_parents = 1,
   1469		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1470	},
   1471};
   1472
   1473static struct clk_regmap axg_vclk_div12_en = {
   1474	.data = &(struct clk_regmap_gate_data){
   1475		.offset = HHI_VID_CLK_CNTL,
   1476		.bit_idx = 4,
   1477	},
   1478	.hw.init = &(struct clk_init_data) {
   1479		.name = "vclk_div12_en",
   1480		.ops = &clk_regmap_gate_ops,
   1481		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
   1482		.num_parents = 1,
   1483		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1484	},
   1485};
   1486
   1487static struct clk_regmap axg_vclk2_div1 = {
   1488	.data = &(struct clk_regmap_gate_data){
   1489		.offset = HHI_VIID_CLK_CNTL,
   1490		.bit_idx = 0,
   1491	},
   1492	.hw.init = &(struct clk_init_data) {
   1493		.name = "vclk2_div1",
   1494		.ops = &clk_regmap_gate_ops,
   1495		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
   1496		.num_parents = 1,
   1497		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1498	},
   1499};
   1500
   1501static struct clk_regmap axg_vclk2_div2_en = {
   1502	.data = &(struct clk_regmap_gate_data){
   1503		.offset = HHI_VIID_CLK_CNTL,
   1504		.bit_idx = 1,
   1505	},
   1506	.hw.init = &(struct clk_init_data) {
   1507		.name = "vclk2_div2_en",
   1508		.ops = &clk_regmap_gate_ops,
   1509		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
   1510		.num_parents = 1,
   1511		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1512	},
   1513};
   1514
   1515static struct clk_regmap axg_vclk2_div4_en = {
   1516	.data = &(struct clk_regmap_gate_data){
   1517		.offset = HHI_VIID_CLK_CNTL,
   1518		.bit_idx = 2,
   1519	},
   1520	.hw.init = &(struct clk_init_data) {
   1521		.name = "vclk2_div4_en",
   1522		.ops = &clk_regmap_gate_ops,
   1523		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
   1524		.num_parents = 1,
   1525		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1526	},
   1527};
   1528
   1529static struct clk_regmap axg_vclk2_div6_en = {
   1530	.data = &(struct clk_regmap_gate_data){
   1531		.offset = HHI_VIID_CLK_CNTL,
   1532		.bit_idx = 3,
   1533	},
   1534	.hw.init = &(struct clk_init_data) {
   1535		.name = "vclk2_div6_en",
   1536		.ops = &clk_regmap_gate_ops,
   1537		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
   1538		.num_parents = 1,
   1539		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1540	},
   1541};
   1542
   1543static struct clk_regmap axg_vclk2_div12_en = {
   1544	.data = &(struct clk_regmap_gate_data){
   1545		.offset = HHI_VIID_CLK_CNTL,
   1546		.bit_idx = 4,
   1547	},
   1548	.hw.init = &(struct clk_init_data) {
   1549		.name = "vclk2_div12_en",
   1550		.ops = &clk_regmap_gate_ops,
   1551		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
   1552		.num_parents = 1,
   1553		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1554	},
   1555};
   1556
   1557static struct clk_fixed_factor axg_vclk_div2 = {
   1558	.mult = 1,
   1559	.div = 2,
   1560	.hw.init = &(struct clk_init_data){
   1561		.name = "vclk_div2",
   1562		.ops = &clk_fixed_factor_ops,
   1563		.parent_hws = (const struct clk_hw *[]) {
   1564			&axg_vclk_div2_en.hw
   1565		},
   1566		.num_parents = 1,
   1567	},
   1568};
   1569
   1570static struct clk_fixed_factor axg_vclk_div4 = {
   1571	.mult = 1,
   1572	.div = 4,
   1573	.hw.init = &(struct clk_init_data){
   1574		.name = "vclk_div4",
   1575		.ops = &clk_fixed_factor_ops,
   1576		.parent_hws = (const struct clk_hw *[]) {
   1577			&axg_vclk_div4_en.hw
   1578		},
   1579		.num_parents = 1,
   1580	},
   1581};
   1582
   1583static struct clk_fixed_factor axg_vclk_div6 = {
   1584	.mult = 1,
   1585	.div = 6,
   1586	.hw.init = &(struct clk_init_data){
   1587		.name = "vclk_div6",
   1588		.ops = &clk_fixed_factor_ops,
   1589		.parent_hws = (const struct clk_hw *[]) {
   1590			&axg_vclk_div6_en.hw
   1591		},
   1592		.num_parents = 1,
   1593	},
   1594};
   1595
   1596static struct clk_fixed_factor axg_vclk_div12 = {
   1597	.mult = 1,
   1598	.div = 12,
   1599	.hw.init = &(struct clk_init_data){
   1600		.name = "vclk_div12",
   1601		.ops = &clk_fixed_factor_ops,
   1602		.parent_hws = (const struct clk_hw *[]) {
   1603			&axg_vclk_div12_en.hw
   1604		},
   1605		.num_parents = 1,
   1606	},
   1607};
   1608
   1609static struct clk_fixed_factor axg_vclk2_div2 = {
   1610	.mult = 1,
   1611	.div = 2,
   1612	.hw.init = &(struct clk_init_data){
   1613		.name = "vclk2_div2",
   1614		.ops = &clk_fixed_factor_ops,
   1615		.parent_hws = (const struct clk_hw *[]) {
   1616			&axg_vclk2_div2_en.hw
   1617		},
   1618		.num_parents = 1,
   1619	},
   1620};
   1621
   1622static struct clk_fixed_factor axg_vclk2_div4 = {
   1623	.mult = 1,
   1624	.div = 4,
   1625	.hw.init = &(struct clk_init_data){
   1626		.name = "vclk2_div4",
   1627		.ops = &clk_fixed_factor_ops,
   1628		.parent_hws = (const struct clk_hw *[]) {
   1629			&axg_vclk2_div4_en.hw
   1630		},
   1631		.num_parents = 1,
   1632	},
   1633};
   1634
   1635static struct clk_fixed_factor axg_vclk2_div6 = {
   1636	.mult = 1,
   1637	.div = 6,
   1638	.hw.init = &(struct clk_init_data){
   1639		.name = "vclk2_div6",
   1640		.ops = &clk_fixed_factor_ops,
   1641		.parent_hws = (const struct clk_hw *[]) {
   1642			&axg_vclk2_div6_en.hw
   1643		},
   1644		.num_parents = 1,
   1645	},
   1646};
   1647
   1648static struct clk_fixed_factor axg_vclk2_div12 = {
   1649	.mult = 1,
   1650	.div = 12,
   1651	.hw.init = &(struct clk_init_data){
   1652		.name = "vclk2_div12",
   1653		.ops = &clk_fixed_factor_ops,
   1654		.parent_hws = (const struct clk_hw *[]) {
   1655			&axg_vclk2_div12_en.hw
   1656		},
   1657		.num_parents = 1,
   1658	},
   1659};
   1660
   1661static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
   1662static const struct clk_hw *axg_cts_parent_hws[] = {
   1663	&axg_vclk_div1.hw,
   1664	&axg_vclk_div2.hw,
   1665	&axg_vclk_div4.hw,
   1666	&axg_vclk_div6.hw,
   1667	&axg_vclk_div12.hw,
   1668	&axg_vclk2_div1.hw,
   1669	&axg_vclk2_div2.hw,
   1670	&axg_vclk2_div4.hw,
   1671	&axg_vclk2_div6.hw,
   1672	&axg_vclk2_div12.hw,
   1673};
   1674
   1675static struct clk_regmap axg_cts_encl_sel = {
   1676	.data = &(struct clk_regmap_mux_data){
   1677		.offset = HHI_VIID_CLK_DIV,
   1678		.mask = 0xf,
   1679		.shift = 12,
   1680		.table = mux_table_cts_sel,
   1681	},
   1682	.hw.init = &(struct clk_init_data){
   1683		.name = "cts_encl_sel",
   1684		.ops = &clk_regmap_mux_ops,
   1685		.parent_hws = axg_cts_parent_hws,
   1686		.num_parents = ARRAY_SIZE(axg_cts_parent_hws),
   1687		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
   1688	},
   1689};
   1690
   1691static struct clk_regmap axg_cts_encl = {
   1692	.data = &(struct clk_regmap_gate_data){
   1693		.offset = HHI_VID_CLK_CNTL2,
   1694		.bit_idx = 3,
   1695	},
   1696	.hw.init = &(struct clk_init_data) {
   1697		.name = "cts_encl",
   1698		.ops = &clk_regmap_gate_ops,
   1699		.parent_hws = (const struct clk_hw *[]) {
   1700			&axg_cts_encl_sel.hw
   1701		},
   1702		.num_parents = 1,
   1703		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1704	},
   1705};
   1706
   1707/* MIPI DSI Host Clock */
   1708
   1709static u32 mux_table_axg_vdin_meas[]    = { 0, 1, 2, 3, 6, 7 };
   1710static const struct clk_parent_data axg_vdin_meas_parent_data[] = {
   1711	{ .fw_name = "xtal", },
   1712	{ .hw = &axg_fclk_div4.hw },
   1713	{ .hw = &axg_fclk_div3.hw },
   1714	{ .hw = &axg_fclk_div5.hw },
   1715	{ .hw = &axg_fclk_div2.hw },
   1716	{ .hw = &axg_fclk_div7.hw },
   1717};
   1718
   1719static struct clk_regmap axg_vdin_meas_sel = {
   1720	.data = &(struct clk_regmap_mux_data){
   1721		.offset = HHI_VDIN_MEAS_CLK_CNTL,
   1722		.mask = 0x7,
   1723		.shift = 21,
   1724		.flags = CLK_MUX_ROUND_CLOSEST,
   1725		.table = mux_table_axg_vdin_meas,
   1726	},
   1727	.hw.init = &(struct clk_init_data){
   1728		.name = "vdin_meas_sel",
   1729		.ops = &clk_regmap_mux_ops,
   1730		.parent_data = axg_vdin_meas_parent_data,
   1731		.num_parents = ARRAY_SIZE(axg_vdin_meas_parent_data),
   1732		.flags = CLK_SET_RATE_PARENT,
   1733	},
   1734};
   1735
   1736static struct clk_regmap axg_vdin_meas_div = {
   1737	.data = &(struct clk_regmap_div_data){
   1738		.offset = HHI_VDIN_MEAS_CLK_CNTL,
   1739		.shift = 12,
   1740		.width = 7,
   1741	},
   1742	.hw.init = &(struct clk_init_data){
   1743		.name = "vdin_meas_div",
   1744		.ops = &clk_regmap_divider_ops,
   1745		.parent_hws = (const struct clk_hw *[]) {
   1746			&axg_vdin_meas_sel.hw },
   1747		.num_parents = 1,
   1748		.flags = CLK_SET_RATE_PARENT,
   1749	},
   1750};
   1751
   1752static struct clk_regmap axg_vdin_meas = {
   1753	.data = &(struct clk_regmap_gate_data){
   1754		.offset = HHI_VDIN_MEAS_CLK_CNTL,
   1755		.bit_idx = 20,
   1756	},
   1757	.hw.init = &(struct clk_init_data) {
   1758		.name = "vdin_meas",
   1759		.ops = &clk_regmap_gate_ops,
   1760		.parent_hws = (const struct clk_hw *[]) {
   1761			&axg_vdin_meas_div.hw },
   1762		.num_parents = 1,
   1763		.flags = CLK_SET_RATE_PARENT,
   1764	},
   1765};
   1766
   1767static u32 mux_table_gen_clk[]	= { 0, 4, 5, 6, 7, 8,
   1768				    9, 10, 11, 13, 14, };
   1769static const struct clk_parent_data gen_clk_parent_data[] = {
   1770	{ .fw_name = "xtal", },
   1771	{ .hw = &axg_hifi_pll.hw },
   1772	{ .hw = &axg_mpll0.hw },
   1773	{ .hw = &axg_mpll1.hw },
   1774	{ .hw = &axg_mpll2.hw },
   1775	{ .hw = &axg_mpll3.hw },
   1776	{ .hw = &axg_fclk_div4.hw },
   1777	{ .hw = &axg_fclk_div3.hw },
   1778	{ .hw = &axg_fclk_div5.hw },
   1779	{ .hw = &axg_fclk_div7.hw },
   1780	{ .hw = &axg_gp0_pll.hw },
   1781};
   1782
   1783static struct clk_regmap axg_gen_clk_sel = {
   1784	.data = &(struct clk_regmap_mux_data){
   1785		.offset = HHI_GEN_CLK_CNTL,
   1786		.mask = 0xf,
   1787		.shift = 12,
   1788		.table = mux_table_gen_clk,
   1789	},
   1790	.hw.init = &(struct clk_init_data){
   1791		.name = "gen_clk_sel",
   1792		.ops = &clk_regmap_mux_ops,
   1793		/*
   1794		 * bits 15:12 selects from 14 possible parents:
   1795		 * xtal, [rtc_oscin_i], [sys_cpu_div16], [ddr_dpll_pt],
   1796		 * hifi_pll, mpll0, mpll1, mpll2, mpll3, fdiv4,
   1797		 * fdiv3, fdiv5, [cts_msr_clk], fdiv7, gp0_pll
   1798		 */
   1799		.parent_data = gen_clk_parent_data,
   1800		.num_parents = ARRAY_SIZE(gen_clk_parent_data),
   1801	},
   1802};
   1803
   1804static struct clk_regmap axg_gen_clk_div = {
   1805	.data = &(struct clk_regmap_div_data){
   1806		.offset = HHI_GEN_CLK_CNTL,
   1807		.shift = 0,
   1808		.width = 11,
   1809	},
   1810	.hw.init = &(struct clk_init_data){
   1811		.name = "gen_clk_div",
   1812		.ops = &clk_regmap_divider_ops,
   1813		.parent_hws = (const struct clk_hw *[]) {
   1814			&axg_gen_clk_sel.hw
   1815		},
   1816		.num_parents = 1,
   1817		.flags = CLK_SET_RATE_PARENT,
   1818	},
   1819};
   1820
   1821static struct clk_regmap axg_gen_clk = {
   1822	.data = &(struct clk_regmap_gate_data){
   1823		.offset = HHI_GEN_CLK_CNTL,
   1824		.bit_idx = 7,
   1825	},
   1826	.hw.init = &(struct clk_init_data){
   1827		.name = "gen_clk",
   1828		.ops = &clk_regmap_gate_ops,
   1829		.parent_hws = (const struct clk_hw *[]) {
   1830			&axg_gen_clk_div.hw
   1831		},
   1832		.num_parents = 1,
   1833		.flags = CLK_SET_RATE_PARENT,
   1834	},
   1835};
   1836
   1837#define MESON_GATE(_name, _reg, _bit) \
   1838	MESON_PCLK(_name, _reg, _bit, &axg_clk81.hw)
   1839
   1840/* Everything Else (EE) domain gates */
   1841static MESON_GATE(axg_ddr, HHI_GCLK_MPEG0, 0);
   1842static MESON_GATE(axg_audio_locker, HHI_GCLK_MPEG0, 2);
   1843static MESON_GATE(axg_mipi_dsi_host, HHI_GCLK_MPEG0, 3);
   1844static MESON_GATE(axg_isa, HHI_GCLK_MPEG0, 5);
   1845static MESON_GATE(axg_pl301, HHI_GCLK_MPEG0, 6);
   1846static MESON_GATE(axg_periphs, HHI_GCLK_MPEG0, 7);
   1847static MESON_GATE(axg_spicc_0, HHI_GCLK_MPEG0, 8);
   1848static MESON_GATE(axg_i2c, HHI_GCLK_MPEG0, 9);
   1849static MESON_GATE(axg_rng0, HHI_GCLK_MPEG0, 12);
   1850static MESON_GATE(axg_uart0, HHI_GCLK_MPEG0, 13);
   1851static MESON_GATE(axg_mipi_dsi_phy, HHI_GCLK_MPEG0, 14);
   1852static MESON_GATE(axg_spicc_1, HHI_GCLK_MPEG0, 15);
   1853static MESON_GATE(axg_pcie_a, HHI_GCLK_MPEG0, 16);
   1854static MESON_GATE(axg_pcie_b, HHI_GCLK_MPEG0, 17);
   1855static MESON_GATE(axg_hiu_reg, HHI_GCLK_MPEG0, 19);
   1856static MESON_GATE(axg_assist_misc, HHI_GCLK_MPEG0, 23);
   1857static MESON_GATE(axg_emmc_b, HHI_GCLK_MPEG0, 25);
   1858static MESON_GATE(axg_emmc_c, HHI_GCLK_MPEG0, 26);
   1859static MESON_GATE(axg_dma, HHI_GCLK_MPEG0, 27);
   1860static MESON_GATE(axg_spi, HHI_GCLK_MPEG0, 30);
   1861
   1862static MESON_GATE(axg_audio, HHI_GCLK_MPEG1, 0);
   1863static MESON_GATE(axg_eth_core, HHI_GCLK_MPEG1, 3);
   1864static MESON_GATE(axg_uart1, HHI_GCLK_MPEG1, 16);
   1865static MESON_GATE(axg_g2d, HHI_GCLK_MPEG1, 20);
   1866static MESON_GATE(axg_usb0, HHI_GCLK_MPEG1, 21);
   1867static MESON_GATE(axg_usb1, HHI_GCLK_MPEG1, 22);
   1868static MESON_GATE(axg_reset, HHI_GCLK_MPEG1, 23);
   1869static MESON_GATE(axg_usb_general, HHI_GCLK_MPEG1, 26);
   1870static MESON_GATE(axg_ahb_arb0, HHI_GCLK_MPEG1, 29);
   1871static MESON_GATE(axg_efuse, HHI_GCLK_MPEG1, 30);
   1872static MESON_GATE(axg_boot_rom, HHI_GCLK_MPEG1, 31);
   1873
   1874static MESON_GATE(axg_ahb_data_bus, HHI_GCLK_MPEG2, 1);
   1875static MESON_GATE(axg_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
   1876static MESON_GATE(axg_usb1_to_ddr, HHI_GCLK_MPEG2, 8);
   1877static MESON_GATE(axg_usb0_to_ddr, HHI_GCLK_MPEG2, 9);
   1878static MESON_GATE(axg_mmc_pclk, HHI_GCLK_MPEG2, 11);
   1879static MESON_GATE(axg_vpu_intr, HHI_GCLK_MPEG2, 25);
   1880static MESON_GATE(axg_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
   1881static MESON_GATE(axg_gic, HHI_GCLK_MPEG2, 30);
   1882
   1883/* Always On (AO) domain gates */
   1884
   1885static MESON_GATE(axg_ao_media_cpu, HHI_GCLK_AO, 0);
   1886static MESON_GATE(axg_ao_ahb_sram, HHI_GCLK_AO, 1);
   1887static MESON_GATE(axg_ao_ahb_bus, HHI_GCLK_AO, 2);
   1888static MESON_GATE(axg_ao_iface, HHI_GCLK_AO, 3);
   1889static MESON_GATE(axg_ao_i2c, HHI_GCLK_AO, 4);
   1890
   1891/* Array of all clocks provided by this provider */
   1892
   1893static struct clk_hw_onecell_data axg_hw_onecell_data = {
   1894	.hws = {
   1895		[CLKID_SYS_PLL]			= &axg_sys_pll.hw,
   1896		[CLKID_FIXED_PLL]		= &axg_fixed_pll.hw,
   1897		[CLKID_FCLK_DIV2]		= &axg_fclk_div2.hw,
   1898		[CLKID_FCLK_DIV3]		= &axg_fclk_div3.hw,
   1899		[CLKID_FCLK_DIV4]		= &axg_fclk_div4.hw,
   1900		[CLKID_FCLK_DIV5]		= &axg_fclk_div5.hw,
   1901		[CLKID_FCLK_DIV7]		= &axg_fclk_div7.hw,
   1902		[CLKID_GP0_PLL]			= &axg_gp0_pll.hw,
   1903		[CLKID_MPEG_SEL]		= &axg_mpeg_clk_sel.hw,
   1904		[CLKID_MPEG_DIV]		= &axg_mpeg_clk_div.hw,
   1905		[CLKID_CLK81]			= &axg_clk81.hw,
   1906		[CLKID_MPLL0]			= &axg_mpll0.hw,
   1907		[CLKID_MPLL1]			= &axg_mpll1.hw,
   1908		[CLKID_MPLL2]			= &axg_mpll2.hw,
   1909		[CLKID_MPLL3]			= &axg_mpll3.hw,
   1910		[CLKID_DDR]			= &axg_ddr.hw,
   1911		[CLKID_AUDIO_LOCKER]		= &axg_audio_locker.hw,
   1912		[CLKID_MIPI_DSI_HOST]		= &axg_mipi_dsi_host.hw,
   1913		[CLKID_ISA]			= &axg_isa.hw,
   1914		[CLKID_PL301]			= &axg_pl301.hw,
   1915		[CLKID_PERIPHS]			= &axg_periphs.hw,
   1916		[CLKID_SPICC0]			= &axg_spicc_0.hw,
   1917		[CLKID_I2C]			= &axg_i2c.hw,
   1918		[CLKID_RNG0]			= &axg_rng0.hw,
   1919		[CLKID_UART0]			= &axg_uart0.hw,
   1920		[CLKID_MIPI_DSI_PHY]		= &axg_mipi_dsi_phy.hw,
   1921		[CLKID_SPICC1]			= &axg_spicc_1.hw,
   1922		[CLKID_PCIE_A]			= &axg_pcie_a.hw,
   1923		[CLKID_PCIE_B]			= &axg_pcie_b.hw,
   1924		[CLKID_HIU_IFACE]		= &axg_hiu_reg.hw,
   1925		[CLKID_ASSIST_MISC]		= &axg_assist_misc.hw,
   1926		[CLKID_SD_EMMC_B]		= &axg_emmc_b.hw,
   1927		[CLKID_SD_EMMC_C]		= &axg_emmc_c.hw,
   1928		[CLKID_DMA]			= &axg_dma.hw,
   1929		[CLKID_SPI]			= &axg_spi.hw,
   1930		[CLKID_AUDIO]			= &axg_audio.hw,
   1931		[CLKID_ETH]			= &axg_eth_core.hw,
   1932		[CLKID_UART1]			= &axg_uart1.hw,
   1933		[CLKID_G2D]			= &axg_g2d.hw,
   1934		[CLKID_USB0]			= &axg_usb0.hw,
   1935		[CLKID_USB1]			= &axg_usb1.hw,
   1936		[CLKID_RESET]			= &axg_reset.hw,
   1937		[CLKID_USB]			= &axg_usb_general.hw,
   1938		[CLKID_AHB_ARB0]		= &axg_ahb_arb0.hw,
   1939		[CLKID_EFUSE]			= &axg_efuse.hw,
   1940		[CLKID_BOOT_ROM]		= &axg_boot_rom.hw,
   1941		[CLKID_AHB_DATA_BUS]		= &axg_ahb_data_bus.hw,
   1942		[CLKID_AHB_CTRL_BUS]		= &axg_ahb_ctrl_bus.hw,
   1943		[CLKID_USB1_DDR_BRIDGE]		= &axg_usb1_to_ddr.hw,
   1944		[CLKID_USB0_DDR_BRIDGE]		= &axg_usb0_to_ddr.hw,
   1945		[CLKID_MMC_PCLK]		= &axg_mmc_pclk.hw,
   1946		[CLKID_VPU_INTR]		= &axg_vpu_intr.hw,
   1947		[CLKID_SEC_AHB_AHB3_BRIDGE]	= &axg_sec_ahb_ahb3_bridge.hw,
   1948		[CLKID_GIC]			= &axg_gic.hw,
   1949		[CLKID_AO_MEDIA_CPU]		= &axg_ao_media_cpu.hw,
   1950		[CLKID_AO_AHB_SRAM]		= &axg_ao_ahb_sram.hw,
   1951		[CLKID_AO_AHB_BUS]		= &axg_ao_ahb_bus.hw,
   1952		[CLKID_AO_IFACE]		= &axg_ao_iface.hw,
   1953		[CLKID_AO_I2C]			= &axg_ao_i2c.hw,
   1954		[CLKID_SD_EMMC_B_CLK0_SEL]	= &axg_sd_emmc_b_clk0_sel.hw,
   1955		[CLKID_SD_EMMC_B_CLK0_DIV]	= &axg_sd_emmc_b_clk0_div.hw,
   1956		[CLKID_SD_EMMC_B_CLK0]		= &axg_sd_emmc_b_clk0.hw,
   1957		[CLKID_SD_EMMC_C_CLK0_SEL]	= &axg_sd_emmc_c_clk0_sel.hw,
   1958		[CLKID_SD_EMMC_C_CLK0_DIV]	= &axg_sd_emmc_c_clk0_div.hw,
   1959		[CLKID_SD_EMMC_C_CLK0]		= &axg_sd_emmc_c_clk0.hw,
   1960		[CLKID_MPLL0_DIV]		= &axg_mpll0_div.hw,
   1961		[CLKID_MPLL1_DIV]		= &axg_mpll1_div.hw,
   1962		[CLKID_MPLL2_DIV]		= &axg_mpll2_div.hw,
   1963		[CLKID_MPLL3_DIV]		= &axg_mpll3_div.hw,
   1964		[CLKID_HIFI_PLL]		= &axg_hifi_pll.hw,
   1965		[CLKID_MPLL_PREDIV]		= &axg_mpll_prediv.hw,
   1966		[CLKID_FCLK_DIV2_DIV]		= &axg_fclk_div2_div.hw,
   1967		[CLKID_FCLK_DIV3_DIV]		= &axg_fclk_div3_div.hw,
   1968		[CLKID_FCLK_DIV4_DIV]		= &axg_fclk_div4_div.hw,
   1969		[CLKID_FCLK_DIV5_DIV]		= &axg_fclk_div5_div.hw,
   1970		[CLKID_FCLK_DIV7_DIV]		= &axg_fclk_div7_div.hw,
   1971		[CLKID_PCIE_PLL]		= &axg_pcie_pll.hw,
   1972		[CLKID_PCIE_MUX]		= &axg_pcie_mux.hw,
   1973		[CLKID_PCIE_REF]		= &axg_pcie_ref.hw,
   1974		[CLKID_PCIE_CML_EN0]		= &axg_pcie_cml_en0.hw,
   1975		[CLKID_PCIE_CML_EN1]		= &axg_pcie_cml_en1.hw,
   1976		[CLKID_GEN_CLK_SEL]		= &axg_gen_clk_sel.hw,
   1977		[CLKID_GEN_CLK_DIV]		= &axg_gen_clk_div.hw,
   1978		[CLKID_GEN_CLK]			= &axg_gen_clk.hw,
   1979		[CLKID_SYS_PLL_DCO]		= &axg_sys_pll_dco.hw,
   1980		[CLKID_FIXED_PLL_DCO]		= &axg_fixed_pll_dco.hw,
   1981		[CLKID_GP0_PLL_DCO]		= &axg_gp0_pll_dco.hw,
   1982		[CLKID_HIFI_PLL_DCO]		= &axg_hifi_pll_dco.hw,
   1983		[CLKID_PCIE_PLL_DCO]		= &axg_pcie_pll_dco.hw,
   1984		[CLKID_PCIE_PLL_OD]		= &axg_pcie_pll_od.hw,
   1985		[CLKID_VPU_0_DIV]		= &axg_vpu_0_div.hw,
   1986		[CLKID_VPU_0_SEL]		= &axg_vpu_0_sel.hw,
   1987		[CLKID_VPU_0]			= &axg_vpu_0.hw,
   1988		[CLKID_VPU_1_DIV]		= &axg_vpu_1_div.hw,
   1989		[CLKID_VPU_1_SEL]		= &axg_vpu_1_sel.hw,
   1990		[CLKID_VPU_1]			= &axg_vpu_1.hw,
   1991		[CLKID_VPU]			= &axg_vpu.hw,
   1992		[CLKID_VAPB_0_DIV]		= &axg_vapb_0_div.hw,
   1993		[CLKID_VAPB_0_SEL]		= &axg_vapb_0_sel.hw,
   1994		[CLKID_VAPB_0]			= &axg_vapb_0.hw,
   1995		[CLKID_VAPB_1_DIV]		= &axg_vapb_1_div.hw,
   1996		[CLKID_VAPB_1_SEL]		= &axg_vapb_1_sel.hw,
   1997		[CLKID_VAPB_1]			= &axg_vapb_1.hw,
   1998		[CLKID_VAPB_SEL]		= &axg_vapb_sel.hw,
   1999		[CLKID_VAPB]			= &axg_vapb.hw,
   2000		[CLKID_VCLK]			= &axg_vclk.hw,
   2001		[CLKID_VCLK2]			= &axg_vclk2.hw,
   2002		[CLKID_VCLK_SEL]		= &axg_vclk_sel.hw,
   2003		[CLKID_VCLK2_SEL]		= &axg_vclk2_sel.hw,
   2004		[CLKID_VCLK_INPUT]		= &axg_vclk_input.hw,
   2005		[CLKID_VCLK2_INPUT]		= &axg_vclk2_input.hw,
   2006		[CLKID_VCLK_DIV]		= &axg_vclk_div.hw,
   2007		[CLKID_VCLK2_DIV]		= &axg_vclk2_div.hw,
   2008		[CLKID_VCLK_DIV2_EN]		= &axg_vclk_div2_en.hw,
   2009		[CLKID_VCLK_DIV4_EN]		= &axg_vclk_div4_en.hw,
   2010		[CLKID_VCLK_DIV6_EN]		= &axg_vclk_div6_en.hw,
   2011		[CLKID_VCLK_DIV12_EN]		= &axg_vclk_div12_en.hw,
   2012		[CLKID_VCLK2_DIV2_EN]		= &axg_vclk2_div2_en.hw,
   2013		[CLKID_VCLK2_DIV4_EN]		= &axg_vclk2_div4_en.hw,
   2014		[CLKID_VCLK2_DIV6_EN]		= &axg_vclk2_div6_en.hw,
   2015		[CLKID_VCLK2_DIV12_EN]		= &axg_vclk2_div12_en.hw,
   2016		[CLKID_VCLK_DIV1]		= &axg_vclk_div1.hw,
   2017		[CLKID_VCLK_DIV2]		= &axg_vclk_div2.hw,
   2018		[CLKID_VCLK_DIV4]		= &axg_vclk_div4.hw,
   2019		[CLKID_VCLK_DIV6]		= &axg_vclk_div6.hw,
   2020		[CLKID_VCLK_DIV12]		= &axg_vclk_div12.hw,
   2021		[CLKID_VCLK2_DIV1]		= &axg_vclk2_div1.hw,
   2022		[CLKID_VCLK2_DIV2]		= &axg_vclk2_div2.hw,
   2023		[CLKID_VCLK2_DIV4]		= &axg_vclk2_div4.hw,
   2024		[CLKID_VCLK2_DIV6]		= &axg_vclk2_div6.hw,
   2025		[CLKID_VCLK2_DIV12]		= &axg_vclk2_div12.hw,
   2026		[CLKID_CTS_ENCL_SEL]		= &axg_cts_encl_sel.hw,
   2027		[CLKID_CTS_ENCL]		= &axg_cts_encl.hw,
   2028		[CLKID_VDIN_MEAS_SEL]		= &axg_vdin_meas_sel.hw,
   2029		[CLKID_VDIN_MEAS_DIV]		= &axg_vdin_meas_div.hw,
   2030		[CLKID_VDIN_MEAS]		= &axg_vdin_meas.hw,
   2031		[NR_CLKS]			= NULL,
   2032	},
   2033	.num = NR_CLKS,
   2034};
   2035
   2036/* Convenience table to populate regmap in .probe */
   2037static struct clk_regmap *const axg_clk_regmaps[] = {
   2038	&axg_clk81,
   2039	&axg_ddr,
   2040	&axg_audio_locker,
   2041	&axg_mipi_dsi_host,
   2042	&axg_isa,
   2043	&axg_pl301,
   2044	&axg_periphs,
   2045	&axg_spicc_0,
   2046	&axg_i2c,
   2047	&axg_rng0,
   2048	&axg_uart0,
   2049	&axg_mipi_dsi_phy,
   2050	&axg_spicc_1,
   2051	&axg_pcie_a,
   2052	&axg_pcie_b,
   2053	&axg_hiu_reg,
   2054	&axg_assist_misc,
   2055	&axg_emmc_b,
   2056	&axg_emmc_c,
   2057	&axg_dma,
   2058	&axg_spi,
   2059	&axg_audio,
   2060	&axg_eth_core,
   2061	&axg_uart1,
   2062	&axg_g2d,
   2063	&axg_usb0,
   2064	&axg_usb1,
   2065	&axg_reset,
   2066	&axg_usb_general,
   2067	&axg_ahb_arb0,
   2068	&axg_efuse,
   2069	&axg_boot_rom,
   2070	&axg_ahb_data_bus,
   2071	&axg_ahb_ctrl_bus,
   2072	&axg_usb1_to_ddr,
   2073	&axg_usb0_to_ddr,
   2074	&axg_mmc_pclk,
   2075	&axg_vpu_intr,
   2076	&axg_sec_ahb_ahb3_bridge,
   2077	&axg_gic,
   2078	&axg_ao_media_cpu,
   2079	&axg_ao_ahb_sram,
   2080	&axg_ao_ahb_bus,
   2081	&axg_ao_iface,
   2082	&axg_ao_i2c,
   2083	&axg_sd_emmc_b_clk0,
   2084	&axg_sd_emmc_c_clk0,
   2085	&axg_mpeg_clk_div,
   2086	&axg_sd_emmc_b_clk0_div,
   2087	&axg_sd_emmc_c_clk0_div,
   2088	&axg_mpeg_clk_sel,
   2089	&axg_sd_emmc_b_clk0_sel,
   2090	&axg_sd_emmc_c_clk0_sel,
   2091	&axg_mpll0,
   2092	&axg_mpll1,
   2093	&axg_mpll2,
   2094	&axg_mpll3,
   2095	&axg_mpll0_div,
   2096	&axg_mpll1_div,
   2097	&axg_mpll2_div,
   2098	&axg_mpll3_div,
   2099	&axg_fixed_pll,
   2100	&axg_sys_pll,
   2101	&axg_gp0_pll,
   2102	&axg_hifi_pll,
   2103	&axg_mpll_prediv,
   2104	&axg_fclk_div2,
   2105	&axg_fclk_div3,
   2106	&axg_fclk_div4,
   2107	&axg_fclk_div5,
   2108	&axg_fclk_div7,
   2109	&axg_pcie_pll_dco,
   2110	&axg_pcie_pll_od,
   2111	&axg_pcie_pll,
   2112	&axg_pcie_mux,
   2113	&axg_pcie_ref,
   2114	&axg_pcie_cml_en0,
   2115	&axg_pcie_cml_en1,
   2116	&axg_gen_clk_sel,
   2117	&axg_gen_clk_div,
   2118	&axg_gen_clk,
   2119	&axg_fixed_pll_dco,
   2120	&axg_sys_pll_dco,
   2121	&axg_gp0_pll_dco,
   2122	&axg_hifi_pll_dco,
   2123	&axg_pcie_pll_dco,
   2124	&axg_pcie_pll_od,
   2125	&axg_vpu_0_div,
   2126	&axg_vpu_0_sel,
   2127	&axg_vpu_0,
   2128	&axg_vpu_1_div,
   2129	&axg_vpu_1_sel,
   2130	&axg_vpu_1,
   2131	&axg_vpu,
   2132	&axg_vapb_0_div,
   2133	&axg_vapb_0_sel,
   2134	&axg_vapb_0,
   2135	&axg_vapb_1_div,
   2136	&axg_vapb_1_sel,
   2137	&axg_vapb_1,
   2138	&axg_vapb_sel,
   2139	&axg_vapb,
   2140	&axg_vclk,
   2141	&axg_vclk2,
   2142	&axg_vclk_sel,
   2143	&axg_vclk2_sel,
   2144	&axg_vclk_input,
   2145	&axg_vclk2_input,
   2146	&axg_vclk_div,
   2147	&axg_vclk2_div,
   2148	&axg_vclk_div2_en,
   2149	&axg_vclk_div4_en,
   2150	&axg_vclk_div6_en,
   2151	&axg_vclk_div12_en,
   2152	&axg_vclk2_div2_en,
   2153	&axg_vclk2_div4_en,
   2154	&axg_vclk2_div6_en,
   2155	&axg_vclk2_div12_en,
   2156	&axg_cts_encl_sel,
   2157	&axg_cts_encl,
   2158	&axg_vdin_meas_sel,
   2159	&axg_vdin_meas_div,
   2160	&axg_vdin_meas,
   2161};
   2162
   2163static const struct meson_eeclkc_data axg_clkc_data = {
   2164	.regmap_clks = axg_clk_regmaps,
   2165	.regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps),
   2166	.hw_onecell_data = &axg_hw_onecell_data,
   2167};
   2168
   2169
   2170static const struct of_device_id clkc_match_table[] = {
   2171	{ .compatible = "amlogic,axg-clkc", .data = &axg_clkc_data },
   2172	{}
   2173};
   2174MODULE_DEVICE_TABLE(of, clkc_match_table);
   2175
   2176static struct platform_driver axg_driver = {
   2177	.probe		= meson_eeclkc_probe,
   2178	.driver		= {
   2179		.name	= "axg-clkc",
   2180		.of_match_table = clkc_match_table,
   2181	},
   2182};
   2183
   2184module_platform_driver(axg_driver);
   2185MODULE_LICENSE("GPL v2");