ARM: move read_{boot, persistent}_clock to the architecture level
Subsystems (3)
PATCH 1/1 ARM: move read_{boot, persistent}_clock to the architecture level
At the moment, read_persistent_clock is implemented at the platform level, which makes it impossible to compile these platforms in a single kernel.
Implement these two functions at the architecture level, and provide a thin registration interface for both read_boot_clock and read_persistent_clock. The two affected platforms (OMAP and Tegra) are converted at the same time.
Compile tested only.
--- arch/arm/include/asm/mach/time.h | 5 +++++ arch/arm/kernel/time.c | 36 ++++++++++++++++++++++++++++++++++++ arch/arm/mach-tegra/timer.c | 5 +++-- arch/arm/plat-omap/counter_32k.c | 6 ++++-- 4 files changed, 48 insertions(+), 4 deletions(-)
arch/arm/include/asm/mach/time.h +5 -0
@@ -42,4 +42,9 @@ struct sys_timer {extern void timer_tick (void ); +struct timespec ; +typedef void (*clock_access_fn )(struct timespec *); +extern int register_persistent_clock (clock_access_fn read_boot, +clock_access_fn read_persistent); +#endif
arch/arm/kernel/time.c +36 -0
@@ -110,6 +110,42 @@ void timer_tick(void) }#endif +static void dummy_clock_access (struct timespec *ts) +{ + ts->tv_sec =0 ; + ts->tv_nsec =0 ; +} + +static clock_access_fn __read_persistent_clock = dummy_clock_access; +static clock_access_fn __read_boot_clock = dummy_clock_access;; + +void read_persistent_clock (struct timespec *ts) +{ +__read_persistent_clock (ts); +} + +void read_boot_clock (struct timespec *ts) +{ +__read_boot_clock (ts); +} + +int __init register_persistent_clock (clock_access_fn read_boot, +clock_access_fn read_persistent) +{ +/* Only allow the clockaccess functions to be registered once */ +if (__read_persistent_clock == dummy_clock_access && + __read_boot_clock == dummy_clock_access) { +if (read_boot) + __read_boot_clock = read_boot; +if (read_persistent) + __read_persistent_clock = read_persistent; + +return 0 ; + } + +return -EINVAL ; +} +#if defined(CONFIG_PM ) && !defined(CONFIG_GENERIC_CLOCKEVENTS )static int timer_suspend (void ) {
arch/arm/mach-tegra/timer.c +3 -2
@@ -124,7 +124,7 @@ static u64 tegra_rtc_read_ms(void) }/* -* read_persistent_clock - Return time from a persistent clock. +* tegra_read_persistent_clock - Return time from a persistent clock. * * Reads the time from a source which isn't disabled during PM, the * 32k sync timer. Convert the cycles elapsed since last read into
@@ -133,7 +133,7 @@ static u64 tegra_rtc_read_ms(void)* tegra_rtc driver could be executing to avoid race conditions * on the RTC shadow register */ -void read_persistent_clock (struct timespec *ts) +static void tegra_read_persistent_clock (struct timespec *ts) {u64 delta;struct timespec *tsp = &persistent_ts;
@@ -243,6 +243,7 @@ static void __init tegra_init_timer(void) tegra_clockevent.irq = tegra_timer_irq.irq;clockevents_register_device (&tegra_clockevent);tegra_twd_init (); +register_persistent_clock (NULL , tegra_read_persistent_clock); }struct sys_timer tegra_timer = {
arch/arm/plat-omap/counter_32k.c +4 -2
@@ -19,6 +19,7 @@#include <linux/io.h> #include <linux/clocksource.h> +#include <asm/mach/time.h> #include <asm/sched_clock.h> #include <plat/hardware.h>
@@ -43,7 +44,7 @@ static u32 notrace omap_32k_read_sched_clock(void) }/** -* read_persistent_clock - Return time from a persistent clock. +* omap_read_persistent_clock - Return time from a persistent clock. * * Reads the time from a source which isn't disabled during PM, the * 32k sync timer. Convert the cycles elapsed since last read into
@@ -52,7 +53,7 @@ static u32 notrace omap_32k_read_sched_clock(void)static struct timespec persistent_ts;static cycles_t cycles, last_cycles;static unsigned int persistent_mult, persistent_shift; -void read_persistent_clock (struct timespec *ts) +static void omap_read_persistent_clock (struct timespec *ts) {unsigned long long nsecs;cycles_t delta;
@@ -116,6 +117,7 @@ int __init omap_init_clocksource_32k(void)printk (err,"32k_counter" );setup_sched_clock (omap_32k_read_sched_clock,32 ,32768 ); +register_persistent_clock (NULL , omap_read_persistent_clock); }return 0 ; }
Signature · 1 line
1.7.10
PATCH 1/1 ARM: move read_{boot, persistent}_clock to the architecture level
Quoted 9 lines · Marc Zyngier
At the moment,
read_persistent_clockis implemented at the platform level, which makes it impossible to compile these platforms in a single kernel.Implement these two functions at the architecture level, and provide a thin registration interface for both
read_boot_clockandread_persistent_clock. The two affected platforms (OMAP and Tegra) are converted at the same time.
Quoted 6 lines
Compile tested only.
Reported-by Jeff Ohlstein <[email protected]>Cc Stephen Warren <[email protected]>Cc Tony Lindgren <[email protected]>Signed-off-by Marc Zyngier <[email protected]>
I'm not sure exactly how to fully exercise this, but Tegra still boots without issue or obvious error messages with this patch applied.
PATCH 1/1 ARM: move read_{boot,persistent}_clock to the architecture level
In reply to Marc ZyngierQuoted 10 lines · Marc Zyngier
At the moment,
read_persistent_clockis implemented at the platform level, which makes it impossible to compile these platforms in a single kernel.Implement these two functions at the architecture level, and provide a thin registration interface for both
read_boot_clockandread_persistent_clock. The two affected platforms (OMAP and Tegra) are converted at the same time.Compile tested only.
Sorry I'm a bit behind with emails again..
Boot tested on omap1 and omap2/3/4:
PATCH 1/1 ARM: move read_{boot, persistent}_clock to the architecture level
In reply to Marc ZyngierQuoted 10 lines · Marc Zyngier
At the moment,
read_persistent_clockis implemented at the platform level, which makes it impossible to compile these platforms in a single kernel.Implement these two functions at the architecture level, and provide a thin registration interface for both
read_boot_clockandread_persistent_clock. The two affected platforms (OMAP and Tegra) are converted at the same time.Compile tested only.
As this now has tested-bys for OMAP and Tegra, I guess it's ready. Who's planning to take this?
PATCH 1/1 ARM: move read_{boot, persistent}_clock to the architecture level
Quoted 5 lines · Russell King - ARM Linux
Quoted 4 lines · Marc Zyngier
At the moment,
read_persistent_clockis implemented at the platform level, which makes it impossible to compile these platforms in a single kernel.
Quoted 8 lines
Quoted 6 lines
Implement these two functions at the architecture level, and provide a thin registration interface for both
read_boot_clockandread_persistent_clock. The two affected platforms (OMAP and Tegra) are converted at the same time.Compile tested only.
As this now has tested-bys for OMAP and Tegra, I guess it's ready.
Who's
Quoted 1 line
planning to take this?
If you're happy to take it, and unless someone objects to it, I'll put it in the patch system.
Thanks Stephen and Tony for testing it.
M.
Signature · 1 line
Fast, cheap, reliable. Pick two.
PATCH 1/1 ARM: move read_{boot, persistent}_clock to the architecture level
Quoted 12 lines · Marc Zyngier
Quoted 10 lines · Russell King - ARM Linux
Quoted 9 lines · Marc Zyngier
At the moment,
read_persistent_clockis implemented at the platform level, which makes it impossible to compile these platforms in a single kernel.Implement these two functions at the architecture level, and provide a thin registration interface for both
read_boot_clockandread_persistent_clock. The two affected platforms (OMAP and Tegra) are converted at the same time.
Quoted 8 lines
Quoted 3 lines
Quoted 1 line
Compile tested only.
As this now has tested-bys for OMAP and Tegra, I guess it's ready.
Who's
Quoted 1 line
planning to take this?
If you're happy to take it, and unless someone objects to it, I'll put it in the patch system.
Sure.