mpc85xx/t104x: Add deep sleep framework support
When T104x soc wakes up from deep sleep, control is passed to the primary core that starts executing uboot. After re-initialized some IP blocks, like DDRC, kernel will take responsibility to continue to restore environment it leaves before. Signed-off-by: Tang Yuantian <Yuantian.Tang@freescale.com> Reviewed-by: York Sun <yorksun@freescale.com>
This commit is contained in:
@@ -343,6 +343,13 @@ void board_init_f(ulong bootflag)
|
||||
#ifdef CONFIG_PRAM
|
||||
ulong reg;
|
||||
#endif
|
||||
#ifdef CONFIG_DEEP_SLEEP
|
||||
const ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
|
||||
struct ccsr_scfg *scfg = (void *)CONFIG_SYS_MPC85xx_SCFG;
|
||||
u32 start_addr;
|
||||
typedef void (*func_t)(void);
|
||||
func_t kernel_resume;
|
||||
#endif
|
||||
|
||||
/* Pointer is writable since we allocated a register for it */
|
||||
gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
|
||||
@@ -360,6 +367,15 @@ void board_init_f(ulong bootflag)
|
||||
if ((*init_fnc_ptr) () != 0)
|
||||
hang();
|
||||
|
||||
#ifdef CONFIG_DEEP_SLEEP
|
||||
/* Jump to kernel in deep sleep case */
|
||||
if (in_be32(&gur->scrtsr[0]) & (1 << 3)) {
|
||||
start_addr = in_be32(&scfg->sparecr[1]);
|
||||
kernel_resume = (func_t)start_addr;
|
||||
kernel_resume();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_POST
|
||||
post_bootmode_init();
|
||||
post_run(NULL, POST_ROM | post_bootmode_get(NULL));
|
||||
|
||||
Reference in New Issue
Block a user