.text
ENTRY(pnx4008_cpu_suspend)
@this function should be entered in Direct run mode.
@ save registers on stack
stmfd sp!, {r0 - r6, lr}
@ setup Power Manager base address in r4
@ and put it's value in r5
mov r4,
orr r4, r4,
orr r4, r4,
orr r4, r4,
ldr r5, [r4,
@ setup SDRAM controller base address in r2
@ and put it's value in r3
mov r2,
orr r2, r2,
orr r2, r2,
orr r2, r2,
ldr r3, [r2,
@ clear SDRAM self-refresh bit latch
and r5, r5,
@ clear SDRAM self-refresh bit
and r5, r5,
str r5, [r4,
@ do save current bit settings in r1
mov r1, r5
@ set SDRAM self-refresh bit
orr r5, r5,
str r5, [r4,
@ set SDRAM self-refresh bit latch
orr r5, r5,
str r5, [r4,
@ clear SDRAM self-refresh bit latch
and r5, r5,
str r5, [r4,
@ clear SDRAM self-refresh bit
and r5, r5,
str r5, [r4,
@ wait for SDRAM to get into self-refresh mode
2: ldr r3, [r2,
tst r3,
beq 2b
@ to prepare SDRAM to get out of self-refresh mode after wakeup
orr r5, r5,
str r5, [r4,
@ do enter stop mode
orr r5, r5,
str r5, [r4,
nop
nop
nop
nop
nop
nop
nop
nop
nop
@ sleeping now...
@ coming out of STOP mode into Direct Run mode
@ clear STOP mode and SDRAM self-refresh bits
str r1, [r4,
@ wait for SDRAM to get out self-refresh mode
3: ldr r3, [r2,
tst r3,
bne 3b
@ restore regs and return
ldmfd sp!, {r0 - r6, pc}
ENTRY(pnx4008_cpu_suspend_sz)
.word . - pnx4008_cpu_suspend
ENTRY(pnx4008_cpu_standby)
@ save registers on stack
stmfd sp!, {r0 - r6, lr}
@ setup Power Manager base address in r4
@ and put it's value in r5
mov r4,
orr r4, r4,
orr r4, r4,
orr r4, r4,
ldr r5, [r4,
@ setup SDRAM controller base address in r2
@ and put it's value in r3
mov r2,
orr r2, r2,
orr r2, r2,
orr r2, r2,
ldr r3, [r2,
@ clear SDRAM self-refresh bit latch
and r5, r5,
@ clear SDRAM self-refresh bit
and r5, r5,
str r5, [r4,
@ do save current bit settings in r1
mov r1, r5
@ set SDRAM self-refresh bit
orr r5, r5,
str r5, [r4,
@ set SDRAM self-refresh bit latch
orr r5, r5,
str r5, [r4,
@ clear SDRAM self-refresh bit latch
and r5, r5,
str r5, [r4,
@ clear SDRAM self-refresh bit
and r5, r5,
str r5, [r4,
@ wait for SDRAM to get into self-refresh mode
2: ldr r3, [r2,
tst r3,
beq 2b
@ set 'get out of self-refresh mode after wakeup' bit
orr r5, r5,
str r5, [r4,
mcr p15, 0, r0, c7, c0, 4 @ kinda sleeping now...
@ set SDRAM self-refresh bit latch
orr r5, r5,
str r5, [r4,
@ clear SDRAM self-refresh bit latch
and r5, r5,
str r5, [r4,
@ wait for SDRAM to get out self-refresh mode
3: ldr r3, [r2,
tst r3,
bne 3b
@ restore regs and return
ldmfd sp!, {r0 - r6, pc}
ENTRY(pnx4008_cpu_standby_sz)
.word . - pnx4008_cpu_standby
ENTRY(pnx4008_cache_clean_invalidate)
stmfd sp!, {r0 - r6, lr}
mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache
1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate
bne 1b
ldmfd sp!, {r0 - r6, pc}