[PATCH linux dev-5.4] clk: ast2600: Fix AHB clock divider for A1
Andrew Jeffery
andrew at aj.id.au
Fri Apr 10 13:06:41 AEST 2020
On Fri, 10 Apr 2020, at 06:59, Eddie James wrote:
>
> 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?
Yeah, pretty much that. I had a bit of a crack but then figured I'd just ask
the question :)
Andrew
More information about the openbmc
mailing list