@ -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 ;
}