[PATCH linux dev-5.4] clk: ast2600: Fix AHB clock divider for A1
Eddie James
eajames at linux.ibm.com
Fri Apr 10 07:29:50 AEST 2020
On 4/8/20 11:53 PM, Andrew Jeffery wrote:
>
> 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?
Yea it's a bit complicated. Do you mean use some boolean variables or
add some comments?
Thanks,
Eddie
>
> Andrew
More information about the openbmc
mailing list