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 a01596cac..2cc61ddcb 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)  { -	return timer_freq; +	writel((0 - t), &tmu->tcnt0); +} + +void reset_timer(void) +{ +	tmu_timer_stop(0); +	set_timer(0); +	tmu_timer_start(0);  } |