summaryrefslogtreecommitdiffstats
path: root/arch/arm/include/asm/sched_clock.h
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2012-08-07 19:05:10 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-08-11 09:15:58 +0100
commit237ec6f2e51d2fc2ff37c7c5f1ccc9264d09c85b (patch)
tree17a21e6c00129a703d906166f0e640089e3af6b7 /arch/arm/include/asm/sched_clock.h
parentf1898f6be9a2e3690fb62d8307849b86a89cc36c (diff)
downloadlinux-237ec6f2e51d2fc2ff37c7c5f1ccc9264d09c85b.tar.gz
linux-237ec6f2e51d2fc2ff37c7c5f1ccc9264d09c85b.tar.bz2
linux-237ec6f2e51d2fc2ff37c7c5f1ccc9264d09c85b.zip
ARM: 7486/1: sched_clock: update epoch_cyc on resume
Many clocks that are used to provide sched_clock will reset during suspend. If read_sched_clock returns 0 after suspend, sched_clock will appear to jump forward. This patch resets cd.epoch_cyc to the current value of read_sched_clock during resume, which causes sched_clock() just after suspend to return the same value as sched_clock() just before suspend. In addition, during the window where epoch_ns has been updated before suspend, but epoch_cyc has not been updated after suspend, it is unknown whether the clock has reset or not, and sched_clock() could return a bogus value. Add a suspended flag, and return the pre-suspend epoch_ns value during this period. The new behavior is triggered by calling setup_sched_clock_needs_suspend instead of setup_sched_clock. Signed-off-by: Colin Cross <ccross@android.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/include/asm/sched_clock.h')
-rw-r--r--arch/arm/include/asm/sched_clock.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/arm/include/asm/sched_clock.h b/arch/arm/include/asm/sched_clock.h
index e3f757263438..05b8e82ec9f5 100644
--- a/arch/arm/include/asm/sched_clock.h
+++ b/arch/arm/include/asm/sched_clock.h
@@ -10,5 +10,7 @@
extern void sched_clock_postinit(void);
extern void setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate);
+extern void setup_sched_clock_needs_suspend(u32 (*read)(void), int bits,
+ unsigned long rate);
#endif