diff options
| -rw-r--r-- | arch/blackfin/cpu/initcode.c | 46 | 
1 files changed, 46 insertions, 0 deletions
| diff --git a/arch/blackfin/cpu/initcode.c b/arch/blackfin/cpu/initcode.c index ce9a43598..1a066806d 100644 --- a/arch/blackfin/cpu/initcode.c +++ b/arch/blackfin/cpu/initcode.c @@ -509,6 +509,11 @@ maybe_self_refresh(ADI_BOOT_DATA *bs)  		return false;  #ifdef __ADSPBF60x__ +	/* resume from hibernate, return false let ddr initialize */ +	if ((bfin_read32(DPM0_STAT) & 0xF0) == 0x50) { +		serial_putc('b'); +		return false; +	}  #else /* __ADSPBF60x__ */ @@ -827,6 +832,7 @@ program_memory_controller(ADI_BOOT_DATA *bs, bool put_into_srfs)  	while (!(bfin_read_DMC0_STAT() & DLLCALDONE))  		continue;  	serial_putc('!'); +  #else /* __ADSPBF60x__ */  	/* Program the external memory controller before we come out of @@ -894,7 +900,46 @@ check_hibernation(ADI_BOOT_DATA *bs, u16 vr_ctl, bool put_into_srfs)  		return;  	serial_putc('b'); +#ifdef __ADSPBF60x__ +	if (bfin_read32(DPM0_RESTORE0) != 0) { +		uint32_t reg = bfin_read_DMC0_CTL(); +		reg &= ~0x8; +		bfin_write_DMC0_CTL(reg); + +		while ((bfin_read_DMC0_STAT() & 0x8)) +			continue; +		while (!(bfin_read_DMC0_STAT() & 0x1)) +			continue; +		serial_putc('z'); +		uint32_t *hibernate_magic = bfin_read32(DPM0_RESTORE4); +		SSYNC(); /* make sure memory controller is done */ +		if (hibernate_magic[0] == 0xDEADBEEF) { +			serial_putc('c'); +			SSYNC(); +			bfin_write_EVT15(hibernate_magic[1]); +			bfin_write_IMASK(EVT_IVG15); +			__asm__ __volatile__ ( +				/* load reti early to avoid anomaly 281 */ +				"reti = %2;" +				/* clear hibernate magic */ +				"[%0] = %1;" +				/* load stack pointer */ +				"SP = [%0 + 8];" +				/* lower ourselves from reset ivg to ivg15 */ +				"raise 15;" +				"nop;nop;nop;" +				"rti;" +				: +				: "p"(hibernate_magic), +				"d"(0x2000 /* jump.s 0 */), +				"d"(0xffa00000) +			); +		} + + +	} +#else  	/* Are we coming out of hibernate (suspend to memory) ?  	 * The memory layout is:  	 * 0x0: hibernate magic for anomaly 307 (0xDEADBEEF) @@ -927,6 +972,7 @@ check_hibernation(ADI_BOOT_DATA *bs, u16 vr_ctl, bool put_into_srfs)  		}  		serial_putc('d');  	} +#endif  	serial_putc('e');  } |