@ -50,12 +50,7 @@ u32 get_osc_clk_speed(void)
if ( val & SYSCLKDIV_2 )
cdiv = 2 ;
else if ( val & SYSCLKDIV_1 )
cdiv = 1 ;
else
/*
* Should never reach here ! ( Assume divider as 1 )
*/
cdiv = 1 ;
/* enable timer2 */
@ -89,11 +84,7 @@ u32 get_osc_clk_speed(void)
while ( readl ( & s32k_base - > s32k_cr ) < ( start + 20 ) ) ;
cend = readl ( & gpt1_base - > tcrr ) ; /* get end sys_clk count */
cdiff = cend - cstart ; /* get elapsed ticks */
if ( cdiv = = 2 )
{
cdiff * = 2 ;
}
cdiff * = cdiv ;
/* based on number of ticks assign speed */
if ( cdiff > 19000 )
@ -135,65 +126,22 @@ void get_sys_clkin_sel(u32 osc_clk, u32 *sys_clkin_sel)
}
}
/******************************************************************************
* prcm_init ( ) - inits clocks for PRCM as defined in clocks . h
* called from SRAM , or Flash ( using temp SRAM stack ) .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void prcm_init ( void )
/*
* OMAP34XX / 35 XX specific functions
*/
static void dpll3_init_34xx ( u32 sil_index , u32 clk_index )
{
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
dpll_param * ptr = ( dpll_param * ) get_core_dpll_param ( ) ;
void ( * f_lock_pll ) ( u32 , u32 , u32 , u32 ) ;
int xip_safe , p0 , p1 , p2 , p3 ;
u32 osc_clk = 0 , sys_clkin_sel ;
u32 clk_index , sil_index = 0 ;
struct prm * prm_base = ( struct prm * ) PRM_BASE ;
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
dpll_param * dpll_param_p ;
f_lock_pll = ( void * ) ( ( u32 ) & _end_vect - ( u32 ) & _start +
SRAM_VECT_CODE ) ;
xip_safe = is_running_in_sram ( ) ;
/*
* Gauge the input clock speed and find out the sys_clkin_sel
* value corresponding to the input clock .
*/
osc_clk = get_osc_clk_speed ( ) ;
get_sys_clkin_sel ( osc_clk , & sys_clkin_sel ) ;
/* set input crystal speed */
sr32 ( & prm_base - > clksel , 0 , 3 , sys_clkin_sel ) ;
/* Moving to the right sysclk and ES rev base */
ptr = ptr + ( 3 * clk_index ) + sil_index ;
/* If the input clock is greater than 19.2M always divide/2 */
if ( sys_clkin_sel > 2 ) {
/* input clock divider */
sr32 ( & prm_base - > clksrc_ctrl , 6 , 2 , 2 ) ;
clk_index = sys_clkin_sel / 2 ;
} else {
/* input clock divider */
sr32 ( & prm_base - > clksrc_ctrl , 6 , 2 , 1 ) ;
clk_index = sys_clkin_sel ;
}
/*
* The DPLL tables are defined according to sysclk value and
* silicon revision . The clk_index value will be used to get
* the values for that input sysclk from the DPLL param table
* and sil_index will get the values for that SysClk for the
* appropriate silicon rev .
*/
if ( get_cpu_rev ( ) )
sil_index = 1 ;
/* Unlock MPU DPLL (slows things down, and needed later) */
sr32 ( & prcm_base - > clken_pll_mpu , 0 , 3 , PLL_LOW_POWER_BYPASS ) ;
wait_on_value ( ST_MPU_CLK , 0 , & prcm_base - > idlest_pll_mpu , LDELAY ) ;
/* Getting the base address of Core DPLL param table */
dpll_param_p = ( dpll_param * ) get_core_dpll_param ( ) ;
/* Moving it to the right sysclk and ES rev base */
dpll_param_p = dpll_param_p + 3 * clk_index + sil_index ;
if ( xip_safe ) {
/*
* CORE DPLL
@ -208,34 +156,38 @@ void prcm_init(void)
* work . write another value and then default value .
*/
/* m3x2 */
sr32 ( & prcm_base - > clksel1_emu , 16 , 5 , CORE_M3X2 + 1 ) ;
/* m3x2 */
/* CM_CLKSEL1_EMU[DIV_DPLL3] */
sr32 ( & prcm_base - > clksel1_emu , 16 , 5 , ( CORE_M3X2 + 1 ) ) ;
sr32 ( & prcm_base - > clksel1_emu , 16 , 5 , CORE_M3X2 ) ;
/* Set M2 */
sr32 ( & prcm_base - > clksel1_pll , 27 , 2 , dpll_param_p - > m2 ) ;
/* Set M */
sr32 ( & prcm_base - > clksel1_pll , 16 , 11 , dpll_param_p - > m ) ;
/* Set N */
sr32 ( & prcm_base - > clksel1_pll , 8 , 7 , dpll_param_p - > n ) ;
/* 96M Src */
/* M2 (CORE_DPLL_CLKOUT_DIV): CM_CLKSEL1_PLL[27:31] */
sr32 ( & prcm_base - > clksel1_pll , 27 , 5 , ptr - > m2 ) ;
/* M (CORE_DPLL_MULT): CM_CLKSEL1_PLL[16:26] */
sr32 ( & prcm_base - > clksel1_pll , 16 , 11 , ptr - > m ) ;
/* N (CORE_DPLL_DIV): CM_CLKSEL1_PLL[8:14] */
sr32 ( & prcm_base - > clksel1_pll , 8 , 7 , ptr - > n ) ;
/* Source is the CM_96M_FCLK: CM_CLKSEL1_PLL[6] */
sr32 ( & prcm_base - > clksel1_pll , 6 , 1 , 0 ) ;
/* ssi */
/* SSI */
sr32 ( & prcm_base - > clksel_core , 8 , 4 , CORE_SSI_DIV ) ;
/* fsusb */
/* FSUSB */
sr32 ( & prcm_base - > clksel_core , 4 , 2 , CORE_FUSB_DIV ) ;
/* l 4 */
/* L 4 */
sr32 ( & prcm_base - > clksel_core , 2 , 2 , CORE_L4_DIV ) ;
/* l 3 */
/* L 3 */
sr32 ( & prcm_base - > clksel_core , 0 , 2 , CORE_L3_DIV ) ;
/* gfx */
sr32 ( & prcm_base - > clksel_gfx , 0 , 3 , GFX_DIV ) ;
/* reset mgr */
/* GFX */
sr32 ( & prcm_base - > clksel_gfx , 0 , 3 , GFX_DIV ) ;
/* RESET MGR */
sr32 ( & prcm_base - > clksel_wkup , 1 , 2 , WKUP_RSM ) ;
/* FREQSEL */
sr32 ( & prcm_base - > clken_pll , 4 , 4 , dpll_param_p - > fsel ) ;
/* lock mode */
sr32 ( & prcm_base - > clken_pll , 0 , 3 , PLL_LOCK ) ;
/* FREQSEL (CORE_DPLL_FREQSEL): CM_CLKEN_PLL[4:7] */
sr32 ( & prcm_base - > clken_pll , 4 , 4 , ptr - > fsel ) ;
/* LOCK MODE */
sr32 ( & prcm_base - > clken_pll , 0 , 3 , PLL_LOCK ) ;
wait_on_value ( ST_CORE_CLK , 1 , & prcm_base - > idlest_ckgen ,
LDELAY ) ;
@ -244,102 +196,405 @@ void prcm_init(void)
* if running from flash , jump to small relocated code
* area in SRAM .
*/
f_lock_pll = ( void * ) ( ( u32 ) & _end_vect - ( u32 ) & _start +
SRAM_VECT_CODE ) ;
p0 = readl ( & prcm_base - > clken_pll ) ;
sr32 ( & p0 , 0 , 3 , PLL_FAST_RELOCK_BYPASS ) ;
sr32 ( & p0 , 4 , 4 , dpll_param_p - > fsel ) ; /* FREQSEL */
/* FREQSEL (CORE_DPLL_FREQSEL): CM_CLKEN_PLL[4:7] */
sr32 ( & p0 , 4 , 4 , ptr - > fsel ) ;
p1 = readl ( & prcm_base - > clksel1_pll ) ;
sr32 ( & p1 , 27 , 2 , dpll_param_p - > m2 ) ; /* Set M2 */
sr32 ( & p1 , 16 , 11 , dpll_param_p - > m ) ; /* Set M */
sr32 ( & p1 , 8 , 7 , dpll_param_p - > n ) ; /* Set N */
sr32 ( & p1 , 6 , 1 , 0 ) ; /* set source for 96M */
/* M2 (CORE_DPLL_CLKOUT_DIV): CM_CLKSEL1_PLL[27:31] */
sr32 ( & p1 , 27 , 5 , ptr - > m2 ) ;
/* M (CORE_DPLL_MULT): CM_CLKSEL1_PLL[16:26] */
sr32 ( & p1 , 16 , 11 , ptr - > m ) ;
/* N (CORE_DPLL_DIV): CM_CLKSEL1_PLL[8:14] */
sr32 ( & p1 , 8 , 7 , ptr - > n ) ;
/* Source is the CM_96M_FCLK: CM_CLKSEL1_PLL[6] */
sr32 ( & p1 , 6 , 1 , 0 ) ;
p2 = readl ( & prcm_base - > clksel_core ) ;
sr32 ( & p2 , 8 , 4 , CORE_SSI_DIV ) ; /* ssi */
sr32 ( & p2 , 4 , 2 , CORE_FUSB_DIV ) ; /* fsusb */
sr32 ( & p2 , 2 , 2 , CORE_L4_DIV ) ; /* l4 */
sr32 ( & p2 , 0 , 2 , CORE_L3_DIV ) ; /* l3 */
/* SSI */
sr32 ( & p2 , 8 , 4 , CORE_SSI_DIV ) ;
/* FSUSB */
sr32 ( & p2 , 4 , 2 , CORE_FUSB_DIV ) ;
/* L4 */
sr32 ( & p2 , 2 , 2 , CORE_L4_DIV ) ;
/* L3 */
sr32 ( & p2 , 0 , 2 , CORE_L3_DIV ) ;
p3 = ( u32 ) & prcm_base - > idlest_ckgen ;
( * f_lock_pll ) ( p0 , p1 , p2 , p3 ) ;
}
}
/* PER DPLL */
sr32 ( & prcm_base - > clken_pll , 16 , 3 , PLL_STOP ) ;
wait_on_value ( ST_PERIPH_CLK , 0 , & prcm_base - > idlest_ckgen , LDELAY ) ;
/* Getting the base address to PER DPLL param table */
/* Set N */
dpll_param_p = ( dpll_param * ) get_per_dpll_param ( ) ;
static void dpll4_init_34xx ( u32 sil_index , u32 clk_index )
{
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
dpll_param * ptr = ( dpll_param * ) get_per_dpll_param ( ) ;
/* Moving it to the right sysclk base */
dpll_param_p = dpll_param_p + clk_index ;
ptr = ptr + clk_index ;
/* EN_PERIPH_DPLL: CM_CLKEN_PLL[16:18] */
sr32 ( & prcm_base - > clken_pll , 16 , 3 , PLL_STOP ) ;
wait_on_value ( ST_PERIPH_CLK , 0 , & prcm_base - > idlest_ckgen , LDELAY ) ;
/*
* Errata 1.50 Workaround for OMAP3 ES1 .0 only
* If using default divisors , write default divisor + 1
* and then the actual divisor value
*/
sr32 ( & prcm_base - > clksel1_emu , 24 , 5 , PER_M6X2 + 1 ) ; /* set M6 */
sr32 ( & prcm_base - > clksel1_emu , 24 , 5 , PER_M6X2 ) ; /* set M6 */
sr32 ( & prcm_base - > clksel_cam , 0 , 5 , PER_M5X2 + 1 ) ; /* set M5 */
sr32 ( & prcm_base - > clksel_cam , 0 , 5 , PER_M5X2 ) ; /* set M5 */
sr32 ( & prcm_base - > clksel_dss , 0 , 5 , PER_M4X2 + 1 ) ; /* set M4 */
sr32 ( & prcm_base - > clksel_dss , 0 , 5 , PER_M4X2 ) ; /* set M4 */
sr32 ( & prcm_base - > clksel_dss , 8 , 5 , PER_M3X2 + 1 ) ; /* set M3 */
sr32 ( & prcm_base - > clksel_dss , 8 , 5 , PER_M3X2 ) ; /* set M3 */
sr32 ( & prcm_base - > clksel3_pll , 0 , 5 , dpll_param_p - > m2 + 1 ) ; /* set M2 */
sr32 ( & prcm_base - > clksel3_pll , 0 , 5 , dpll_param_p - > m2 ) ; /* set M2 */
/* M6 */
sr32 ( & prcm_base - > clksel1_emu , 24 , 5 , ( PER_M6X2 + 1 ) ) ;
sr32 ( & prcm_base - > clksel1_emu , 24 , 5 , PER_M6X2 ) ;
/* M5 */
sr32 ( & prcm_base - > clksel_cam , 0 , 5 , ( PER_M5X2 + 1 ) ) ;
sr32 ( & prcm_base - > clksel_cam , 0 , 5 , PER_M5X2 ) ;
/* M4 */
sr32 ( & prcm_base - > clksel_dss , 0 , 5 , ( PER_M4X2 + 1 ) ) ;
sr32 ( & prcm_base - > clksel_dss , 0 , 5 , PER_M4X2 ) ;
/* M3 */
sr32 ( & prcm_base - > clksel_dss , 8 , 5 , ( PER_M3X2 + 1 ) ) ;
sr32 ( & prcm_base - > clksel_dss , 8 , 5 , PER_M3X2 ) ;
/* M2 (DIV_96M): CM_CLKSEL3_PLL[0:4] */
sr32 ( & prcm_base - > clksel3_pll , 0 , 5 , ( ptr - > m2 + 1 ) ) ;
sr32 ( & prcm_base - > clksel3_pll , 0 , 5 , ptr - > m2 ) ;
/* Workaround end */
sr32 ( & prcm_base - > clksel2_pll , 8 , 11 , dpll_param_p - > m ) ; /* set m */
sr32 ( & prcm_base - > clksel2_pll , 0 , 7 , dpll_param_p - > n ) ; /* set n */
sr32 ( & prcm_base - > clken_pll , 20 , 4 , dpll_param_p - > fsel ) ; /* FREQSEL */
sr32 ( & prcm_base - > clken_pll , 16 , 3 , PLL_LOCK ) ; /* lock mode */
/* M (PERIPH_DPLL_MULT): CM_CLKSEL2_PLL[8:18] */
sr32 ( & prcm_base - > clksel2_pll , 8 , 11 , ptr - > m ) ;
/* N (PERIPH_DPLL_DIV): CM_CLKSEL2_PLL[0:6] */
sr32 ( & prcm_base - > clksel2_pll , 0 , 7 , ptr - > n ) ;
/* FREQSEL (PERIPH_DPLL_FREQSEL): CM_CLKEN_PLL[20:23] */
sr32 ( & prcm_base - > clken_pll , 20 , 4 , ptr - > fsel ) ;
/* LOCK MODE (EN_PERIPH_DPLL): CM_CLKEN_PLL[16:18] */
sr32 ( & prcm_base - > clken_pll , 16 , 3 , PLL_LOCK ) ;
wait_on_value ( ST_PERIPH_CLK , 2 , & prcm_base - > idlest_ckgen , LDELAY ) ;
}
/* Getting the base address to MPU DPLL param table */
dpll_param_p = ( dpll_param * ) get_mpu_dpll_param ( ) ;
static void mpu_init_34xx ( u32 sil_index , u32 clk_index )
{
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
dpll_param * ptr = ( dpll_param * ) get_mpu_dpll_param ( ) ;
/* Moving it to the right sysclk and ES rev base */
dpll_param_p = dpll_param_p + 3 * clk_index + sil_index ;
/* Moving to the right sysclk and ES rev base */
ptr = ptr + ( 3 * clk_index ) + sil_index ;
/* MPU DPLL (unlocked already) */
/* Set M2 */
sr32 ( & prcm_base - > clksel2_pll_mpu , 0 , 5 , dpll_param_p - > m2 ) ;
/* Set M */
sr32 ( & prcm_base - > clksel1_pll_mpu , 8 , 11 , dpll_param_p - > m ) ;
/* Set N */
sr32 ( & prcm_base - > clksel1_pll_mpu , 0 , 7 , dpll_param_p - > n ) ;
/* FREQSEL */
sr32 ( & prcm_base - > clken_pll_mpu , 4 , 4 , dpll_param_p - > fsel ) ;
/* lock mode */
sr32 ( & prcm_base - > clken_pll_mpu , 0 , 3 , PLL_LOCK ) ;
wait_on_value ( ST_MPU_CLK , 1 , & prcm_base - > idlest_pll_mpu , LDELAY ) ;
/* Getting the base address to IVA DPLL param table */
dpll_param_p = ( dpll_param * ) get_iva_dpll_param ( ) ;
/* Moving it to the right sysclk and ES rev base */
dpll_param_p = dpll_param_p + 3 * clk_index + sil_index ;
/* IVA DPLL (set to 12*20=240MHz) */
/* M2 (MPU_DPLL_CLKOUT_DIV) : CM_CLKSEL2_PLL_MPU[0:4] */
sr32 ( & prcm_base - > clksel2_pll_mpu , 0 , 5 , ptr - > m2 ) ;
/* M (MPU_DPLL_MULT) : CM_CLKSEL2_PLL_MPU[8:18] */
sr32 ( & prcm_base - > clksel1_pll_mpu , 8 , 11 , ptr - > m ) ;
/* N (MPU_DPLL_DIV) : CM_CLKSEL2_PLL_MPU[0:6] */
sr32 ( & prcm_base - > clksel1_pll_mpu , 0 , 7 , ptr - > n ) ;
/* FREQSEL (MPU_DPLL_FREQSEL) : CM_CLKEN_PLL_MPU[4:7] */
sr32 ( & prcm_base - > clken_pll_mpu , 4 , 4 , ptr - > fsel ) ;
}
static void iva_init_34xx ( u32 sil_index , u32 clk_index )
{
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
dpll_param * ptr = ( dpll_param * ) get_iva_dpll_param ( ) ;
/* Moving to the right sysclk and ES rev base */
ptr = ptr + ( 3 * clk_index ) + sil_index ;
/* IVA DPLL */
/* EN_IVA2_DPLL : CM_CLKEN_PLL_IVA2[0:2] */
sr32 ( & prcm_base - > clken_pll_iva2 , 0 , 3 , PLL_STOP ) ;
wait_on_value ( ST_IVA2_CLK , 0 , & prcm_base - > idlest_pll_iva2 , LDELAY ) ;
/* M2 (IVA2_DPLL_CLKOUT_DIV) : CM_CLKSEL2_PLL_IVA2[0:4] */
sr32 ( & prcm_base - > clksel2_pll_iva2 , 0 , 5 , ptr - > m2 ) ;
/* M (IVA2_DPLL_MULT) : CM_CLKSEL1_PLL_IVA2[8:18] */
sr32 ( & prcm_base - > clksel1_pll_iva2 , 8 , 11 , ptr - > m ) ;
/* N (IVA2_DPLL_DIV) : CM_CLKSEL1_PLL_IVA2[0:6] */
sr32 ( & prcm_base - > clksel1_pll_iva2 , 0 , 7 , ptr - > n ) ;
/* FREQSEL (IVA2_DPLL_FREQSEL) : CM_CLKEN_PLL_IVA2[4:7] */
sr32 ( & prcm_base - > clken_pll_iva2 , 4 , 4 , ptr - > fsel ) ;
/* LOCK MODE (EN_IVA2_DPLL) : CM_CLKEN_PLL_IVA2[0:2] */
sr32 ( & prcm_base - > clken_pll_iva2 , 0 , 3 , PLL_LOCK ) ;
wait_on_value ( ST_IVA2_CLK , 1 , & prcm_base - > idlest_pll_iva2 , LDELAY ) ;
}
/*
* OMAP3630 specific functions
*/
static void dpll3_init_36xx ( u32 sil_index , u32 clk_index )
{
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
dpll_param * ptr = ( dpll_param * ) get_36x_core_dpll_param ( ) ;
void ( * f_lock_pll ) ( u32 , u32 , u32 , u32 ) ;
int xip_safe , p0 , p1 , p2 , p3 ;
xip_safe = is_running_in_sram ( ) ;
/* Moving it to the right sysclk base */
ptr + = clk_index ;
if ( xip_safe ) {
/* CORE DPLL */
/* Select relock bypass: CM_CLKEN_PLL[0:2] */
sr32 ( & prcm_base - > clken_pll , 0 , 3 , PLL_FAST_RELOCK_BYPASS ) ;
wait_on_value ( ST_CORE_CLK , 0 , & prcm_base - > idlest_ckgen ,
LDELAY ) ;
/* CM_CLKSEL1_EMU[DIV_DPLL3] */
sr32 ( & prcm_base - > clksel1_emu , 16 , 5 , CORE_M3X2 ) ;
/* M2 (CORE_DPLL_CLKOUT_DIV): CM_CLKSEL1_PLL[27:31] */
sr32 ( & prcm_base - > clksel1_pll , 27 , 5 , ptr - > m2 ) ;
/* M (CORE_DPLL_MULT): CM_CLKSEL1_PLL[16:26] */
sr32 ( & prcm_base - > clksel1_pll , 16 , 11 , ptr - > m ) ;
/* N (CORE_DPLL_DIV): CM_CLKSEL1_PLL[8:14] */
sr32 ( & prcm_base - > clksel1_pll , 8 , 7 , ptr - > n ) ;
/* Source is the CM_96M_FCLK: CM_CLKSEL1_PLL[6] */
sr32 ( & prcm_base - > clksel1_pll , 6 , 1 , 0 ) ;
/* SSI */
sr32 ( & prcm_base - > clksel_core , 8 , 4 , CORE_SSI_DIV ) ;
/* FSUSB */
sr32 ( & prcm_base - > clksel_core , 4 , 2 , CORE_FUSB_DIV ) ;
/* L4 */
sr32 ( & prcm_base - > clksel_core , 2 , 2 , CORE_L4_DIV ) ;
/* L3 */
sr32 ( & prcm_base - > clksel_core , 0 , 2 , CORE_L3_DIV ) ;
/* GFX */
sr32 ( & prcm_base - > clksel_gfx , 0 , 3 , GFX_DIV ) ;
/* RESET MGR */
sr32 ( & prcm_base - > clksel_wkup , 1 , 2 , WKUP_RSM ) ;
/* FREQSEL (CORE_DPLL_FREQSEL): CM_CLKEN_PLL[4:7] */
sr32 ( & prcm_base - > clken_pll , 4 , 4 , ptr - > fsel ) ;
/* LOCK MODE */
sr32 ( & prcm_base - > clken_pll , 0 , 3 , PLL_LOCK ) ;
wait_on_value ( ST_CORE_CLK , 1 , & prcm_base - > idlest_ckgen ,
LDELAY ) ;
} else if ( is_running_in_flash ( ) ) {
/*
* if running from flash , jump to small relocated code
* area in SRAM .
*/
f_lock_pll = ( void * ) ( ( u32 ) & _end_vect - ( u32 ) & _start +
SRAM_VECT_CODE ) ;
p0 = readl ( & prcm_base - > clken_pll ) ;
sr32 ( & p0 , 0 , 3 , PLL_FAST_RELOCK_BYPASS ) ;
/* FREQSEL (CORE_DPLL_FREQSEL): CM_CLKEN_PLL[4:7] */
sr32 ( & p0 , 4 , 4 , ptr - > fsel ) ;
p1 = readl ( & prcm_base - > clksel1_pll ) ;
/* M2 (CORE_DPLL_CLKOUT_DIV): CM_CLKSEL1_PLL[27:31] */
sr32 ( & p1 , 27 , 5 , ptr - > m2 ) ;
/* M (CORE_DPLL_MULT): CM_CLKSEL1_PLL[16:26] */
sr32 ( & p1 , 16 , 11 , ptr - > m ) ;
/* N (CORE_DPLL_DIV): CM_CLKSEL1_PLL[8:14] */
sr32 ( & p1 , 8 , 7 , ptr - > n ) ;
/* Source is the CM_96M_FCLK: CM_CLKSEL1_PLL[6] */
sr32 ( & p1 , 6 , 1 , 0 ) ;
p2 = readl ( & prcm_base - > clksel_core ) ;
/* SSI */
sr32 ( & p2 , 8 , 4 , CORE_SSI_DIV ) ;
/* FSUSB */
sr32 ( & p2 , 4 , 2 , CORE_FUSB_DIV ) ;
/* L4 */
sr32 ( & p2 , 2 , 2 , CORE_L4_DIV ) ;
/* L3 */
sr32 ( & p2 , 0 , 2 , CORE_L3_DIV ) ;
p3 = ( u32 ) & prcm_base - > idlest_ckgen ;
( * f_lock_pll ) ( p0 , p1 , p2 , p3 ) ;
}
}
static void dpll4_init_36xx ( u32 sil_index , u32 clk_index )
{
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
struct dpll_per_36x_param * ptr ;
ptr = ( struct dpll_per_36x_param * ) get_36x_per_dpll_param ( ) ;
/* Moving it to the right sysclk base */
ptr + = clk_index ;
/* EN_PERIPH_DPLL: CM_CLKEN_PLL[16:18] */
sr32 ( & prcm_base - > clken_pll , 16 , 3 , PLL_STOP ) ;
wait_on_value ( ST_PERIPH_CLK , 0 , & prcm_base - > idlest_ckgen , LDELAY ) ;
/* M6 (DIV_DPLL4): CM_CLKSEL1_EMU[24:29] */
sr32 ( & prcm_base - > clksel1_emu , 24 , 6 , ptr - > m6 ) ;
/* M5 (CLKSEL_CAM): CM_CLKSEL1_EMU[0:5] */
sr32 ( & prcm_base - > clksel_cam , 0 , 6 , ptr - > m5 ) ;
/* M4 (CLKSEL_DSS1): CM_CLKSEL_DSS[0:5] */
sr32 ( & prcm_base - > clksel_dss , 0 , 6 , ptr - > m4 ) ;
/* M3 (CLKSEL_DSS1): CM_CLKSEL_DSS[8:13] */
sr32 ( & prcm_base - > clksel_dss , 8 , 6 , ptr - > m3 ) ;
/* M2 (DIV_96M): CM_CLKSEL3_PLL[0:4] */
sr32 ( & prcm_base - > clksel3_pll , 0 , 5 , ptr - > m2 ) ;
/* M (PERIPH_DPLL_MULT): CM_CLKSEL2_PLL[8:19] */
sr32 ( & prcm_base - > clksel2_pll , 8 , 12 , ptr - > m ) ;
/* N (PERIPH_DPLL_DIV): CM_CLKSEL2_PLL[0:6] */
sr32 ( & prcm_base - > clksel2_pll , 0 , 7 , ptr - > n ) ;
/* M2DIV (CLKSEL_96M): CM_CLKSEL_CORE[12:13] */
sr32 ( & prcm_base - > clksel_core , 12 , 2 , ptr - > m2div ) ;
/* LOCK MODE (EN_PERIPH_DPLL): CM_CLKEN_PLL[16:18] */
sr32 ( & prcm_base - > clken_pll , 16 , 3 , PLL_LOCK ) ;
wait_on_value ( ST_PERIPH_CLK , 2 , & prcm_base - > idlest_ckgen , LDELAY ) ;
}
static void mpu_init_36xx ( u32 sil_index , u32 clk_index )
{
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
dpll_param * ptr = ( dpll_param * ) get_36x_mpu_dpll_param ( ) ;
/* Moving to the right sysclk */
ptr + = clk_index ;
/* MPU DPLL (unlocked already */
/* M2 (MPU_DPLL_CLKOUT_DIV) : CM_CLKSEL2_PLL_MPU[0:4] */
sr32 ( & prcm_base - > clksel2_pll_mpu , 0 , 5 , ptr - > m2 ) ;
/* M (MPU_DPLL_MULT) : CM_CLKSEL2_PLL_MPU[8:18] */
sr32 ( & prcm_base - > clksel1_pll_mpu , 8 , 11 , ptr - > m ) ;
/* N (MPU_DPLL_DIV) : CM_CLKSEL2_PLL_MPU[0:6] */
sr32 ( & prcm_base - > clksel1_pll_mpu , 0 , 7 , ptr - > n ) ;
}
static void iva_init_36xx ( u32 sil_index , u32 clk_index )
{
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
dpll_param * ptr = ( dpll_param * ) get_36x_iva_dpll_param ( ) ;
/* Moving to the right sysclk */
ptr + = clk_index ;
/* IVA DPLL */
/* EN_IVA2_DPLL : CM_CLKEN_PLL_IVA2[0:2] */
sr32 ( & prcm_base - > clken_pll_iva2 , 0 , 3 , PLL_STOP ) ;
wait_on_value ( ST_IVA2_CLK , 0 , & prcm_base - > idlest_pll_iva2 , LDELAY ) ;
/* set M2 */
sr32 ( & prcm_base - > clksel2_pll_iva2 , 0 , 5 , dpll_param_p - > m2 ) ;
/* set M */
sr32 ( & prcm_base - > clksel1_pll_iva2 , 8 , 11 , dpll_param_p - > m ) ;
/* set N */
sr32 ( & prcm_base - > clksel1_pll_iva2 , 0 , 7 , dpll_param_p - > n ) ;
/* FREQSEL */
sr32 ( & prcm_base - > clken_pll_iva2 , 4 , 4 , dpll_param_p - > fsel ) ;
/* lock mode */
/* M2 (IVA2_DPLL_CLKOUT_DIV) : CM_CLKSEL2_PLL_IVA2[0:4] */
sr32 ( & prcm_base - > clksel2_pll_iva2 , 0 , 5 , ptr - > m2 ) ;
/* M (IVA2_DPLL_MULT) : CM_CLKSEL1_PLL_IVA2[8:18] */
sr32 ( & prcm_base - > clksel1_pll_iva2 , 8 , 11 , ptr - > m ) ;
/* N (IVA2_DPLL_DIV) : CM_CLKSEL1_PLL_IVA2[0:6] */
sr32 ( & prcm_base - > clksel1_pll_iva2 , 0 , 7 , ptr - > n ) ;
/* LOCK (MODE (EN_IVA2_DPLL) : CM_CLKEN_PLL_IVA2[0:2] */
sr32 ( & prcm_base - > clken_pll_iva2 , 0 , 3 , PLL_LOCK ) ;
wait_on_value ( ST_IVA2_CLK , 1 , & prcm_base - > idlest_pll_iva2 , LDELAY ) ;
}
/******************************************************************************
* prcm_init ( ) - inits clocks for PRCM as defined in clocks . h
* called from SRAM , or Flash ( using temp SRAM stack ) .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void prcm_init ( void )
{
u32 osc_clk = 0 , sys_clkin_sel ;
u32 clk_index , sil_index = 0 ;
struct prm * prm_base = ( struct prm * ) PRM_BASE ;
struct prcm * prcm_base = ( struct prcm * ) PRCM_BASE ;
/*
* Gauge the input clock speed and find out the sys_clkin_sel
* value corresponding to the input clock .
*/
osc_clk = get_osc_clk_speed ( ) ;
get_sys_clkin_sel ( osc_clk , & sys_clkin_sel ) ;
/* set input crystal speed */
sr32 ( & prm_base - > clksel , 0 , 3 , sys_clkin_sel ) ;
/* If the input clock is greater than 19.2M always divide/2 */
if ( sys_clkin_sel > 2 ) {
/* input clock divider */
sr32 ( & prm_base - > clksrc_ctrl , 6 , 2 , 2 ) ;
clk_index = sys_clkin_sel / 2 ;
} else {
/* input clock divider */
sr32 ( & prm_base - > clksrc_ctrl , 6 , 2 , 1 ) ;
clk_index = sys_clkin_sel ;
}
if ( get_cpu_family ( ) = = CPU_OMAP36XX ) {
/* Unlock MPU DPLL (slows things down, and needed later) */
sr32 ( & prcm_base - > clken_pll_mpu , 0 , 3 , PLL_LOW_POWER_BYPASS ) ;
wait_on_value ( ST_MPU_CLK , 0 , & prcm_base - > idlest_pll_mpu ,
LDELAY ) ;
dpll3_init_36xx ( 0 , clk_index ) ;
dpll4_init_36xx ( 0 , clk_index ) ;
iva_init_36xx ( 0 , clk_index ) ;
mpu_init_36xx ( 0 , clk_index ) ;
/* Lock MPU DPLL to set frequency */
sr32 ( & prcm_base - > clken_pll_mpu , 0 , 3 , PLL_LOCK ) ;
wait_on_value ( ST_MPU_CLK , 1 , & prcm_base - > idlest_pll_mpu ,
LDELAY ) ;
} else {
/*
* The DPLL tables are defined according to sysclk value and
* silicon revision . The clk_index value will be used to get
* the values for that input sysclk from the DPLL param table
* and sil_index will get the values for that SysClk for the
* appropriate silicon rev .
*/
if ( ( ( get_cpu_family ( ) = = CPU_OMAP34XX )
& & ( get_cpu_rev ( ) > = CPU_3XX_ES20 ) ) | |
( get_cpu_family ( ) = = CPU_AM35XX ) )
sil_index = 1 ;
/* Unlock MPU DPLL (slows things down, and needed later) */
sr32 ( & prcm_base - > clken_pll_mpu , 0 , 3 , PLL_LOW_POWER_BYPASS ) ;
wait_on_value ( ST_MPU_CLK , 0 , & prcm_base - > idlest_pll_mpu ,
LDELAY ) ;
dpll3_init_34xx ( sil_index , clk_index ) ;
dpll4_init_34xx ( sil_index , clk_index ) ;
iva_init_34xx ( sil_index , clk_index ) ;
mpu_init_34xx ( sil_index , clk_index ) ;
/* Lock MPU DPLL to set frequency */
sr32 ( & prcm_base - > clken_pll_mpu , 0 , 3 , PLL_LOCK ) ;
wait_on_value ( ST_MPU_CLK , 1 , & prcm_base - > idlest_pll_mpu ,
LDELAY ) ;
}
/* Set up GPTimers to sys_clk source only */
sr32 ( & prcm_base - > clksel_per , 0 , 8 , 0xff ) ;