f6a579da9c
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
71 lines
1.4 KiB
C
71 lines
1.4 KiB
C
#include <common.h>
|
|
|
|
#include <mach/netx-regs.h>
|
|
|
|
int timer_init (void)
|
|
{
|
|
/* disable timer initially */
|
|
GPIO_REG(GPIO_COUNTER_CTRL(0)) = 0;
|
|
/* Reset the timer value to zero */
|
|
GPIO_REG(GPIO_COUNTER_CURRENT(0)) = 0;
|
|
GPIO_REG(GPIO_COUNTER_MAX(0)) = 0xffffffff;
|
|
GPIO_REG(GPIO_COUNTER_CTRL(0)) = COUNTER_CTRL_RUN;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* current timestamp in ms */
|
|
static unsigned long timestamp = 0;
|
|
|
|
static unsigned long last_timer = 0;
|
|
|
|
/* We can't detect overruns here since we don't know how often
|
|
* we get called. The only thing we can do is to make sure that
|
|
* time moves forward.
|
|
*/
|
|
ulong get_timer (ulong start)
|
|
{
|
|
unsigned long cur_timer = GPIO_REG(GPIO_COUNTER_CURRENT(0));
|
|
unsigned long time_inc;
|
|
|
|
|
|
if(cur_timer > last_timer)
|
|
time_inc = (cur_timer - last_timer) / 100000;
|
|
else
|
|
time_inc = ((0xffffffff - last_timer) + cur_timer) / 100000;
|
|
|
|
if(time_inc)
|
|
last_timer = cur_timer;
|
|
|
|
timestamp += time_inc;
|
|
|
|
return timestamp - start;
|
|
}
|
|
|
|
void mdelay(unsigned long msec)
|
|
{
|
|
unsigned long now = get_timer(0);
|
|
|
|
while( get_timer(0) < now + msec );
|
|
}
|
|
|
|
void udelay(unsigned long usec)
|
|
{
|
|
unsigned long start, end, msec = usec / 1000;
|
|
|
|
if(msec)
|
|
mdelay(msec);
|
|
|
|
usec -= msec * 1000;
|
|
|
|
start = GPIO_REG(GPIO_COUNTER_CURRENT(0));
|
|
end = start + usec * 100;
|
|
|
|
if(end < start) {
|
|
/* wait for overrun */
|
|
while( GPIO_REG(GPIO_COUNTER_CURRENT(0)) > start);
|
|
}
|
|
|
|
while( GPIO_REG(GPIO_COUNTER_CURRENT(0)) < end);
|
|
}
|