|
|
|
@ -83,8 +83,13 @@ enum { |
|
|
|
|
* peripheral bus pclk div: |
|
|
|
|
* aclk_bus: pclk_bus = 1:1 or 2:1 or 4:1 or 8:1 |
|
|
|
|
*/ |
|
|
|
|
PERI_SEL_PLL_MASK = 1, |
|
|
|
|
PERI_SEL_PLL_SHIFT = 15, |
|
|
|
|
PERI_SEL_CPLL = 0, |
|
|
|
|
PERI_SEL_GPLL, |
|
|
|
|
|
|
|
|
|
PERI_PCLK_DIV_SHIFT = 12, |
|
|
|
|
PERI_PCLK_DIV_MASK = 7, |
|
|
|
|
PERI_PCLK_DIV_MASK = 3, |
|
|
|
|
|
|
|
|
|
/* peripheral bus hclk div: aclk_bus: hclk_bus = 1:1 or 2:1 or 4:1 */ |
|
|
|
|
PERI_HCLK_DIV_SHIFT = 8, |
|
|
|
@ -160,13 +165,13 @@ static int rkclk_set_pll(struct rk3288_cru *cru, enum rk_clk_id clk_id, |
|
|
|
|
uint vco_hz = OSC_HZ / 1000 * div->nf / div->nr * 1000; |
|
|
|
|
uint output_hz = vco_hz / div->no; |
|
|
|
|
|
|
|
|
|
debug("PLL at %p: nf=%d, nr=%d, no=%d, vco=%u Hz, output=%u Hz\n", |
|
|
|
|
pll, div->nf, div->nr, div->no, vco_hz, output_hz); |
|
|
|
|
debug("PLL at %x: nf=%d, nr=%d, no=%d, vco=%u Hz, output=%u Hz\n", |
|
|
|
|
(uint)pll, div->nf, div->nr, div->no, vco_hz, output_hz); |
|
|
|
|
assert(vco_hz >= VCO_MIN_HZ && vco_hz <= VCO_MAX_HZ && |
|
|
|
|
output_hz >= OUTPUT_MIN_HZ && output_hz <= OUTPUT_MAX_HZ && |
|
|
|
|
(div->no == 1 || !(div->no % 2))); |
|
|
|
|
|
|
|
|
|
/* enter rest */ |
|
|
|
|
/* enter reset */ |
|
|
|
|
rk_setreg(&pll->con3, 1 << PLL_RESET_SHIFT); |
|
|
|
|
|
|
|
|
|
rk_clrsetreg(&pll->con0, |
|
|
|
@ -177,7 +182,7 @@ static int rkclk_set_pll(struct rk3288_cru *cru, enum rk_clk_id clk_id, |
|
|
|
|
|
|
|
|
|
udelay(10); |
|
|
|
|
|
|
|
|
|
/* return form rest */ |
|
|
|
|
/* return from reset */ |
|
|
|
|
rk_clrreg(&pll->con3, 1 << PLL_RESET_SHIFT); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
@ -199,7 +204,6 @@ static int rkclk_configure_ddr(struct rk3288_cru *cru, struct rk3288_grf *grf, |
|
|
|
|
}; |
|
|
|
|
int cfg; |
|
|
|
|
|
|
|
|
|
debug("%s: cru=%p, grf=%p, hz=%u\n", __func__, cru, grf, hz); |
|
|
|
|
switch (hz) { |
|
|
|
|
case 300000000: |
|
|
|
|
cfg = 0; |
|
|
|
@ -214,7 +218,7 @@ static int rkclk_configure_ddr(struct rk3288_cru *cru, struct rk3288_grf *grf, |
|
|
|
|
cfg = 3; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
debug("Unsupported SDRAM frequency, add to clock.c!"); |
|
|
|
|
debug("Unsupported SDRAM frequency"); |
|
|
|
|
return -EINVAL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -420,6 +424,7 @@ static void rkclk_init(struct rk3288_cru *cru, struct rk3288_grf *grf) |
|
|
|
|
PERI_PCLK_DIV_MASK << PERI_PCLK_DIV_SHIFT | |
|
|
|
|
PERI_HCLK_DIV_MASK << PERI_HCLK_DIV_SHIFT | |
|
|
|
|
PERI_ACLK_DIV_MASK << PERI_ACLK_DIV_SHIFT, |
|
|
|
|
PERI_SEL_GPLL << PERI_SEL_PLL_SHIFT | |
|
|
|
|
pclk_div << PERI_PCLK_DIV_SHIFT | |
|
|
|
|
hclk_div << PERI_HCLK_DIV_SHIFT | |
|
|
|
|
aclk_div << PERI_ACLK_DIV_SHIFT); |
|
|
|
@ -787,7 +792,7 @@ static const char *const clk_name[CLK_COUNT] = { |
|
|
|
|
"dpll", |
|
|
|
|
"cpll", |
|
|
|
|
"gpll", |
|
|
|
|
"mpll", |
|
|
|
|
"npll", |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static int rk3288_clk_bind(struct udevice *dev) |
|
|
|
|