diff options
author | Andreas Gaeer <Andreas.Gaer@baslerweb.com> | 2010-10-06 04:38:55 -0400 |
---|---|---|
committer | Kevin Hilman <khilman@deeprootsystems.com> | 2010-12-10 10:33:49 -0500 |
commit | 6d1c57c84cc474a0fa63aadaa260b13dc5c7d68b (patch) | |
tree | 5ce151dd60a963883ff738132e30c9adf590030c /arch/arm/mach-davinci/time.c | |
parent | cf7d7e5a1980d1116ee152d25dac382b112b9c17 (diff) |
davinci: Implement sched_clock()
Overwrite the default implementation of sched_clock that is based on
jiffies by something more precise. This improves timestamps in ftrace.
Implementation is copied from OMAP platform code.
Signed-off-by: Andreas Gaeer <Andreas.Gaer@baslerweb.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Diffstat (limited to 'arch/arm/mach-davinci/time.c')
-rw-r--r-- | arch/arm/mach-davinci/time.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/arch/arm/mach-davinci/time.c b/arch/arm/mach-davinci/time.c index 0f21c36e65dd..5d1eea026635 100644 --- a/arch/arm/mach-davinci/time.c +++ b/arch/arm/mach-davinci/time.c | |||
@@ -272,15 +272,36 @@ static cycle_t read_cycles(struct clocksource *cs) | |||
272 | return (cycles_t)timer32_read(t); | 272 | return (cycles_t)timer32_read(t); |
273 | } | 273 | } |
274 | 274 | ||
275 | /* | ||
276 | * Kernel assumes that sched_clock can be called early but may not have | ||
277 | * things ready yet. | ||
278 | */ | ||
279 | static cycle_t read_dummy(struct clocksource *cs) | ||
280 | { | ||
281 | return 0; | ||
282 | } | ||
283 | |||
284 | |||
275 | static struct clocksource clocksource_davinci = { | 285 | static struct clocksource clocksource_davinci = { |
276 | .rating = 300, | 286 | .rating = 300, |
277 | .read = read_cycles, | 287 | .read = read_dummy, |
278 | .mask = CLOCKSOURCE_MASK(32), | 288 | .mask = CLOCKSOURCE_MASK(32), |
279 | .shift = 24, | 289 | .shift = 24, |
280 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 290 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
281 | }; | 291 | }; |
282 | 292 | ||
283 | /* | 293 | /* |
294 | * Overwrite weak default sched_clock with something more precise | ||
295 | */ | ||
296 | unsigned long long notrace sched_clock(void) | ||
297 | { | ||
298 | const cycle_t cyc = clocksource_davinci.read(&clocksource_davinci); | ||
299 | |||
300 | return clocksource_cyc2ns(cyc, clocksource_davinci.mult, | ||
301 | clocksource_davinci.shift); | ||
302 | } | ||
303 | |||
304 | /* | ||
284 | * clockevent | 305 | * clockevent |
285 | */ | 306 | */ |
286 | static int davinci_set_next_event(unsigned long cycles, | 307 | static int davinci_set_next_event(unsigned long cycles, |
@@ -377,6 +398,7 @@ static void __init davinci_timer_init(void) | |||
377 | davinci_clock_tick_rate = clk_get_rate(timer_clk); | 398 | davinci_clock_tick_rate = clk_get_rate(timer_clk); |
378 | 399 | ||
379 | /* setup clocksource */ | 400 | /* setup clocksource */ |
401 | clocksource_davinci.read = read_cycles; | ||
380 | clocksource_davinci.name = id_to_name[clocksource_id]; | 402 | clocksource_davinci.name = id_to_name[clocksource_id]; |
381 | clocksource_davinci.mult = | 403 | clocksource_davinci.mult = |
382 | clocksource_khz2mult(davinci_clock_tick_rate/1000, | 404 | clocksource_khz2mult(davinci_clock_tick_rate/1000, |