@ -14,17 +14,12 @@
# include <asm/arch/hardware.h>
# include <asm/io.h>
# define PRCM_MOD_EN 0x2
# define PRCM_FORCE_WAKEUP 0x2
# define PRCM_FUNCTL 0x0
# define CPGMAC0_IDLE 0x30000
# define OSC (V_OSCK / 1000000)
const struct cm_perpll * cmper = ( struct cm_perpll * ) CM_PER ;
const struct cm_wkuppll * cmwkup = ( struct cm_wkuppll * ) CM_WKUP ;
const struct cm_dpll * cmdpll = ( struct cm_dpll * ) CM_DPLL ;
const struct cm_rtc * cmrtc = ( struct cm_rtc * ) CM_RTC ;
struct cm_perpll * const cmper = ( struct cm_perpll * ) CM_PER ;
struct cm_wkuppll * const cmwkup = ( struct cm_wkuppll * ) CM_WKUP ;
struct cm_dpll * const cmdpll = ( struct cm_dpll * ) CM_DPLL ;
struct cm_rtc * const cmrtc = ( struct cm_rtc * ) CM_RTC ;
const struct dpll_regs dpll_mpu_regs = {
. cm_clkmode_dpll = CM_WKUP + 0x88 ,
@ -63,199 +58,85 @@ const struct dpll_params dpll_core = {
const struct dpll_params dpll_per = {
960 , OSC - 1 , 5 , - 1 , - 1 , - 1 , - 1 } ;
static void enable_interface_clocks ( void )
{
/* Enable all the Interconnect Modules */
writel ( PRCM_MOD_EN , & cmper - > l3clkctrl ) ;
while ( readl ( & cmper - > l3clkctrl ) ! = PRCM_MOD_EN )
;
writel ( PRCM_MOD_EN , & cmper - > l4lsclkctrl ) ;
while ( readl ( & cmper - > l4lsclkctrl ) ! = PRCM_MOD_EN )
;
writel ( PRCM_MOD_EN , & cmper - > l4fwclkctrl ) ;
while ( readl ( & cmper - > l4fwclkctrl ) ! = PRCM_MOD_EN )
;
writel ( PRCM_MOD_EN , & cmwkup - > wkl4wkclkctrl ) ;
while ( readl ( & cmwkup - > wkl4wkclkctrl ) ! = PRCM_MOD_EN )
;
writel ( PRCM_MOD_EN , & cmper - > l3instrclkctrl ) ;
while ( readl ( & cmper - > l3instrclkctrl ) ! = PRCM_MOD_EN )
;
writel ( PRCM_MOD_EN , & cmper - > l4hsclkctrl ) ;
while ( readl ( & cmper - > l4hsclkctrl ) ! = PRCM_MOD_EN )
;
writel ( PRCM_MOD_EN , & cmwkup - > wkgpio0clkctrl ) ;
while ( readl ( & cmwkup - > wkgpio0clkctrl ) ! = PRCM_MOD_EN )
;
}
/*
* Force power domain wake up transition
* Ensure that the corresponding interface clock is active before
* using the peripheral
*/
static void power_domain_wkup_transition ( void )
void setup_clocks_for_console ( void )
{
writel ( PRCM_FORCE_WAKEUP , & cmper - > l3clkstctrl ) ;
writel ( PRCM_FORCE_WAKEUP , & cmper - > l4lsclkstctrl ) ;
writel ( PRCM_FORCE_WAKEUP , & cmwkup - > wkclkstctrl ) ;
writel ( PRCM_FORCE_WAKEUP , & cmper - > l4fwclkstctrl ) ;
writel ( PRCM_FORCE_WAKEUP , & cmper - > l3sclkstctrl ) ;
clrsetbits_le32 ( & cmwkup - > wkclkstctrl , CD_CLKCTRL_CLKTRCTRL_MASK ,
CD_CLKCTRL_CLKTRCTRL_SW_WKUP < <
CD_CLKCTRL_CLKTRCTRL_SHIFT ) ;
clrsetbits_le32 ( & cmper - > l4hsclkstctrl , CD_CLKCTRL_CLKTRCTRL_MASK ,
CD_CLKCTRL_CLKTRCTRL_SW_WKUP < <
CD_CLKCTRL_CLKTRCTRL_SHIFT ) ;
clrsetbits_le32 ( & cmwkup - > wkup_uart0ctrl ,
MODULE_CLKCTRL_MODULEMODE_MASK ,
MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN < <
MODULE_CLKCTRL_MODULEMODE_SHIFT ) ;
clrsetbits_le32 ( & cmper - > uart1clkctrl ,
MODULE_CLKCTRL_MODULEMODE_MASK ,
MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN < <
MODULE_CLKCTRL_MODULEMODE_SHIFT ) ;
clrsetbits_le32 ( & cmper - > uart2clkctrl ,
MODULE_CLKCTRL_MODULEMODE_MASK ,
MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN < <
MODULE_CLKCTRL_MODULEMODE_SHIFT ) ;
clrsetbits_le32 ( & cmper - > uart3clkctrl ,
MODULE_CLKCTRL_MODULEMODE_MASK ,
MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN < <
MODULE_CLKCTRL_MODULEMODE_SHIFT ) ;
clrsetbits_le32 ( & cmper - > uart4clkctrl ,
MODULE_CLKCTRL_MODULEMODE_MASK ,
MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN < <
MODULE_CLKCTRL_MODULEMODE_SHIFT ) ;
clrsetbits_le32 ( & cmper - > uart5clkctrl ,
MODULE_CLKCTRL_MODULEMODE_MASK ,
MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN < <
MODULE_CLKCTRL_MODULEMODE_SHIFT ) ;
}
/*
* Enable the peripheral clock for required peripherals
*/
static void enable_per_clocks ( void )
void enable_basic_clocks ( void )
{
/* Enable the control module though RBL would have done it*/
writel ( PRCM_MOD_EN , & cmwkup - > wkctrlclkctrl ) ;
while ( readl ( & cmwkup - > wkctrlclkctrl ) ! = PRCM_MOD_EN )
;
/* Enable the module clock */
writel ( PRCM_MOD_EN , & cmper - > timer2clkctrl ) ;
while ( readl ( & cmper - > timer2clkctrl ) ! = PRCM_MOD_EN )
;
u32 * const clk_domains [ ] = {
& cmper - > l3clkstctrl ,
& cmper - > l4fwclkstctrl ,
& cmper - > l3sclkstctrl ,
& cmper - > l4lsclkstctrl ,
& cmwkup - > wkclkstctrl ,
& cmper - > emiffwclkctrl ,
& cmrtc - > clkstctrl ,
0
} ;
u32 * const clk_modules_explicit_en [ ] = {
& cmper - > l3clkctrl ,
& cmper - > l4lsclkctrl ,
& cmper - > l4fwclkctrl ,
& cmwkup - > wkl4wkclkctrl ,
& cmper - > l3instrclkctrl ,
& cmper - > l4hsclkctrl ,
& cmwkup - > wkgpio0clkctrl ,
& cmwkup - > wkctrlclkctrl ,
& cmper - > timer2clkctrl ,
& cmper - > gpmcclkctrl ,
& cmper - > elmclkctrl ,
& cmper - > mmc0clkctrl ,
& cmper - > mmc1clkctrl ,
& cmwkup - > wkup_i2c0ctrl ,
& cmper - > gpio1clkctrl ,
& cmper - > gpio2clkctrl ,
& cmper - > gpio3clkctrl ,
& cmper - > i2c1clkctrl ,
& cmper - > cpgmac0clkctrl ,
& cmper - > spi0clkctrl ,
& cmrtc - > rtcclkctrl ,
& cmper - > usb0clkctrl ,
& cmper - > emiffwclkctrl ,
& cmper - > emifclkctrl ,
0
} ;
do_enable_clocks ( clk_domains , clk_modules_explicit_en , 1 ) ;
/* Select the Master osc 24 MHZ as Timer2 clock source */
writel ( 0x1 , & cmdpll - > clktimer2clk ) ;
/* UART0 */
writel ( PRCM_MOD_EN , & cmwkup - > wkup_uart0ctrl ) ;
while ( readl ( & cmwkup - > wkup_uart0ctrl ) ! = PRCM_MOD_EN )
;
/* UART1 */
# ifdef CONFIG_SERIAL2
writel ( PRCM_MOD_EN , & cmper - > uart1clkctrl ) ;
while ( readl ( & cmper - > uart1clkctrl ) ! = PRCM_MOD_EN )
;
# endif /* CONFIG_SERIAL2 */
/* UART2 */
# ifdef CONFIG_SERIAL3
writel ( PRCM_MOD_EN , & cmper - > uart2clkctrl ) ;
while ( readl ( & cmper - > uart2clkctrl ) ! = PRCM_MOD_EN )
;
# endif /* CONFIG_SERIAL3 */
/* UART3 */
# ifdef CONFIG_SERIAL4
writel ( PRCM_MOD_EN , & cmper - > uart3clkctrl ) ;
while ( readl ( & cmper - > uart3clkctrl ) ! = PRCM_MOD_EN )
;
# endif /* CONFIG_SERIAL4 */
/* UART4 */
# ifdef CONFIG_SERIAL5
writel ( PRCM_MOD_EN , & cmper - > uart4clkctrl ) ;
while ( readl ( & cmper - > uart4clkctrl ) ! = PRCM_MOD_EN )
;
# endif /* CONFIG_SERIAL5 */
/* UART5 */
# ifdef CONFIG_SERIAL6
writel ( PRCM_MOD_EN , & cmper - > uart5clkctrl ) ;
while ( readl ( & cmper - > uart5clkctrl ) ! = PRCM_MOD_EN )
;
# endif /* CONFIG_SERIAL6 */
/* GPMC */
writel ( PRCM_MOD_EN , & cmper - > gpmcclkctrl ) ;
while ( readl ( & cmper - > gpmcclkctrl ) ! = PRCM_MOD_EN )
;
/* ELM */
writel ( PRCM_MOD_EN , & cmper - > elmclkctrl ) ;
while ( readl ( & cmper - > elmclkctrl ) ! = PRCM_MOD_EN )
;
/* MMC0*/
writel ( PRCM_MOD_EN , & cmper - > mmc0clkctrl ) ;
while ( readl ( & cmper - > mmc0clkctrl ) ! = PRCM_MOD_EN )
;
/* MMC1 */
writel ( PRCM_MOD_EN , & cmper - > mmc1clkctrl ) ;
while ( readl ( & cmper - > mmc1clkctrl ) ! = PRCM_MOD_EN )
;
/* i2c0 */
writel ( PRCM_MOD_EN , & cmwkup - > wkup_i2c0ctrl ) ;
while ( readl ( & cmwkup - > wkup_i2c0ctrl ) ! = PRCM_MOD_EN )
;
/* gpio1 module */
writel ( PRCM_MOD_EN , & cmper - > gpio1clkctrl ) ;
while ( readl ( & cmper - > gpio1clkctrl ) ! = PRCM_MOD_EN )
;
/* gpio2 module */
writel ( PRCM_MOD_EN , & cmper - > gpio2clkctrl ) ;
while ( readl ( & cmper - > gpio2clkctrl ) ! = PRCM_MOD_EN )
;
/* gpio3 module */
writel ( PRCM_MOD_EN , & cmper - > gpio3clkctrl ) ;
while ( readl ( & cmper - > gpio3clkctrl ) ! = PRCM_MOD_EN )
;
/* i2c1 */
writel ( PRCM_MOD_EN , & cmper - > i2c1clkctrl ) ;
while ( readl ( & cmper - > i2c1clkctrl ) ! = PRCM_MOD_EN )
;
/* Ethernet */
writel ( PRCM_MOD_EN , & cmper - > cpgmac0clkctrl ) ;
while ( ( readl ( & cmper - > cpgmac0clkctrl ) & CPGMAC0_IDLE ) ! = PRCM_FUNCTL )
;
/* spi0 */
writel ( PRCM_MOD_EN , & cmper - > spi0clkctrl ) ;
while ( readl ( & cmper - > spi0clkctrl ) ! = PRCM_MOD_EN )
;
/* RTC */
writel ( PRCM_MOD_EN , & cmrtc - > rtcclkctrl ) ;
while ( readl ( & cmrtc - > rtcclkctrl ) ! = PRCM_MOD_EN )
;
/* MUSB */
writel ( PRCM_MOD_EN , & cmper - > usb0clkctrl ) ;
while ( readl ( & cmper - > usb0clkctrl ) ! = PRCM_MOD_EN )
;
}
void enable_emif_clocks ( void )
{
/* Enable the EMIF_FW Functional clock */
writel ( PRCM_MOD_EN , & cmper - > emiffwclkctrl ) ;
/* Enable EMIF0 Clock */
writel ( PRCM_MOD_EN , & cmper - > emifclkctrl ) ;
/* Poll if module is functional */
while ( ( readl ( & cmper - > emifclkctrl ) ) ! = PRCM_MOD_EN )
;
}
/*
* Configure the PLL / PRCM for necessary peripherals
*/
void pll_init ( )
{
setup_dplls ( ) ;
/* Enable the required interconnect clocks */
enable_interface_clocks ( ) ;
/* Power domain wake up transition */
power_domain_wkup_transition ( ) ;
/* Enable the required peripherals */
enable_per_clocks ( ) ;
}