diff options
Diffstat (limited to 'board/icecube/icecube.c')
| -rw-r--r-- | board/icecube/icecube.c | 49 | 
1 files changed, 49 insertions, 0 deletions
| diff --git a/board/icecube/icecube.c b/board/icecube/icecube.c index 700c9d932..296099843 100644 --- a/board/icecube/icecube.c +++ b/board/icecube/icecube.c @@ -42,6 +42,53 @@  #include "mt48lc16m16a2-75.h"  # endif  #endif + +#ifdef CONFIG_LITE5200B_PM +/* u-boot part of low-power mode implementation */ +#define SAVED_ADDR (*(void **)0x00000000) +#define PSC2_4 0x02 + +void lite5200b_wakeup(void) +{ +	unsigned char wakeup_pin; +	void (*linux_wakeup)(void); + +	/* check PSC2_4, if it's down "QT" is signaling we have a wakeup +	 * from low power mode */ +	*(vu_char *)MPC5XXX_WU_GPIO_ENABLE = PSC2_4; +	__asm__ volatile ("sync"); + +	wakeup_pin = *(vu_char *)MPC5XXX_WU_GPIO_DATA_I; +	if (wakeup_pin & PSC2_4) +		return; + +	/* acknowledge to "QT" +	 * by holding pin at 1 for 10 uS */ +	*(vu_char *)MPC5XXX_WU_GPIO_DIR = PSC2_4; +	__asm__ volatile ("sync"); +	*(vu_char *)MPC5XXX_WU_GPIO_DATA_O = PSC2_4; +	__asm__ volatile ("sync"); +	udelay(10); + +	/* put ram out of self-refresh */ +	*(vu_long *)MPC5XXX_SDRAM_CTRL |= 0x80000000;	/* mode_en */ +	__asm__ volatile ("sync"); +	*(vu_long *)MPC5XXX_SDRAM_CTRL |= 0x50000000;	/* cke ref_en */ +	__asm__ volatile ("sync"); +	*(vu_long *)MPC5XXX_SDRAM_CTRL &= ~0x80000000;	/* !mode_en */ +	__asm__ volatile ("sync"); +	udelay(10); /* wait a bit */ + +	/* jump back to linux kernel code */ +	linux_wakeup = SAVED_ADDR; +	printf("\n\nLooks like we just woke, transferring control to 0x%08lx\n", +			linux_wakeup); +	linux_wakeup(); +} +#else +#define lite5200b_wakeup() +#endif +  #ifndef CFG_RAMBOOT  static void sdram_start (int hi_addr)  { @@ -208,6 +255,8 @@ long int initdram (int board_type)  		__asm__ volatile ("sync");  	} +	lite5200b_wakeup(); +  	return dramsize + dramsize2;  } |