diff options
Diffstat (limited to 'arch/sh/lib')
-rw-r--r-- | arch/sh/lib/time.c | 72 |
1 files changed, 31 insertions, 41 deletions
diff --git a/arch/sh/lib/time.c b/arch/sh/lib/time.c index a01596cace..2cc61ddcbb 100644 --- a/arch/sh/lib/time.c +++ b/arch/sh/lib/time.c @@ -2,7 +2,7 @@ * (C) Copyright 2009 * Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> * - * (C) Copyright 2007-2010 + * (C) Copyright 2007-2012 * Nobobuhiro Iwamatsu <iwamatsu@nigauri.org> * * (C) Copyright 2003 @@ -30,71 +30,54 @@ #include <common.h> #include <div64.h> #include <asm/processor.h> -#include <asm/clk.h> #include <asm/io.h> +#include <sh_tmu.h> -#define TMU_MAX_COUNTER (~0UL) +static struct tmu_regs *tmu = (struct tmu_regs *)TMU_BASE; -static ulong timer_freq; +static u16 bit; static unsigned long last_tcnt; static unsigned long long overflow_ticks; +unsigned long get_tbclk(void) +{ + return get_tmu0_clk_rate() >> ((bit + 1) * 2); +} + static inline unsigned long long tick_to_time(unsigned long long tick) { tick *= CONFIG_SYS_HZ; - do_div(tick, timer_freq); + do_div(tick, get_tbclk()); return tick; } static inline unsigned long long usec_to_tick(unsigned long long usec) { - usec *= timer_freq; + usec *= get_tbclk(); do_div(usec, 1000000); return usec; } -static void tmu_timer_start (unsigned int timer) +static void tmu_timer_start(unsigned int timer) { if (timer > 2) return; - writeb(readb(TSTR) | (1 << timer), TSTR); + writeb(readb(&tmu->tstr) | (1 << timer), &tmu->tstr); } -static void tmu_timer_stop (unsigned int timer) +static void tmu_timer_stop(unsigned int timer) { if (timer > 2) return; - writeb(readb(TSTR) & ~(1 << timer), TSTR); + writeb(readb(&tmu->tstr) & ~(1 << timer), &tmu->tstr); } -int timer_init (void) +int timer_init(void) { - /* Divide clock by CONFIG_SYS_TMU_CLK_DIV */ - u16 bit = 0; - - switch (CONFIG_SYS_TMU_CLK_DIV) { - case 1024: - bit = 4; - break; - case 256: - bit = 3; - break; - case 64: - bit = 2; - break; - case 16: - bit = 1; - break; - case 4: - default: - break; - } - writew(readw(TCR0) | bit, TCR0); - - /* Calc clock rate */ - timer_freq = get_tmu0_clk_rate() >> ((bit + 1) * 2); + bit = (ffs(CONFIG_SYS_TMU_CLK_DIV) >> 1) - 1; + writew(readw(&tmu->tcr0) | bit, &tmu->tcr0); tmu_timer_stop(0); tmu_timer_start(0); @@ -105,9 +88,9 @@ int timer_init (void) return 0; } -unsigned long long get_ticks (void) +unsigned long long get_ticks(void) { - unsigned long tcnt = 0 - readl(TCNT0); + unsigned long tcnt = 0 - readl(&tmu->tcnt0); if (last_tcnt > tcnt) /* overflow */ overflow_ticks++; @@ -116,7 +99,7 @@ unsigned long long get_ticks (void) return (overflow_ticks << 32) | tcnt; } -void __udelay (unsigned long usec) +void __udelay(unsigned long usec) { unsigned long long tmp; ulong tmo; @@ -128,13 +111,20 @@ void __udelay (unsigned long usec) /*NOP*/; } -unsigned long get_timer (unsigned long base) +unsigned long get_timer(unsigned long base) { /* return msec */ return tick_to_time(get_ticks()) - base; } -unsigned long get_tbclk (void) +void set_timer(unsigned long t) +{ + writel((0 - t), &tmu->tcnt0); +} + +void reset_timer(void) { - return timer_freq; + tmu_timer_stop(0); + set_timer(0); + tmu_timer_start(0); } |