ARM: tegra: timer: Fix us timer time after resume from LP1
authorColin Cross <ccross@android.com>
Sun, 24 Oct 2010 23:11:03 +0000 (16:11 -0700)
committerColin Cross <ccross@android.com>
Tue, 26 Oct 2010 01:46:20 +0000 (18:46 -0700)
In LP1 suspend, or during a failed LP0 suspend, the core power is
not turned off and the timer register is not reset.  Saving the
timer value during suspend and adding it to the offset after resume
will cause the timer value to double for each suspend cycle.

To fix, when resuming subtract the current value of the timer
register from the offset.  Also, use the rtc registers to add
the time that passed during suspend.

Change-Id: I9f7ee2089b98cf66af45271f8478fbd9eb2ee250
Signed-off-by: Colin Cross <ccross@android.com>
arch/arm/mach-tegra/timer.c

index 72dc904813b26a571e6a7d2d1f9ff08fd0363680..dff49f201c7a15f4ad285265f87a35a4f336134b 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "board.h"
 #include "clock.h"
+#include "power.h"
 
 #define RTC_SECONDS            0x08
 #define RTC_SHADOW_SECONDS     0x0c
@@ -104,12 +105,15 @@ static cycle_t tegra_clocksource_us_read(struct clocksource *cs)
 
 void tegra_clocksource_us_suspend(struct clocksource *cs)
 {
-       tegra_us_resume_offset = tegra_clocksource_us_read(cs);
+       tegra_us_resume_offset = tegra_clocksource_us_read(cs) -
+               tegra_rtc_read_ms() * 1000;
 }
 
 void tegra_clocksource_us_resume(struct clocksource *cs)
 {
-       tegra_us_clocksource_offset = tegra_us_resume_offset;
+       tegra_us_clocksource_offset += tegra_us_resume_offset +
+               tegra_rtc_read_ms() * 1000 -
+               tegra_clocksource_us_read(cs);
 }
 
 static struct clock_event_device tegra_clockevent = {