From: Tim R. <tim...@us...> - 2002-04-19 20:02:24
|
Update of /cvsroot/blob/blob/src/blob In directory usw-pr-cvs1:/tmp/cvs-serv18160/src/blob Modified Files: memsetup-sa1110.S start-sa11x0.S Log Message: suspend/resume is broken, some fixes from Lineo Index: memsetup-sa1110.S =================================================================== RCS file: /cvsroot/blob/blob/src/blob/memsetup-sa1110.S,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- memsetup-sa1110.S 12 Feb 2002 00:03:50 -0000 1.12 +++ memsetup-sa1110.S 19 Apr 2002 20:01:36 -0000 1.13 @@ -72,6 +72,12 @@ .long MSC2_VALUE /* 0x2C MSC2 */ .long SMCNFG_VALUE /* 0x30 SMCNFG */ +PWR_BASE: .long 0x90020000 +#define PSSR 0x04 +#define PSPR 0x08 +#define PPCR 0x14 +#define POSR 0x1C + .globl memsetup memsetup: mov r5, lr @@ -101,6 +107,25 @@ ldr r2, [r1, #MDCAS22 ] str r2, [r0, #MDCAS22 ] + /* + * Refer to sections 9.5.3.7: Reviving DRAMS from Self-Refresh Mode + * and 10.2.1: Hardware or Sleep Reset Procedures + */ + /* Step 1: Complete a power-on wait period (typically 100-200 usec) + * to allow clocks to come up to speed */ + mov r4, #0x2000 /* DDD: way longer than 200 usec */ +spin: subs r4, r4, #1 + bne spin + + /* Step 2 is for systems with SMROM, so we'll skip it. */ + + /* Step 3: clear DH + * NOTE: do NOT clear SSS, the kernel wants it set */ + ldr r1, PWR_BASE + mov r2, #0x08 /* PSSR_DH */ + str r2, [r1, #PSSR] /* clear DH by writing 1 to it */ + + #ifdef MDREFR_DONT_BELIEVE_IN_MAGIC ldr r2, [r1, #MDREFR ] str r2, [r0, #MDREFR ] @@ -110,6 +135,8 @@ bic r2, r2, #MDREFR_K0DB2 bic r2, r2, #MDREFR_K1DB2 bic r2, r2, #MDREFR_K2DB2 + bic r2, r2, #0xff /* clear TRASR and DRI */ + bic r2, r2, #0xff00 str r2, [ r0, #MDREFR ] /* set TRASR and DRI, KxDB2 */ Index: start-sa11x0.S =================================================================== RCS file: /cvsroot/blob/blob/src/blob/start-sa11x0.S,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- start-sa11x0.S 18 Jan 2002 22:32:00 -0000 1.2 +++ start-sa11x0.S 19 Apr 2002 20:01:36 -0000 1.3 @@ -50,6 +50,7 @@ #define PSSR 0x04 #define PSPR 0x08 #define PPCR 0x14 +#define POSR 0x1C RST_BASE: .word 0x90030000 #define RCSR 0x04 @@ -82,29 +83,32 @@ ldr r1, cpuspeed str r1, [r0, #PPCR] - - /* init LED */ - bl ledinit - - /* setup memory */ - bl memsetup - /* check if this is a wake-up from sleep */ ldr r0, RST_BASE ldr r1, [r0, #RCSR] and r1, r1, #0x0f - teq r1, #0x08 - bne real_reset /* no, continue booting */ + tst r1, #0x08 /* check the Sleep Mode Reset bit */ + beq real_reset /* no, continue booting */ + + /* Wait for the oscillator to stabilize */ + ldr r0, PWR_BASE +wait_for_OOK: + ldr r1, [r0, #POSR] + tst r1, #1 /* test Oscillator OK bit */ + beq wait_for_OOK /* yes, a wake-up. clear RCSR by writing a 1 (see 9.6.2.1 from [1]) */ + ldr r0, RST_BASE mov r1, #0x08 str r1, [r0, #RCSR] ; + /* setup memory */ + bl memsetup + /* handle Power Manager Sleep Status Register (PSSR) * see 9.5.7.5 from [1]*/ + ldr r0, PWR_BASE ldr r1, [r0, #PSSR] - /* clear DH bit, brings out DRAM from self-refresh */ - orr r1, r1, #0x08 /* clear PH bit, bring periperal pins out from sleep state */ orr r1, r1, #0x10 str r1, [r0, #PSSR] @@ -114,7 +118,14 @@ ldr r1, [r0, #PSPR] mov pc, r1 + real_reset: + /* init LED */ + bl ledinit + + /* setup memory */ + bl memsetup + /* turn off the LED. if it stays off it is an indication that * we didn't make it into the C code */ bl led_off |