|
@@ -18,6 +18,7 @@
|
|
|
#include <linux/of.h>
|
|
|
#include <linux/of_address.h>
|
|
|
#include <mach/map.h>
|
|
|
+#include <asm/sched_clock.h>
|
|
|
#include <asm/mach/time.h>
|
|
|
|
|
|
#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();
|