178b4af31SQiufang Dai // SPDX-License-Identifier: GPL-2.0+ 278b4af31SQiufang Dai /* 378b4af31SQiufang Dai * AmLogic Meson-AXG Clock Controller Driver 478b4af31SQiufang Dai * 578b4af31SQiufang Dai * Copyright (c) 2016 Baylibre SAS. 678b4af31SQiufang Dai * Author: Michael Turquette <mturquette@baylibre.com> 778b4af31SQiufang Dai * 878b4af31SQiufang Dai * Copyright (c) 2017 Amlogic, inc. 978b4af31SQiufang Dai * Author: Qiufang Dai <qiufang.dai@amlogic.com> 1078b4af31SQiufang Dai */ 1178b4af31SQiufang Dai 1278b4af31SQiufang Dai #include <linux/clk-provider.h> 13161f6e5bSJerome Brunet #include <linux/init.h> 14a96cbb14SRob Herring #include <linux/mod_devicetable.h> 1578b4af31SQiufang Dai #include <linux/platform_device.h> 1620425f63SKevin Hilman #include <linux/module.h> 1778b4af31SQiufang Dai 18889c2b7eSJerome Brunet #include "clk-regmap.h" 19889c2b7eSJerome Brunet #include "clk-pll.h" 20889c2b7eSJerome Brunet #include "clk-mpll.h" 2178b4af31SQiufang Dai #include "axg.h" 226682bd4dSJerome Brunet #include "meson-eeclk.h" 236e73dac7SJerome Brunet 24ccbfbd36SNeil Armstrong #include <dt-bindings/clock/axg-clkc.h> 25ccbfbd36SNeil Armstrong 2678b4af31SQiufang Dai static DEFINE_SPINLOCK(meson_clk_lock); 2778b4af31SQiufang Dai 2887173557SJerome Brunet static struct clk_regmap axg_fixed_pll_dco = { 29722825dcSJerome Brunet .data = &(struct meson_clk_pll_data){ 30e40c7e3cSJerome Brunet .en = { 31e40c7e3cSJerome Brunet .reg_off = HHI_MPLL_CNTL, 32e40c7e3cSJerome Brunet .shift = 30, 33e40c7e3cSJerome Brunet .width = 1, 34e40c7e3cSJerome Brunet }, 3578b4af31SQiufang Dai .m = { 3678b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL, 3778b4af31SQiufang Dai .shift = 0, 3878b4af31SQiufang Dai .width = 9, 3978b4af31SQiufang Dai }, 4078b4af31SQiufang Dai .n = { 4178b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL, 4278b4af31SQiufang Dai .shift = 9, 4378b4af31SQiufang Dai .width = 5, 4478b4af31SQiufang Dai }, 456b71acecSJerome Brunet .frac = { 466b71acecSJerome Brunet .reg_off = HHI_MPLL_CNTL2, 476b71acecSJerome Brunet .shift = 0, 486b71acecSJerome Brunet .width = 12, 496b71acecSJerome Brunet }, 50722825dcSJerome Brunet .l = { 51722825dcSJerome Brunet .reg_off = HHI_MPLL_CNTL, 52722825dcSJerome Brunet .shift = 31, 53722825dcSJerome Brunet .width = 1, 54722825dcSJerome Brunet }, 55722825dcSJerome Brunet .rst = { 56722825dcSJerome Brunet .reg_off = HHI_MPLL_CNTL, 57722825dcSJerome Brunet .shift = 29, 58722825dcSJerome Brunet .width = 1, 59722825dcSJerome Brunet }, 60722825dcSJerome Brunet }, 6178b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 6287173557SJerome Brunet .name = "fixed_pll_dco", 6378b4af31SQiufang Dai .ops = &meson_clk_pll_ro_ops, 64cc132d11SAlexandre Mergnat .parent_data = &(const struct clk_parent_data) { 65cc132d11SAlexandre Mergnat .fw_name = "xtal", 66cc132d11SAlexandre Mergnat }, 6778b4af31SQiufang Dai .num_parents = 1, 6878b4af31SQiufang Dai }, 6978b4af31SQiufang Dai }; 7078b4af31SQiufang Dai 7187173557SJerome Brunet static struct clk_regmap axg_fixed_pll = { 7287173557SJerome Brunet .data = &(struct clk_regmap_div_data){ 7387173557SJerome Brunet .offset = HHI_MPLL_CNTL, 7487173557SJerome Brunet .shift = 16, 7587173557SJerome Brunet .width = 2, 7687173557SJerome Brunet .flags = CLK_DIVIDER_POWER_OF_TWO, 7787173557SJerome Brunet }, 7887173557SJerome Brunet .hw.init = &(struct clk_init_data){ 7987173557SJerome Brunet .name = "fixed_pll", 8087173557SJerome Brunet .ops = &clk_regmap_divider_ro_ops, 81cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 82cc132d11SAlexandre Mergnat &axg_fixed_pll_dco.hw 83cc132d11SAlexandre Mergnat }, 8487173557SJerome Brunet .num_parents = 1, 8587173557SJerome Brunet /* 8687173557SJerome Brunet * This clock won't ever change at runtime so 8787173557SJerome Brunet * CLK_SET_RATE_PARENT is not required 8887173557SJerome Brunet */ 8987173557SJerome Brunet }, 9087173557SJerome Brunet }; 9187173557SJerome Brunet 9287173557SJerome Brunet static struct clk_regmap axg_sys_pll_dco = { 93722825dcSJerome Brunet .data = &(struct meson_clk_pll_data){ 94e40c7e3cSJerome Brunet .en = { 95e40c7e3cSJerome Brunet .reg_off = HHI_SYS_PLL_CNTL, 96e40c7e3cSJerome Brunet .shift = 30, 97e40c7e3cSJerome Brunet .width = 1, 98e40c7e3cSJerome Brunet }, 9978b4af31SQiufang Dai .m = { 10078b4af31SQiufang Dai .reg_off = HHI_SYS_PLL_CNTL, 10178b4af31SQiufang Dai .shift = 0, 10278b4af31SQiufang Dai .width = 9, 10378b4af31SQiufang Dai }, 10478b4af31SQiufang Dai .n = { 10578b4af31SQiufang Dai .reg_off = HHI_SYS_PLL_CNTL, 10678b4af31SQiufang Dai .shift = 9, 10778b4af31SQiufang Dai .width = 5, 10878b4af31SQiufang Dai }, 109722825dcSJerome Brunet .l = { 110722825dcSJerome Brunet .reg_off = HHI_SYS_PLL_CNTL, 111722825dcSJerome Brunet .shift = 31, 112722825dcSJerome Brunet .width = 1, 113722825dcSJerome Brunet }, 114722825dcSJerome Brunet .rst = { 115722825dcSJerome Brunet .reg_off = HHI_SYS_PLL_CNTL, 116722825dcSJerome Brunet .shift = 29, 117722825dcSJerome Brunet .width = 1, 118722825dcSJerome Brunet }, 119722825dcSJerome Brunet }, 12078b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 12187173557SJerome Brunet .name = "sys_pll_dco", 12278b4af31SQiufang Dai .ops = &meson_clk_pll_ro_ops, 123cc132d11SAlexandre Mergnat .parent_data = &(const struct clk_parent_data) { 124cc132d11SAlexandre Mergnat .fw_name = "xtal", 125cc132d11SAlexandre Mergnat }, 12678b4af31SQiufang Dai .num_parents = 1, 12778b4af31SQiufang Dai }, 12878b4af31SQiufang Dai }; 12978b4af31SQiufang Dai 13087173557SJerome Brunet static struct clk_regmap axg_sys_pll = { 13187173557SJerome Brunet .data = &(struct clk_regmap_div_data){ 13287173557SJerome Brunet .offset = HHI_SYS_PLL_CNTL, 13387173557SJerome Brunet .shift = 16, 13487173557SJerome Brunet .width = 2, 13587173557SJerome Brunet .flags = CLK_DIVIDER_POWER_OF_TWO, 13687173557SJerome Brunet }, 13787173557SJerome Brunet .hw.init = &(struct clk_init_data){ 13887173557SJerome Brunet .name = "sys_pll", 13987173557SJerome Brunet .ops = &clk_regmap_divider_ro_ops, 140cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 141cc132d11SAlexandre Mergnat &axg_sys_pll_dco.hw 142cc132d11SAlexandre Mergnat }, 14387173557SJerome Brunet .num_parents = 1, 14487173557SJerome Brunet .flags = CLK_SET_RATE_PARENT, 14587173557SJerome Brunet }, 14687173557SJerome Brunet }; 14787173557SJerome Brunet 148dd601dbcSJerome Brunet static const struct pll_params_table axg_gp0_pll_params_table[] = { 149dd601dbcSJerome Brunet PLL_PARAMS(40, 1), 150dd601dbcSJerome Brunet PLL_PARAMS(41, 1), 151dd601dbcSJerome Brunet PLL_PARAMS(42, 1), 152dd601dbcSJerome Brunet PLL_PARAMS(43, 1), 153dd601dbcSJerome Brunet PLL_PARAMS(44, 1), 154dd601dbcSJerome Brunet PLL_PARAMS(45, 1), 155dd601dbcSJerome Brunet PLL_PARAMS(46, 1), 156dd601dbcSJerome Brunet PLL_PARAMS(47, 1), 157dd601dbcSJerome Brunet PLL_PARAMS(48, 1), 158dd601dbcSJerome Brunet PLL_PARAMS(49, 1), 159dd601dbcSJerome Brunet PLL_PARAMS(50, 1), 160dd601dbcSJerome Brunet PLL_PARAMS(51, 1), 161dd601dbcSJerome Brunet PLL_PARAMS(52, 1), 162dd601dbcSJerome Brunet PLL_PARAMS(53, 1), 163dd601dbcSJerome Brunet PLL_PARAMS(54, 1), 164dd601dbcSJerome Brunet PLL_PARAMS(55, 1), 165dd601dbcSJerome Brunet PLL_PARAMS(56, 1), 166dd601dbcSJerome Brunet PLL_PARAMS(57, 1), 167dd601dbcSJerome Brunet PLL_PARAMS(58, 1), 168dd601dbcSJerome Brunet PLL_PARAMS(59, 1), 169dd601dbcSJerome Brunet PLL_PARAMS(60, 1), 170dd601dbcSJerome Brunet PLL_PARAMS(61, 1), 171dd601dbcSJerome Brunet PLL_PARAMS(62, 1), 172dd601dbcSJerome Brunet PLL_PARAMS(63, 1), 173dd601dbcSJerome Brunet PLL_PARAMS(64, 1), 174dd601dbcSJerome Brunet PLL_PARAMS(65, 1), 175dd601dbcSJerome Brunet PLL_PARAMS(66, 1), 176dd601dbcSJerome Brunet PLL_PARAMS(67, 1), 177dd601dbcSJerome Brunet PLL_PARAMS(68, 1), 17878b4af31SQiufang Dai { /* sentinel */ }, 17978b4af31SQiufang Dai }; 18078b4af31SQiufang Dai 1815d1c04ddSStephen Boyd static const struct reg_sequence axg_gp0_init_regs[] = { 182c77de0e5SJerome Brunet { .reg = HHI_GP0_PLL_CNTL1, .def = 0xc084b000 }, 183722825dcSJerome Brunet { .reg = HHI_GP0_PLL_CNTL2, .def = 0xb75020be }, 184722825dcSJerome Brunet { .reg = HHI_GP0_PLL_CNTL3, .def = 0x0a59a288 }, 185722825dcSJerome Brunet { .reg = HHI_GP0_PLL_CNTL4, .def = 0xc000004d }, 186722825dcSJerome Brunet { .reg = HHI_GP0_PLL_CNTL5, .def = 0x00078000 }, 18778b4af31SQiufang Dai }; 18878b4af31SQiufang Dai 18987173557SJerome Brunet static struct clk_regmap axg_gp0_pll_dco = { 190722825dcSJerome Brunet .data = &(struct meson_clk_pll_data){ 191e40c7e3cSJerome Brunet .en = { 192e40c7e3cSJerome Brunet .reg_off = HHI_GP0_PLL_CNTL, 193e40c7e3cSJerome Brunet .shift = 30, 194e40c7e3cSJerome Brunet .width = 1, 195e40c7e3cSJerome Brunet }, 19678b4af31SQiufang Dai .m = { 19778b4af31SQiufang Dai .reg_off = HHI_GP0_PLL_CNTL, 19878b4af31SQiufang Dai .shift = 0, 19978b4af31SQiufang Dai .width = 9, 20078b4af31SQiufang Dai }, 20178b4af31SQiufang Dai .n = { 20278b4af31SQiufang Dai .reg_off = HHI_GP0_PLL_CNTL, 20378b4af31SQiufang Dai .shift = 9, 20478b4af31SQiufang Dai .width = 5, 20578b4af31SQiufang Dai }, 206c77de0e5SJerome Brunet .frac = { 207c77de0e5SJerome Brunet .reg_off = HHI_GP0_PLL_CNTL1, 208c77de0e5SJerome Brunet .shift = 0, 209c77de0e5SJerome Brunet .width = 10, 210c77de0e5SJerome Brunet }, 211722825dcSJerome Brunet .l = { 212722825dcSJerome Brunet .reg_off = HHI_GP0_PLL_CNTL, 213722825dcSJerome Brunet .shift = 31, 214722825dcSJerome Brunet .width = 1, 21578b4af31SQiufang Dai }, 216722825dcSJerome Brunet .rst = { 217722825dcSJerome Brunet .reg_off = HHI_GP0_PLL_CNTL, 218722825dcSJerome Brunet .shift = 29, 219722825dcSJerome Brunet .width = 1, 220722825dcSJerome Brunet }, 221dd601dbcSJerome Brunet .table = axg_gp0_pll_params_table, 222722825dcSJerome Brunet .init_regs = axg_gp0_init_regs, 223722825dcSJerome Brunet .init_count = ARRAY_SIZE(axg_gp0_init_regs), 224722825dcSJerome Brunet }, 22578b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 22687173557SJerome Brunet .name = "gp0_pll_dco", 22778b4af31SQiufang Dai .ops = &meson_clk_pll_ops, 228cc132d11SAlexandre Mergnat .parent_data = &(const struct clk_parent_data) { 229cc132d11SAlexandre Mergnat .fw_name = "xtal", 230cc132d11SAlexandre Mergnat }, 23178b4af31SQiufang Dai .num_parents = 1, 23278b4af31SQiufang Dai }, 23378b4af31SQiufang Dai }; 23478b4af31SQiufang Dai 23587173557SJerome Brunet static struct clk_regmap axg_gp0_pll = { 23687173557SJerome Brunet .data = &(struct clk_regmap_div_data){ 23787173557SJerome Brunet .offset = HHI_GP0_PLL_CNTL, 23887173557SJerome Brunet .shift = 16, 23987173557SJerome Brunet .width = 2, 24087173557SJerome Brunet .flags = CLK_DIVIDER_POWER_OF_TWO, 24187173557SJerome Brunet }, 24287173557SJerome Brunet .hw.init = &(struct clk_init_data){ 24387173557SJerome Brunet .name = "gp0_pll", 24487173557SJerome Brunet .ops = &clk_regmap_divider_ops, 245cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 246cc132d11SAlexandre Mergnat &axg_gp0_pll_dco.hw 247cc132d11SAlexandre Mergnat }, 24887173557SJerome Brunet .num_parents = 1, 24987173557SJerome Brunet .flags = CLK_SET_RATE_PARENT, 25087173557SJerome Brunet }, 25187173557SJerome Brunet }; 25287173557SJerome Brunet 2535d1c04ddSStephen Boyd static const struct reg_sequence axg_hifi_init_regs[] = { 254093c3facSJerome Brunet { .reg = HHI_HIFI_PLL_CNTL1, .def = 0xc084b000 }, 255093c3facSJerome Brunet { .reg = HHI_HIFI_PLL_CNTL2, .def = 0xb75020be }, 256093c3facSJerome Brunet { .reg = HHI_HIFI_PLL_CNTL3, .def = 0x0a6a3a88 }, 257093c3facSJerome Brunet { .reg = HHI_HIFI_PLL_CNTL4, .def = 0xc000004d }, 258093c3facSJerome Brunet { .reg = HHI_HIFI_PLL_CNTL5, .def = 0x00058000 }, 259093c3facSJerome Brunet }; 260093c3facSJerome Brunet 26187173557SJerome Brunet static struct clk_regmap axg_hifi_pll_dco = { 262093c3facSJerome Brunet .data = &(struct meson_clk_pll_data){ 263e40c7e3cSJerome Brunet .en = { 264e40c7e3cSJerome Brunet .reg_off = HHI_HIFI_PLL_CNTL, 265e40c7e3cSJerome Brunet .shift = 30, 266e40c7e3cSJerome Brunet .width = 1, 267e40c7e3cSJerome Brunet }, 268093c3facSJerome Brunet .m = { 269093c3facSJerome Brunet .reg_off = HHI_HIFI_PLL_CNTL, 270093c3facSJerome Brunet .shift = 0, 271093c3facSJerome Brunet .width = 9, 272093c3facSJerome Brunet }, 273093c3facSJerome Brunet .n = { 274093c3facSJerome Brunet .reg_off = HHI_HIFI_PLL_CNTL, 275093c3facSJerome Brunet .shift = 9, 276093c3facSJerome Brunet .width = 5, 277093c3facSJerome Brunet }, 278093c3facSJerome Brunet .frac = { 279093c3facSJerome Brunet .reg_off = HHI_HIFI_PLL_CNTL5, 280093c3facSJerome Brunet .shift = 0, 281093c3facSJerome Brunet .width = 13, 282093c3facSJerome Brunet }, 283093c3facSJerome Brunet .l = { 284093c3facSJerome Brunet .reg_off = HHI_HIFI_PLL_CNTL, 285093c3facSJerome Brunet .shift = 31, 286093c3facSJerome Brunet .width = 1, 287093c3facSJerome Brunet }, 288093c3facSJerome Brunet .rst = { 289093c3facSJerome Brunet .reg_off = HHI_HIFI_PLL_CNTL, 290093c3facSJerome Brunet .shift = 29, 291093c3facSJerome Brunet .width = 1, 292093c3facSJerome Brunet }, 293dd601dbcSJerome Brunet .table = axg_gp0_pll_params_table, 294093c3facSJerome Brunet .init_regs = axg_hifi_init_regs, 295093c3facSJerome Brunet .init_count = ARRAY_SIZE(axg_hifi_init_regs), 296093c3facSJerome Brunet .flags = CLK_MESON_PLL_ROUND_CLOSEST, 297093c3facSJerome Brunet }, 298093c3facSJerome Brunet .hw.init = &(struct clk_init_data){ 29987173557SJerome Brunet .name = "hifi_pll_dco", 300093c3facSJerome Brunet .ops = &meson_clk_pll_ops, 301cc132d11SAlexandre Mergnat .parent_data = &(const struct clk_parent_data) { 302cc132d11SAlexandre Mergnat .fw_name = "xtal", 303cc132d11SAlexandre Mergnat }, 304093c3facSJerome Brunet .num_parents = 1, 305093c3facSJerome Brunet }, 306093c3facSJerome Brunet }; 30778b4af31SQiufang Dai 30887173557SJerome Brunet static struct clk_regmap axg_hifi_pll = { 30987173557SJerome Brunet .data = &(struct clk_regmap_div_data){ 31087173557SJerome Brunet .offset = HHI_HIFI_PLL_CNTL, 31187173557SJerome Brunet .shift = 16, 31287173557SJerome Brunet .width = 2, 31387173557SJerome Brunet .flags = CLK_DIVIDER_POWER_OF_TWO, 31487173557SJerome Brunet }, 31587173557SJerome Brunet .hw.init = &(struct clk_init_data){ 31687173557SJerome Brunet .name = "hifi_pll", 31787173557SJerome Brunet .ops = &clk_regmap_divider_ops, 318cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 319cc132d11SAlexandre Mergnat &axg_hifi_pll_dco.hw 320cc132d11SAlexandre Mergnat }, 32187173557SJerome Brunet .num_parents = 1, 32287173557SJerome Brunet .flags = CLK_SET_RATE_PARENT, 32387173557SJerome Brunet }, 32487173557SJerome Brunet }; 32587173557SJerome Brunet 32605f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div2_div = { 32778b4af31SQiufang Dai .mult = 1, 32878b4af31SQiufang Dai .div = 2, 32978b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 33005f81440SJerome Brunet .name = "fclk_div2_div", 33178b4af31SQiufang Dai .ops = &clk_fixed_factor_ops, 332cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw }, 33378b4af31SQiufang Dai .num_parents = 1, 33478b4af31SQiufang Dai }, 33578b4af31SQiufang Dai }; 33678b4af31SQiufang Dai 33705f81440SJerome Brunet static struct clk_regmap axg_fclk_div2 = { 33805f81440SJerome Brunet .data = &(struct clk_regmap_gate_data){ 33905f81440SJerome Brunet .offset = HHI_MPLL_CNTL6, 34005f81440SJerome Brunet .bit_idx = 27, 34105f81440SJerome Brunet }, 34205f81440SJerome Brunet .hw.init = &(struct clk_init_data){ 34305f81440SJerome Brunet .name = "fclk_div2", 34405f81440SJerome Brunet .ops = &clk_regmap_gate_ops, 345cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 346cc132d11SAlexandre Mergnat &axg_fclk_div2_div.hw 347cc132d11SAlexandre Mergnat }, 34805f81440SJerome Brunet .num_parents = 1, 349d6ee1e7eSJerome Brunet .flags = CLK_IS_CRITICAL, 35005f81440SJerome Brunet }, 35105f81440SJerome Brunet }; 35205f81440SJerome Brunet 35305f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div3_div = { 35478b4af31SQiufang Dai .mult = 1, 35578b4af31SQiufang Dai .div = 3, 35678b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 35705f81440SJerome Brunet .name = "fclk_div3_div", 35878b4af31SQiufang Dai .ops = &clk_fixed_factor_ops, 359cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw }, 36078b4af31SQiufang Dai .num_parents = 1, 36178b4af31SQiufang Dai }, 36278b4af31SQiufang Dai }; 36378b4af31SQiufang Dai 36405f81440SJerome Brunet static struct clk_regmap axg_fclk_div3 = { 36505f81440SJerome Brunet .data = &(struct clk_regmap_gate_data){ 36605f81440SJerome Brunet .offset = HHI_MPLL_CNTL6, 36705f81440SJerome Brunet .bit_idx = 28, 36805f81440SJerome Brunet }, 36905f81440SJerome Brunet .hw.init = &(struct clk_init_data){ 37005f81440SJerome Brunet .name = "fclk_div3", 37105f81440SJerome Brunet .ops = &clk_regmap_gate_ops, 372cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 373cc132d11SAlexandre Mergnat &axg_fclk_div3_div.hw 374cc132d11SAlexandre Mergnat }, 37505f81440SJerome Brunet .num_parents = 1, 376d6ee1e7eSJerome Brunet /* 377d6ee1e7eSJerome Brunet * FIXME: 378d6ee1e7eSJerome Brunet * This clock, as fdiv2, is used by the SCPI FW and is required 379d6ee1e7eSJerome Brunet * by the platform to operate correctly. 380d6ee1e7eSJerome Brunet * Until the following condition are met, we need this clock to 381d6ee1e7eSJerome Brunet * be marked as critical: 382d6ee1e7eSJerome Brunet * a) The SCPI generic driver claims and enable all the clocks 383d6ee1e7eSJerome Brunet * it needs 384d6ee1e7eSJerome Brunet * b) CCF has a clock hand-off mechanism to make the sure the 385d6ee1e7eSJerome Brunet * clock stays on until the proper driver comes along 386d6ee1e7eSJerome Brunet */ 387d6ee1e7eSJerome Brunet .flags = CLK_IS_CRITICAL, 38805f81440SJerome Brunet }, 38905f81440SJerome Brunet }; 39005f81440SJerome Brunet 39105f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div4_div = { 39278b4af31SQiufang Dai .mult = 1, 39378b4af31SQiufang Dai .div = 4, 39478b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 39505f81440SJerome Brunet .name = "fclk_div4_div", 39678b4af31SQiufang Dai .ops = &clk_fixed_factor_ops, 397cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw }, 39878b4af31SQiufang Dai .num_parents = 1, 39978b4af31SQiufang Dai }, 40078b4af31SQiufang Dai }; 40178b4af31SQiufang Dai 40205f81440SJerome Brunet static struct clk_regmap axg_fclk_div4 = { 40305f81440SJerome Brunet .data = &(struct clk_regmap_gate_data){ 40405f81440SJerome Brunet .offset = HHI_MPLL_CNTL6, 40505f81440SJerome Brunet .bit_idx = 29, 40605f81440SJerome Brunet }, 40705f81440SJerome Brunet .hw.init = &(struct clk_init_data){ 40805f81440SJerome Brunet .name = "fclk_div4", 40905f81440SJerome Brunet .ops = &clk_regmap_gate_ops, 410cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 411cc132d11SAlexandre Mergnat &axg_fclk_div4_div.hw 412cc132d11SAlexandre Mergnat }, 41305f81440SJerome Brunet .num_parents = 1, 41405f81440SJerome Brunet }, 41505f81440SJerome Brunet }; 41605f81440SJerome Brunet 41705f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div5_div = { 41878b4af31SQiufang Dai .mult = 1, 41978b4af31SQiufang Dai .div = 5, 42078b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 42105f81440SJerome Brunet .name = "fclk_div5_div", 42278b4af31SQiufang Dai .ops = &clk_fixed_factor_ops, 423cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw }, 42478b4af31SQiufang Dai .num_parents = 1, 42578b4af31SQiufang Dai }, 42678b4af31SQiufang Dai }; 42778b4af31SQiufang Dai 42805f81440SJerome Brunet static struct clk_regmap axg_fclk_div5 = { 42905f81440SJerome Brunet .data = &(struct clk_regmap_gate_data){ 43005f81440SJerome Brunet .offset = HHI_MPLL_CNTL6, 43105f81440SJerome Brunet .bit_idx = 30, 43205f81440SJerome Brunet }, 43305f81440SJerome Brunet .hw.init = &(struct clk_init_data){ 43405f81440SJerome Brunet .name = "fclk_div5", 43505f81440SJerome Brunet .ops = &clk_regmap_gate_ops, 436cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 437cc132d11SAlexandre Mergnat &axg_fclk_div5_div.hw 438cc132d11SAlexandre Mergnat }, 43905f81440SJerome Brunet .num_parents = 1, 44005f81440SJerome Brunet }, 44105f81440SJerome Brunet }; 44205f81440SJerome Brunet 44305f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div7_div = { 44478b4af31SQiufang Dai .mult = 1, 44578b4af31SQiufang Dai .div = 7, 44678b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 44705f81440SJerome Brunet .name = "fclk_div7_div", 44878b4af31SQiufang Dai .ops = &clk_fixed_factor_ops, 449cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 450cc132d11SAlexandre Mergnat &axg_fixed_pll.hw 451cc132d11SAlexandre Mergnat }, 45278b4af31SQiufang Dai .num_parents = 1, 45378b4af31SQiufang Dai }, 45478b4af31SQiufang Dai }; 45578b4af31SQiufang Dai 45605f81440SJerome Brunet static struct clk_regmap axg_fclk_div7 = { 45705f81440SJerome Brunet .data = &(struct clk_regmap_gate_data){ 45805f81440SJerome Brunet .offset = HHI_MPLL_CNTL6, 45905f81440SJerome Brunet .bit_idx = 31, 46005f81440SJerome Brunet }, 46105f81440SJerome Brunet .hw.init = &(struct clk_init_data){ 46205f81440SJerome Brunet .name = "fclk_div7", 46305f81440SJerome Brunet .ops = &clk_regmap_gate_ops, 464cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 465cc132d11SAlexandre Mergnat &axg_fclk_div7_div.hw 466cc132d11SAlexandre Mergnat }, 46705f81440SJerome Brunet .num_parents = 1, 46805f81440SJerome Brunet }, 46905f81440SJerome Brunet }; 47005f81440SJerome Brunet 471513b67acSJerome Brunet static struct clk_regmap axg_mpll_prediv = { 472513b67acSJerome Brunet .data = &(struct clk_regmap_div_data){ 473513b67acSJerome Brunet .offset = HHI_MPLL_CNTL5, 474513b67acSJerome Brunet .shift = 12, 475513b67acSJerome Brunet .width = 1, 476513b67acSJerome Brunet }, 477513b67acSJerome Brunet .hw.init = &(struct clk_init_data){ 478513b67acSJerome Brunet .name = "mpll_prediv", 479513b67acSJerome Brunet .ops = &clk_regmap_divider_ro_ops, 480cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 481cc132d11SAlexandre Mergnat &axg_fixed_pll.hw 482cc132d11SAlexandre Mergnat }, 483513b67acSJerome Brunet .num_parents = 1, 484513b67acSJerome Brunet }, 485513b67acSJerome Brunet }; 486513b67acSJerome Brunet 487d610b54fSJerome Brunet static struct clk_regmap axg_mpll0_div = { 488c763e61aSJerome Brunet .data = &(struct meson_clk_mpll_data){ 48978b4af31SQiufang Dai .sdm = { 49078b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL7, 49178b4af31SQiufang Dai .shift = 0, 49278b4af31SQiufang Dai .width = 14, 49378b4af31SQiufang Dai }, 49478b4af31SQiufang Dai .sdm_en = { 49578b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL7, 49678b4af31SQiufang Dai .shift = 15, 49778b4af31SQiufang Dai .width = 1, 49878b4af31SQiufang Dai }, 49978b4af31SQiufang Dai .n2 = { 50078b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL7, 50178b4af31SQiufang Dai .shift = 16, 50278b4af31SQiufang Dai .width = 9, 50378b4af31SQiufang Dai }, 5046c00e7b7SJerome Brunet .misc = { 5056c00e7b7SJerome Brunet .reg_off = HHI_PLL_TOP_MISC, 5066c00e7b7SJerome Brunet .shift = 0, 5076c00e7b7SJerome Brunet .width = 1, 5086c00e7b7SJerome Brunet }, 50978b4af31SQiufang Dai .lock = &meson_clk_lock, 510de1ca2d0SJerome Brunet .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 511c763e61aSJerome Brunet }, 51278b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 513d610b54fSJerome Brunet .name = "mpll0_div", 51478b4af31SQiufang Dai .ops = &meson_clk_mpll_ops, 515cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 516cc132d11SAlexandre Mergnat &axg_mpll_prediv.hw 517cc132d11SAlexandre Mergnat }, 51878b4af31SQiufang Dai .num_parents = 1, 51978b4af31SQiufang Dai }, 52078b4af31SQiufang Dai }; 52178b4af31SQiufang Dai 522d610b54fSJerome Brunet static struct clk_regmap axg_mpll0 = { 523d610b54fSJerome Brunet .data = &(struct clk_regmap_gate_data){ 524d610b54fSJerome Brunet .offset = HHI_MPLL_CNTL7, 525d610b54fSJerome Brunet .bit_idx = 14, 526d610b54fSJerome Brunet }, 527d610b54fSJerome Brunet .hw.init = &(struct clk_init_data){ 528d610b54fSJerome Brunet .name = "mpll0", 529d610b54fSJerome Brunet .ops = &clk_regmap_gate_ops, 530cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 531cc132d11SAlexandre Mergnat &axg_mpll0_div.hw 532cc132d11SAlexandre Mergnat }, 533d610b54fSJerome Brunet .num_parents = 1, 534d610b54fSJerome Brunet .flags = CLK_SET_RATE_PARENT, 535d610b54fSJerome Brunet }, 536d610b54fSJerome Brunet }; 537d610b54fSJerome Brunet 538d610b54fSJerome Brunet static struct clk_regmap axg_mpll1_div = { 539c763e61aSJerome Brunet .data = &(struct meson_clk_mpll_data){ 54078b4af31SQiufang Dai .sdm = { 54178b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL8, 54278b4af31SQiufang Dai .shift = 0, 54378b4af31SQiufang Dai .width = 14, 54478b4af31SQiufang Dai }, 54578b4af31SQiufang Dai .sdm_en = { 54678b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL8, 54778b4af31SQiufang Dai .shift = 15, 54878b4af31SQiufang Dai .width = 1, 54978b4af31SQiufang Dai }, 55078b4af31SQiufang Dai .n2 = { 55178b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL8, 55278b4af31SQiufang Dai .shift = 16, 55378b4af31SQiufang Dai .width = 9, 55478b4af31SQiufang Dai }, 5556c00e7b7SJerome Brunet .misc = { 5566c00e7b7SJerome Brunet .reg_off = HHI_PLL_TOP_MISC, 5576c00e7b7SJerome Brunet .shift = 1, 5586c00e7b7SJerome Brunet .width = 1, 5596c00e7b7SJerome Brunet }, 56078b4af31SQiufang Dai .lock = &meson_clk_lock, 561de1ca2d0SJerome Brunet .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 562c763e61aSJerome Brunet }, 56378b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 564d610b54fSJerome Brunet .name = "mpll1_div", 56578b4af31SQiufang Dai .ops = &meson_clk_mpll_ops, 566cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 567cc132d11SAlexandre Mergnat &axg_mpll_prediv.hw 568cc132d11SAlexandre Mergnat }, 56978b4af31SQiufang Dai .num_parents = 1, 57078b4af31SQiufang Dai }, 57178b4af31SQiufang Dai }; 57278b4af31SQiufang Dai 573d610b54fSJerome Brunet static struct clk_regmap axg_mpll1 = { 574d610b54fSJerome Brunet .data = &(struct clk_regmap_gate_data){ 575d610b54fSJerome Brunet .offset = HHI_MPLL_CNTL8, 576d610b54fSJerome Brunet .bit_idx = 14, 577d610b54fSJerome Brunet }, 578d610b54fSJerome Brunet .hw.init = &(struct clk_init_data){ 579d610b54fSJerome Brunet .name = "mpll1", 580d610b54fSJerome Brunet .ops = &clk_regmap_gate_ops, 581cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 582cc132d11SAlexandre Mergnat &axg_mpll1_div.hw 583cc132d11SAlexandre Mergnat }, 584d610b54fSJerome Brunet .num_parents = 1, 585d610b54fSJerome Brunet .flags = CLK_SET_RATE_PARENT, 586d610b54fSJerome Brunet }, 587d610b54fSJerome Brunet }; 588d610b54fSJerome Brunet 589d610b54fSJerome Brunet static struct clk_regmap axg_mpll2_div = { 590c763e61aSJerome Brunet .data = &(struct meson_clk_mpll_data){ 59178b4af31SQiufang Dai .sdm = { 59278b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL9, 59378b4af31SQiufang Dai .shift = 0, 59478b4af31SQiufang Dai .width = 14, 59578b4af31SQiufang Dai }, 59678b4af31SQiufang Dai .sdm_en = { 59778b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL9, 59878b4af31SQiufang Dai .shift = 15, 59978b4af31SQiufang Dai .width = 1, 60078b4af31SQiufang Dai }, 60178b4af31SQiufang Dai .n2 = { 60278b4af31SQiufang Dai .reg_off = HHI_MPLL_CNTL9, 60378b4af31SQiufang Dai .shift = 16, 60478b4af31SQiufang Dai .width = 9, 60578b4af31SQiufang Dai }, 606dc4e62d3SJerome Brunet .ssen = { 607dc4e62d3SJerome Brunet .reg_off = HHI_MPLL_CNTL, 608dc4e62d3SJerome Brunet .shift = 25, 609dc4e62d3SJerome Brunet .width = 1, 610dc4e62d3SJerome Brunet }, 6116c00e7b7SJerome Brunet .misc = { 6126c00e7b7SJerome Brunet .reg_off = HHI_PLL_TOP_MISC, 6136c00e7b7SJerome Brunet .shift = 2, 6146c00e7b7SJerome Brunet .width = 1, 6156c00e7b7SJerome Brunet }, 61678b4af31SQiufang Dai .lock = &meson_clk_lock, 617de1ca2d0SJerome Brunet .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 618c763e61aSJerome Brunet }, 61978b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 620d610b54fSJerome Brunet .name = "mpll2_div", 62178b4af31SQiufang Dai .ops = &meson_clk_mpll_ops, 622cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 623cc132d11SAlexandre Mergnat &axg_mpll_prediv.hw 624cc132d11SAlexandre Mergnat }, 62578b4af31SQiufang Dai .num_parents = 1, 62678b4af31SQiufang Dai }, 62778b4af31SQiufang Dai }; 62878b4af31SQiufang Dai 629d610b54fSJerome Brunet static struct clk_regmap axg_mpll2 = { 630d610b54fSJerome Brunet .data = &(struct clk_regmap_gate_data){ 631d610b54fSJerome Brunet .offset = HHI_MPLL_CNTL9, 632d610b54fSJerome Brunet .bit_idx = 14, 633d610b54fSJerome Brunet }, 634d610b54fSJerome Brunet .hw.init = &(struct clk_init_data){ 635d610b54fSJerome Brunet .name = "mpll2", 636d610b54fSJerome Brunet .ops = &clk_regmap_gate_ops, 637cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 638cc132d11SAlexandre Mergnat &axg_mpll2_div.hw 639cc132d11SAlexandre Mergnat }, 640d610b54fSJerome Brunet .num_parents = 1, 641d610b54fSJerome Brunet .flags = CLK_SET_RATE_PARENT, 642d610b54fSJerome Brunet }, 643d610b54fSJerome Brunet }; 644d610b54fSJerome Brunet 645d610b54fSJerome Brunet static struct clk_regmap axg_mpll3_div = { 646c763e61aSJerome Brunet .data = &(struct meson_clk_mpll_data){ 64778b4af31SQiufang Dai .sdm = { 64878b4af31SQiufang Dai .reg_off = HHI_MPLL3_CNTL0, 64978b4af31SQiufang Dai .shift = 12, 65078b4af31SQiufang Dai .width = 14, 65178b4af31SQiufang Dai }, 65278b4af31SQiufang Dai .sdm_en = { 65378b4af31SQiufang Dai .reg_off = HHI_MPLL3_CNTL0, 65478b4af31SQiufang Dai .shift = 11, 65578b4af31SQiufang Dai .width = 1, 65678b4af31SQiufang Dai }, 65778b4af31SQiufang Dai .n2 = { 65878b4af31SQiufang Dai .reg_off = HHI_MPLL3_CNTL0, 65978b4af31SQiufang Dai .shift = 2, 66078b4af31SQiufang Dai .width = 9, 66178b4af31SQiufang Dai }, 6626c00e7b7SJerome Brunet .misc = { 6636c00e7b7SJerome Brunet .reg_off = HHI_PLL_TOP_MISC, 6646c00e7b7SJerome Brunet .shift = 3, 6656c00e7b7SJerome Brunet .width = 1, 6666c00e7b7SJerome Brunet }, 66778b4af31SQiufang Dai .lock = &meson_clk_lock, 668de1ca2d0SJerome Brunet .flags = CLK_MESON_MPLL_ROUND_CLOSEST, 669c763e61aSJerome Brunet }, 67078b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 671d610b54fSJerome Brunet .name = "mpll3_div", 67278b4af31SQiufang Dai .ops = &meson_clk_mpll_ops, 673cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 674cc132d11SAlexandre Mergnat &axg_mpll_prediv.hw 675cc132d11SAlexandre Mergnat }, 67678b4af31SQiufang Dai .num_parents = 1, 67778b4af31SQiufang Dai }, 67878b4af31SQiufang Dai }; 67978b4af31SQiufang Dai 680d610b54fSJerome Brunet static struct clk_regmap axg_mpll3 = { 681d610b54fSJerome Brunet .data = &(struct clk_regmap_gate_data){ 682d610b54fSJerome Brunet .offset = HHI_MPLL3_CNTL0, 683d610b54fSJerome Brunet .bit_idx = 0, 684d610b54fSJerome Brunet }, 685d610b54fSJerome Brunet .hw.init = &(struct clk_init_data){ 686d610b54fSJerome Brunet .name = "mpll3", 687d610b54fSJerome Brunet .ops = &clk_regmap_gate_ops, 688cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 689cc132d11SAlexandre Mergnat &axg_mpll3_div.hw 690cc132d11SAlexandre Mergnat }, 691d610b54fSJerome Brunet .num_parents = 1, 692d610b54fSJerome Brunet .flags = CLK_SET_RATE_PARENT, 693d610b54fSJerome Brunet }, 694d610b54fSJerome Brunet }; 695d610b54fSJerome Brunet 696dd601dbcSJerome Brunet static const struct pll_params_table axg_pcie_pll_params_table[] = { 697cddcb20bSYixun Lan { 698cddcb20bSYixun Lan .m = 200, 699cddcb20bSYixun Lan .n = 3, 700cddcb20bSYixun Lan }, 701cddcb20bSYixun Lan { /* sentinel */ }, 702cddcb20bSYixun Lan }; 703cddcb20bSYixun Lan 704cddcb20bSYixun Lan static const struct reg_sequence axg_pcie_init_regs[] = { 705cddcb20bSYixun Lan { .reg = HHI_PCIE_PLL_CNTL1, .def = 0x0084a2aa }, 706cddcb20bSYixun Lan { .reg = HHI_PCIE_PLL_CNTL2, .def = 0xb75020be }, 707cddcb20bSYixun Lan { .reg = HHI_PCIE_PLL_CNTL3, .def = 0x0a47488e }, 708cddcb20bSYixun Lan { .reg = HHI_PCIE_PLL_CNTL4, .def = 0xc000004d }, 709cddcb20bSYixun Lan { .reg = HHI_PCIE_PLL_CNTL5, .def = 0x00078000 }, 710cddcb20bSYixun Lan { .reg = HHI_PCIE_PLL_CNTL6, .def = 0x002323c6 }, 71187173557SJerome Brunet { .reg = HHI_PCIE_PLL_CNTL, .def = 0x400106c8 }, 712cddcb20bSYixun Lan }; 713cddcb20bSYixun Lan 71487173557SJerome Brunet static struct clk_regmap axg_pcie_pll_dco = { 715cddcb20bSYixun Lan .data = &(struct meson_clk_pll_data){ 716e40c7e3cSJerome Brunet .en = { 717e40c7e3cSJerome Brunet .reg_off = HHI_PCIE_PLL_CNTL, 718e40c7e3cSJerome Brunet .shift = 30, 719e40c7e3cSJerome Brunet .width = 1, 720e40c7e3cSJerome Brunet }, 721cddcb20bSYixun Lan .m = { 722cddcb20bSYixun Lan .reg_off = HHI_PCIE_PLL_CNTL, 723cddcb20bSYixun Lan .shift = 0, 724cddcb20bSYixun Lan .width = 9, 725cddcb20bSYixun Lan }, 726cddcb20bSYixun Lan .n = { 727cddcb20bSYixun Lan .reg_off = HHI_PCIE_PLL_CNTL, 728cddcb20bSYixun Lan .shift = 9, 729cddcb20bSYixun Lan .width = 5, 730cddcb20bSYixun Lan }, 731cddcb20bSYixun Lan .frac = { 732cddcb20bSYixun Lan .reg_off = HHI_PCIE_PLL_CNTL1, 733cddcb20bSYixun Lan .shift = 0, 734cddcb20bSYixun Lan .width = 12, 735cddcb20bSYixun Lan }, 736cddcb20bSYixun Lan .l = { 737cddcb20bSYixun Lan .reg_off = HHI_PCIE_PLL_CNTL, 738cddcb20bSYixun Lan .shift = 31, 739cddcb20bSYixun Lan .width = 1, 740cddcb20bSYixun Lan }, 741cddcb20bSYixun Lan .rst = { 742cddcb20bSYixun Lan .reg_off = HHI_PCIE_PLL_CNTL, 743cddcb20bSYixun Lan .shift = 29, 744cddcb20bSYixun Lan .width = 1, 745cddcb20bSYixun Lan }, 746dd601dbcSJerome Brunet .table = axg_pcie_pll_params_table, 747cddcb20bSYixun Lan .init_regs = axg_pcie_init_regs, 748cddcb20bSYixun Lan .init_count = ARRAY_SIZE(axg_pcie_init_regs), 749cddcb20bSYixun Lan }, 750cddcb20bSYixun Lan .hw.init = &(struct clk_init_data){ 75187173557SJerome Brunet .name = "pcie_pll_dco", 752cddcb20bSYixun Lan .ops = &meson_clk_pll_ops, 753cc132d11SAlexandre Mergnat .parent_data = &(const struct clk_parent_data) { 754cc132d11SAlexandre Mergnat .fw_name = "xtal", 755cc132d11SAlexandre Mergnat }, 756cddcb20bSYixun Lan .num_parents = 1, 757cddcb20bSYixun Lan }, 758cddcb20bSYixun Lan }; 759cddcb20bSYixun Lan 76087173557SJerome Brunet static struct clk_regmap axg_pcie_pll_od = { 76187173557SJerome Brunet .data = &(struct clk_regmap_div_data){ 76287173557SJerome Brunet .offset = HHI_PCIE_PLL_CNTL, 76387173557SJerome Brunet .shift = 16, 76487173557SJerome Brunet .width = 2, 76587173557SJerome Brunet .flags = CLK_DIVIDER_POWER_OF_TWO, 76687173557SJerome Brunet }, 76787173557SJerome Brunet .hw.init = &(struct clk_init_data){ 76887173557SJerome Brunet .name = "pcie_pll_od", 76987173557SJerome Brunet .ops = &clk_regmap_divider_ops, 770cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 771cc132d11SAlexandre Mergnat &axg_pcie_pll_dco.hw 772cc132d11SAlexandre Mergnat }, 77387173557SJerome Brunet .num_parents = 1, 77487173557SJerome Brunet .flags = CLK_SET_RATE_PARENT, 77587173557SJerome Brunet }, 77687173557SJerome Brunet }; 77787173557SJerome Brunet 77887173557SJerome Brunet static struct clk_regmap axg_pcie_pll = { 77987173557SJerome Brunet .data = &(struct clk_regmap_div_data){ 78087173557SJerome Brunet .offset = HHI_PCIE_PLL_CNTL6, 78187173557SJerome Brunet .shift = 6, 78287173557SJerome Brunet .width = 2, 78387173557SJerome Brunet .flags = CLK_DIVIDER_POWER_OF_TWO, 78487173557SJerome Brunet }, 78587173557SJerome Brunet .hw.init = &(struct clk_init_data){ 78687173557SJerome Brunet .name = "pcie_pll", 78787173557SJerome Brunet .ops = &clk_regmap_divider_ops, 788cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 789cc132d11SAlexandre Mergnat &axg_pcie_pll_od.hw 790cc132d11SAlexandre Mergnat }, 79187173557SJerome Brunet .num_parents = 1, 79287173557SJerome Brunet .flags = CLK_SET_RATE_PARENT, 79387173557SJerome Brunet }, 79487173557SJerome Brunet }; 79587173557SJerome Brunet 796cddcb20bSYixun Lan static struct clk_regmap axg_pcie_mux = { 797cddcb20bSYixun Lan .data = &(struct clk_regmap_mux_data){ 798cddcb20bSYixun Lan .offset = HHI_PCIE_PLL_CNTL6, 799cddcb20bSYixun Lan .mask = 0x1, 800cddcb20bSYixun Lan .shift = 2, 80169b93104SYixun Lan /* skip the parent mpll3, reserved for debug */ 80269b93104SYixun Lan .table = (u32[]){ 1 }, 803cddcb20bSYixun Lan }, 804cddcb20bSYixun Lan .hw.init = &(struct clk_init_data){ 805cddcb20bSYixun Lan .name = "pcie_mux", 806cddcb20bSYixun Lan .ops = &clk_regmap_mux_ops, 807cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { &axg_pcie_pll.hw }, 80869b93104SYixun Lan .num_parents = 1, 809cddcb20bSYixun Lan .flags = CLK_SET_RATE_PARENT, 810cddcb20bSYixun Lan }, 811cddcb20bSYixun Lan }; 812cddcb20bSYixun Lan 813cddcb20bSYixun Lan static struct clk_regmap axg_pcie_ref = { 814cddcb20bSYixun Lan .data = &(struct clk_regmap_mux_data){ 815cddcb20bSYixun Lan .offset = HHI_PCIE_PLL_CNTL6, 816cddcb20bSYixun Lan .mask = 0x1, 817cddcb20bSYixun Lan .shift = 1, 818cddcb20bSYixun Lan /* skip the parent 0, reserved for debug */ 819cddcb20bSYixun Lan .table = (u32[]){ 1 }, 820cddcb20bSYixun Lan }, 821cddcb20bSYixun Lan .hw.init = &(struct clk_init_data){ 822cddcb20bSYixun Lan .name = "pcie_ref", 823cddcb20bSYixun Lan .ops = &clk_regmap_mux_ops, 824cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { &axg_pcie_mux.hw }, 825cddcb20bSYixun Lan .num_parents = 1, 826cddcb20bSYixun Lan .flags = CLK_SET_RATE_PARENT, 827cddcb20bSYixun Lan }, 828cddcb20bSYixun Lan }; 829cddcb20bSYixun Lan 830cddcb20bSYixun Lan static struct clk_regmap axg_pcie_cml_en0 = { 831cddcb20bSYixun Lan .data = &(struct clk_regmap_gate_data){ 832cddcb20bSYixun Lan .offset = HHI_PCIE_PLL_CNTL6, 833cddcb20bSYixun Lan .bit_idx = 4, 834cddcb20bSYixun Lan }, 835cddcb20bSYixun Lan .hw.init = &(struct clk_init_data) { 836cddcb20bSYixun Lan .name = "pcie_cml_en0", 837cddcb20bSYixun Lan .ops = &clk_regmap_gate_ops, 838cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw }, 839cddcb20bSYixun Lan .num_parents = 1, 840cddcb20bSYixun Lan .flags = CLK_SET_RATE_PARENT, 841cddcb20bSYixun Lan 842cddcb20bSYixun Lan }, 843cddcb20bSYixun Lan }; 844cddcb20bSYixun Lan 845cddcb20bSYixun Lan static struct clk_regmap axg_pcie_cml_en1 = { 846cddcb20bSYixun Lan .data = &(struct clk_regmap_gate_data){ 847cddcb20bSYixun Lan .offset = HHI_PCIE_PLL_CNTL6, 848cddcb20bSYixun Lan .bit_idx = 3, 849cddcb20bSYixun Lan }, 850cddcb20bSYixun Lan .hw.init = &(struct clk_init_data) { 851cddcb20bSYixun Lan .name = "pcie_cml_en1", 852cddcb20bSYixun Lan .ops = &clk_regmap_gate_ops, 853cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw }, 854cddcb20bSYixun Lan .num_parents = 1, 855cddcb20bSYixun Lan .flags = CLK_SET_RATE_PARENT, 856cddcb20bSYixun Lan }, 857cddcb20bSYixun Lan }; 858cddcb20bSYixun Lan 85978b4af31SQiufang Dai static u32 mux_table_clk81[] = { 0, 2, 3, 4, 5, 6, 7 }; 860cc132d11SAlexandre Mergnat static const struct clk_parent_data clk81_parent_data[] = { 861cc132d11SAlexandre Mergnat { .fw_name = "xtal", }, 862cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div7.hw }, 863cc132d11SAlexandre Mergnat { .hw = &axg_mpll1.hw }, 864cc132d11SAlexandre Mergnat { .hw = &axg_mpll2.hw }, 865cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div4.hw }, 866cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div3.hw }, 867cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div5.hw }, 86878b4af31SQiufang Dai }; 86978b4af31SQiufang Dai 8702513a28cSJerome Brunet static struct clk_regmap axg_mpeg_clk_sel = { 8712513a28cSJerome Brunet .data = &(struct clk_regmap_mux_data){ 8722513a28cSJerome Brunet .offset = HHI_MPEG_CLK_CNTL, 87378b4af31SQiufang Dai .mask = 0x7, 87478b4af31SQiufang Dai .shift = 12, 87578b4af31SQiufang Dai .table = mux_table_clk81, 8762513a28cSJerome Brunet }, 87778b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 87878b4af31SQiufang Dai .name = "mpeg_clk_sel", 8792513a28cSJerome Brunet .ops = &clk_regmap_mux_ro_ops, 880cc132d11SAlexandre Mergnat .parent_data = clk81_parent_data, 881cc132d11SAlexandre Mergnat .num_parents = ARRAY_SIZE(clk81_parent_data), 88278b4af31SQiufang Dai }, 88378b4af31SQiufang Dai }; 88478b4af31SQiufang Dai 885f06ddd28SJerome Brunet static struct clk_regmap axg_mpeg_clk_div = { 886f06ddd28SJerome Brunet .data = &(struct clk_regmap_div_data){ 887f06ddd28SJerome Brunet .offset = HHI_MPEG_CLK_CNTL, 88878b4af31SQiufang Dai .shift = 0, 88978b4af31SQiufang Dai .width = 7, 890f06ddd28SJerome Brunet }, 89178b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 89278b4af31SQiufang Dai .name = "mpeg_clk_div", 893f06ddd28SJerome Brunet .ops = &clk_regmap_divider_ops, 894cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 895cc132d11SAlexandre Mergnat &axg_mpeg_clk_sel.hw 896cc132d11SAlexandre Mergnat }, 89778b4af31SQiufang Dai .num_parents = 1, 89878b4af31SQiufang Dai .flags = CLK_SET_RATE_PARENT, 89978b4af31SQiufang Dai }, 90078b4af31SQiufang Dai }; 90178b4af31SQiufang Dai 9027f9768a5SJerome Brunet static struct clk_regmap axg_clk81 = { 9037f9768a5SJerome Brunet .data = &(struct clk_regmap_gate_data){ 9047f9768a5SJerome Brunet .offset = HHI_MPEG_CLK_CNTL, 90578b4af31SQiufang Dai .bit_idx = 7, 9067f9768a5SJerome Brunet }, 90778b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 90878b4af31SQiufang Dai .name = "clk81", 9097f9768a5SJerome Brunet .ops = &clk_regmap_gate_ops, 910cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 911cc132d11SAlexandre Mergnat &axg_mpeg_clk_div.hw 912cc132d11SAlexandre Mergnat }, 91378b4af31SQiufang Dai .num_parents = 1, 91478b4af31SQiufang Dai .flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL), 91578b4af31SQiufang Dai }, 91678b4af31SQiufang Dai }; 91778b4af31SQiufang Dai 918cc132d11SAlexandre Mergnat static const struct clk_parent_data axg_sd_emmc_clk0_parent_data[] = { 919cc132d11SAlexandre Mergnat { .fw_name = "xtal", }, 920cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div2.hw }, 921cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div3.hw }, 922cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div5.hw }, 923cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div7.hw }, 92478b4af31SQiufang Dai /* 92578b4af31SQiufang Dai * Following these parent clocks, we should also have had mpll2, mpll3 92678b4af31SQiufang Dai * and gp0_pll but these clocks are too precious to be used here. All 92778b4af31SQiufang Dai * the necessary rates for MMC and NAND operation can be acheived using 92878b4af31SQiufang Dai * xtal or fclk_div clocks 92978b4af31SQiufang Dai */ 93078b4af31SQiufang Dai }; 93178b4af31SQiufang Dai 93278b4af31SQiufang Dai /* SDcard clock */ 9332513a28cSJerome Brunet static struct clk_regmap axg_sd_emmc_b_clk0_sel = { 9342513a28cSJerome Brunet .data = &(struct clk_regmap_mux_data){ 9352513a28cSJerome Brunet .offset = HHI_SD_EMMC_CLK_CNTL, 93678b4af31SQiufang Dai .mask = 0x7, 93778b4af31SQiufang Dai .shift = 25, 9382513a28cSJerome Brunet }, 93978b4af31SQiufang Dai .hw.init = &(struct clk_init_data) { 94078b4af31SQiufang Dai .name = "sd_emmc_b_clk0_sel", 9412513a28cSJerome Brunet .ops = &clk_regmap_mux_ops, 942cc132d11SAlexandre Mergnat .parent_data = axg_sd_emmc_clk0_parent_data, 943cc132d11SAlexandre Mergnat .num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data), 94478b4af31SQiufang Dai .flags = CLK_SET_RATE_PARENT, 94578b4af31SQiufang Dai }, 94678b4af31SQiufang Dai }; 94778b4af31SQiufang Dai 948f06ddd28SJerome Brunet static struct clk_regmap axg_sd_emmc_b_clk0_div = { 949f06ddd28SJerome Brunet .data = &(struct clk_regmap_div_data){ 950f06ddd28SJerome Brunet .offset = HHI_SD_EMMC_CLK_CNTL, 95178b4af31SQiufang Dai .shift = 16, 95278b4af31SQiufang Dai .width = 7, 95378b4af31SQiufang Dai .flags = CLK_DIVIDER_ROUND_CLOSEST, 954f06ddd28SJerome Brunet }, 95578b4af31SQiufang Dai .hw.init = &(struct clk_init_data) { 95678b4af31SQiufang Dai .name = "sd_emmc_b_clk0_div", 957f06ddd28SJerome Brunet .ops = &clk_regmap_divider_ops, 958cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 959cc132d11SAlexandre Mergnat &axg_sd_emmc_b_clk0_sel.hw 960cc132d11SAlexandre Mergnat }, 96178b4af31SQiufang Dai .num_parents = 1, 96278b4af31SQiufang Dai .flags = CLK_SET_RATE_PARENT, 96378b4af31SQiufang Dai }, 96478b4af31SQiufang Dai }; 96578b4af31SQiufang Dai 9667f9768a5SJerome Brunet static struct clk_regmap axg_sd_emmc_b_clk0 = { 9677f9768a5SJerome Brunet .data = &(struct clk_regmap_gate_data){ 9687f9768a5SJerome Brunet .offset = HHI_SD_EMMC_CLK_CNTL, 96978b4af31SQiufang Dai .bit_idx = 23, 9707f9768a5SJerome Brunet }, 97178b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 97278b4af31SQiufang Dai .name = "sd_emmc_b_clk0", 9737f9768a5SJerome Brunet .ops = &clk_regmap_gate_ops, 974cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 975cc132d11SAlexandre Mergnat &axg_sd_emmc_b_clk0_div.hw 976cc132d11SAlexandre Mergnat }, 97778b4af31SQiufang Dai .num_parents = 1, 97878b4af31SQiufang Dai .flags = CLK_SET_RATE_PARENT, 97978b4af31SQiufang Dai }, 98078b4af31SQiufang Dai }; 98178b4af31SQiufang Dai 98278b4af31SQiufang Dai /* EMMC/NAND clock */ 9832513a28cSJerome Brunet static struct clk_regmap axg_sd_emmc_c_clk0_sel = { 9842513a28cSJerome Brunet .data = &(struct clk_regmap_mux_data){ 9852513a28cSJerome Brunet .offset = HHI_NAND_CLK_CNTL, 98678b4af31SQiufang Dai .mask = 0x7, 98778b4af31SQiufang Dai .shift = 9, 9882513a28cSJerome Brunet }, 98978b4af31SQiufang Dai .hw.init = &(struct clk_init_data) { 99078b4af31SQiufang Dai .name = "sd_emmc_c_clk0_sel", 9912513a28cSJerome Brunet .ops = &clk_regmap_mux_ops, 992cc132d11SAlexandre Mergnat .parent_data = axg_sd_emmc_clk0_parent_data, 993cc132d11SAlexandre Mergnat .num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data), 99478b4af31SQiufang Dai .flags = CLK_SET_RATE_PARENT, 99578b4af31SQiufang Dai }, 99678b4af31SQiufang Dai }; 99778b4af31SQiufang Dai 998f06ddd28SJerome Brunet static struct clk_regmap axg_sd_emmc_c_clk0_div = { 999f06ddd28SJerome Brunet .data = &(struct clk_regmap_div_data){ 1000f06ddd28SJerome Brunet .offset = HHI_NAND_CLK_CNTL, 100178b4af31SQiufang Dai .shift = 0, 100278b4af31SQiufang Dai .width = 7, 100378b4af31SQiufang Dai .flags = CLK_DIVIDER_ROUND_CLOSEST, 1004f06ddd28SJerome Brunet }, 100578b4af31SQiufang Dai .hw.init = &(struct clk_init_data) { 100678b4af31SQiufang Dai .name = "sd_emmc_c_clk0_div", 1007f06ddd28SJerome Brunet .ops = &clk_regmap_divider_ops, 1008cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 1009cc132d11SAlexandre Mergnat &axg_sd_emmc_c_clk0_sel.hw 1010cc132d11SAlexandre Mergnat }, 101178b4af31SQiufang Dai .num_parents = 1, 101278b4af31SQiufang Dai .flags = CLK_SET_RATE_PARENT, 101378b4af31SQiufang Dai }, 101478b4af31SQiufang Dai }; 101578b4af31SQiufang Dai 10167f9768a5SJerome Brunet static struct clk_regmap axg_sd_emmc_c_clk0 = { 10177f9768a5SJerome Brunet .data = &(struct clk_regmap_gate_data){ 10187f9768a5SJerome Brunet .offset = HHI_NAND_CLK_CNTL, 101978b4af31SQiufang Dai .bit_idx = 7, 10207f9768a5SJerome Brunet }, 102178b4af31SQiufang Dai .hw.init = &(struct clk_init_data){ 102278b4af31SQiufang Dai .name = "sd_emmc_c_clk0", 10237f9768a5SJerome Brunet .ops = &clk_regmap_gate_ops, 1024cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 1025cc132d11SAlexandre Mergnat &axg_sd_emmc_c_clk0_div.hw 1026cc132d11SAlexandre Mergnat }, 102778b4af31SQiufang Dai .num_parents = 1, 102878b4af31SQiufang Dai .flags = CLK_SET_RATE_PARENT, 102978b4af31SQiufang Dai }, 103078b4af31SQiufang Dai }; 103178b4af31SQiufang Dai 103214ebb315SNeil Armstrong /* VPU Clock */ 103314ebb315SNeil Armstrong 103414ebb315SNeil Armstrong static const struct clk_hw *axg_vpu_parent_hws[] = { 103514ebb315SNeil Armstrong &axg_fclk_div4.hw, 103614ebb315SNeil Armstrong &axg_fclk_div3.hw, 103714ebb315SNeil Armstrong &axg_fclk_div5.hw, 103814ebb315SNeil Armstrong &axg_fclk_div7.hw, 103914ebb315SNeil Armstrong }; 104014ebb315SNeil Armstrong 104114ebb315SNeil Armstrong static struct clk_regmap axg_vpu_0_sel = { 104214ebb315SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 104314ebb315SNeil Armstrong .offset = HHI_VPU_CLK_CNTL, 104414ebb315SNeil Armstrong .mask = 0x3, 104514ebb315SNeil Armstrong .shift = 9, 104614ebb315SNeil Armstrong }, 104714ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 104814ebb315SNeil Armstrong .name = "vpu_0_sel", 104914ebb315SNeil Armstrong .ops = &clk_regmap_mux_ops, 105014ebb315SNeil Armstrong .parent_hws = axg_vpu_parent_hws, 105114ebb315SNeil Armstrong .num_parents = ARRAY_SIZE(axg_vpu_parent_hws), 105214ebb315SNeil Armstrong /* We need a specific parent for VPU clock source, let it be set in DT */ 105314ebb315SNeil Armstrong .flags = CLK_SET_RATE_NO_REPARENT, 105414ebb315SNeil Armstrong }, 105514ebb315SNeil Armstrong }; 105614ebb315SNeil Armstrong 105714ebb315SNeil Armstrong static struct clk_regmap axg_vpu_0_div = { 105814ebb315SNeil Armstrong .data = &(struct clk_regmap_div_data){ 105914ebb315SNeil Armstrong .offset = HHI_VPU_CLK_CNTL, 106014ebb315SNeil Armstrong .shift = 0, 106114ebb315SNeil Armstrong .width = 7, 106214ebb315SNeil Armstrong }, 106314ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 106414ebb315SNeil Armstrong .name = "vpu_0_div", 106514ebb315SNeil Armstrong .ops = &clk_regmap_divider_ops, 106614ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_sel.hw }, 106714ebb315SNeil Armstrong .num_parents = 1, 106814ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT, 106914ebb315SNeil Armstrong }, 107014ebb315SNeil Armstrong }; 107114ebb315SNeil Armstrong 107214ebb315SNeil Armstrong static struct clk_regmap axg_vpu_0 = { 107314ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 107414ebb315SNeil Armstrong .offset = HHI_VPU_CLK_CNTL, 107514ebb315SNeil Armstrong .bit_idx = 8, 107614ebb315SNeil Armstrong }, 107714ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 107814ebb315SNeil Armstrong .name = "vpu_0", 107914ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 108014ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_div.hw }, 108114ebb315SNeil Armstrong .num_parents = 1, 108214ebb315SNeil Armstrong /* 108314ebb315SNeil Armstrong * We want to avoid CCF to disable the VPU clock if 108414ebb315SNeil Armstrong * display has been set by Bootloader 108514ebb315SNeil Armstrong */ 108614ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 108714ebb315SNeil Armstrong }, 108814ebb315SNeil Armstrong }; 108914ebb315SNeil Armstrong 109014ebb315SNeil Armstrong static struct clk_regmap axg_vpu_1_sel = { 109114ebb315SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 109214ebb315SNeil Armstrong .offset = HHI_VPU_CLK_CNTL, 109314ebb315SNeil Armstrong .mask = 0x3, 109414ebb315SNeil Armstrong .shift = 25, 109514ebb315SNeil Armstrong }, 109614ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 109714ebb315SNeil Armstrong .name = "vpu_1_sel", 109814ebb315SNeil Armstrong .ops = &clk_regmap_mux_ops, 109914ebb315SNeil Armstrong .parent_hws = axg_vpu_parent_hws, 110014ebb315SNeil Armstrong .num_parents = ARRAY_SIZE(axg_vpu_parent_hws), 110114ebb315SNeil Armstrong /* We need a specific parent for VPU clock source, let it be set in DT */ 110214ebb315SNeil Armstrong .flags = CLK_SET_RATE_NO_REPARENT, 110314ebb315SNeil Armstrong }, 110414ebb315SNeil Armstrong }; 110514ebb315SNeil Armstrong 110614ebb315SNeil Armstrong static struct clk_regmap axg_vpu_1_div = { 110714ebb315SNeil Armstrong .data = &(struct clk_regmap_div_data){ 110814ebb315SNeil Armstrong .offset = HHI_VPU_CLK_CNTL, 110914ebb315SNeil Armstrong .shift = 16, 111014ebb315SNeil Armstrong .width = 7, 111114ebb315SNeil Armstrong }, 111214ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 111314ebb315SNeil Armstrong .name = "vpu_1_div", 111414ebb315SNeil Armstrong .ops = &clk_regmap_divider_ops, 111514ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_sel.hw }, 111614ebb315SNeil Armstrong .num_parents = 1, 111714ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT, 111814ebb315SNeil Armstrong }, 111914ebb315SNeil Armstrong }; 112014ebb315SNeil Armstrong 112114ebb315SNeil Armstrong static struct clk_regmap axg_vpu_1 = { 112214ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 112314ebb315SNeil Armstrong .offset = HHI_VPU_CLK_CNTL, 112414ebb315SNeil Armstrong .bit_idx = 24, 112514ebb315SNeil Armstrong }, 112614ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 112714ebb315SNeil Armstrong .name = "vpu_1", 112814ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 112914ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_div.hw }, 113014ebb315SNeil Armstrong .num_parents = 1, 113114ebb315SNeil Armstrong /* 113214ebb315SNeil Armstrong * We want to avoid CCF to disable the VPU clock if 113314ebb315SNeil Armstrong * display has been set by Bootloader 113414ebb315SNeil Armstrong */ 113514ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 113614ebb315SNeil Armstrong }, 113714ebb315SNeil Armstrong }; 113814ebb315SNeil Armstrong 113914ebb315SNeil Armstrong static struct clk_regmap axg_vpu = { 114014ebb315SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 114114ebb315SNeil Armstrong .offset = HHI_VPU_CLK_CNTL, 114214ebb315SNeil Armstrong .mask = 1, 114314ebb315SNeil Armstrong .shift = 31, 114414ebb315SNeil Armstrong }, 114514ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 114614ebb315SNeil Armstrong .name = "vpu", 114714ebb315SNeil Armstrong .ops = &clk_regmap_mux_ops, 114814ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 114914ebb315SNeil Armstrong &axg_vpu_0.hw, 115014ebb315SNeil Armstrong &axg_vpu_1.hw 115114ebb315SNeil Armstrong }, 115214ebb315SNeil Armstrong .num_parents = 2, 115314ebb315SNeil Armstrong .flags = CLK_SET_RATE_NO_REPARENT, 115414ebb315SNeil Armstrong }, 115514ebb315SNeil Armstrong }; 115614ebb315SNeil Armstrong 115714ebb315SNeil Armstrong /* VAPB Clock */ 115814ebb315SNeil Armstrong 115914ebb315SNeil Armstrong static struct clk_regmap axg_vapb_0_sel = { 116014ebb315SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 116114ebb315SNeil Armstrong .offset = HHI_VAPBCLK_CNTL, 116214ebb315SNeil Armstrong .mask = 0x3, 116314ebb315SNeil Armstrong .shift = 9, 116414ebb315SNeil Armstrong }, 116514ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 116614ebb315SNeil Armstrong .name = "vapb_0_sel", 116714ebb315SNeil Armstrong .ops = &clk_regmap_mux_ops, 116814ebb315SNeil Armstrong .parent_hws = axg_vpu_parent_hws, 116914ebb315SNeil Armstrong .num_parents = ARRAY_SIZE(axg_vpu_parent_hws), 117014ebb315SNeil Armstrong .flags = CLK_SET_RATE_NO_REPARENT, 117114ebb315SNeil Armstrong }, 117214ebb315SNeil Armstrong }; 117314ebb315SNeil Armstrong 117414ebb315SNeil Armstrong static struct clk_regmap axg_vapb_0_div = { 117514ebb315SNeil Armstrong .data = &(struct clk_regmap_div_data){ 117614ebb315SNeil Armstrong .offset = HHI_VAPBCLK_CNTL, 117714ebb315SNeil Armstrong .shift = 0, 117814ebb315SNeil Armstrong .width = 7, 117914ebb315SNeil Armstrong }, 118014ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 118114ebb315SNeil Armstrong .name = "vapb_0_div", 118214ebb315SNeil Armstrong .ops = &clk_regmap_divider_ops, 118314ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 118414ebb315SNeil Armstrong &axg_vapb_0_sel.hw 118514ebb315SNeil Armstrong }, 118614ebb315SNeil Armstrong .num_parents = 1, 118714ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT, 118814ebb315SNeil Armstrong }, 118914ebb315SNeil Armstrong }; 119014ebb315SNeil Armstrong 119114ebb315SNeil Armstrong static struct clk_regmap axg_vapb_0 = { 119214ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 119314ebb315SNeil Armstrong .offset = HHI_VAPBCLK_CNTL, 119414ebb315SNeil Armstrong .bit_idx = 8, 119514ebb315SNeil Armstrong }, 119614ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 119714ebb315SNeil Armstrong .name = "vapb_0", 119814ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 119914ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 120014ebb315SNeil Armstrong &axg_vapb_0_div.hw 120114ebb315SNeil Armstrong }, 120214ebb315SNeil Armstrong .num_parents = 1, 120314ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 120414ebb315SNeil Armstrong }, 120514ebb315SNeil Armstrong }; 120614ebb315SNeil Armstrong 120714ebb315SNeil Armstrong static struct clk_regmap axg_vapb_1_sel = { 120814ebb315SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 120914ebb315SNeil Armstrong .offset = HHI_VAPBCLK_CNTL, 121014ebb315SNeil Armstrong .mask = 0x3, 121114ebb315SNeil Armstrong .shift = 25, 121214ebb315SNeil Armstrong }, 121314ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 121414ebb315SNeil Armstrong .name = "vapb_1_sel", 121514ebb315SNeil Armstrong .ops = &clk_regmap_mux_ops, 121614ebb315SNeil Armstrong .parent_hws = axg_vpu_parent_hws, 121714ebb315SNeil Armstrong .num_parents = ARRAY_SIZE(axg_vpu_parent_hws), 121814ebb315SNeil Armstrong .flags = CLK_SET_RATE_NO_REPARENT, 121914ebb315SNeil Armstrong }, 122014ebb315SNeil Armstrong }; 122114ebb315SNeil Armstrong 122214ebb315SNeil Armstrong static struct clk_regmap axg_vapb_1_div = { 122314ebb315SNeil Armstrong .data = &(struct clk_regmap_div_data){ 122414ebb315SNeil Armstrong .offset = HHI_VAPBCLK_CNTL, 122514ebb315SNeil Armstrong .shift = 16, 122614ebb315SNeil Armstrong .width = 7, 122714ebb315SNeil Armstrong }, 122814ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 122914ebb315SNeil Armstrong .name = "vapb_1_div", 123014ebb315SNeil Armstrong .ops = &clk_regmap_divider_ops, 123114ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 123214ebb315SNeil Armstrong &axg_vapb_1_sel.hw 123314ebb315SNeil Armstrong }, 123414ebb315SNeil Armstrong .num_parents = 1, 123514ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT, 123614ebb315SNeil Armstrong }, 123714ebb315SNeil Armstrong }; 123814ebb315SNeil Armstrong 123914ebb315SNeil Armstrong static struct clk_regmap axg_vapb_1 = { 124014ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 124114ebb315SNeil Armstrong .offset = HHI_VAPBCLK_CNTL, 124214ebb315SNeil Armstrong .bit_idx = 24, 124314ebb315SNeil Armstrong }, 124414ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 124514ebb315SNeil Armstrong .name = "vapb_1", 124614ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 124714ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 124814ebb315SNeil Armstrong &axg_vapb_1_div.hw 124914ebb315SNeil Armstrong }, 125014ebb315SNeil Armstrong .num_parents = 1, 125114ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 125214ebb315SNeil Armstrong }, 125314ebb315SNeil Armstrong }; 125414ebb315SNeil Armstrong 125514ebb315SNeil Armstrong static struct clk_regmap axg_vapb_sel = { 125614ebb315SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 125714ebb315SNeil Armstrong .offset = HHI_VAPBCLK_CNTL, 125814ebb315SNeil Armstrong .mask = 1, 125914ebb315SNeil Armstrong .shift = 31, 126014ebb315SNeil Armstrong }, 126114ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 126214ebb315SNeil Armstrong .name = "vapb_sel", 126314ebb315SNeil Armstrong .ops = &clk_regmap_mux_ops, 126414ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 126514ebb315SNeil Armstrong &axg_vapb_0.hw, 126614ebb315SNeil Armstrong &axg_vapb_1.hw 126714ebb315SNeil Armstrong }, 126814ebb315SNeil Armstrong .num_parents = 2, 126914ebb315SNeil Armstrong .flags = CLK_SET_RATE_NO_REPARENT, 127014ebb315SNeil Armstrong }, 127114ebb315SNeil Armstrong }; 127214ebb315SNeil Armstrong 127314ebb315SNeil Armstrong static struct clk_regmap axg_vapb = { 127414ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 127514ebb315SNeil Armstrong .offset = HHI_VAPBCLK_CNTL, 127614ebb315SNeil Armstrong .bit_idx = 30, 127714ebb315SNeil Armstrong }, 127814ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 127914ebb315SNeil Armstrong .name = "vapb", 128014ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 128114ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vapb_sel.hw }, 128214ebb315SNeil Armstrong .num_parents = 1, 128314ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 128414ebb315SNeil Armstrong }, 128514ebb315SNeil Armstrong }; 128614ebb315SNeil Armstrong 128714ebb315SNeil Armstrong /* Video Clocks */ 128814ebb315SNeil Armstrong 128914ebb315SNeil Armstrong static const struct clk_hw *axg_vclk_parent_hws[] = { 129014ebb315SNeil Armstrong &axg_gp0_pll.hw, 129114ebb315SNeil Armstrong &axg_fclk_div4.hw, 129214ebb315SNeil Armstrong &axg_fclk_div3.hw, 129314ebb315SNeil Armstrong &axg_fclk_div5.hw, 129414ebb315SNeil Armstrong &axg_fclk_div2.hw, 129514ebb315SNeil Armstrong &axg_fclk_div7.hw, 129614ebb315SNeil Armstrong &axg_mpll1.hw, 129714ebb315SNeil Armstrong }; 129814ebb315SNeil Armstrong 129914ebb315SNeil Armstrong static struct clk_regmap axg_vclk_sel = { 130014ebb315SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 130114ebb315SNeil Armstrong .offset = HHI_VID_CLK_CNTL, 130214ebb315SNeil Armstrong .mask = 0x7, 130314ebb315SNeil Armstrong .shift = 16, 130414ebb315SNeil Armstrong }, 130514ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 130614ebb315SNeil Armstrong .name = "vclk_sel", 130714ebb315SNeil Armstrong .ops = &clk_regmap_mux_ops, 130814ebb315SNeil Armstrong .parent_hws = axg_vclk_parent_hws, 130914ebb315SNeil Armstrong .num_parents = ARRAY_SIZE(axg_vclk_parent_hws), 131014ebb315SNeil Armstrong .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 131114ebb315SNeil Armstrong }, 131214ebb315SNeil Armstrong }; 131314ebb315SNeil Armstrong 131414ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_sel = { 131514ebb315SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 131614ebb315SNeil Armstrong .offset = HHI_VIID_CLK_CNTL, 131714ebb315SNeil Armstrong .mask = 0x7, 131814ebb315SNeil Armstrong .shift = 16, 131914ebb315SNeil Armstrong }, 132014ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 132114ebb315SNeil Armstrong .name = "vclk2_sel", 132214ebb315SNeil Armstrong .ops = &clk_regmap_mux_ops, 132314ebb315SNeil Armstrong .parent_hws = axg_vclk_parent_hws, 132414ebb315SNeil Armstrong .num_parents = ARRAY_SIZE(axg_vclk_parent_hws), 132514ebb315SNeil Armstrong .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 132614ebb315SNeil Armstrong }, 132714ebb315SNeil Armstrong }; 132814ebb315SNeil Armstrong 132914ebb315SNeil Armstrong static struct clk_regmap axg_vclk_input = { 133014ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 133114ebb315SNeil Armstrong .offset = HHI_VID_CLK_DIV, 133214ebb315SNeil Armstrong .bit_idx = 16, 133314ebb315SNeil Armstrong }, 133414ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 133514ebb315SNeil Armstrong .name = "vclk_input", 133614ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 133714ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk_sel.hw }, 133814ebb315SNeil Armstrong .num_parents = 1, 133914ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 134014ebb315SNeil Armstrong }, 134114ebb315SNeil Armstrong }; 134214ebb315SNeil Armstrong 134314ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_input = { 134414ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 134514ebb315SNeil Armstrong .offset = HHI_VIID_CLK_DIV, 134614ebb315SNeil Armstrong .bit_idx = 16, 134714ebb315SNeil Armstrong }, 134814ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 134914ebb315SNeil Armstrong .name = "vclk2_input", 135014ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 135114ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk2_sel.hw }, 135214ebb315SNeil Armstrong .num_parents = 1, 135314ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 135414ebb315SNeil Armstrong }, 135514ebb315SNeil Armstrong }; 135614ebb315SNeil Armstrong 135714ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div = { 135814ebb315SNeil Armstrong .data = &(struct clk_regmap_div_data){ 135914ebb315SNeil Armstrong .offset = HHI_VID_CLK_DIV, 136014ebb315SNeil Armstrong .shift = 0, 136114ebb315SNeil Armstrong .width = 8, 136214ebb315SNeil Armstrong }, 136314ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 136414ebb315SNeil Armstrong .name = "vclk_div", 136514ebb315SNeil Armstrong .ops = &clk_regmap_divider_ops, 136614ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 136714ebb315SNeil Armstrong &axg_vclk_input.hw 136814ebb315SNeil Armstrong }, 136914ebb315SNeil Armstrong .num_parents = 1, 137014ebb315SNeil Armstrong .flags = CLK_GET_RATE_NOCACHE, 137114ebb315SNeil Armstrong }, 137214ebb315SNeil Armstrong }; 137314ebb315SNeil Armstrong 137414ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div = { 137514ebb315SNeil Armstrong .data = &(struct clk_regmap_div_data){ 137614ebb315SNeil Armstrong .offset = HHI_VIID_CLK_DIV, 137714ebb315SNeil Armstrong .shift = 0, 137814ebb315SNeil Armstrong .width = 8, 137914ebb315SNeil Armstrong }, 138014ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 138114ebb315SNeil Armstrong .name = "vclk2_div", 138214ebb315SNeil Armstrong .ops = &clk_regmap_divider_ops, 138314ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 138414ebb315SNeil Armstrong &axg_vclk2_input.hw 138514ebb315SNeil Armstrong }, 138614ebb315SNeil Armstrong .num_parents = 1, 138714ebb315SNeil Armstrong .flags = CLK_GET_RATE_NOCACHE, 138814ebb315SNeil Armstrong }, 138914ebb315SNeil Armstrong }; 139014ebb315SNeil Armstrong 139114ebb315SNeil Armstrong static struct clk_regmap axg_vclk = { 139214ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 139314ebb315SNeil Armstrong .offset = HHI_VID_CLK_CNTL, 139414ebb315SNeil Armstrong .bit_idx = 19, 139514ebb315SNeil Armstrong }, 139614ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 139714ebb315SNeil Armstrong .name = "vclk", 139814ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 139914ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk_div.hw }, 140014ebb315SNeil Armstrong .num_parents = 1, 140114ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 140214ebb315SNeil Armstrong }, 140314ebb315SNeil Armstrong }; 140414ebb315SNeil Armstrong 140514ebb315SNeil Armstrong static struct clk_regmap axg_vclk2 = { 140614ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 140714ebb315SNeil Armstrong .offset = HHI_VIID_CLK_CNTL, 140814ebb315SNeil Armstrong .bit_idx = 19, 140914ebb315SNeil Armstrong }, 141014ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 141114ebb315SNeil Armstrong .name = "vclk2", 141214ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 141314ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk2_div.hw }, 141414ebb315SNeil Armstrong .num_parents = 1, 141514ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 141614ebb315SNeil Armstrong }, 141714ebb315SNeil Armstrong }; 141814ebb315SNeil Armstrong 141914ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div1 = { 142014ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 142114ebb315SNeil Armstrong .offset = HHI_VID_CLK_CNTL, 142214ebb315SNeil Armstrong .bit_idx = 0, 142314ebb315SNeil Armstrong }, 142414ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 142514ebb315SNeil Armstrong .name = "vclk_div1", 142614ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 142714ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw }, 142814ebb315SNeil Armstrong .num_parents = 1, 142914ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 143014ebb315SNeil Armstrong }, 143114ebb315SNeil Armstrong }; 143214ebb315SNeil Armstrong 143314ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div2_en = { 143414ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 143514ebb315SNeil Armstrong .offset = HHI_VID_CLK_CNTL, 143614ebb315SNeil Armstrong .bit_idx = 1, 143714ebb315SNeil Armstrong }, 143814ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 143914ebb315SNeil Armstrong .name = "vclk_div2_en", 144014ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 144114ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw }, 144214ebb315SNeil Armstrong .num_parents = 1, 144314ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 144414ebb315SNeil Armstrong }, 144514ebb315SNeil Armstrong }; 144614ebb315SNeil Armstrong 144714ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div4_en = { 144814ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 144914ebb315SNeil Armstrong .offset = HHI_VID_CLK_CNTL, 145014ebb315SNeil Armstrong .bit_idx = 2, 145114ebb315SNeil Armstrong }, 145214ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 145314ebb315SNeil Armstrong .name = "vclk_div4_en", 145414ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 145514ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw }, 145614ebb315SNeil Armstrong .num_parents = 1, 145714ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 145814ebb315SNeil Armstrong }, 145914ebb315SNeil Armstrong }; 146014ebb315SNeil Armstrong 146114ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div6_en = { 146214ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 146314ebb315SNeil Armstrong .offset = HHI_VID_CLK_CNTL, 146414ebb315SNeil Armstrong .bit_idx = 3, 146514ebb315SNeil Armstrong }, 146614ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 146714ebb315SNeil Armstrong .name = "vclk_div6_en", 146814ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 146914ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw }, 147014ebb315SNeil Armstrong .num_parents = 1, 147114ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 147214ebb315SNeil Armstrong }, 147314ebb315SNeil Armstrong }; 147414ebb315SNeil Armstrong 147514ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div12_en = { 147614ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 147714ebb315SNeil Armstrong .offset = HHI_VID_CLK_CNTL, 147814ebb315SNeil Armstrong .bit_idx = 4, 147914ebb315SNeil Armstrong }, 148014ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 148114ebb315SNeil Armstrong .name = "vclk_div12_en", 148214ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 148314ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw }, 148414ebb315SNeil Armstrong .num_parents = 1, 148514ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 148614ebb315SNeil Armstrong }, 148714ebb315SNeil Armstrong }; 148814ebb315SNeil Armstrong 148914ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div1 = { 149014ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 149114ebb315SNeil Armstrong .offset = HHI_VIID_CLK_CNTL, 149214ebb315SNeil Armstrong .bit_idx = 0, 149314ebb315SNeil Armstrong }, 149414ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 149514ebb315SNeil Armstrong .name = "vclk2_div1", 149614ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 149714ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw }, 149814ebb315SNeil Armstrong .num_parents = 1, 149914ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 150014ebb315SNeil Armstrong }, 150114ebb315SNeil Armstrong }; 150214ebb315SNeil Armstrong 150314ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div2_en = { 150414ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 150514ebb315SNeil Armstrong .offset = HHI_VIID_CLK_CNTL, 150614ebb315SNeil Armstrong .bit_idx = 1, 150714ebb315SNeil Armstrong }, 150814ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 150914ebb315SNeil Armstrong .name = "vclk2_div2_en", 151014ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 151114ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw }, 151214ebb315SNeil Armstrong .num_parents = 1, 151314ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 151414ebb315SNeil Armstrong }, 151514ebb315SNeil Armstrong }; 151614ebb315SNeil Armstrong 151714ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div4_en = { 151814ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 151914ebb315SNeil Armstrong .offset = HHI_VIID_CLK_CNTL, 152014ebb315SNeil Armstrong .bit_idx = 2, 152114ebb315SNeil Armstrong }, 152214ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 152314ebb315SNeil Armstrong .name = "vclk2_div4_en", 152414ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 152514ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw }, 152614ebb315SNeil Armstrong .num_parents = 1, 152714ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 152814ebb315SNeil Armstrong }, 152914ebb315SNeil Armstrong }; 153014ebb315SNeil Armstrong 153114ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div6_en = { 153214ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 153314ebb315SNeil Armstrong .offset = HHI_VIID_CLK_CNTL, 153414ebb315SNeil Armstrong .bit_idx = 3, 153514ebb315SNeil Armstrong }, 153614ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 153714ebb315SNeil Armstrong .name = "vclk2_div6_en", 153814ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 153914ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw }, 154014ebb315SNeil Armstrong .num_parents = 1, 154114ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 154214ebb315SNeil Armstrong }, 154314ebb315SNeil Armstrong }; 154414ebb315SNeil Armstrong 154514ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div12_en = { 154614ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 154714ebb315SNeil Armstrong .offset = HHI_VIID_CLK_CNTL, 154814ebb315SNeil Armstrong .bit_idx = 4, 154914ebb315SNeil Armstrong }, 155014ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 155114ebb315SNeil Armstrong .name = "vclk2_div12_en", 155214ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 155314ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw }, 155414ebb315SNeil Armstrong .num_parents = 1, 155514ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 155614ebb315SNeil Armstrong }, 155714ebb315SNeil Armstrong }; 155814ebb315SNeil Armstrong 155914ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk_div2 = { 156014ebb315SNeil Armstrong .mult = 1, 156114ebb315SNeil Armstrong .div = 2, 156214ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 156314ebb315SNeil Armstrong .name = "vclk_div2", 156414ebb315SNeil Armstrong .ops = &clk_fixed_factor_ops, 156514ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 156614ebb315SNeil Armstrong &axg_vclk_div2_en.hw 156714ebb315SNeil Armstrong }, 156814ebb315SNeil Armstrong .num_parents = 1, 156914ebb315SNeil Armstrong }, 157014ebb315SNeil Armstrong }; 157114ebb315SNeil Armstrong 157214ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk_div4 = { 157314ebb315SNeil Armstrong .mult = 1, 157414ebb315SNeil Armstrong .div = 4, 157514ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 157614ebb315SNeil Armstrong .name = "vclk_div4", 157714ebb315SNeil Armstrong .ops = &clk_fixed_factor_ops, 157814ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 157914ebb315SNeil Armstrong &axg_vclk_div4_en.hw 158014ebb315SNeil Armstrong }, 158114ebb315SNeil Armstrong .num_parents = 1, 158214ebb315SNeil Armstrong }, 158314ebb315SNeil Armstrong }; 158414ebb315SNeil Armstrong 158514ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk_div6 = { 158614ebb315SNeil Armstrong .mult = 1, 158714ebb315SNeil Armstrong .div = 6, 158814ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 158914ebb315SNeil Armstrong .name = "vclk_div6", 159014ebb315SNeil Armstrong .ops = &clk_fixed_factor_ops, 159114ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 159214ebb315SNeil Armstrong &axg_vclk_div6_en.hw 159314ebb315SNeil Armstrong }, 159414ebb315SNeil Armstrong .num_parents = 1, 159514ebb315SNeil Armstrong }, 159614ebb315SNeil Armstrong }; 159714ebb315SNeil Armstrong 159814ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk_div12 = { 159914ebb315SNeil Armstrong .mult = 1, 160014ebb315SNeil Armstrong .div = 12, 160114ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 160214ebb315SNeil Armstrong .name = "vclk_div12", 160314ebb315SNeil Armstrong .ops = &clk_fixed_factor_ops, 160414ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 160514ebb315SNeil Armstrong &axg_vclk_div12_en.hw 160614ebb315SNeil Armstrong }, 160714ebb315SNeil Armstrong .num_parents = 1, 160814ebb315SNeil Armstrong }, 160914ebb315SNeil Armstrong }; 161014ebb315SNeil Armstrong 161114ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk2_div2 = { 161214ebb315SNeil Armstrong .mult = 1, 161314ebb315SNeil Armstrong .div = 2, 161414ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 161514ebb315SNeil Armstrong .name = "vclk2_div2", 161614ebb315SNeil Armstrong .ops = &clk_fixed_factor_ops, 161714ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 161814ebb315SNeil Armstrong &axg_vclk2_div2_en.hw 161914ebb315SNeil Armstrong }, 162014ebb315SNeil Armstrong .num_parents = 1, 162114ebb315SNeil Armstrong }, 162214ebb315SNeil Armstrong }; 162314ebb315SNeil Armstrong 162414ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk2_div4 = { 162514ebb315SNeil Armstrong .mult = 1, 162614ebb315SNeil Armstrong .div = 4, 162714ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 162814ebb315SNeil Armstrong .name = "vclk2_div4", 162914ebb315SNeil Armstrong .ops = &clk_fixed_factor_ops, 163014ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 163114ebb315SNeil Armstrong &axg_vclk2_div4_en.hw 163214ebb315SNeil Armstrong }, 163314ebb315SNeil Armstrong .num_parents = 1, 163414ebb315SNeil Armstrong }, 163514ebb315SNeil Armstrong }; 163614ebb315SNeil Armstrong 163714ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk2_div6 = { 163814ebb315SNeil Armstrong .mult = 1, 163914ebb315SNeil Armstrong .div = 6, 164014ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 164114ebb315SNeil Armstrong .name = "vclk2_div6", 164214ebb315SNeil Armstrong .ops = &clk_fixed_factor_ops, 164314ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 164414ebb315SNeil Armstrong &axg_vclk2_div6_en.hw 164514ebb315SNeil Armstrong }, 164614ebb315SNeil Armstrong .num_parents = 1, 164714ebb315SNeil Armstrong }, 164814ebb315SNeil Armstrong }; 164914ebb315SNeil Armstrong 165014ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk2_div12 = { 165114ebb315SNeil Armstrong .mult = 1, 165214ebb315SNeil Armstrong .div = 12, 165314ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 165414ebb315SNeil Armstrong .name = "vclk2_div12", 165514ebb315SNeil Armstrong .ops = &clk_fixed_factor_ops, 165614ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 165714ebb315SNeil Armstrong &axg_vclk2_div12_en.hw 165814ebb315SNeil Armstrong }, 165914ebb315SNeil Armstrong .num_parents = 1, 166014ebb315SNeil Armstrong }, 166114ebb315SNeil Armstrong }; 166214ebb315SNeil Armstrong 166314ebb315SNeil Armstrong static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 }; 166414ebb315SNeil Armstrong static const struct clk_hw *axg_cts_parent_hws[] = { 166514ebb315SNeil Armstrong &axg_vclk_div1.hw, 166614ebb315SNeil Armstrong &axg_vclk_div2.hw, 166714ebb315SNeil Armstrong &axg_vclk_div4.hw, 166814ebb315SNeil Armstrong &axg_vclk_div6.hw, 166914ebb315SNeil Armstrong &axg_vclk_div12.hw, 167014ebb315SNeil Armstrong &axg_vclk2_div1.hw, 167114ebb315SNeil Armstrong &axg_vclk2_div2.hw, 167214ebb315SNeil Armstrong &axg_vclk2_div4.hw, 167314ebb315SNeil Armstrong &axg_vclk2_div6.hw, 167414ebb315SNeil Armstrong &axg_vclk2_div12.hw, 167514ebb315SNeil Armstrong }; 167614ebb315SNeil Armstrong 167714ebb315SNeil Armstrong static struct clk_regmap axg_cts_encl_sel = { 167814ebb315SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 167914ebb315SNeil Armstrong .offset = HHI_VIID_CLK_DIV, 168014ebb315SNeil Armstrong .mask = 0xf, 168114ebb315SNeil Armstrong .shift = 12, 168214ebb315SNeil Armstrong .table = mux_table_cts_sel, 168314ebb315SNeil Armstrong }, 168414ebb315SNeil Armstrong .hw.init = &(struct clk_init_data){ 168514ebb315SNeil Armstrong .name = "cts_encl_sel", 168614ebb315SNeil Armstrong .ops = &clk_regmap_mux_ops, 168714ebb315SNeil Armstrong .parent_hws = axg_cts_parent_hws, 168814ebb315SNeil Armstrong .num_parents = ARRAY_SIZE(axg_cts_parent_hws), 168914ebb315SNeil Armstrong .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 169014ebb315SNeil Armstrong }, 169114ebb315SNeil Armstrong }; 169214ebb315SNeil Armstrong 169314ebb315SNeil Armstrong static struct clk_regmap axg_cts_encl = { 169414ebb315SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 169514ebb315SNeil Armstrong .offset = HHI_VID_CLK_CNTL2, 169614ebb315SNeil Armstrong .bit_idx = 3, 169714ebb315SNeil Armstrong }, 169814ebb315SNeil Armstrong .hw.init = &(struct clk_init_data) { 169914ebb315SNeil Armstrong .name = "cts_encl", 170014ebb315SNeil Armstrong .ops = &clk_regmap_gate_ops, 170114ebb315SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 170214ebb315SNeil Armstrong &axg_cts_encl_sel.hw 170314ebb315SNeil Armstrong }, 170414ebb315SNeil Armstrong .num_parents = 1, 170514ebb315SNeil Armstrong .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 170614ebb315SNeil Armstrong }, 170714ebb315SNeil Armstrong }; 170814ebb315SNeil Armstrong 1709e80d8510SNeil Armstrong /* MIPI DSI Host Clock */ 1710e80d8510SNeil Armstrong 1711e80d8510SNeil Armstrong static u32 mux_table_axg_vdin_meas[] = { 0, 1, 2, 3, 6, 7 }; 1712e80d8510SNeil Armstrong static const struct clk_parent_data axg_vdin_meas_parent_data[] = { 1713e80d8510SNeil Armstrong { .fw_name = "xtal", }, 1714e80d8510SNeil Armstrong { .hw = &axg_fclk_div4.hw }, 1715e80d8510SNeil Armstrong { .hw = &axg_fclk_div3.hw }, 1716e80d8510SNeil Armstrong { .hw = &axg_fclk_div5.hw }, 1717e80d8510SNeil Armstrong { .hw = &axg_fclk_div2.hw }, 1718e80d8510SNeil Armstrong { .hw = &axg_fclk_div7.hw }, 1719e80d8510SNeil Armstrong }; 1720e80d8510SNeil Armstrong 1721e80d8510SNeil Armstrong static struct clk_regmap axg_vdin_meas_sel = { 1722e80d8510SNeil Armstrong .data = &(struct clk_regmap_mux_data){ 1723e80d8510SNeil Armstrong .offset = HHI_VDIN_MEAS_CLK_CNTL, 1724e80d8510SNeil Armstrong .mask = 0x7, 1725e80d8510SNeil Armstrong .shift = 21, 1726e80d8510SNeil Armstrong .flags = CLK_MUX_ROUND_CLOSEST, 1727e80d8510SNeil Armstrong .table = mux_table_axg_vdin_meas, 1728e80d8510SNeil Armstrong }, 1729e80d8510SNeil Armstrong .hw.init = &(struct clk_init_data){ 1730e80d8510SNeil Armstrong .name = "vdin_meas_sel", 1731e80d8510SNeil Armstrong .ops = &clk_regmap_mux_ops, 1732e80d8510SNeil Armstrong .parent_data = axg_vdin_meas_parent_data, 1733e80d8510SNeil Armstrong .num_parents = ARRAY_SIZE(axg_vdin_meas_parent_data), 1734e80d8510SNeil Armstrong .flags = CLK_SET_RATE_PARENT, 1735e80d8510SNeil Armstrong }, 1736e80d8510SNeil Armstrong }; 1737e80d8510SNeil Armstrong 1738e80d8510SNeil Armstrong static struct clk_regmap axg_vdin_meas_div = { 1739e80d8510SNeil Armstrong .data = &(struct clk_regmap_div_data){ 1740e80d8510SNeil Armstrong .offset = HHI_VDIN_MEAS_CLK_CNTL, 1741e80d8510SNeil Armstrong .shift = 12, 1742e80d8510SNeil Armstrong .width = 7, 1743e80d8510SNeil Armstrong }, 1744e80d8510SNeil Armstrong .hw.init = &(struct clk_init_data){ 1745e80d8510SNeil Armstrong .name = "vdin_meas_div", 1746e80d8510SNeil Armstrong .ops = &clk_regmap_divider_ops, 1747e80d8510SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 1748e80d8510SNeil Armstrong &axg_vdin_meas_sel.hw }, 1749e80d8510SNeil Armstrong .num_parents = 1, 1750e80d8510SNeil Armstrong .flags = CLK_SET_RATE_PARENT, 1751e80d8510SNeil Armstrong }, 1752e80d8510SNeil Armstrong }; 1753e80d8510SNeil Armstrong 1754e80d8510SNeil Armstrong static struct clk_regmap axg_vdin_meas = { 1755e80d8510SNeil Armstrong .data = &(struct clk_regmap_gate_data){ 1756e80d8510SNeil Armstrong .offset = HHI_VDIN_MEAS_CLK_CNTL, 1757e80d8510SNeil Armstrong .bit_idx = 20, 1758e80d8510SNeil Armstrong }, 1759e80d8510SNeil Armstrong .hw.init = &(struct clk_init_data) { 1760e80d8510SNeil Armstrong .name = "vdin_meas", 1761e80d8510SNeil Armstrong .ops = &clk_regmap_gate_ops, 1762e80d8510SNeil Armstrong .parent_hws = (const struct clk_hw *[]) { 1763e80d8510SNeil Armstrong &axg_vdin_meas_div.hw }, 1764e80d8510SNeil Armstrong .num_parents = 1, 1765e80d8510SNeil Armstrong .flags = CLK_SET_RATE_PARENT, 1766e80d8510SNeil Armstrong }, 1767e80d8510SNeil Armstrong }; 1768e80d8510SNeil Armstrong 17697df533a7SJerome Brunet static u32 mux_table_gen_clk[] = { 0, 4, 5, 6, 7, 8, 17707df533a7SJerome Brunet 9, 10, 11, 13, 14, }; 1771cc132d11SAlexandre Mergnat static const struct clk_parent_data gen_clk_parent_data[] = { 1772cc132d11SAlexandre Mergnat { .fw_name = "xtal", }, 1773cc132d11SAlexandre Mergnat { .hw = &axg_hifi_pll.hw }, 1774cc132d11SAlexandre Mergnat { .hw = &axg_mpll0.hw }, 1775cc132d11SAlexandre Mergnat { .hw = &axg_mpll1.hw }, 1776cc132d11SAlexandre Mergnat { .hw = &axg_mpll2.hw }, 1777cc132d11SAlexandre Mergnat { .hw = &axg_mpll3.hw }, 1778cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div4.hw }, 1779cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div3.hw }, 1780cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div5.hw }, 1781cc132d11SAlexandre Mergnat { .hw = &axg_fclk_div7.hw }, 1782cc132d11SAlexandre Mergnat { .hw = &axg_gp0_pll.hw }, 17837df533a7SJerome Brunet }; 17847df533a7SJerome Brunet 17857df533a7SJerome Brunet static struct clk_regmap axg_gen_clk_sel = { 17867df533a7SJerome Brunet .data = &(struct clk_regmap_mux_data){ 17877df533a7SJerome Brunet .offset = HHI_GEN_CLK_CNTL, 17887df533a7SJerome Brunet .mask = 0xf, 17897df533a7SJerome Brunet .shift = 12, 17907df533a7SJerome Brunet .table = mux_table_gen_clk, 17917df533a7SJerome Brunet }, 17927df533a7SJerome Brunet .hw.init = &(struct clk_init_data){ 17937df533a7SJerome Brunet .name = "gen_clk_sel", 17947df533a7SJerome Brunet .ops = &clk_regmap_mux_ops, 17957df533a7SJerome Brunet /* 17967df533a7SJerome Brunet * bits 15:12 selects from 14 possible parents: 17977df533a7SJerome Brunet * xtal, [rtc_oscin_i], [sys_cpu_div16], [ddr_dpll_pt], 17987df533a7SJerome Brunet * hifi_pll, mpll0, mpll1, mpll2, mpll3, fdiv4, 17997df533a7SJerome Brunet * fdiv3, fdiv5, [cts_msr_clk], fdiv7, gp0_pll 18007df533a7SJerome Brunet */ 1801cc132d11SAlexandre Mergnat .parent_data = gen_clk_parent_data, 1802cc132d11SAlexandre Mergnat .num_parents = ARRAY_SIZE(gen_clk_parent_data), 18037df533a7SJerome Brunet }, 18047df533a7SJerome Brunet }; 18057df533a7SJerome Brunet 18067df533a7SJerome Brunet static struct clk_regmap axg_gen_clk_div = { 18077df533a7SJerome Brunet .data = &(struct clk_regmap_div_data){ 18087df533a7SJerome Brunet .offset = HHI_GEN_CLK_CNTL, 18097df533a7SJerome Brunet .shift = 0, 18107df533a7SJerome Brunet .width = 11, 18117df533a7SJerome Brunet }, 18127df533a7SJerome Brunet .hw.init = &(struct clk_init_data){ 18137df533a7SJerome Brunet .name = "gen_clk_div", 18147df533a7SJerome Brunet .ops = &clk_regmap_divider_ops, 1815cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 1816cc132d11SAlexandre Mergnat &axg_gen_clk_sel.hw 1817cc132d11SAlexandre Mergnat }, 18187df533a7SJerome Brunet .num_parents = 1, 18197df533a7SJerome Brunet .flags = CLK_SET_RATE_PARENT, 18207df533a7SJerome Brunet }, 18217df533a7SJerome Brunet }; 18227df533a7SJerome Brunet 18237df533a7SJerome Brunet static struct clk_regmap axg_gen_clk = { 18247df533a7SJerome Brunet .data = &(struct clk_regmap_gate_data){ 18257df533a7SJerome Brunet .offset = HHI_GEN_CLK_CNTL, 18267df533a7SJerome Brunet .bit_idx = 7, 18277df533a7SJerome Brunet }, 18287df533a7SJerome Brunet .hw.init = &(struct clk_init_data){ 18297df533a7SJerome Brunet .name = "gen_clk", 18307df533a7SJerome Brunet .ops = &clk_regmap_gate_ops, 1831cc132d11SAlexandre Mergnat .parent_hws = (const struct clk_hw *[]) { 1832cc132d11SAlexandre Mergnat &axg_gen_clk_div.hw 1833cc132d11SAlexandre Mergnat }, 18347df533a7SJerome Brunet .num_parents = 1, 18357df533a7SJerome Brunet .flags = CLK_SET_RATE_PARENT, 18367df533a7SJerome Brunet }, 18377df533a7SJerome Brunet }; 18387df533a7SJerome Brunet 18393a36044eSAlexandre Mergnat #define MESON_GATE(_name, _reg, _bit) \ 18403a36044eSAlexandre Mergnat MESON_PCLK(_name, _reg, _bit, &axg_clk81.hw) 18413a36044eSAlexandre Mergnat 184278b4af31SQiufang Dai /* Everything Else (EE) domain gates */ 184378b4af31SQiufang Dai static MESON_GATE(axg_ddr, HHI_GCLK_MPEG0, 0); 184478b4af31SQiufang Dai static MESON_GATE(axg_audio_locker, HHI_GCLK_MPEG0, 2); 184578b4af31SQiufang Dai static MESON_GATE(axg_mipi_dsi_host, HHI_GCLK_MPEG0, 3); 184678b4af31SQiufang Dai static MESON_GATE(axg_isa, HHI_GCLK_MPEG0, 5); 184778b4af31SQiufang Dai static MESON_GATE(axg_pl301, HHI_GCLK_MPEG0, 6); 184878b4af31SQiufang Dai static MESON_GATE(axg_periphs, HHI_GCLK_MPEG0, 7); 184978b4af31SQiufang Dai static MESON_GATE(axg_spicc_0, HHI_GCLK_MPEG0, 8); 185078b4af31SQiufang Dai static MESON_GATE(axg_i2c, HHI_GCLK_MPEG0, 9); 185178b4af31SQiufang Dai static MESON_GATE(axg_rng0, HHI_GCLK_MPEG0, 12); 185278b4af31SQiufang Dai static MESON_GATE(axg_uart0, HHI_GCLK_MPEG0, 13); 185378b4af31SQiufang Dai static MESON_GATE(axg_mipi_dsi_phy, HHI_GCLK_MPEG0, 14); 185478b4af31SQiufang Dai static MESON_GATE(axg_spicc_1, HHI_GCLK_MPEG0, 15); 185578b4af31SQiufang Dai static MESON_GATE(axg_pcie_a, HHI_GCLK_MPEG0, 16); 185678b4af31SQiufang Dai static MESON_GATE(axg_pcie_b, HHI_GCLK_MPEG0, 17); 185778b4af31SQiufang Dai static MESON_GATE(axg_hiu_reg, HHI_GCLK_MPEG0, 19); 185878b4af31SQiufang Dai static MESON_GATE(axg_assist_misc, HHI_GCLK_MPEG0, 23); 185978b4af31SQiufang Dai static MESON_GATE(axg_emmc_b, HHI_GCLK_MPEG0, 25); 186078b4af31SQiufang Dai static MESON_GATE(axg_emmc_c, HHI_GCLK_MPEG0, 26); 186178b4af31SQiufang Dai static MESON_GATE(axg_dma, HHI_GCLK_MPEG0, 27); 186278b4af31SQiufang Dai static MESON_GATE(axg_spi, HHI_GCLK_MPEG0, 30); 186378b4af31SQiufang Dai 186478b4af31SQiufang Dai static MESON_GATE(axg_audio, HHI_GCLK_MPEG1, 0); 186578b4af31SQiufang Dai static MESON_GATE(axg_eth_core, HHI_GCLK_MPEG1, 3); 186678b4af31SQiufang Dai static MESON_GATE(axg_uart1, HHI_GCLK_MPEG1, 16); 186778b4af31SQiufang Dai static MESON_GATE(axg_g2d, HHI_GCLK_MPEG1, 20); 186878b4af31SQiufang Dai static MESON_GATE(axg_usb0, HHI_GCLK_MPEG1, 21); 186978b4af31SQiufang Dai static MESON_GATE(axg_usb1, HHI_GCLK_MPEG1, 22); 187078b4af31SQiufang Dai static MESON_GATE(axg_reset, HHI_GCLK_MPEG1, 23); 187178b4af31SQiufang Dai static MESON_GATE(axg_usb_general, HHI_GCLK_MPEG1, 26); 187278b4af31SQiufang Dai static MESON_GATE(axg_ahb_arb0, HHI_GCLK_MPEG1, 29); 187378b4af31SQiufang Dai static MESON_GATE(axg_efuse, HHI_GCLK_MPEG1, 30); 187478b4af31SQiufang Dai static MESON_GATE(axg_boot_rom, HHI_GCLK_MPEG1, 31); 187578b4af31SQiufang Dai 187678b4af31SQiufang Dai static MESON_GATE(axg_ahb_data_bus, HHI_GCLK_MPEG2, 1); 187778b4af31SQiufang Dai static MESON_GATE(axg_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2); 187878b4af31SQiufang Dai static MESON_GATE(axg_usb1_to_ddr, HHI_GCLK_MPEG2, 8); 187978b4af31SQiufang Dai static MESON_GATE(axg_usb0_to_ddr, HHI_GCLK_MPEG2, 9); 188078b4af31SQiufang Dai static MESON_GATE(axg_mmc_pclk, HHI_GCLK_MPEG2, 11); 188178b4af31SQiufang Dai static MESON_GATE(axg_vpu_intr, HHI_GCLK_MPEG2, 25); 188278b4af31SQiufang Dai static MESON_GATE(axg_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26); 188378b4af31SQiufang Dai static MESON_GATE(axg_gic, HHI_GCLK_MPEG2, 30); 188478b4af31SQiufang Dai 188578b4af31SQiufang Dai /* Always On (AO) domain gates */ 188678b4af31SQiufang Dai 188778b4af31SQiufang Dai static MESON_GATE(axg_ao_media_cpu, HHI_GCLK_AO, 0); 188878b4af31SQiufang Dai static MESON_GATE(axg_ao_ahb_sram, HHI_GCLK_AO, 1); 188978b4af31SQiufang Dai static MESON_GATE(axg_ao_ahb_bus, HHI_GCLK_AO, 2); 189078b4af31SQiufang Dai static MESON_GATE(axg_ao_iface, HHI_GCLK_AO, 3); 189178b4af31SQiufang Dai static MESON_GATE(axg_ao_i2c, HHI_GCLK_AO, 4); 189278b4af31SQiufang Dai 189378b4af31SQiufang Dai /* Array of all clocks provided by this provider */ 189478b4af31SQiufang Dai 1895141fbc27SNeil Armstrong static struct clk_hw *axg_hw_clks[] = { 189678b4af31SQiufang Dai [CLKID_SYS_PLL] = &axg_sys_pll.hw, 189778b4af31SQiufang Dai [CLKID_FIXED_PLL] = &axg_fixed_pll.hw, 189878b4af31SQiufang Dai [CLKID_FCLK_DIV2] = &axg_fclk_div2.hw, 189978b4af31SQiufang Dai [CLKID_FCLK_DIV3] = &axg_fclk_div3.hw, 190078b4af31SQiufang Dai [CLKID_FCLK_DIV4] = &axg_fclk_div4.hw, 190178b4af31SQiufang Dai [CLKID_FCLK_DIV5] = &axg_fclk_div5.hw, 190278b4af31SQiufang Dai [CLKID_FCLK_DIV7] = &axg_fclk_div7.hw, 190378b4af31SQiufang Dai [CLKID_GP0_PLL] = &axg_gp0_pll.hw, 190478b4af31SQiufang Dai [CLKID_MPEG_SEL] = &axg_mpeg_clk_sel.hw, 190578b4af31SQiufang Dai [CLKID_MPEG_DIV] = &axg_mpeg_clk_div.hw, 190678b4af31SQiufang Dai [CLKID_CLK81] = &axg_clk81.hw, 190778b4af31SQiufang Dai [CLKID_MPLL0] = &axg_mpll0.hw, 190878b4af31SQiufang Dai [CLKID_MPLL1] = &axg_mpll1.hw, 190978b4af31SQiufang Dai [CLKID_MPLL2] = &axg_mpll2.hw, 191078b4af31SQiufang Dai [CLKID_MPLL3] = &axg_mpll3.hw, 191178b4af31SQiufang Dai [CLKID_DDR] = &axg_ddr.hw, 191278b4af31SQiufang Dai [CLKID_AUDIO_LOCKER] = &axg_audio_locker.hw, 191378b4af31SQiufang Dai [CLKID_MIPI_DSI_HOST] = &axg_mipi_dsi_host.hw, 191478b4af31SQiufang Dai [CLKID_ISA] = &axg_isa.hw, 191578b4af31SQiufang Dai [CLKID_PL301] = &axg_pl301.hw, 191678b4af31SQiufang Dai [CLKID_PERIPHS] = &axg_periphs.hw, 191778b4af31SQiufang Dai [CLKID_SPICC0] = &axg_spicc_0.hw, 191878b4af31SQiufang Dai [CLKID_I2C] = &axg_i2c.hw, 191978b4af31SQiufang Dai [CLKID_RNG0] = &axg_rng0.hw, 192078b4af31SQiufang Dai [CLKID_UART0] = &axg_uart0.hw, 192178b4af31SQiufang Dai [CLKID_MIPI_DSI_PHY] = &axg_mipi_dsi_phy.hw, 192278b4af31SQiufang Dai [CLKID_SPICC1] = &axg_spicc_1.hw, 192378b4af31SQiufang Dai [CLKID_PCIE_A] = &axg_pcie_a.hw, 192478b4af31SQiufang Dai [CLKID_PCIE_B] = &axg_pcie_b.hw, 192578b4af31SQiufang Dai [CLKID_HIU_IFACE] = &axg_hiu_reg.hw, 192678b4af31SQiufang Dai [CLKID_ASSIST_MISC] = &axg_assist_misc.hw, 192778b4af31SQiufang Dai [CLKID_SD_EMMC_B] = &axg_emmc_b.hw, 192878b4af31SQiufang Dai [CLKID_SD_EMMC_C] = &axg_emmc_c.hw, 192978b4af31SQiufang Dai [CLKID_DMA] = &axg_dma.hw, 193078b4af31SQiufang Dai [CLKID_SPI] = &axg_spi.hw, 193178b4af31SQiufang Dai [CLKID_AUDIO] = &axg_audio.hw, 193278b4af31SQiufang Dai [CLKID_ETH] = &axg_eth_core.hw, 193378b4af31SQiufang Dai [CLKID_UART1] = &axg_uart1.hw, 193478b4af31SQiufang Dai [CLKID_G2D] = &axg_g2d.hw, 193578b4af31SQiufang Dai [CLKID_USB0] = &axg_usb0.hw, 193678b4af31SQiufang Dai [CLKID_USB1] = &axg_usb1.hw, 193778b4af31SQiufang Dai [CLKID_RESET] = &axg_reset.hw, 193878b4af31SQiufang Dai [CLKID_USB] = &axg_usb_general.hw, 193978b4af31SQiufang Dai [CLKID_AHB_ARB0] = &axg_ahb_arb0.hw, 194078b4af31SQiufang Dai [CLKID_EFUSE] = &axg_efuse.hw, 194178b4af31SQiufang Dai [CLKID_BOOT_ROM] = &axg_boot_rom.hw, 194278b4af31SQiufang Dai [CLKID_AHB_DATA_BUS] = &axg_ahb_data_bus.hw, 194378b4af31SQiufang Dai [CLKID_AHB_CTRL_BUS] = &axg_ahb_ctrl_bus.hw, 194478b4af31SQiufang Dai [CLKID_USB1_DDR_BRIDGE] = &axg_usb1_to_ddr.hw, 194578b4af31SQiufang Dai [CLKID_USB0_DDR_BRIDGE] = &axg_usb0_to_ddr.hw, 194678b4af31SQiufang Dai [CLKID_MMC_PCLK] = &axg_mmc_pclk.hw, 194778b4af31SQiufang Dai [CLKID_VPU_INTR] = &axg_vpu_intr.hw, 194878b4af31SQiufang Dai [CLKID_SEC_AHB_AHB3_BRIDGE] = &axg_sec_ahb_ahb3_bridge.hw, 194978b4af31SQiufang Dai [CLKID_GIC] = &axg_gic.hw, 195078b4af31SQiufang Dai [CLKID_AO_MEDIA_CPU] = &axg_ao_media_cpu.hw, 195178b4af31SQiufang Dai [CLKID_AO_AHB_SRAM] = &axg_ao_ahb_sram.hw, 195278b4af31SQiufang Dai [CLKID_AO_AHB_BUS] = &axg_ao_ahb_bus.hw, 195378b4af31SQiufang Dai [CLKID_AO_IFACE] = &axg_ao_iface.hw, 195478b4af31SQiufang Dai [CLKID_AO_I2C] = &axg_ao_i2c.hw, 195578b4af31SQiufang Dai [CLKID_SD_EMMC_B_CLK0_SEL] = &axg_sd_emmc_b_clk0_sel.hw, 195678b4af31SQiufang Dai [CLKID_SD_EMMC_B_CLK0_DIV] = &axg_sd_emmc_b_clk0_div.hw, 195778b4af31SQiufang Dai [CLKID_SD_EMMC_B_CLK0] = &axg_sd_emmc_b_clk0.hw, 195878b4af31SQiufang Dai [CLKID_SD_EMMC_C_CLK0_SEL] = &axg_sd_emmc_c_clk0_sel.hw, 195978b4af31SQiufang Dai [CLKID_SD_EMMC_C_CLK0_DIV] = &axg_sd_emmc_c_clk0_div.hw, 196078b4af31SQiufang Dai [CLKID_SD_EMMC_C_CLK0] = &axg_sd_emmc_c_clk0.hw, 1961d610b54fSJerome Brunet [CLKID_MPLL0_DIV] = &axg_mpll0_div.hw, 1962d610b54fSJerome Brunet [CLKID_MPLL1_DIV] = &axg_mpll1_div.hw, 1963d610b54fSJerome Brunet [CLKID_MPLL2_DIV] = &axg_mpll2_div.hw, 1964d610b54fSJerome Brunet [CLKID_MPLL3_DIV] = &axg_mpll3_div.hw, 1965093c3facSJerome Brunet [CLKID_HIFI_PLL] = &axg_hifi_pll.hw, 1966513b67acSJerome Brunet [CLKID_MPLL_PREDIV] = &axg_mpll_prediv.hw, 196705f81440SJerome Brunet [CLKID_FCLK_DIV2_DIV] = &axg_fclk_div2_div.hw, 196805f81440SJerome Brunet [CLKID_FCLK_DIV3_DIV] = &axg_fclk_div3_div.hw, 196905f81440SJerome Brunet [CLKID_FCLK_DIV4_DIV] = &axg_fclk_div4_div.hw, 197005f81440SJerome Brunet [CLKID_FCLK_DIV5_DIV] = &axg_fclk_div5_div.hw, 197105f81440SJerome Brunet [CLKID_FCLK_DIV7_DIV] = &axg_fclk_div7_div.hw, 1972cddcb20bSYixun Lan [CLKID_PCIE_PLL] = &axg_pcie_pll.hw, 1973cddcb20bSYixun Lan [CLKID_PCIE_MUX] = &axg_pcie_mux.hw, 1974cddcb20bSYixun Lan [CLKID_PCIE_REF] = &axg_pcie_ref.hw, 1975cddcb20bSYixun Lan [CLKID_PCIE_CML_EN0] = &axg_pcie_cml_en0.hw, 1976cddcb20bSYixun Lan [CLKID_PCIE_CML_EN1] = &axg_pcie_cml_en1.hw, 19777df533a7SJerome Brunet [CLKID_GEN_CLK_SEL] = &axg_gen_clk_sel.hw, 19787df533a7SJerome Brunet [CLKID_GEN_CLK_DIV] = &axg_gen_clk_div.hw, 19797df533a7SJerome Brunet [CLKID_GEN_CLK] = &axg_gen_clk.hw, 198087173557SJerome Brunet [CLKID_SYS_PLL_DCO] = &axg_sys_pll_dco.hw, 198187173557SJerome Brunet [CLKID_FIXED_PLL_DCO] = &axg_fixed_pll_dco.hw, 198287173557SJerome Brunet [CLKID_GP0_PLL_DCO] = &axg_gp0_pll_dco.hw, 198387173557SJerome Brunet [CLKID_HIFI_PLL_DCO] = &axg_hifi_pll_dco.hw, 198487173557SJerome Brunet [CLKID_PCIE_PLL_DCO] = &axg_pcie_pll_dco.hw, 198587173557SJerome Brunet [CLKID_PCIE_PLL_OD] = &axg_pcie_pll_od.hw, 198614ebb315SNeil Armstrong [CLKID_VPU_0_DIV] = &axg_vpu_0_div.hw, 198714ebb315SNeil Armstrong [CLKID_VPU_0_SEL] = &axg_vpu_0_sel.hw, 198814ebb315SNeil Armstrong [CLKID_VPU_0] = &axg_vpu_0.hw, 198914ebb315SNeil Armstrong [CLKID_VPU_1_DIV] = &axg_vpu_1_div.hw, 199014ebb315SNeil Armstrong [CLKID_VPU_1_SEL] = &axg_vpu_1_sel.hw, 199114ebb315SNeil Armstrong [CLKID_VPU_1] = &axg_vpu_1.hw, 199214ebb315SNeil Armstrong [CLKID_VPU] = &axg_vpu.hw, 199314ebb315SNeil Armstrong [CLKID_VAPB_0_DIV] = &axg_vapb_0_div.hw, 199414ebb315SNeil Armstrong [CLKID_VAPB_0_SEL] = &axg_vapb_0_sel.hw, 199514ebb315SNeil Armstrong [CLKID_VAPB_0] = &axg_vapb_0.hw, 199614ebb315SNeil Armstrong [CLKID_VAPB_1_DIV] = &axg_vapb_1_div.hw, 199714ebb315SNeil Armstrong [CLKID_VAPB_1_SEL] = &axg_vapb_1_sel.hw, 199814ebb315SNeil Armstrong [CLKID_VAPB_1] = &axg_vapb_1.hw, 199914ebb315SNeil Armstrong [CLKID_VAPB_SEL] = &axg_vapb_sel.hw, 200014ebb315SNeil Armstrong [CLKID_VAPB] = &axg_vapb.hw, 200114ebb315SNeil Armstrong [CLKID_VCLK] = &axg_vclk.hw, 200214ebb315SNeil Armstrong [CLKID_VCLK2] = &axg_vclk2.hw, 200314ebb315SNeil Armstrong [CLKID_VCLK_SEL] = &axg_vclk_sel.hw, 200414ebb315SNeil Armstrong [CLKID_VCLK2_SEL] = &axg_vclk2_sel.hw, 200514ebb315SNeil Armstrong [CLKID_VCLK_INPUT] = &axg_vclk_input.hw, 200614ebb315SNeil Armstrong [CLKID_VCLK2_INPUT] = &axg_vclk2_input.hw, 200714ebb315SNeil Armstrong [CLKID_VCLK_DIV] = &axg_vclk_div.hw, 200814ebb315SNeil Armstrong [CLKID_VCLK2_DIV] = &axg_vclk2_div.hw, 200914ebb315SNeil Armstrong [CLKID_VCLK_DIV2_EN] = &axg_vclk_div2_en.hw, 201014ebb315SNeil Armstrong [CLKID_VCLK_DIV4_EN] = &axg_vclk_div4_en.hw, 201114ebb315SNeil Armstrong [CLKID_VCLK_DIV6_EN] = &axg_vclk_div6_en.hw, 201214ebb315SNeil Armstrong [CLKID_VCLK_DIV12_EN] = &axg_vclk_div12_en.hw, 201314ebb315SNeil Armstrong [CLKID_VCLK2_DIV2_EN] = &axg_vclk2_div2_en.hw, 201414ebb315SNeil Armstrong [CLKID_VCLK2_DIV4_EN] = &axg_vclk2_div4_en.hw, 201514ebb315SNeil Armstrong [CLKID_VCLK2_DIV6_EN] = &axg_vclk2_div6_en.hw, 201614ebb315SNeil Armstrong [CLKID_VCLK2_DIV12_EN] = &axg_vclk2_div12_en.hw, 201714ebb315SNeil Armstrong [CLKID_VCLK_DIV1] = &axg_vclk_div1.hw, 201814ebb315SNeil Armstrong [CLKID_VCLK_DIV2] = &axg_vclk_div2.hw, 201914ebb315SNeil Armstrong [CLKID_VCLK_DIV4] = &axg_vclk_div4.hw, 202014ebb315SNeil Armstrong [CLKID_VCLK_DIV6] = &axg_vclk_div6.hw, 202114ebb315SNeil Armstrong [CLKID_VCLK_DIV12] = &axg_vclk_div12.hw, 202214ebb315SNeil Armstrong [CLKID_VCLK2_DIV1] = &axg_vclk2_div1.hw, 202314ebb315SNeil Armstrong [CLKID_VCLK2_DIV2] = &axg_vclk2_div2.hw, 202414ebb315SNeil Armstrong [CLKID_VCLK2_DIV4] = &axg_vclk2_div4.hw, 202514ebb315SNeil Armstrong [CLKID_VCLK2_DIV6] = &axg_vclk2_div6.hw, 202614ebb315SNeil Armstrong [CLKID_VCLK2_DIV12] = &axg_vclk2_div12.hw, 202714ebb315SNeil Armstrong [CLKID_CTS_ENCL_SEL] = &axg_cts_encl_sel.hw, 202814ebb315SNeil Armstrong [CLKID_CTS_ENCL] = &axg_cts_encl.hw, 2029e80d8510SNeil Armstrong [CLKID_VDIN_MEAS_SEL] = &axg_vdin_meas_sel.hw, 2030e80d8510SNeil Armstrong [CLKID_VDIN_MEAS_DIV] = &axg_vdin_meas_div.hw, 2031e80d8510SNeil Armstrong [CLKID_VDIN_MEAS] = &axg_vdin_meas.hw, 203278b4af31SQiufang Dai }; 203378b4af31SQiufang Dai 2034722825dcSJerome Brunet /* Convenience table to populate regmap in .probe */ 20357f9768a5SJerome Brunet static struct clk_regmap *const axg_clk_regmaps[] = { 203678b4af31SQiufang Dai &axg_clk81, 203778b4af31SQiufang Dai &axg_ddr, 203878b4af31SQiufang Dai &axg_audio_locker, 203978b4af31SQiufang Dai &axg_mipi_dsi_host, 204078b4af31SQiufang Dai &axg_isa, 204178b4af31SQiufang Dai &axg_pl301, 204278b4af31SQiufang Dai &axg_periphs, 204378b4af31SQiufang Dai &axg_spicc_0, 204478b4af31SQiufang Dai &axg_i2c, 204578b4af31SQiufang Dai &axg_rng0, 204678b4af31SQiufang Dai &axg_uart0, 204778b4af31SQiufang Dai &axg_mipi_dsi_phy, 204878b4af31SQiufang Dai &axg_spicc_1, 204978b4af31SQiufang Dai &axg_pcie_a, 205078b4af31SQiufang Dai &axg_pcie_b, 205178b4af31SQiufang Dai &axg_hiu_reg, 205278b4af31SQiufang Dai &axg_assist_misc, 205378b4af31SQiufang Dai &axg_emmc_b, 205478b4af31SQiufang Dai &axg_emmc_c, 205578b4af31SQiufang Dai &axg_dma, 205678b4af31SQiufang Dai &axg_spi, 205778b4af31SQiufang Dai &axg_audio, 205878b4af31SQiufang Dai &axg_eth_core, 205978b4af31SQiufang Dai &axg_uart1, 206078b4af31SQiufang Dai &axg_g2d, 206178b4af31SQiufang Dai &axg_usb0, 206278b4af31SQiufang Dai &axg_usb1, 206378b4af31SQiufang Dai &axg_reset, 206478b4af31SQiufang Dai &axg_usb_general, 206578b4af31SQiufang Dai &axg_ahb_arb0, 206678b4af31SQiufang Dai &axg_efuse, 206778b4af31SQiufang Dai &axg_boot_rom, 206878b4af31SQiufang Dai &axg_ahb_data_bus, 206978b4af31SQiufang Dai &axg_ahb_ctrl_bus, 207078b4af31SQiufang Dai &axg_usb1_to_ddr, 207178b4af31SQiufang Dai &axg_usb0_to_ddr, 207278b4af31SQiufang Dai &axg_mmc_pclk, 207378b4af31SQiufang Dai &axg_vpu_intr, 207478b4af31SQiufang Dai &axg_sec_ahb_ahb3_bridge, 207578b4af31SQiufang Dai &axg_gic, 207678b4af31SQiufang Dai &axg_ao_media_cpu, 207778b4af31SQiufang Dai &axg_ao_ahb_sram, 207878b4af31SQiufang Dai &axg_ao_ahb_bus, 207978b4af31SQiufang Dai &axg_ao_iface, 208078b4af31SQiufang Dai &axg_ao_i2c, 208178b4af31SQiufang Dai &axg_sd_emmc_b_clk0, 208278b4af31SQiufang Dai &axg_sd_emmc_c_clk0, 2083f06ddd28SJerome Brunet &axg_mpeg_clk_div, 2084f06ddd28SJerome Brunet &axg_sd_emmc_b_clk0_div, 2085f06ddd28SJerome Brunet &axg_sd_emmc_c_clk0_div, 20862513a28cSJerome Brunet &axg_mpeg_clk_sel, 20872513a28cSJerome Brunet &axg_sd_emmc_b_clk0_sel, 20882513a28cSJerome Brunet &axg_sd_emmc_c_clk0_sel, 2089c763e61aSJerome Brunet &axg_mpll0, 2090c763e61aSJerome Brunet &axg_mpll1, 2091c763e61aSJerome Brunet &axg_mpll2, 2092c763e61aSJerome Brunet &axg_mpll3, 2093d610b54fSJerome Brunet &axg_mpll0_div, 2094d610b54fSJerome Brunet &axg_mpll1_div, 2095d610b54fSJerome Brunet &axg_mpll2_div, 2096d610b54fSJerome Brunet &axg_mpll3_div, 2097722825dcSJerome Brunet &axg_fixed_pll, 2098722825dcSJerome Brunet &axg_sys_pll, 2099722825dcSJerome Brunet &axg_gp0_pll, 2100093c3facSJerome Brunet &axg_hifi_pll, 2101513b67acSJerome Brunet &axg_mpll_prediv, 210205f81440SJerome Brunet &axg_fclk_div2, 210305f81440SJerome Brunet &axg_fclk_div3, 210405f81440SJerome Brunet &axg_fclk_div4, 210505f81440SJerome Brunet &axg_fclk_div5, 210605f81440SJerome Brunet &axg_fclk_div7, 210787173557SJerome Brunet &axg_pcie_pll_dco, 210887173557SJerome Brunet &axg_pcie_pll_od, 2109cddcb20bSYixun Lan &axg_pcie_pll, 2110cddcb20bSYixun Lan &axg_pcie_mux, 2111cddcb20bSYixun Lan &axg_pcie_ref, 2112cddcb20bSYixun Lan &axg_pcie_cml_en0, 2113cddcb20bSYixun Lan &axg_pcie_cml_en1, 21147df533a7SJerome Brunet &axg_gen_clk_sel, 21157df533a7SJerome Brunet &axg_gen_clk_div, 21167df533a7SJerome Brunet &axg_gen_clk, 211787173557SJerome Brunet &axg_fixed_pll_dco, 211887173557SJerome Brunet &axg_sys_pll_dco, 211987173557SJerome Brunet &axg_gp0_pll_dco, 212087173557SJerome Brunet &axg_hifi_pll_dco, 212187173557SJerome Brunet &axg_pcie_pll_dco, 212287173557SJerome Brunet &axg_pcie_pll_od, 212314ebb315SNeil Armstrong &axg_vpu_0_div, 212414ebb315SNeil Armstrong &axg_vpu_0_sel, 212514ebb315SNeil Armstrong &axg_vpu_0, 212614ebb315SNeil Armstrong &axg_vpu_1_div, 212714ebb315SNeil Armstrong &axg_vpu_1_sel, 212814ebb315SNeil Armstrong &axg_vpu_1, 212914ebb315SNeil Armstrong &axg_vpu, 213014ebb315SNeil Armstrong &axg_vapb_0_div, 213114ebb315SNeil Armstrong &axg_vapb_0_sel, 213214ebb315SNeil Armstrong &axg_vapb_0, 213314ebb315SNeil Armstrong &axg_vapb_1_div, 213414ebb315SNeil Armstrong &axg_vapb_1_sel, 213514ebb315SNeil Armstrong &axg_vapb_1, 213614ebb315SNeil Armstrong &axg_vapb_sel, 213714ebb315SNeil Armstrong &axg_vapb, 213814ebb315SNeil Armstrong &axg_vclk, 213914ebb315SNeil Armstrong &axg_vclk2, 214014ebb315SNeil Armstrong &axg_vclk_sel, 214114ebb315SNeil Armstrong &axg_vclk2_sel, 214214ebb315SNeil Armstrong &axg_vclk_input, 214314ebb315SNeil Armstrong &axg_vclk2_input, 214414ebb315SNeil Armstrong &axg_vclk_div, 2145*0cbefc7bSIgor Prusov &axg_vclk_div1, 214614ebb315SNeil Armstrong &axg_vclk2_div, 2147*0cbefc7bSIgor Prusov &axg_vclk2_div1, 214814ebb315SNeil Armstrong &axg_vclk_div2_en, 214914ebb315SNeil Armstrong &axg_vclk_div4_en, 215014ebb315SNeil Armstrong &axg_vclk_div6_en, 215114ebb315SNeil Armstrong &axg_vclk_div12_en, 215214ebb315SNeil Armstrong &axg_vclk2_div2_en, 215314ebb315SNeil Armstrong &axg_vclk2_div4_en, 215414ebb315SNeil Armstrong &axg_vclk2_div6_en, 215514ebb315SNeil Armstrong &axg_vclk2_div12_en, 215614ebb315SNeil Armstrong &axg_cts_encl_sel, 215714ebb315SNeil Armstrong &axg_cts_encl, 2158e80d8510SNeil Armstrong &axg_vdin_meas_sel, 2159e80d8510SNeil Armstrong &axg_vdin_meas_div, 2160e80d8510SNeil Armstrong &axg_vdin_meas, 216178b4af31SQiufang Dai }; 216278b4af31SQiufang Dai 21636682bd4dSJerome Brunet static const struct meson_eeclkc_data axg_clkc_data = { 21646682bd4dSJerome Brunet .regmap_clks = axg_clk_regmaps, 21656682bd4dSJerome Brunet .regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps), 2166141fbc27SNeil Armstrong .hw_clks = { 2167141fbc27SNeil Armstrong .hws = axg_hw_clks, 2168141fbc27SNeil Armstrong .num = ARRAY_SIZE(axg_hw_clks), 2169141fbc27SNeil Armstrong }, 21706682bd4dSJerome Brunet }; 21716682bd4dSJerome Brunet 21726682bd4dSJerome Brunet 217378b4af31SQiufang Dai static const struct of_device_id clkc_match_table[] = { 21746682bd4dSJerome Brunet { .compatible = "amlogic,axg-clkc", .data = &axg_clkc_data }, 217578b4af31SQiufang Dai {} 217678b4af31SQiufang Dai }; 217720425f63SKevin Hilman MODULE_DEVICE_TABLE(of, clkc_match_table); 217878b4af31SQiufang Dai 217978b4af31SQiufang Dai static struct platform_driver axg_driver = { 21806682bd4dSJerome Brunet .probe = meson_eeclkc_probe, 218178b4af31SQiufang Dai .driver = { 218278b4af31SQiufang Dai .name = "axg-clkc", 218378b4af31SQiufang Dai .of_match_table = clkc_match_table, 218478b4af31SQiufang Dai }, 218578b4af31SQiufang Dai }; 218678b4af31SQiufang Dai 218720425f63SKevin Hilman module_platform_driver(axg_driver); 218820425f63SKevin Hilman MODULE_LICENSE("GPL v2"); 2189