summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorOlof Johansson <olof@lixom.net>2013-01-08 05:53:33 -0800
committerOlof Johansson <olof@lixom.net>2013-01-08 05:53:53 -0800
commit981302783e891482d767ce90b04ed37159d2ebf8 (patch)
tree02947bcb4641d9db548e36b8491f190ebd9578f6 /kernel
parentd1c3ed669a2d452cacfb48c2d171a1f364dae2ed (diff)
parentae278a935f086775e8ae31a8ec9f7224ea25ea3c (diff)
downloadlinux-981302783e891482d767ce90b04ed37159d2ebf8.tar.gz
linux-981302783e891482d767ce90b04ed37159d2ebf8.tar.bz2
linux-981302783e891482d767ce90b04ed37159d2ebf8.zip
Merge tag 'swarren-for-3.9-arm-timer-rework' of git://git.kernel.org/pub/scm/linux/kernel/git/swarren/linux-tegra into next/cleanup
From Stephen Warren: ARM/...: timer and clock events cleanup, and remove struct sys_timer This branch contains a number of cleanups and unifications to various timer- clock-events- and ARM timer code. The main points are: 1) Convert arch_gettimeoffset to a pointer, so that architectures with multiple timer implementations can simply set this standard pointer rather than maintaining their own arch-specific pointers for the same purpose. Various architectures are converted to using this new feature. 2) Conversion of ARM timer implementations to use clock_event_devices's suspend/resume operations, rather than the ARM-specific sys_timer versions. Thus, the ARM code begins to use more common infra-structure rather than arch-specific code. 3) Removal of ARM's struct sys_timer completely, now that everything uses common code. 4) Introduction of drivers/clocksource/clksrc-of.c, which allows ARM clock source implementations to be moved into drivers/clocksource, with the need to add SoC-specific header files for each timer initialization function; instead, all enabled implementations are registered into a table which a single core function iterates over, and calls the relevant initialization functions based on device tree. At least the Tegra and BCM2835 clocksource implementations will use this feature in the 3.9 kernel cycle. * tag 'swarren-for-3.9-arm-timer-rework' of git://git.kernel.org/pub/scm/linux/kernel/git/swarren/linux-tegra: clocksource: add common of_clksrc_init() function ARM: delete struct sys_timer ARM: remove struct sys_timer suspend and resume fields ARM: samsung: register syscore_ops for timer resume directly ARM: ux500: convert timer suspend/resume to clock_event_device ARM: sa1100: convert timer suspend/resume to clock_event_device ARM: pxa: convert timer suspend/resume to clock_event_device ARM: at91: convert timer suspend/resume to clock_event_device ARM: set arch_gettimeoffset directly m68k: set arch_gettimeoffset directly time: convert arch_gettimeoffset to a pointer cris: move usec/nsec conversion to do_slow_gettimeoffset Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/time/timekeeping.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index cbc6acb0db3f..8ed934601587 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -135,6 +135,20 @@ static void tk_setup_internals(struct timekeeper *tk, struct clocksource *clock)
}
/* Timekeeper helper functions. */
+
+#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
+u32 (*arch_gettimeoffset)(void);
+
+u32 get_arch_timeoffset(void)
+{
+ if (likely(arch_gettimeoffset))
+ return arch_gettimeoffset();
+ return 0;
+}
+#else
+static inline u32 get_arch_timeoffset(void) { return 0; }
+#endif
+
static inline s64 timekeeping_get_ns(struct timekeeper *tk)
{
cycle_t cycle_now, cycle_delta;
@@ -151,8 +165,8 @@ static inline s64 timekeeping_get_ns(struct timekeeper *tk)
nsec = cycle_delta * tk->mult + tk->xtime_nsec;
nsec >>= tk->shift;
- /* If arch requires, add in gettimeoffset() */
- return nsec + arch_gettimeoffset();
+ /* If arch requires, add in get_arch_timeoffset() */
+ return nsec + get_arch_timeoffset();
}
static inline s64 timekeeping_get_ns_raw(struct timekeeper *tk)
@@ -171,8 +185,8 @@ static inline s64 timekeeping_get_ns_raw(struct timekeeper *tk)
/* convert delta to nanoseconds. */
nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift);
- /* If arch requires, add in gettimeoffset() */
- return nsec + arch_gettimeoffset();
+ /* If arch requires, add in get_arch_timeoffset() */
+ return nsec + get_arch_timeoffset();
}
static RAW_NOTIFIER_HEAD(pvclock_gtod_chain);
@@ -254,8 +268,8 @@ static void timekeeping_forward_now(struct timekeeper *tk)
tk->xtime_nsec += cycle_delta * tk->mult;
- /* If arch requires, add in gettimeoffset() */
- tk->xtime_nsec += (u64)arch_gettimeoffset() << tk->shift;
+ /* If arch requires, add in get_arch_timeoffset() */
+ tk->xtime_nsec += (u64)get_arch_timeoffset() << tk->shift;
tk_normalize_xtime(tk);