[PATCH v8 09/11] clk: meson: redesign A1 Peripherals CLK controller

Jerome Brunet jbrunet at baylibre.com
Fri Dec 2 04:01:52 PST 2022


On Fri 02 Dec 2022 at 01:57, Dmitry Rokosov <ddrokosov at sberdevices.ru> 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 at sberdevices.ru>
> ---
>  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 at amlogic.com>
> + *
> + * Copyright (c) 2022, SberDevices. All Rights Reserved.
> + * Author: Dmitry Rokosov <ddrokosov at sberdevices.ru>
>   */
>  
>  #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 at amlogic.com>");
> +MODULE_AUTHOR("Dmitry Rokosov <ddrokosov at sberdevices.ru>");
> +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 at amlogic.com>
> + *
> + * Copyright (c) 2022, SberDevices. All Rights Reserved.
> + * Author: Dmitry Rokosov <ddrokosov at sberdevices.ru>
>   */
>  
>  #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




More information about the linux-amlogic mailing list