Commit f9cd0342 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Russell King

[ARM PATCH] 2094/1: don't lose the system timer after resuming from sleep on SA11x0 and

 PXA2xx

Patch from Nicolas Pitre

Let's make sure OSCR doesn't end up to be restored with a value
past OSMR0 otherwise the system timer won't start ticking until
OSCR wraps around (aprox 17 min.

Also set OSCR _after_ OIER is restored to avoid matching when
corresponding match interrupt is masked out.

Signed-off-by: Nicolas Pitre 
parent 38dd6915
...@@ -45,7 +45,7 @@ extern void pxa_cpu_resume(void); ...@@ -45,7 +45,7 @@ extern void pxa_cpu_resume(void);
*/ */
enum { SLEEP_SAVE_START = 0, enum { SLEEP_SAVE_START = 0,
SLEEP_SAVE_OSCR, SLEEP_SAVE_OIER, SLEEP_SAVE_OIER,
SLEEP_SAVE_OSMR0, SLEEP_SAVE_OSMR1, SLEEP_SAVE_OSMR2, SLEEP_SAVE_OSMR3, SLEEP_SAVE_OSMR0, SLEEP_SAVE_OSMR1, SLEEP_SAVE_OSMR2, SLEEP_SAVE_OSMR3,
SLEEP_SAVE_GPLR0, SLEEP_SAVE_GPLR1, SLEEP_SAVE_GPLR2, SLEEP_SAVE_GPLR0, SLEEP_SAVE_GPLR1, SLEEP_SAVE_GPLR2,
...@@ -78,7 +78,6 @@ static int pxa_pm_enter(u32 state) ...@@ -78,7 +78,6 @@ static int pxa_pm_enter(u32 state)
delta = xtime.tv_sec - RCNR; delta = xtime.tv_sec - RCNR;
/* save vital registers */ /* save vital registers */
SAVE(OSCR);
SAVE(OSMR0); SAVE(OSMR0);
SAVE(OSMR1); SAVE(OSMR1);
SAVE(OSMR2); SAVE(OSMR2);
...@@ -149,9 +148,11 @@ static int pxa_pm_enter(u32 state) ...@@ -149,9 +148,11 @@ static int pxa_pm_enter(u32 state)
RESTORE(OSMR1); RESTORE(OSMR1);
RESTORE(OSMR2); RESTORE(OSMR2);
RESTORE(OSMR3); RESTORE(OSMR3);
RESTORE(OSCR);
RESTORE(OIER); RESTORE(OIER);
/* OSMR0 is the system timer: make sure OSCR is sufficiently behind */
OSCR = OSMR0 - LATCH;
RESTORE(CKEN); RESTORE(CKEN);
ICLR = 0; ICLR = 0;
......
...@@ -44,7 +44,7 @@ extern void sa1100_cpu_resume(void); ...@@ -44,7 +44,7 @@ extern void sa1100_cpu_resume(void);
*/ */
enum { SLEEP_SAVE_SP = 0, enum { SLEEP_SAVE_SP = 0,
SLEEP_SAVE_OSCR, SLEEP_SAVE_OIER, SLEEP_SAVE_OIER,
SLEEP_SAVE_OSMR0, SLEEP_SAVE_OSMR1, SLEEP_SAVE_OSMR2, SLEEP_SAVE_OSMR3, SLEEP_SAVE_OSMR0, SLEEP_SAVE_OSMR1, SLEEP_SAVE_OSMR2, SLEEP_SAVE_OSMR3,
SLEEP_SAVE_GPDR, SLEEP_SAVE_GAFR, SLEEP_SAVE_GPDR, SLEEP_SAVE_GAFR,
...@@ -69,7 +69,6 @@ static int sa11x0_pm_enter(u32 state) ...@@ -69,7 +69,6 @@ static int sa11x0_pm_enter(u32 state)
gpio = GPLR; gpio = GPLR;
/* save vital registers */ /* save vital registers */
SAVE(OSCR);
SAVE(OSMR0); SAVE(OSMR0);
SAVE(OSMR1); SAVE(OSMR1);
SAVE(OSMR2); SAVE(OSMR2);
...@@ -131,9 +130,11 @@ static int sa11x0_pm_enter(u32 state) ...@@ -131,9 +130,11 @@ static int sa11x0_pm_enter(u32 state)
RESTORE(OSMR1); RESTORE(OSMR1);
RESTORE(OSMR2); RESTORE(OSMR2);
RESTORE(OSMR3); RESTORE(OSMR3);
RESTORE(OSCR);
RESTORE(OIER); RESTORE(OIER);
/* OSMR0 is the system timer: make sure OSCR is sufficiently behind */
OSCR = OSMR0 - LATCH;
/* restore current time */ /* restore current time */
xtime.tv_sec = RCNR + delta; xtime.tv_sec = RCNR + delta;
......
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