|
@@ -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');
|
|
|
}
|