From: Sebastian Siewior Date: Mon, 28 Apr 2008 09:43:03 +0000 (+0200) Subject: m68knommu: add sched_clock() for the DMA timer X-Git-Tag: v2.6.27-rc1~519^2~8 X-Git-Url: http://www.pilppa.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=5bed10a5ee272fbf18ce0ce764245bbb8f28e2e6;p=linux-2.6-omap-h63xx.git m68knommu: add sched_clock() for the DMA timer with this printk() and other sched_clock() user use the more precise timestamps. The highly optimized math is from arch/x86/kernel/tsc_32.c. Signed-off-by: Sebastian Siewior Signed-off-by: Greg Ungerer --- diff --git a/arch/m68knommu/platform/coldfire/dma_timer.c b/arch/m68knommu/platform/coldfire/dma_timer.c index b623c993219..772578b1084 100644 --- a/arch/m68knommu/platform/coldfire/dma_timer.c +++ b/arch/m68knommu/platform/coldfire/dma_timer.c @@ -66,3 +66,19 @@ static int __init init_cf_dt_clocksource(void) } arch_initcall(init_cf_dt_clocksource); + +#define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */ +#define CYC2NS_SCALE ((1000000 << CYC2NS_SCALE_FACTOR) / (DMA_FREQ / 1000)) + +static unsigned long long cycles2ns(unsigned long cycl) +{ + return (unsigned long long) ((unsigned long long)cycl * + CYC2NS_SCALE) >> CYC2NS_SCALE_FACTOR; +} + +unsigned long long sched_clock(void) +{ + unsigned long cycl = __raw_readl(DTCN0); + + return cycles2ns(cycl); +}