|
17 | 17 |
|
18 | 18 | #define ASPEED_G6_NUM_CLKS 71
|
19 | 19 |
|
20 |
| -#define ASPEED_G6_SILICON_REV 0x004 |
| 20 | +#define ASPEED_G6_SILICON_REV 0x014 |
| 21 | +#define CHIP_REVISION_ID GENMASK(23, 16) |
21 | 22 |
|
22 | 23 | #define ASPEED_G6_RESET_CTRL 0x040
|
23 | 24 | #define ASPEED_G6_RESET_CTRL2 0x050
|
@@ -190,18 +191,34 @@ static struct clk_hw *ast2600_calc_pll(const char *name, u32 val)
|
190 | 191 | static struct clk_hw *ast2600_calc_apll(const char *name, u32 val)
|
191 | 192 | {
|
192 | 193 | unsigned int mult, div;
|
| 194 | + u32 chip_id = readl(scu_g6_base + ASPEED_G6_SILICON_REV); |
193 | 195 |
|
194 |
| - if (val & BIT(20)) { |
195 |
| - /* Pass through mode */ |
196 |
| - mult = div = 1; |
| 196 | + if (((chip_id & CHIP_REVISION_ID) >> 16) >= 2) { |
| 197 | + if (val & BIT(24)) { |
| 198 | + /* Pass through mode */ |
| 199 | + mult = div = 1; |
| 200 | + } else { |
| 201 | + /* F = 25Mhz * [(m + 1) / (n + 1)] / (p + 1) */ |
| 202 | + u32 m = val & 0x1fff; |
| 203 | + u32 n = (val >> 13) & 0x3f; |
| 204 | + u32 p = (val >> 19) & 0xf; |
| 205 | + |
| 206 | + mult = (m + 1); |
| 207 | + div = (n + 1) * (p + 1); |
| 208 | + } |
197 | 209 | } else {
|
198 |
| - /* F = 25Mhz * (2-od) * [(m + 2) / (n + 1)] */ |
199 |
| - u32 m = (val >> 5) & 0x3f; |
200 |
| - u32 od = (val >> 4) & 0x1; |
201 |
| - u32 n = val & 0xf; |
| 210 | + if (val & BIT(20)) { |
| 211 | + /* Pass through mode */ |
| 212 | + mult = div = 1; |
| 213 | + } else { |
| 214 | + /* F = 25Mhz * (2-od) * [(m + 2) / (n + 1)] */ |
| 215 | + u32 m = (val >> 5) & 0x3f; |
| 216 | + u32 od = (val >> 4) & 0x1; |
| 217 | + u32 n = val & 0xf; |
202 | 218 |
|
203 |
| - mult = (2 - od) * (m + 2); |
204 |
| - div = n + 1; |
| 219 | + mult = (2 - od) * (m + 2); |
| 220 | + div = n + 1; |
| 221 | + } |
205 | 222 | }
|
206 | 223 | return clk_hw_register_fixed_factor(NULL, name, "clkin", 0,
|
207 | 224 | mult, div);
|
|
0 commit comments