PXA Timers: Stop interrupts becomming enabled when they shouldn't be Calling save_time_delta() from within pxa_pm_enter() isn't allowed as it will reenable interrupts in a function where they should be disabled throughout. These calls can be made safely from the time.c suspend/resume functions instead. Signed-Off-By: Richard Purdie Index: linux-2.6.12/arch/arm/mach-pxa/pm.c =================================================================== --- linux-2.6.12.orig/arch/arm/mach-pxa/pm.c 2005-08-21 20:05:16.000000000 +0100 +++ linux-2.6.12/arch/arm/mach-pxa/pm.c 2005-08-21 20:06:02.000000000 +0100 @@ -78,7 +78,6 @@ { unsigned long sleep_save[SLEEP_SAVE_SIZE]; unsigned long checksum = 0; - struct timespec delta, rtc; int i; extern void pxa_cpu_pm_enter(suspend_state_t state); @@ -87,11 +86,6 @@ iwmmxt_task_disable(NULL); #endif - /* preserve current time */ - rtc.tv_sec = RCNR; - rtc.tv_nsec = 0; - save_time_delta(&delta, &rtc); - SAVE(GPLR0); SAVE(GPLR1); SAVE(GPLR2); SAVE(GPDR0); SAVE(GPDR1); SAVE(GPDR2); SAVE(GRER0); SAVE(GRER1); SAVE(GRER2); @@ -182,10 +176,6 @@ RESTORE(PSTR); - /* restore current time */ - rtc.tv_sec = RCNR; - restore_time_delta(&delta, &rtc); - #ifdef DEBUG printk(KERN_DEBUG "*** made it back from resume\n"); #endif Index: linux-2.6.12/arch/arm/mach-pxa/time.c =================================================================== --- linux-2.6.12.orig/arch/arm/mach-pxa/time.c 2005-08-21 20:04:39.000000000 +0100 +++ linux-2.6.12/arch/arm/mach-pxa/time.c 2005-08-21 20:05:24.000000000 +0100 @@ -128,6 +128,7 @@ #ifdef CONFIG_PM static unsigned long osmr[4], oier; +static struct timespec delta, rtc; static void pxa_timer_suspend(void) { @@ -136,10 +137,19 @@ osmr[2] = OSMR2; osmr[3] = OSMR3; oier = OIER; + + /* preserve current time */ + rtc.tv_sec = RCNR; + rtc.tv_nsec = 0; + save_time_delta(&delta, &rtc); } static void pxa_timer_resume(void) { + /* restore current time */ + rtc.tv_sec = RCNR; + restore_time_delta(&delta, &rtc); + OSMR0 = osmr[0]; OSMR1 = osmr[1]; OSMR2 = osmr[2];