From 7c552b7d11aade329dabf582f971e57485e79991 Mon Sep 17 00:00:00 2001 From: Marc Zyngier Date: Mon, 16 Jan 2012 11:44:12 +0000 Subject: [PATCH] --- yaml --- r: 297626 b: refs/heads/master c: bc8d849d9171a2014f8e9b0322f3ac5af9d3f2b2 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/arm/Kconfig | 1 + trunk/arch/arm/mach-prima2/timer.c | 21 +++++++-------------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index 629dcb056add..0b7af85d1fd0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 30c9c5b157b70d0a2f1fd0f37b936e63bade0d58 +refs/heads/master: bc8d849d9171a2014f8e9b0322f3ac5af9d3f2b2 diff --git a/trunk/arch/arm/Kconfig b/trunk/arch/arm/Kconfig index cb757342a662..a18550ee2f28 100644 --- a/trunk/arch/arm/Kconfig +++ b/trunk/arch/arm/Kconfig @@ -388,6 +388,7 @@ config ARCH_PRIMA2 select GENERIC_CLOCKEVENTS select CLKDEV_LOOKUP select GENERIC_IRQ_CHIP + select HAVE_SCHED_CLOCK select MIGHT_HAVE_CACHE_L2X0 select USE_OF select ZONE_DMA diff --git a/trunk/arch/arm/mach-prima2/timer.c b/trunk/arch/arm/mach-prima2/timer.c index b7a6091ce791..0d024b1e916d 100644 --- a/trunk/arch/arm/mach-prima2/timer.c +++ b/trunk/arch/arm/mach-prima2/timer.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #define SIRFSOC_TIMER_COUNTER_LO 0x0000 @@ -165,21 +166,9 @@ static struct irqaction sirfsoc_timer_irq = { }; /* Overwrite weak default sched_clock with more precise one */ -unsigned long long notrace sched_clock(void) +static u32 notrace sirfsoc_read_sched_clock(void) { - static int is_mapped; - - /* - * sched_clock is called earlier than .init of sys_timer - * if we map timer memory in .init of sys_timer, system - * will panic due to illegal memory access - */ - if (!is_mapped) { - sirfsoc_of_timer_map(); - is_mapped = 1; - } - - return sirfsoc_timer_read(NULL) * (NSEC_PER_SEC / CLOCK_TICK_RATE); + return (u32)(sirfsoc_timer_read(NULL) & 0xffffffff); } static void __init sirfsoc_clockevent_init(void) @@ -210,6 +199,8 @@ static void __init sirfsoc_timer_init(void) BUG_ON(rate < CLOCK_TICK_RATE); BUG_ON(rate % CLOCK_TICK_RATE); + sirfsoc_of_timer_map(); + writel_relaxed(rate / CLOCK_TICK_RATE / 2 - 1, sirfsoc_timer_base + SIRFSOC_TIMER_DIV); writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO); writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI); @@ -217,6 +208,8 @@ static void __init sirfsoc_timer_init(void) BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE)); + setup_sched_clock(sirfsoc_read_sched_clock, 32, CLOCK_TICK_RATE); + BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq)); sirfsoc_clockevent_init();