diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-versatile/core.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index 3b8576111c1..998b398df30 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/amba/bus.h> | 27 | #include <linux/amba/bus.h> |
28 | #include <linux/amba/clcd.h> | 28 | #include <linux/amba/clcd.h> |
29 | 29 | ||
30 | #include <asm/cnt32_to_63.h> | ||
30 | #include <asm/system.h> | 31 | #include <asm/system.h> |
31 | #include <asm/hardware.h> | 32 | #include <asm/hardware.h> |
32 | #include <asm/io.h> | 33 | #include <asm/io.h> |
@@ -228,14 +229,19 @@ void __init versatile_map_io(void) | |||
228 | 229 | ||
229 | /* | 230 | /* |
230 | * This is the Versatile sched_clock implementation. This has | 231 | * This is the Versatile sched_clock implementation. This has |
231 | * a resolution of 41.7ns, and a maximum value of about 179s. | 232 | * a resolution of 41.7ns, and a maximum value of about 35583 days. |
233 | * | ||
234 | * The return value is guaranteed to be monotonic in that range as | ||
235 | * long as there is always less than 89 seconds between successive | ||
236 | * calls to this function. | ||
232 | */ | 237 | */ |
233 | unsigned long long sched_clock(void) | 238 | unsigned long long sched_clock(void) |
234 | { | 239 | { |
235 | unsigned long long v; | 240 | unsigned long long v = cnt32_to_63(readl(VERSATILE_REFCOUNTER)); |
236 | 241 | ||
237 | v = (unsigned long long)readl(VERSATILE_REFCOUNTER) * 125; | 242 | /* the <<1 gets rid of the cnt_32_to_63 top bit saving on a bic insn */ |
238 | do_div(v, 3); | 243 | v *= 125<<1; |
244 | do_div(v, 3<<1); | ||
239 | 245 | ||
240 | return v; | 246 | return v; |
241 | } | 247 | } |