diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2009-06-04 10:06:47 (GMT) |
---|---|---|
committer | Nobuhiro Iwamatsu <iwamatsu@nigauri.org> | 2009-07-08 02:43:15 (GMT) |
commit | 8dd29c87ba370072a8464b8cc19e0a1e6e0497b4 (patch) | |
tree | 628a823a6a796d0c40f21a67c2c0b45f55447f51 /lib_sh/time.c | |
parent | add380f51f34ed1e2678c2abac8d53c91d652f26 (diff) | |
download | u-boot-8dd29c87ba370072a8464b8cc19e0a1e6e0497b4.tar.xz |
sh3/sh4: fix CONFIG_SYS_HZ to 1000
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Diffstat (limited to 'lib_sh/time.c')
-rw-r--r-- | lib_sh/time.c | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/lib_sh/time.c b/lib_sh/time.c index 8fccce3..dc1c57e 100644 --- a/lib_sh/time.c +++ b/lib_sh/time.c @@ -1,4 +1,7 @@ /* + * (C) Copyright 2009 + * Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * * (C) Copyright 2007-2008 * Nobobuhiro Iwamatsu <iwamatsu@nigauri.org> * @@ -25,11 +28,30 @@ */ #include <common.h> +#include <div64.h> #include <asm/processor.h> +#include <asm/clk.h> #include <asm/io.h> #define TMU_MAX_COUNTER (~0UL) -static int clk_adj = 1; + +static ulong timer_freq; + +static inline unsigned long long tick_to_time(unsigned long long tick) +{ + tick *= CONFIG_SYS_HZ; + do_div(tick, timer_freq); + + return tick; +} + +static inline unsigned long long usec_to_tick(unsigned long long usec) +{ + usec *= timer_freq; + do_div(usec, 1000000); + + return usec; +} static void tmu_timer_start (unsigned int timer) { @@ -65,15 +87,12 @@ int timer_init (void) break; case 4: default: - bit = 0; break; } writew(readw(TCR0) | bit, TCR0); - /* Clock adjustment calc */ - clk_adj = (int)(1.0 / ((1.0 / CONFIG_SYS_HZ) * 1000000)); - if (clk_adj < 1) - clk_adj = 1; + /* Calc clock rate */ + timer_freq = get_tmu0_clk_rate() >> ((bit + 1) * 2); tmu_timer_stop(0); tmu_timer_start(0); @@ -86,24 +105,22 @@ unsigned long long get_ticks (void) return 0 - readl(TCNT0); } -static unsigned long get_usec (void) -{ - return (0 - readl(TCNT0)); -} - void udelay (unsigned long usec) { - unsigned int start = get_usec(); - unsigned int end = start + (usec * clk_adj); + unsigned long long tmp; + ulong tmo; + + tmo = usec_to_tick(usec); + tmp = get_ticks() + tmo; /* get current timestamp */ - while (get_usec() < end) - continue; + while (get_ticks() < tmp) /* loop till event */ + /*NOP*/; } unsigned long get_timer (unsigned long base) { /* return msec */ - return ((get_usec() / clk_adj) / 1000) - base; + return tick_to_time(get_ticks()) - base; } void set_timer (unsigned long t) @@ -120,5 +137,5 @@ void reset_timer (void) unsigned long get_tbclk (void) { - return CONFIG_SYS_HZ; + return timer_freq; } |