Commit f45c5b1c authored by Joel Stanley's avatar Joel Stanley Committed by Stephen Boyd

clk/ast2600: Fix soc revision for AHB

Move the soc revision parsing to the initial probe, saving the driver
from parsing the register multiple times.

Use this variable to select the correct divisor table for the AHB clock.
Before this fix the A2 would have used the A0 table.

Fixes: 2d491066 ("clk: ast2600: Fix AHB clock divider for A1")
Signed-off-by: default avatarJoel Stanley <joel@jms.id.au>
Link: https://lore.kernel.org/r/20210922235449.213631-1-joel@jms.id.auReviewed-by: default avatarAndrew Jeffery <andrew@aj.id.au>
Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent c54ce354
...@@ -51,6 +51,8 @@ static DEFINE_SPINLOCK(aspeed_g6_clk_lock); ...@@ -51,6 +51,8 @@ static DEFINE_SPINLOCK(aspeed_g6_clk_lock);
static struct clk_hw_onecell_data *aspeed_g6_clk_data; static struct clk_hw_onecell_data *aspeed_g6_clk_data;
static void __iomem *scu_g6_base; static void __iomem *scu_g6_base;
/* AST2600 revision: A0, A1, A2, etc */
static u8 soc_rev;
/* /*
* Clocks marked with CLK_IS_CRITICAL: * Clocks marked with CLK_IS_CRITICAL:
...@@ -191,9 +193,8 @@ static struct clk_hw *ast2600_calc_pll(const char *name, u32 val) ...@@ -191,9 +193,8 @@ static struct clk_hw *ast2600_calc_pll(const char *name, u32 val)
static struct clk_hw *ast2600_calc_apll(const char *name, u32 val) static struct clk_hw *ast2600_calc_apll(const char *name, u32 val)
{ {
unsigned int mult, div; unsigned int mult, div;
u32 chip_id = readl(scu_g6_base + ASPEED_G6_SILICON_REV);
if (((chip_id & CHIP_REVISION_ID) >> 16) >= 2) { if (soc_rev >= 2) {
if (val & BIT(24)) { if (val & BIT(24)) {
/* Pass through mode */ /* Pass through mode */
mult = div = 1; mult = div = 1;
...@@ -707,7 +708,7 @@ static const u32 ast2600_a1_axi_ahb200_tbl[] = { ...@@ -707,7 +708,7 @@ static const u32 ast2600_a1_axi_ahb200_tbl[] = {
static void __init aspeed_g6_cc(struct regmap *map) static void __init aspeed_g6_cc(struct regmap *map)
{ {
struct clk_hw *hw; struct clk_hw *hw;
u32 val, div, divbits, chip_id, axi_div, ahb_div; u32 val, div, divbits, axi_div, ahb_div;
clk_hw_register_fixed_rate(NULL, "clkin", NULL, 0, 25000000); clk_hw_register_fixed_rate(NULL, "clkin", NULL, 0, 25000000);
...@@ -738,8 +739,7 @@ static void __init aspeed_g6_cc(struct regmap *map) ...@@ -738,8 +739,7 @@ static void __init aspeed_g6_cc(struct regmap *map)
axi_div = 2; axi_div = 2;
divbits = (val >> 11) & 0x3; divbits = (val >> 11) & 0x3;
regmap_read(map, ASPEED_G6_SILICON_REV, &chip_id); if (soc_rev >= 1) {
if (chip_id & BIT(16)) {
if (!divbits) { if (!divbits) {
ahb_div = ast2600_a1_axi_ahb200_tbl[(val >> 8) & 0x3]; ahb_div = ast2600_a1_axi_ahb200_tbl[(val >> 8) & 0x3];
if (val & BIT(16)) if (val & BIT(16))
...@@ -784,6 +784,8 @@ static void __init aspeed_g6_cc_init(struct device_node *np) ...@@ -784,6 +784,8 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
if (!scu_g6_base) if (!scu_g6_base)
return; return;
soc_rev = (readl(scu_g6_base + ASPEED_G6_SILICON_REV) & CHIP_REVISION_ID) >> 16;
aspeed_g6_clk_data = kzalloc(struct_size(aspeed_g6_clk_data, hws, aspeed_g6_clk_data = kzalloc(struct_size(aspeed_g6_clk_data, hws,
ASPEED_G6_NUM_CLKS), GFP_KERNEL); ASPEED_G6_NUM_CLKS), GFP_KERNEL);
if (!aspeed_g6_clk_data) if (!aspeed_g6_clk_data)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment