@ -398,84 +398,6 @@ static int pll_para_config(u32 freq_hz, struct pll_div *div)
return 0 ;
}
# ifdef CONFIG_SPL_BUILD
static void rkclk_init ( struct rk3399_cru * cru )
{
u32 aclk_div ;
u32 hclk_div ;
u32 pclk_div ;
/*
* some cru registers changed by bootrom , we ' d better reset them to
* reset / default values described in TRM to avoid confusion in kernel .
* Please consider these three lines as a fix of bootrom bug .
*/
rk_clrsetreg ( & cru - > clksel_con [ 12 ] , 0xffff , 0x4101 ) ;
rk_clrsetreg ( & cru - > clksel_con [ 19 ] , 0xffff , 0x033f ) ;
rk_clrsetreg ( & cru - > clksel_con [ 56 ] , 0x0003 , 0x0003 ) ;
/* configure gpll cpll */
rkclk_set_pll ( & cru - > gpll_con [ 0 ] , & gpll_init_cfg ) ;
rkclk_set_pll ( & cru - > cpll_con [ 0 ] , & cpll_init_cfg ) ;
/* configure perihp aclk, hclk, pclk */
aclk_div = GPLL_HZ / PERIHP_ACLK_HZ - 1 ;
assert ( ( aclk_div + 1 ) * PERIHP_ACLK_HZ = = GPLL_HZ & & aclk_div < 0x1f ) ;
hclk_div = PERIHP_ACLK_HZ / PERIHP_HCLK_HZ - 1 ;
assert ( ( hclk_div + 1 ) * PERIHP_HCLK_HZ = =
PERIHP_ACLK_HZ & & ( hclk_div < 0x4 ) ) ;
pclk_div = PERIHP_ACLK_HZ / PERIHP_PCLK_HZ - 1 ;
assert ( ( pclk_div + 1 ) * PERIHP_PCLK_HZ = =
PERIHP_ACLK_HZ & & ( pclk_div < 0x7 ) ) ;
rk_clrsetreg ( & cru - > clksel_con [ 14 ] ,
PCLK_PERIHP_DIV_CON_MASK | HCLK_PERIHP_DIV_CON_MASK |
ACLK_PERIHP_PLL_SEL_MASK | ACLK_PERIHP_DIV_CON_MASK ,
pclk_div < < PCLK_PERIHP_DIV_CON_SHIFT |
hclk_div < < HCLK_PERIHP_DIV_CON_SHIFT |
ACLK_PERIHP_PLL_SEL_GPLL < < ACLK_PERIHP_PLL_SEL_SHIFT |
aclk_div < < ACLK_PERIHP_DIV_CON_SHIFT ) ;
/* configure perilp0 aclk, hclk, pclk */
aclk_div = GPLL_HZ / PERILP0_ACLK_HZ - 1 ;
assert ( ( aclk_div + 1 ) * PERILP0_ACLK_HZ = = GPLL_HZ & & aclk_div < 0x1f ) ;
hclk_div = PERILP0_ACLK_HZ / PERILP0_HCLK_HZ - 1 ;
assert ( ( hclk_div + 1 ) * PERILP0_HCLK_HZ = =
PERILP0_ACLK_HZ & & ( hclk_div < 0x4 ) ) ;
pclk_div = PERILP0_ACLK_HZ / PERILP0_PCLK_HZ - 1 ;
assert ( ( pclk_div + 1 ) * PERILP0_PCLK_HZ = =
PERILP0_ACLK_HZ & & ( pclk_div < 0x7 ) ) ;
rk_clrsetreg ( & cru - > clksel_con [ 23 ] ,
PCLK_PERILP0_DIV_CON_MASK | HCLK_PERILP0_DIV_CON_MASK |
ACLK_PERILP0_PLL_SEL_MASK | ACLK_PERILP0_DIV_CON_MASK ,
pclk_div < < PCLK_PERILP0_DIV_CON_SHIFT |
hclk_div < < HCLK_PERILP0_DIV_CON_SHIFT |
ACLK_PERILP0_PLL_SEL_GPLL < < ACLK_PERILP0_PLL_SEL_SHIFT |
aclk_div < < ACLK_PERILP0_DIV_CON_SHIFT ) ;
/* perilp1 hclk select gpll as source */
hclk_div = GPLL_HZ / PERILP1_HCLK_HZ - 1 ;
assert ( ( hclk_div + 1 ) * PERILP1_HCLK_HZ = =
GPLL_HZ & & ( hclk_div < 0x1f ) ) ;
pclk_div = PERILP1_HCLK_HZ / PERILP1_HCLK_HZ - 1 ;
assert ( ( pclk_div + 1 ) * PERILP1_HCLK_HZ = =
PERILP1_HCLK_HZ & & ( hclk_div < 0x7 ) ) ;
rk_clrsetreg ( & cru - > clksel_con [ 25 ] ,
PCLK_PERILP1_DIV_CON_MASK | HCLK_PERILP1_DIV_CON_MASK |
HCLK_PERILP1_PLL_SEL_MASK ,
pclk_div < < PCLK_PERILP1_DIV_CON_SHIFT |
hclk_div < < HCLK_PERILP1_DIV_CON_SHIFT |
HCLK_PERILP1_PLL_SEL_GPLL < < HCLK_PERILP1_PLL_SEL_SHIFT ) ;
}
# endif
void rk3399_configure_cpu ( struct rk3399_cru * cru ,
enum apll_l_frequencies apll_l_freq )
{
@ -1004,6 +926,85 @@ static struct clk_ops rk3399_clk_ops = {
. enable = rk3399_clk_enable ,
} ;
# ifdef CONFIG_SPL_BUILD
static void rkclk_init ( struct rk3399_cru * cru )
{
u32 aclk_div ;
u32 hclk_div ;
u32 pclk_div ;
rk3399_configure_cpu ( cru , APLL_L_600_MHZ ) ;
/*
* some cru registers changed by bootrom , we ' d better reset them to
* reset / default values described in TRM to avoid confusion in kernel .
* Please consider these three lines as a fix of bootrom bug .
*/
rk_clrsetreg ( & cru - > clksel_con [ 12 ] , 0xffff , 0x4101 ) ;
rk_clrsetreg ( & cru - > clksel_con [ 19 ] , 0xffff , 0x033f ) ;
rk_clrsetreg ( & cru - > clksel_con [ 56 ] , 0x0003 , 0x0003 ) ;
/* configure gpll cpll */
rkclk_set_pll ( & cru - > gpll_con [ 0 ] , & gpll_init_cfg ) ;
rkclk_set_pll ( & cru - > cpll_con [ 0 ] , & cpll_init_cfg ) ;
/* configure perihp aclk, hclk, pclk */
aclk_div = GPLL_HZ / PERIHP_ACLK_HZ - 1 ;
assert ( ( aclk_div + 1 ) * PERIHP_ACLK_HZ = = GPLL_HZ & & aclk_div < 0x1f ) ;
hclk_div = PERIHP_ACLK_HZ / PERIHP_HCLK_HZ - 1 ;
assert ( ( hclk_div + 1 ) * PERIHP_HCLK_HZ = =
PERIHP_ACLK_HZ & & ( hclk_div < 0x4 ) ) ;
pclk_div = PERIHP_ACLK_HZ / PERIHP_PCLK_HZ - 1 ;
assert ( ( pclk_div + 1 ) * PERIHP_PCLK_HZ = =
PERIHP_ACLK_HZ & & ( pclk_div < 0x7 ) ) ;
rk_clrsetreg ( & cru - > clksel_con [ 14 ] ,
PCLK_PERIHP_DIV_CON_MASK | HCLK_PERIHP_DIV_CON_MASK |
ACLK_PERIHP_PLL_SEL_MASK | ACLK_PERIHP_DIV_CON_MASK ,
pclk_div < < PCLK_PERIHP_DIV_CON_SHIFT |
hclk_div < < HCLK_PERIHP_DIV_CON_SHIFT |
ACLK_PERIHP_PLL_SEL_GPLL < < ACLK_PERIHP_PLL_SEL_SHIFT |
aclk_div < < ACLK_PERIHP_DIV_CON_SHIFT ) ;
/* configure perilp0 aclk, hclk, pclk */
aclk_div = GPLL_HZ / PERILP0_ACLK_HZ - 1 ;
assert ( ( aclk_div + 1 ) * PERILP0_ACLK_HZ = = GPLL_HZ & & aclk_div < 0x1f ) ;
hclk_div = PERILP0_ACLK_HZ / PERILP0_HCLK_HZ - 1 ;
assert ( ( hclk_div + 1 ) * PERILP0_HCLK_HZ = =
PERILP0_ACLK_HZ & & ( hclk_div < 0x4 ) ) ;
pclk_div = PERILP0_ACLK_HZ / PERILP0_PCLK_HZ - 1 ;
assert ( ( pclk_div + 1 ) * PERILP0_PCLK_HZ = =
PERILP0_ACLK_HZ & & ( pclk_div < 0x7 ) ) ;
rk_clrsetreg ( & cru - > clksel_con [ 23 ] ,
PCLK_PERILP0_DIV_CON_MASK | HCLK_PERILP0_DIV_CON_MASK |
ACLK_PERILP0_PLL_SEL_MASK | ACLK_PERILP0_DIV_CON_MASK ,
pclk_div < < PCLK_PERILP0_DIV_CON_SHIFT |
hclk_div < < HCLK_PERILP0_DIV_CON_SHIFT |
ACLK_PERILP0_PLL_SEL_GPLL < < ACLK_PERILP0_PLL_SEL_SHIFT |
aclk_div < < ACLK_PERILP0_DIV_CON_SHIFT ) ;
/* perilp1 hclk select gpll as source */
hclk_div = GPLL_HZ / PERILP1_HCLK_HZ - 1 ;
assert ( ( hclk_div + 1 ) * PERILP1_HCLK_HZ = =
GPLL_HZ & & ( hclk_div < 0x1f ) ) ;
pclk_div = PERILP1_HCLK_HZ / PERILP1_HCLK_HZ - 1 ;
assert ( ( pclk_div + 1 ) * PERILP1_HCLK_HZ = =
PERILP1_HCLK_HZ & & ( hclk_div < 0x7 ) ) ;
rk_clrsetreg ( & cru - > clksel_con [ 25 ] ,
PCLK_PERILP1_DIV_CON_MASK | HCLK_PERILP1_DIV_CON_MASK |
HCLK_PERILP1_PLL_SEL_MASK ,
pclk_div < < PCLK_PERILP1_DIV_CON_SHIFT |
hclk_div < < HCLK_PERILP1_DIV_CON_SHIFT |
HCLK_PERILP1_PLL_SEL_GPLL < < HCLK_PERILP1_PLL_SEL_SHIFT ) ;
}
# endif
static int rk3399_clk_probe ( struct udevice * dev )
{
# ifdef CONFIG_SPL_BUILD