[PATCH linux dev-5.4] clk: ast2600: Fix AHB clock divider for A1

Andrew Jeffery andrew at aj.id.au
Thu Apr 9 14:53:31 AEST 2020



On Thu, 9 Apr 2020, at 05:57, Eddie James wrote:
> The latest specs for the AST2600 A1 chip include some different bit
> definitions for calculating the AHB clock divider. Implement these in
> order to get the correct AHB clock value in Linux.
> 
> Signed-off-by: Eddie James <eajames at linux.ibm.com>
> ---
>  drivers/clk/clk-ast2600.c | 31 +++++++++++++++++++++++++------
>  1 file changed, 25 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
> index 42bfdc16bf7a..35f53956c762 100644
> --- a/drivers/clk/clk-ast2600.c
> +++ b/drivers/clk/clk-ast2600.c
> @@ -642,14 +642,22 @@ static const u32 ast2600_a0_axi_ahb_div_table[] = {
>  	2, 2, 3, 5,
>  };
>  
> -static const u32 ast2600_a1_axi_ahb_div_table[] = {
> -	4, 6, 2, 4,
> +static const u32 ast2600_a1_axi_ahb_div0_tbl[] = {
> +	3, 2, 3, 4,
> +};
> +
> +static const u32 ast2600_a1_axi_ahb_div1_tbl[] = {
> +	3, 4, 6, 8,
> +};
> +
> +static const u32 ast2600_a1_axi_ahb200_tbl[] = {
> +	3, 4, 3, 4, 2, 2, 2, 2,
>  };
>  
>  static void __init aspeed_g6_cc(struct regmap *map)
>  {
>  	struct clk_hw *hw;
> -	u32 val, div, chip_id, axi_div, ahb_div;
> +	u32 val, div, divbits, chip_id, axi_div, ahb_div;
>  
>  	clk_hw_register_fixed_rate(NULL, "clkin", NULL, 0, 25000000);
>  
> @@ -679,11 +687,22 @@ static void __init aspeed_g6_cc(struct regmap *map)
>  	else
>  		axi_div = 2;
>  
> +	divbits = (val >> 11) & 0x3;
>  	regmap_read(map, ASPEED_G6_SILICON_REV, &chip_id);
> -	if (chip_id & BIT(16))
> -		ahb_div = ast2600_a1_axi_ahb_div_table[(val >> 11) & 0x3];
> -	else
> +	if (chip_id & BIT(16)) {
> +		if (!divbits) {
> +			ahb_div = ast2600_a1_axi_ahb200_tbl[(val >> 8) & 0x3];
> +			if (val & BIT(16))
> +				ahb_div *= 2;
> +		} else {
> +			if (val & BIT(16))
> +				ahb_div = ast2600_a1_axi_ahb_div1_tbl[divbits];
> +			else
> +				ahb_div = ast2600_a1_axi_ahb_div0_tbl[divbits];
> +		}
> +	} else {
>  		ahb_div = ast2600_a0_axi_ahb_div_table[(val >> 11) & 0x3];
> +	}

This was hard for me to read. Have you considered giving the conditions
names?

Andrew


More information about the openbmc mailing list