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
*/
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_GPLR0, SLEEP_SAVE_GPLR1, SLEEP_SAVE_GPLR2,
delta = xtime.tv_sec - RCNR;
/* save vital registers */
- SAVE(OSCR);
SAVE(OSMR0);
SAVE(OSMR1);
SAVE(OSMR2);
RESTORE(OSMR1);
RESTORE(OSMR2);
RESTORE(OSMR3);
- RESTORE(OSCR);
RESTORE(OIER);
+ /* OSMR0 is the system timer: make sure OSCR is sufficiently behind */
+ OSCR = OSMR0 - LATCH;
+
RESTORE(CKEN);
ICLR = 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_GPDR, SLEEP_SAVE_GAFR,
gpio = GPLR;
/* save vital registers */
- SAVE(OSCR);
SAVE(OSMR0);
SAVE(OSMR1);
SAVE(OSMR2);
RESTORE(OSMR1);
RESTORE(OSMR2);
RESTORE(OSMR3);
- RESTORE(OSCR);
RESTORE(OIER);
+ /* OSMR0 is the system timer: make sure OSCR is sufficiently behind */
+ OSCR = OSMR0 - LATCH;
+
/* restore current time */
xtime.tv_sec = RCNR + delta;