On Fri 02 Dec 2022 at 01:57, Dmitry Rokosov <ddrokosov@xxxxxxxxxxxxxx> wrote: > Summary changes: > - fixed up clk_summary kernel panic due to missing a1_pad_ctrl > clk_regmap definition > - supported meson-a1-clkc common driver > - aligned CLKID-related definitions with CLKID list from order > perspective to remove holes and permutations > - corrected Kconfig dependencies and types > - provided correct MODULE_AUTHORs() and MODULE_LICENSE() > - optimized and fix up some clock relationships and parents > references > - removed unused register offset definitions again, list in commit description a hint things are mixed up > > Signed-off-by: Dmitry Rokosov <ddrokosov@xxxxxxxxxxxxxx> > --- > drivers/clk/meson/Kconfig | 7 +- > drivers/clk/meson/a1.c | 591 ++++++++++++++++++-------------------- > drivers/clk/meson/a1.h | 16 +- > 3 files changed, 292 insertions(+), 322 deletions(-) > > diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig > index deb273673ec1..cabe63bf23f5 100644 > --- a/drivers/clk/meson/Kconfig > +++ b/drivers/clk/meson/Kconfig > @@ -114,13 +114,14 @@ config COMMON_CLK_A1_PLL > aka a1. Say Y if you want PLL to work. > > config COMMON_CLK_A1 > - bool > - depends on ARCH_MESON > + tristate "Meson A1 SoC clock controller support" > + depends on ARM64 > select COMMON_CLK_MESON_DUALDIV > select COMMON_CLK_MESON_REGMAP > + select COMMON_CLK_MESON_A1_CLKC > help > Support for the Peripheral clock controller on Amlogic A113L device, > - aka a1. Say Y if you want Peripherals to work. > + aka a1. Say Y if you want clock peripherals controller to work. > > config COMMON_CLK_G12A > tristate "G12 and SM1 SoC clock controllers support" > diff --git a/drivers/clk/meson/a1.c b/drivers/clk/meson/a1.c > index 2cf20ae1db75..c9b7f09823f8 100644 > --- a/drivers/clk/meson/a1.c > +++ b/drivers/clk/meson/a1.c > @@ -2,6 +2,9 @@ > /* > * Copyright (c) 2019 Amlogic, Inc. All rights reserved. > * Author: Jian Hu <jian.hu@xxxxxxxxxxx> > + * > + * Copyright (c) 2022, SberDevices. All Rights Reserved. > + * Author: Dmitry Rokosov <ddrokosov@xxxxxxxxxxxxxx> > */ > > #include <linux/clk-provider.h> > @@ -10,6 +13,7 @@ > #include "a1.h" > #include "clk-dualdiv.h" > #include "clk-regmap.h" > +#include "meson-a1-clkc.h" > > static struct clk_regmap a1_xtal_clktree = { > .data = &(struct clk_regmap_gate_data){ > @@ -116,11 +120,128 @@ static struct clk_regmap a1_xtal_dds = { > }, > }; > > +static struct clk_regmap a1_rtc_32k_clkin = { > + .data = &(struct clk_regmap_gate_data){ > + .offset = RTC_BY_OSCIN_CTRL0, > + .bit_idx = 31, > + }, > + .hw.init = &(struct clk_init_data) { > + .name = "rtc_32k_clkin", > + .ops = &clk_regmap_gate_ops, > + .parent_data = &(const struct clk_parent_data) { > + .fw_name = "xtal", > + }, > + .num_parents = 1, > + }, > +}; > + > +static const struct meson_clk_dualdiv_param a1_32k_div_table[] = { > + { > + .dual = 1, > + .n1 = 733, > + .m1 = 8, > + .n2 = 732, > + .m2 = 11, > + }, > + {} > +}; > + > +static struct clk_regmap a1_rtc_32k_div = { > + .data = &(struct meson_clk_dualdiv_data){ > + .n1 = { > + .reg_off = RTC_BY_OSCIN_CTRL0, > + .shift = 0, > + .width = 12, > + }, > + .n2 = { > + .reg_off = RTC_BY_OSCIN_CTRL0, > + .shift = 12, > + .width = 12, > + }, > + .m1 = { > + .reg_off = RTC_BY_OSCIN_CTRL1, > + .shift = 0, > + .width = 12, > + }, > + .m2 = { > + .reg_off = RTC_BY_OSCIN_CTRL1, > + .shift = 12, > + .width = 12, > + }, > + .dual = { > + .reg_off = RTC_BY_OSCIN_CTRL0, > + .shift = 28, > + .width = 1, > + }, > + .table = a1_32k_div_table, > + }, > + .hw.init = &(struct clk_init_data){ > + .name = "rtc_32k_div", > + .ops = &meson_clk_dualdiv_ops, > + .parent_hws = (const struct clk_hw *[]) { > + &a1_rtc_32k_clkin.hw > + }, > + .num_parents = 1, > + }, > +}; > + > +static struct clk_regmap a1_rtc_32k_xtal = { > + .data = &(struct clk_regmap_gate_data){ > + .offset = RTC_BY_OSCIN_CTRL1, > + .bit_idx = 24, > + }, > + .hw.init = &(struct clk_init_data) { > + .name = "rtc_32k_xtal", > + .ops = &clk_regmap_gate_ops, > + .parent_hws = (const struct clk_hw *[]) { > + &a1_rtc_32k_clkin.hw > + }, > + .num_parents = 1, > + }, > +}; > + > +static struct clk_regmap a1_rtc_32k_sel = { > + .data = &(struct clk_regmap_mux_data) { > + .offset = RTC_CTRL, > + .mask = 0x3, > + .shift = 0, > + .flags = CLK_MUX_ROUND_CLOSEST, > + }, > + .hw.init = &(struct clk_init_data){ > + .name = "rtc_32k_sel", > + .ops = &clk_regmap_mux_ops, > + .parent_hws = (const struct clk_hw *[]) { > + &a1_rtc_32k_xtal.hw, > + &a1_rtc_32k_div.hw, > + }, > + .num_parents = 2, > + .flags = CLK_SET_RATE_PARENT, > + }, > +}; > + > +struct clk_regmap a1_rtc_clk = { > + .data = &(struct clk_regmap_gate_data){ > + .offset = RTC_BY_OSCIN_CTRL0, > + .bit_idx = 30, > + }, > + .hw.init = &(struct clk_init_data){ > + .name = "rtc_clk", > + .ops = &clk_regmap_gate_ops, > + .parent_hws = (const struct clk_hw *[]) { > + &a1_rtc_32k_sel.hw > + }, > + .num_parents = 1, > + .flags = CLK_SET_RATE_PARENT, > + }, > +}; > + > +static u32 mux_table_sys_clk[] = { 0, 1, 2, 3, 7 }; > static const struct clk_parent_data sys_clk_parents[] = { > { .fw_name = "xtal" }, > { .fw_name = "fclk_div2" }, > { .fw_name = "fclk_div3" }, > { .fw_name = "fclk_div5" }, > + { .hw = &a1_rtc_clk.hw }, > }; > > static struct clk_regmap a1_sys_b_sel = { > @@ -128,6 +249,7 @@ static struct clk_regmap a1_sys_b_sel = { > .offset = SYS_CLK_CTRL0, > .mask = 0x7, > .shift = 26, > + .table = mux_table_sys_clk, > }, > .hw.init = &(struct clk_init_data){ > .name = "sys_b_sel", > @@ -175,6 +297,7 @@ static struct clk_regmap a1_sys_a_sel = { > .offset = SYS_CLK_CTRL0, > .mask = 0x7, > .shift = 10, > + .table = mux_table_sys_clk, > }, > .hw.init = &(struct clk_init_data){ > .name = "sys_a_sel", > @@ -227,7 +350,8 @@ static struct clk_regmap a1_sys_clk = { > .name = "sys_clk", > .ops = &clk_regmap_mux_ro_ops, > .parent_hws = (const struct clk_hw *[]) { > - &a1_sys_a.hw, &a1_sys_b.hw, > + &a1_sys_a.hw, > + &a1_sys_b.hw, > }, > .num_parents = 2, > /* > @@ -243,121 +367,6 @@ static struct clk_regmap a1_sys_clk = { > }, > }; > > -static struct clk_regmap a1_rtc_32k_clkin = { > - .data = &(struct clk_regmap_gate_data){ > - .offset = RTC_BY_OSCIN_CTRL0, > - .bit_idx = 31, > - }, > - .hw.init = &(struct clk_init_data) { > - .name = "rtc_32k_clkin", > - .ops = &clk_regmap_gate_ops, > - .parent_data = &(const struct clk_parent_data) { > - .fw_name = "xtal", > - }, > - .num_parents = 1, > - }, > -}; > - > -static const struct meson_clk_dualdiv_param a1_32k_div_table[] = { > - { > - .dual = 1, > - .n1 = 733, > - .m1 = 8, > - .n2 = 732, > - .m2 = 11, > - }, > - {} > -}; > - > -static struct clk_regmap a1_rtc_32k_div = { > - .data = &(struct meson_clk_dualdiv_data){ > - .n1 = { > - .reg_off = RTC_BY_OSCIN_CTRL0, > - .shift = 0, > - .width = 12, > - }, > - .n2 = { > - .reg_off = RTC_BY_OSCIN_CTRL0, > - .shift = 12, > - .width = 12, > - }, > - .m1 = { > - .reg_off = RTC_BY_OSCIN_CTRL1, > - .shift = 0, > - .width = 12, > - }, > - .m2 = { > - .reg_off = RTC_BY_OSCIN_CTRL1, > - .shift = 12, > - .width = 12, > - }, > - .dual = { > - .reg_off = RTC_BY_OSCIN_CTRL0, > - .shift = 28, > - .width = 1, > - }, > - .table = a1_32k_div_table, > - }, > - .hw.init = &(struct clk_init_data){ > - .name = "rtc_32k_div", > - .ops = &meson_clk_dualdiv_ops, > - .parent_hws = (const struct clk_hw *[]) { > - &a1_rtc_32k_clkin.hw > - }, > - .num_parents = 1, > - }, > -}; > - > -static struct clk_regmap a1_rtc_32k_xtal = { > - .data = &(struct clk_regmap_gate_data){ > - .offset = RTC_BY_OSCIN_CTRL1, > - .bit_idx = 24, > - }, > - .hw.init = &(struct clk_init_data) { > - .name = "rtc_32k_xtal", > - .ops = &clk_regmap_gate_ops, > - .parent_hws = (const struct clk_hw *[]) { > - &a1_rtc_32k_clkin.hw > - }, > - .num_parents = 1, > - }, > -}; > - > -static struct clk_regmap a1_rtc_32k_sel = { > - .data = &(struct clk_regmap_mux_data) { > - .offset = RTC_CTRL, > - .mask = 0x3, > - .shift = 0, > - .flags = CLK_MUX_ROUND_CLOSEST, > - }, > - .hw.init = &(struct clk_init_data){ > - .name = "rtc_32k_sel", > - .ops = &clk_regmap_mux_ops, > - .parent_hws = (const struct clk_hw *[]) { > - &a1_rtc_32k_xtal.hw, > - &a1_rtc_32k_div.hw, > - }, > - .num_parents = 2, > - .flags = CLK_SET_RATE_PARENT, > - }, > -}; > - > -struct clk_regmap a1_rtc_clk = { > - .data = &(struct clk_regmap_gate_data){ > - .offset = RTC_BY_OSCIN_CTRL0, > - .bit_idx = 30, > - }, > - .hw.init = &(struct clk_init_data){ > - .name = "rtc_clk", > - .ops = &clk_regmap_gate_ops, > - .parent_hws = (const struct clk_hw *[]) { > - &a1_rtc_32k_sel.hw > - }, > - .num_parents = 1, > - .flags = CLK_SET_RATE_PARENT, > - }, > -}; > - > static u32 mux_table_dsp_ab[] = { 0, 1, 2, 3, 4, 7 }; > static const struct clk_parent_data dsp_ab_clk_parent_data[] = { > { .fw_name = "xtal", }, > @@ -475,9 +484,9 @@ static struct clk_regmap a1_dspa_sel = { > .hw.init = &(struct clk_init_data){ > .name = "dspa_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = (const struct clk_parent_data []) { > - { .hw = &a1_dspa_a.hw }, > - { .hw = &a1_dspa_b.hw }, > + .parent_hws = (const struct clk_hw *[]) { > + &a1_dspa_a.hw, > + &a1_dspa_b.hw, > }, > .num_parents = 2, > .flags = CLK_SET_RATE_PARENT, > @@ -624,7 +633,8 @@ static struct clk_regmap a1_dspb_sel = { > .name = "dspb_sel", > .ops = &clk_regmap_mux_ops, > .parent_hws = (const struct clk_hw *[]) { > - &a1_dspb_a.hw, &a1_dspb_b.hw, > + &a1_dspb_a.hw, > + &a1_dspb_b.hw, > }, > .num_parents = 2, > .flags = CLK_SET_RATE_PARENT, > @@ -852,6 +862,12 @@ static struct clk_regmap a1_saradc_clk = { > }, > }; > > +static const struct clk_parent_data pwm_abcd_parents[] = { > + { .fw_name = "xtal", }, > + { .hw = &a1_sys_clk.hw }, > + { .hw = &a1_rtc_clk.hw }, > +}; > + > static struct clk_regmap a1_pwm_a_sel = { > .data = &(struct clk_regmap_mux_data){ > .offset = PWM_CLK_AB_CTRL, > @@ -861,11 +877,8 @@ static struct clk_regmap a1_pwm_a_sel = { > .hw.init = &(struct clk_init_data){ > .name = "pwm_a_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = (const struct clk_parent_data []) { > - { .fw_name = "xtal", }, > - { .hw = &a1_sys_clk.hw, }, > - }, > - .num_parents = 2, > + .parent_data = pwm_abcd_parents, > + .num_parents = ARRAY_SIZE(pwm_abcd_parents), > }, > }; > > @@ -918,11 +931,8 @@ static struct clk_regmap a1_pwm_b_sel = { > .hw.init = &(struct clk_init_data){ > .name = "pwm_b_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = (const struct clk_parent_data []) { > - { .fw_name = "xtal", }, > - { .hw = &a1_sys_clk.hw, }, > - }, > - .num_parents = 2, > + .parent_data = pwm_abcd_parents, > + .num_parents = ARRAY_SIZE(pwm_abcd_parents), > }, > }; > > @@ -968,11 +978,8 @@ static struct clk_regmap a1_pwm_c_sel = { > .hw.init = &(struct clk_init_data){ > .name = "pwm_c_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = (const struct clk_parent_data []) { > - { .fw_name = "xtal", }, > - { .hw = &a1_sys_clk.hw, }, > - }, > - .num_parents = 2, > + .parent_data = pwm_abcd_parents, > + .num_parents = ARRAY_SIZE(pwm_abcd_parents), > }, > }; > > @@ -1018,11 +1025,8 @@ static struct clk_regmap a1_pwm_d_sel = { > .hw.init = &(struct clk_init_data){ > .name = "pwm_d_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = (const struct clk_parent_data []) { > - { .fw_name = "xtal", }, > - { .hw = &a1_sys_clk.hw, }, > - }, > - .num_parents = 2, > + .parent_data = pwm_abcd_parents, > + .num_parents = ARRAY_SIZE(pwm_abcd_parents), > }, > }; > > @@ -1059,7 +1063,7 @@ static struct clk_regmap a1_pwm_d = { > }, > }; > > -static const struct clk_parent_data pwm_ef_parent_data[] = { > +static const struct clk_parent_data pwm_ef_parents[] = { > { .fw_name = "xtal", }, > { .hw = &a1_sys_clk.hw }, > { .fw_name = "fclk_div5", }, > @@ -1075,8 +1079,8 @@ static struct clk_regmap a1_pwm_e_sel = { > .hw.init = &(struct clk_init_data){ > .name = "pwm_e_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = pwm_ef_parent_data, > - .num_parents = ARRAY_SIZE(pwm_ef_parent_data), > + .parent_data = pwm_ef_parents, > + .num_parents = ARRAY_SIZE(pwm_ef_parents), > }, > }; > > @@ -1122,8 +1126,8 @@ static struct clk_regmap a1_pwm_f_sel = { > .hw.init = &(struct clk_init_data){ > .name = "pwm_f_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = pwm_ef_parent_data, > - .num_parents = ARRAY_SIZE(pwm_ef_parent_data), > + .parent_data = pwm_ef_parents, > + .num_parents = ARRAY_SIZE(pwm_ef_parents), > }, > }; > > @@ -1169,7 +1173,7 @@ static struct clk_regmap a1_pwm_f = { > * --------------------|/ > * 24M > */ > -static const struct clk_parent_data spicc_parents[] = { > +static const struct clk_parent_data spicc_spifc_parents[] = { > { .fw_name = "fclk_div2"}, > { .fw_name = "fclk_div3"}, > { .fw_name = "fclk_div5"}, > @@ -1185,8 +1189,8 @@ static struct clk_regmap a1_spicc_sel = { > .hw.init = &(struct clk_init_data){ > .name = "spicc_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = spicc_parents, > - .num_parents = 4, > + .parent_data = spicc_spifc_parents, > + .num_parents = ARRAY_SIZE(spicc_spifc_parents), > }, > }; > > @@ -1282,9 +1286,8 @@ static struct clk_regmap a1_spifc_sel = { > .hw.init = &(struct clk_init_data){ > .name = "spifc_sel", > .ops = &clk_regmap_mux_ops, > - /* the same parent with spicc */ > - .parent_data = spicc_parents, > - .num_parents = 4, > + .parent_data = spicc_spifc_parents, > + .num_parents = ARRAY_SIZE(spicc_spifc_parents), > }, > }; > > @@ -1339,7 +1342,7 @@ static struct clk_regmap a1_spifc = { > }, > }; > > -static const struct clk_parent_data usb_bus_parent_data[] = { > +static const struct clk_parent_data usb_bus_parents[] = { > { .fw_name = "xtal", }, > { .hw = &a1_sys_clk.hw }, > { .fw_name = "fclk_div3", }, > @@ -1355,8 +1358,8 @@ static struct clk_regmap a1_usb_bus_sel = { > .hw.init = &(struct clk_init_data){ > .name = "usb_bus_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = usb_bus_parent_data, > - .num_parents = ARRAY_SIZE(usb_bus_parent_data), > + .parent_data = usb_bus_parents, > + .num_parents = ARRAY_SIZE(usb_bus_parents), > .flags = CLK_SET_RATE_PARENT, > }, > }; > @@ -1394,7 +1397,7 @@ static struct clk_regmap a1_usb_bus = { > }, > }; > > -static const struct clk_parent_data sd_emmc_parents[] = { > +static const struct clk_parent_data sd_emmc_psram_dmc_parents[] = { > { .fw_name = "fclk_div2", }, > { .fw_name = "fclk_div3", }, > { .fw_name = "fclk_div5", }, > @@ -1410,8 +1413,8 @@ static struct clk_regmap a1_sd_emmc_sel = { > .hw.init = &(struct clk_init_data){ > .name = "sd_emmc_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = sd_emmc_parents, > - .num_parents = 4, > + .parent_data = sd_emmc_psram_dmc_parents, > + .num_parents = ARRAY_SIZE(sd_emmc_psram_dmc_parents), > }, > }; > > @@ -1475,9 +1478,8 @@ static struct clk_regmap a1_psram_sel = { > .hw.init = &(struct clk_init_data){ > .name = "psram_sel", > .ops = &clk_regmap_mux_ops, > - /* the same parent with sd_emmc */ > - .parent_data = sd_emmc_parents, > - .num_parents = 4, > + .parent_data = sd_emmc_psram_dmc_parents, > + .num_parents = ARRAY_SIZE(sd_emmc_psram_dmc_parents), > }, > }; > > @@ -1541,8 +1543,8 @@ static struct clk_regmap a1_dmc_sel = { > .hw.init = &(struct clk_init_data){ > .name = "dmc_sel", > .ops = &clk_regmap_mux_ops, > - .parent_data = sd_emmc_parents, > - .num_parents = 4, > + .parent_data = sd_emmc_psram_dmc_parents, > + .num_parents = ARRAY_SIZE(sd_emmc_psram_dmc_parents), > }, > }; > > @@ -1873,13 +1875,6 @@ static MESON_GATE(a1_prod_i2c, AXI_CLK_EN, 12); > /* Array of all clocks provided by this provider */ > static struct clk_hw_onecell_data a1_periphs_hw_onecell_data = { > .hws = { > - [CLKID_SYS_B_SEL] = &a1_sys_b_sel.hw, > - [CLKID_SYS_B_DIV] = &a1_sys_b_div.hw, > - [CLKID_SYS_B] = &a1_sys_b.hw, > - [CLKID_SYS_A_SEL] = &a1_sys_a_sel.hw, > - [CLKID_SYS_A_DIV] = &a1_sys_a_div.hw, > - [CLKID_SYS_A] = &a1_sys_a.hw, > - [CLKID_SYS_CLK] = &a1_sys_clk.hw, > [CLKID_XTAL_CLKTREE] = &a1_xtal_clktree.hw, > [CLKID_XTAL_FIXPLL] = &a1_xtal_fixpll.hw, > [CLKID_XTAL_USB_PHY] = &a1_xtal_usb_phy.hw, > @@ -1887,6 +1882,7 @@ static struct clk_hw_onecell_data a1_periphs_hw_onecell_data = { > [CLKID_XTAL_HIFIPLL] = &a1_xtal_hifipll.hw, > [CLKID_XTAL_SYSPLL] = &a1_xtal_syspll.hw, > [CLKID_XTAL_DDS] = &a1_xtal_dds.hw, > + [CLKID_SYS_CLK] = &a1_sys_clk.hw, > [CLKID_CLKTREE] = &a1_clk_tree.hw, > [CLKID_RESET_CTRL] = &a1_reset_ctrl.hw, > [CLKID_ANALOG_CTRL] = &a1_analog_ctrl.hw, > @@ -1940,93 +1936,99 @@ static struct clk_hw_onecell_data a1_periphs_hw_onecell_data = { > [CLKID_CPU_CTRL] = &a1_cpu_ctrl.hw, > [CLKID_ROM] = &a1_rom.hw, > [CLKID_PROC_I2C] = &a1_prod_i2c.hw, > + [CLKID_DSPA_SEL] = &a1_dspa_sel.hw, > + [CLKID_DSPB_SEL] = &a1_dspb_sel.hw, > + [CLKID_DSPA_EN] = &a1_dspa_en.hw, > + [CLKID_DSPA_EN_NIC] = &a1_dspa_en_nic.hw, > + [CLKID_DSPB_EN] = &a1_dspb_en.hw, > + [CLKID_DSPB_EN_NIC] = &a1_dspb_en_nic.hw, > + [CLKID_RTC_CLK] = &a1_rtc_clk.hw, > + [CLKID_CECA_32K] = &a1_ceca_32k_clkout.hw, > + [CLKID_CECB_32K] = &a1_cecb_32k_clkout.hw, > + [CLKID_24M] = &a1_24m.hw, > + [CLKID_12M] = &a1_12m.hw, > + [CLKID_FCLK_DIV2_DIVN] = &a1_fclk_div2_divn.hw, > + [CLKID_GEN] = &a1_gen.hw, > + [CLKID_SARADC_SEL] = &a1_saradc_sel.hw, > + [CLKID_SARADC_CLK] = &a1_saradc_clk.hw, > + [CLKID_PWM_A] = &a1_pwm_a.hw, > + [CLKID_PWM_B] = &a1_pwm_b.hw, > + [CLKID_PWM_C] = &a1_pwm_c.hw, > + [CLKID_PWM_D] = &a1_pwm_d.hw, > + [CLKID_PWM_E] = &a1_pwm_e.hw, > + [CLKID_PWM_F] = &a1_pwm_f.hw, > + [CLKID_SPICC] = &a1_spicc.hw, > + [CLKID_TS] = &a1_ts.hw, > + [CLKID_SPIFC] = &a1_spifc.hw, > + [CLKID_USB_BUS] = &a1_usb_bus.hw, > + [CLKID_SD_EMMC] = &a1_sd_emmc.hw, > + [CLKID_PSRAM] = &a1_psram.hw, > + [CLKID_DMC] = &a1_dmc.hw, > + [CLKID_SYS_A_SEL] = &a1_sys_a_sel.hw, > + [CLKID_SYS_A_DIV] = &a1_sys_a_div.hw, > + [CLKID_SYS_A] = &a1_sys_a.hw, > + [CLKID_SYS_B_SEL] = &a1_sys_b_sel.hw, > + [CLKID_SYS_B_DIV] = &a1_sys_b_div.hw, > + [CLKID_SYS_B] = &a1_sys_b.hw, > [CLKID_DSPA_A_SEL] = &a1_dspa_a_sel.hw, > [CLKID_DSPA_A_DIV] = &a1_dspa_a_div.hw, > [CLKID_DSPA_A] = &a1_dspa_a.hw, > [CLKID_DSPA_B_SEL] = &a1_dspa_b_sel.hw, > [CLKID_DSPA_B_DIV] = &a1_dspa_b_div.hw, > [CLKID_DSPA_B] = &a1_dspa_b.hw, > - [CLKID_DSPA_SEL] = &a1_dspa_sel.hw, > [CLKID_DSPB_A_SEL] = &a1_dspb_a_sel.hw, > [CLKID_DSPB_A_DIV] = &a1_dspb_a_div.hw, > [CLKID_DSPB_A] = &a1_dspb_a.hw, > [CLKID_DSPB_B_SEL] = &a1_dspb_b_sel.hw, > [CLKID_DSPB_B_DIV] = &a1_dspb_b_div.hw, > [CLKID_DSPB_B] = &a1_dspb_b.hw, > - [CLKID_DSPB_SEL] = &a1_dspb_sel.hw, > - [CLKID_DSPA_EN] = &a1_dspa_en.hw, > - [CLKID_DSPA_EN_NIC] = &a1_dspa_en_nic.hw, > - [CLKID_DSPB_EN] = &a1_dspb_en.hw, > - [CLKID_DSPB_EN_NIC] = &a1_dspb_en_nic.hw, > - [CLKID_24M] = &a1_24m.hw, > - [CLKID_24M_DIV2] = &a1_24m_div2.hw, > - [CLKID_12M] = &a1_12m.hw, > + [CLKID_RTC_32K_CLKIN] = &a1_rtc_32k_clkin.hw, > + [CLKID_RTC_32K_DIV] = &a1_rtc_32k_div.hw, > + [CLKID_RTC_32K_XTAL] = &a1_rtc_32k_xtal.hw, > + [CLKID_RTC_32K_SEL] = &a1_rtc_32k_sel.hw, > + [CLKID_CECB_32K_CLKIN] = &a1_cecb_32k_clkin.hw, > + [CLKID_CECB_32K_DIV] = &a1_cecb_32k_div.hw, > + [CLKID_CECB_32K_SEL_PRE] = &a1_cecb_32k_sel_pre.hw, > + [CLKID_CECB_32K_SEL] = &a1_cecb_32k_sel.hw, > + [CLKID_CECA_32K_CLKIN] = &a1_ceca_32k_clkin.hw, > + [CLKID_CECA_32K_DIV] = &a1_ceca_32k_div.hw, > + [CLKID_CECA_32K_SEL_PRE] = &a1_ceca_32k_sel_pre.hw, > + [CLKID_CECA_32K_SEL] = &a1_ceca_32k_sel.hw, > [CLKID_DIV2_PRE] = &a1_fclk_div2_divn_pre.hw, > - [CLKID_FCLK_DIV2_DIVN] = &a1_fclk_div2_divn.hw, > + [CLKID_24M_DIV2] = &a1_24m_div2.hw, > [CLKID_GEN_SEL] = &a1_gen_sel.hw, > [CLKID_GEN_DIV] = &a1_gen_div.hw, > - [CLKID_GEN] = &a1_gen.hw, > - [CLKID_SARADC_SEL] = &a1_saradc_sel.hw, > [CLKID_SARADC_DIV] = &a1_saradc_div.hw, > - [CLKID_SARADC_CLK] = &a1_saradc_clk.hw, > [CLKID_PWM_A_SEL] = &a1_pwm_a_sel.hw, > [CLKID_PWM_A_DIV] = &a1_pwm_a_div.hw, > - [CLKID_PWM_A] = &a1_pwm_a.hw, > [CLKID_PWM_B_SEL] = &a1_pwm_b_sel.hw, > [CLKID_PWM_B_DIV] = &a1_pwm_b_div.hw, > - [CLKID_PWM_B] = &a1_pwm_b.hw, > [CLKID_PWM_C_SEL] = &a1_pwm_c_sel.hw, > [CLKID_PWM_C_DIV] = &a1_pwm_c_div.hw, > - [CLKID_PWM_C] = &a1_pwm_c.hw, > [CLKID_PWM_D_SEL] = &a1_pwm_d_sel.hw, > [CLKID_PWM_D_DIV] = &a1_pwm_d_div.hw, > - [CLKID_PWM_D] = &a1_pwm_d.hw, > [CLKID_PWM_E_SEL] = &a1_pwm_e_sel.hw, > [CLKID_PWM_E_DIV] = &a1_pwm_e_div.hw, > - [CLKID_PWM_E] = &a1_pwm_e.hw, > [CLKID_PWM_F_SEL] = &a1_pwm_f_sel.hw, > [CLKID_PWM_F_DIV] = &a1_pwm_f_div.hw, > - [CLKID_PWM_F] = &a1_pwm_f.hw, > [CLKID_SPICC_SEL] = &a1_spicc_sel.hw, > [CLKID_SPICC_DIV] = &a1_spicc_div.hw, > [CLKID_SPICC_SEL2] = &a1_spicc_sel2.hw, > - [CLKID_SPICC] = &a1_spicc.hw, > [CLKID_TS_DIV] = &a1_ts_div.hw, > - [CLKID_TS] = &a1_ts.hw, > [CLKID_SPIFC_SEL] = &a1_spifc_sel.hw, > [CLKID_SPIFC_DIV] = &a1_spifc_div.hw, > [CLKID_SPIFC_SEL2] = &a1_spifc_sel2.hw, > - [CLKID_SPIFC] = &a1_spifc.hw, > [CLKID_USB_BUS_SEL] = &a1_usb_bus_sel.hw, > [CLKID_USB_BUS_DIV] = &a1_usb_bus_div.hw, > - [CLKID_USB_BUS] = &a1_usb_bus.hw, > [CLKID_SD_EMMC_SEL] = &a1_sd_emmc_sel.hw, > [CLKID_SD_EMMC_DIV] = &a1_sd_emmc_div.hw, > [CLKID_SD_EMMC_SEL2] = &a1_sd_emmc_sel2.hw, > - [CLKID_SD_EMMC] = &a1_sd_emmc.hw, > [CLKID_PSRAM_SEL] = &a1_psram_sel.hw, > [CLKID_PSRAM_DIV] = &a1_psram_div.hw, > [CLKID_PSRAM_SEL2] = &a1_psram_sel2.hw, > - [CLKID_PSRAM] = &a1_psram.hw, > [CLKID_DMC_SEL] = &a1_dmc_sel.hw, > [CLKID_DMC_DIV] = &a1_dmc_div.hw, > [CLKID_DMC_SEL2] = &a1_dmc_sel2.hw, > - [CLKID_DMC] = &a1_dmc.hw, > - [CLKID_RTC_32K_CLKIN] = &a1_rtc_32k_clkin.hw, > - [CLKID_RTC_32K_DIV] = &a1_rtc_32k_div.hw, > - [CLKID_RTC_32K_XTAL] = &a1_rtc_32k_xtal.hw, > - [CLKID_RTC_32K_SEL] = &a1_rtc_32k_sel.hw, > - [CLKID_RTC_CLK] = &a1_rtc_clk.hw, > - [CLKID_CECA_32K_CLKIN] = &a1_ceca_32k_clkin.hw, > - [CLKID_CECA_32K_DIV] = &a1_ceca_32k_div.hw, > - [CLKID_CECA_32K_SEL_PRE] = &a1_ceca_32k_sel_pre.hw, > - [CLKID_CECA_32K_SEL] = &a1_ceca_32k_sel.hw, > - [CLKID_CECA_32K] = &a1_ceca_32k_clkout.hw, > - [CLKID_CECB_32K_CLKIN] = &a1_cecb_32k_clkin.hw, > - [CLKID_CECB_32K_DIV] = &a1_cecb_32k_div.hw, > - [CLKID_CECB_32K_SEL_PRE] = &a1_cecb_32k_sel_pre.hw, > - [CLKID_CECB_32K_SEL] = &a1_cecb_32k_sel.hw, > - [CLKID_CECB_32K] = &a1_cecb_32k_clkout.hw, > [NR_CLKS] = NULL, > }, Please avoid this ordering change - It is borderline impossible to review. Keep the ID Order > .num = NR_CLKS, > @@ -2041,10 +2043,12 @@ static struct clk_regmap *const a1_periphs_regmaps[] = { > &a1_xtal_hifipll, > &a1_xtal_syspll, > &a1_xtal_dds, > + &a1_sys_clk, > &a1_clk_tree, > &a1_reset_ctrl, > &a1_analog_ctrl, > &a1_pwr_ctrl, > + &a1_pad_ctrl, > &a1_sys_ctrl, > &a1_temp_sensor, > &a1_am2axi_dev, > @@ -2093,157 +2097,126 @@ static struct clk_regmap *const a1_periphs_regmaps[] = { > &a1_cpu_ctrl, > &a1_rom, > &a1_prod_i2c, > + &a1_dspa_sel, > + &a1_dspb_sel, > + &a1_dspa_en, > + &a1_dspa_en_nic, > + &a1_dspb_en, > + &a1_dspb_en_nic, > + &a1_rtc_clk, > + &a1_ceca_32k_clkout, > + &a1_cecb_32k_clkout, > + &a1_24m, > + &a1_12m, > + &a1_fclk_div2_divn, > + &a1_gen, > + &a1_saradc_sel, > + &a1_saradc_clk, > + &a1_pwm_a, > + &a1_pwm_b, > + &a1_pwm_c, > + &a1_pwm_d, > + &a1_pwm_e, > + &a1_pwm_f, > + &a1_spicc, > + &a1_ts, > + &a1_spifc, > + &a1_usb_bus, > + &a1_sd_emmc, > + &a1_psram, > + &a1_dmc, > + &a1_sys_a_sel, > + &a1_sys_a_div, > + &a1_sys_a, > + &a1_sys_b_sel, > + &a1_sys_b_div, > + &a1_sys_b, > &a1_dspa_a_sel, > &a1_dspa_a_div, > &a1_dspa_a, > &a1_dspa_b_sel, > &a1_dspa_b_div, > &a1_dspa_b, > - &a1_dspa_sel, > &a1_dspb_a_sel, > &a1_dspb_a_div, > &a1_dspb_a, > &a1_dspb_b_sel, > &a1_dspb_b_div, > &a1_dspb_b, > - &a1_dspb_sel, > - &a1_dspa_en, > - &a1_dspa_en_nic, > - &a1_dspb_en, > - &a1_dspb_en_nic, > - &a1_24m, > - &a1_12m, > + &a1_rtc_32k_clkin, > + &a1_rtc_32k_div, > + &a1_rtc_32k_xtal, > + &a1_rtc_32k_sel, > + &a1_cecb_32k_clkin, > + &a1_cecb_32k_div, > + &a1_cecb_32k_sel_pre, > + &a1_cecb_32k_sel, > + &a1_ceca_32k_clkin, > + &a1_ceca_32k_div, > + &a1_ceca_32k_sel_pre, > + &a1_ceca_32k_sel, > &a1_fclk_div2_divn_pre, > - &a1_fclk_div2_divn, > &a1_gen_sel, > &a1_gen_div, > - &a1_gen, > - &a1_saradc_sel, > &a1_saradc_div, > - &a1_saradc_clk, > &a1_pwm_a_sel, > &a1_pwm_a_div, > - &a1_pwm_a, > &a1_pwm_b_sel, > &a1_pwm_b_div, > - &a1_pwm_b, > &a1_pwm_c_sel, > &a1_pwm_c_div, > - &a1_pwm_c, > &a1_pwm_d_sel, > &a1_pwm_d_div, > - &a1_pwm_d, > &a1_pwm_e_sel, > &a1_pwm_e_div, > - &a1_pwm_e, > &a1_pwm_f_sel, > &a1_pwm_f_div, > - &a1_pwm_f, > &a1_spicc_sel, > &a1_spicc_div, > &a1_spicc_sel2, > - &a1_spicc, > &a1_ts_div, > - &a1_ts, > &a1_spifc_sel, > &a1_spifc_div, > &a1_spifc_sel2, > - &a1_spifc, > &a1_usb_bus_sel, > &a1_usb_bus_div, > - &a1_usb_bus, > &a1_sd_emmc_sel, > &a1_sd_emmc_div, > &a1_sd_emmc_sel2, > - &a1_sd_emmc, > &a1_psram_sel, > &a1_psram_div, > &a1_psram_sel2, > - &a1_psram, > &a1_dmc_sel, > &a1_dmc_div, > &a1_dmc_sel2, > - &a1_dmc, > - &a1_sys_b_sel, > - &a1_sys_b_div, > - &a1_sys_b, > - &a1_sys_a_sel, > - &a1_sys_a_div, > - &a1_sys_a, > - &a1_sys_clk, > - &a1_rtc_32k_clkin, > - &a1_rtc_32k_div, > - &a1_rtc_32k_xtal, > - &a1_rtc_32k_sel, > - &a1_rtc_clk, > - &a1_ceca_32k_clkin, > - &a1_ceca_32k_div, > - &a1_ceca_32k_sel_pre, > - &a1_ceca_32k_sel, > - &a1_ceca_32k_clkout, > - &a1_cecb_32k_clkin, > - &a1_cecb_32k_div, > - &a1_cecb_32k_sel_pre, > - &a1_cecb_32k_sel, > - &a1_cecb_32k_clkout, > }; > > -static struct regmap_config clkc_regmap_config = { > - .reg_bits = 32, > - .val_bits = 32, > - .reg_stride = 4, > +static const struct meson_a1_clkc_data a1_periphs_clkc __maybe_unused = { > + .hw = &a1_periphs_hw_onecell_data, > + .regs = a1_periphs_regmaps, > + .num_regs = ARRAY_SIZE(a1_periphs_regmaps), > }; > > -static int meson_a1_periphs_probe(struct platform_device *pdev) > -{ > - struct device *dev = &pdev->dev; > - struct resource *res; > - void __iomem *base; > - struct regmap *map; > - int ret, i; > - > - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > - > - base = devm_ioremap_resource(dev, res); > - if (IS_ERR(base)) > - return PTR_ERR(base); > - > - map = devm_regmap_init_mmio(dev, base, &clkc_regmap_config); > - if (IS_ERR(map)) > - return PTR_ERR(map); > - > - /* Populate regmap for the regmap backed clocks */ > - for (i = 0; i < ARRAY_SIZE(a1_periphs_regmaps); i++) > - a1_periphs_regmaps[i]->map = map; > - > - for (i = 0; i < a1_periphs_hw_onecell_data.num; i++) { > - /* array might be sparse */ > - if (!a1_periphs_hw_onecell_data.hws[i]) > - continue; > - > - ret = devm_clk_hw_register(dev, > - a1_periphs_hw_onecell_data.hws[i]); > - if (ret) { > - dev_err(dev, "Clock registration failed\n"); > - return ret; > - } > - } > - > - return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, > - &a1_periphs_hw_onecell_data); > -} > - > -static const struct of_device_id clkc_match_table[] = { > - { .compatible = "amlogic,a1-periphs-clkc", }, > - {} > +#ifdef CONFIG_OF > +static const struct of_device_id a1_periphs_clkc_match_table[] = { > + { > + .compatible = "amlogic,a1-periphs-clkc", > + .data = &a1_periphs_clkc, > + }, > + {}, > }; > +MODULE_DEVICE_TABLE(of, a1_periphs_clkc_match_table); > +#endif /* CONFIG_OF */ > > -static struct platform_driver a1_periphs_driver = { > - .probe = meson_a1_periphs_probe, > - .driver = { > - .name = "a1-periphs-clkc", > - .of_match_table = clkc_match_table, > +static struct platform_driver a1_periphs_clkc_driver = { > + .probe = meson_a1_clkc_probe, > + .driver = { > + .name = "a1-periphs-clkc", > + .of_match_table = of_match_ptr(a1_periphs_clkc_match_table), > }, > }; > > -builtin_platform_driver(a1_periphs_driver); > +module_platform_driver(a1_periphs_clkc_driver); > +MODULE_AUTHOR("Jian Hu <jian.hu@xxxxxxxxxxx>"); > +MODULE_AUTHOR("Dmitry Rokosov <ddrokosov@xxxxxxxxxxxxxx>"); > +MODULE_LICENSE("GPL"); > diff --git a/drivers/clk/meson/a1.h b/drivers/clk/meson/a1.h > index 1ae5e04848d6..94b155e33568 100644 > --- a/drivers/clk/meson/a1.h > +++ b/drivers/clk/meson/a1.h > @@ -1,6 +1,12 @@ > /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ > /* > + * Amlogic Meson-A1 Peripheral Clock Controller internals > + * > * Copyright (c) 2019 Amlogic, Inc. All rights reserved. > + * Author: Jian Hu <jian.hu@xxxxxxxxxxx> > + * > + * Copyright (c) 2022, SberDevices. All Rights Reserved. > + * Author: Dmitry Rokosov <ddrokosov@xxxxxxxxxxxxxx> > */ > > #ifndef __A1_H > @@ -12,7 +18,6 @@ > #define RTC_BY_OSCIN_CTRL1 0x8 > #define RTC_CTRL 0xc > #define SYS_CLK_CTRL0 0x10 > -#define AXI_CLK_CTRL0 0x14 > #define SYS_CLK_EN0 0x1c > #define SYS_CLK_EN1 0x20 > #define AXI_CLK_EN 0x24 > @@ -22,13 +27,6 @@ > #define DSPB_CLK_CTRL0 0x34 > #define CLK12_24_CTRL 0x38 > #define GEN_CLK_CTRL 0x3c > -#define TIMESTAMP_CTRL0 0x40 > -#define TIMESTAMP_CTRL1 0x44 > -#define TIMESTAMP_CTRL2 0x48 > -#define TIMESTAMP_VAL0 0x4c > -#define TIMESTAMP_VAL1 0x50 > -#define TIMEBASE_CTRL0 0x54 > -#define TIMEBASE_CTRL1 0x58 > #define SAR_ADC_CLK_CTRL 0xc0 > #define PWM_CLK_AB_CTRL 0xc4 > #define PWM_CLK_CD_CTRL 0xc8 > @@ -44,8 +42,6 @@ > #define CECB_CLK_CTRL1 0xf0 > #define PSRAM_CLK_CTRL 0xf4 > #define DMC_CLK_CTRL 0xf8 > -#define FCLK_DIV1_SEL 0xfc > -#define TST_CTRL 0x100 > > #define CLKID_XTAL_CLKTREE 0 > #define CLKID_SYS_A_SEL 89