[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: Todd Poynor <tpoynor@mvista.com> Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
committed by
Russell King
parent
917f68f816
commit
80a18573ce
@@ -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)
|
|||||||
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 @@
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
@ (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 @@
|
|||||||
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 @@
|
|||||||
|
|
||||||
#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
|
||||||
|
Reference in New Issue
Block a user