|
|
|
@ -8,8 +8,6 @@ |
|
|
|
|
#include <asm/io.h> |
|
|
|
|
#include <asm/arch/timer.h> |
|
|
|
|
|
|
|
|
|
DECLARE_GLOBAL_DATA_PTR; |
|
|
|
|
|
|
|
|
|
static const struct socfpga_timer *timer_base = (void *)CONFIG_SYS_TIMERBASE; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -22,73 +20,3 @@ int timer_init(void) |
|
|
|
|
writel(readl(&timer_base->ctrl) | 0x3, &timer_base->ctrl); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static u32 read_timer(void) |
|
|
|
|
{ |
|
|
|
|
return readl(&timer_base->curr_val); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Delay x useconds |
|
|
|
|
*/ |
|
|
|
|
void __udelay(unsigned long usec) |
|
|
|
|
{ |
|
|
|
|
unsigned long now, last; |
|
|
|
|
/*
|
|
|
|
|
* get the tmo value based on timer clock speed |
|
|
|
|
* tmo = delay required / period of timer clock |
|
|
|
|
*/ |
|
|
|
|
long tmo = usec * CONFIG_TIMER_CLOCK_KHZ / 1000; |
|
|
|
|
|
|
|
|
|
last = read_timer(); |
|
|
|
|
while (tmo > 0) { |
|
|
|
|
now = read_timer(); |
|
|
|
|
if (last >= now) |
|
|
|
|
/* normal mode (non roll) */ |
|
|
|
|
tmo -= last - now; |
|
|
|
|
else |
|
|
|
|
/* we have overflow of the count down timer */ |
|
|
|
|
tmo -= TIMER_LOAD_VAL - last + now; |
|
|
|
|
last = now; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Get the timer value |
|
|
|
|
*/ |
|
|
|
|
ulong get_timer(ulong base) |
|
|
|
|
{ |
|
|
|
|
return get_timer_masked() - base; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Timer : get the time difference |
|
|
|
|
* Unit of tick is based on the CONFIG_SYS_HZ |
|
|
|
|
*/ |
|
|
|
|
ulong get_timer_masked(void) |
|
|
|
|
{ |
|
|
|
|
/* current tick value */ |
|
|
|
|
ulong now = read_timer() / (CONFIG_TIMER_CLOCK_KHZ/CONFIG_SYS_HZ); |
|
|
|
|
if (gd->arch.lastinc >= now) { |
|
|
|
|
/* normal mode (non roll) */ |
|
|
|
|
/* move stamp forward with absolute diff ticks */ |
|
|
|
|
gd->arch.tbl += gd->arch.lastinc - now; |
|
|
|
|
} else { |
|
|
|
|
/* we have overflow of the count down timer */ |
|
|
|
|
gd->arch.tbl += TIMER_LOAD_VAL - gd->arch.lastinc + now; |
|
|
|
|
} |
|
|
|
|
gd->arch.lastinc = now; |
|
|
|
|
return gd->arch.tbl; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Reset the timer |
|
|
|
|
*/ |
|
|
|
|
void reset_timer(void) |
|
|
|
|
{ |
|
|
|
|
/* capture current decrementer value time */ |
|
|
|
|
gd->arch.lastinc = read_timer() / |
|
|
|
|
(CONFIG_TIMER_CLOCK_KHZ / CONFIG_SYS_HZ); |
|
|
|
|
/* start "advancing" time stamp from 0 */ |
|
|
|
|
gd->arch.tbl = 0; |
|
|
|
|
} |
|
|
|
|