Commit 80a18573 authored by Todd Poynor's avatar Todd Poynor Committed by Russell King

[ARM] 2787/2: PXA27x low power modes support

Patch from Todd Poynor

Add symbols for PXA2xx PWRMODE register M field that selects low-power
mode, replace unadorned constants.  Honor power mode parameter of
pxa_cpu_suspend(mode), no longer force to 3 (sleep).  Full Deep Sleep
low-power mode support for PXA27x is pending generic PM interfaces to
select more than 2 suspend-to-RAM-style power modes, but this is
expected soon. This can be hardcoded in the meantime by replacing the
pxa_cpu_suspend() parameter value.  From David Burrage and Todd Poynor.
Try #2 removes one of the register copies and moves the code to save the
pxa_cpu_suspend parameter to immediately surround the call that requires
the parameter value be preserved.
Signed-off-by: default avatarTodd Poynor <tpoynor@mvista.com>
Signed-off-by: default avatarNicolas Pitre <nico@cam.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 917f68f8
...@@ -129,7 +129,7 @@ void pxa_cpu_pm_enter(suspend_state_t state) ...@@ -129,7 +129,7 @@ void pxa_cpu_pm_enter(suspend_state_t state)
case PM_SUSPEND_MEM: case PM_SUSPEND_MEM:
/* set resume return address */ /* set resume return address */
PSPR = virt_to_phys(pxa_cpu_resume); PSPR = virt_to_phys(pxa_cpu_resume);
pxa_cpu_suspend(3); pxa_cpu_suspend(PWRMODE_SLEEP);
break; break;
} }
} }
......
...@@ -157,7 +157,7 @@ void pxa_cpu_pm_enter(suspend_state_t state) ...@@ -157,7 +157,7 @@ void pxa_cpu_pm_enter(suspend_state_t state)
case PM_SUSPEND_MEM: case PM_SUSPEND_MEM:
/* set resume return address */ /* set resume return address */
PSPR = virt_to_phys(pxa_cpu_resume); PSPR = virt_to_phys(pxa_cpu_resume);
pxa_cpu_suspend(3); pxa_cpu_suspend(PWRMODE_SLEEP);
break; break;
} }
} }
......
...@@ -28,7 +28,9 @@ ...@@ -28,7 +28,9 @@
/* /*
* pxa_cpu_suspend() * pxa_cpu_suspend()
* *
* Forces CPU into sleep state * Forces CPU into sleep state.
*
* r0 = value for PWRMODE M field for desired sleep state
*/ */
ENTRY(pxa_cpu_suspend) ENTRY(pxa_cpu_suspend)
...@@ -53,6 +55,7 @@ ENTRY(pxa_cpu_suspend) ...@@ -53,6 +55,7 @@ ENTRY(pxa_cpu_suspend)
mov r10, sp mov r10, sp
stmfd sp!, {r3 - r10} stmfd sp!, {r3 - r10}
mov r5, r0 @ save sleep mode
@ preserve phys address of stack @ preserve phys address of stack
mov r0, sp mov r0, sp
bl sleep_phys_sp bl sleep_phys_sp
...@@ -66,7 +69,7 @@ ENTRY(pxa_cpu_suspend) ...@@ -66,7 +69,7 @@ ENTRY(pxa_cpu_suspend)
@ (also workaround for sighting 28071) @ (also workaround for sighting 28071)
@ prepare value for sleep mode @ prepare value for sleep mode
mov r1, #3 @ sleep mode mov r1, r5 @ sleep mode
@ prepare pointer to physical address 0 (virtual mapping in generic.c) @ prepare pointer to physical address 0 (virtual mapping in generic.c)
mov r2, #UNCACHED_PHYS_0 mov r2, #UNCACHED_PHYS_0
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
ENTRY(pxa_cpu_standby) ENTRY(pxa_cpu_standby)
ldr r0, =PSSR ldr r0, =PSSR
mov r1, #(PSSR_PH | PSSR_STS) mov r1, #(PSSR_PH | PSSR_STS)
mov r2, #2 mov r2, #PWRMODE_STANDBY
mov r3, #UNCACHED_PHYS_0 @ Read mem context in. mov r3, #UNCACHED_PHYS_0 @ Read mem context in.
ldr ip, [r3] ldr ip, [r3]
b 1f b 1f
......
...@@ -2282,4 +2282,11 @@ ...@@ -2282,4 +2282,11 @@
#endif #endif
/* PWRMODE register M field values */
#define PWRMODE_IDLE 0x1
#define PWRMODE_STANDBY 0x2
#define PWRMODE_SLEEP 0x3
#define PWRMODE_DEEPSLEEP 0x7
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment