|
|
|
@ -73,25 +73,25 @@ void set_timer (ulong t) |
|
|
|
|
timestamp = t; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* delay x useconds AND perserve advance timstamp value */ |
|
|
|
|
/* delay x useconds AND preserve advance timestamp value */ |
|
|
|
|
void __udelay (unsigned long usec) |
|
|
|
|
{ |
|
|
|
|
ulong tmo, tmp; |
|
|
|
|
|
|
|
|
|
if (usec >= 1000) { /* if "big" number, spread normalization to seconds */ |
|
|
|
|
tmo = usec / 1000; /* start to normalize for usec to ticks per sec */ |
|
|
|
|
tmo *= CONFIG_SYS_HZ; /* find number of "ticks" to wait to achieve target */ |
|
|
|
|
tmo /= 1000; /* finish normalize. */ |
|
|
|
|
} else { /* else small number, don't kill it prior to HZ multiply */ |
|
|
|
|
if (usec >= 1000) { /* if "big" number, spread normalization to seconds */ |
|
|
|
|
tmo = usec / 1000; /* start to normalize for usec to ticks per sec */ |
|
|
|
|
tmo *= CONFIG_SYS_HZ; /* find number of "ticks" to wait to achieve target */ |
|
|
|
|
tmo /= 1000; /* finish normalize. */ |
|
|
|
|
} else { /* else small number, don't kill it prior to HZ multiply */ |
|
|
|
|
tmo = usec * CONFIG_SYS_HZ; |
|
|
|
|
tmo /= (1000*1000); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
tmp = get_timer (0); /* get current timestamp */ |
|
|
|
|
if ( (tmo + tmp + 1) < tmp )/* if setting this forward will roll time stamp */ |
|
|
|
|
if ( (tmo + tmp + 1) < tmp ) /* if setting this forward will roll time stamp */ |
|
|
|
|
reset_timer_masked (); /* reset "advancing" timestamp to 0, set lastinc value */ |
|
|
|
|
else |
|
|
|
|
tmo += tmp; /* else, set advancing stamp wake up time */ |
|
|
|
|
tmo += tmp; /* else, set advancing stamp wake up time */ |
|
|
|
|
while (get_timer_masked () < tmo)/* loop till event */ |
|
|
|
|
/*NOP*/; |
|
|
|
|
} |
|
|
|
@ -100,16 +100,16 @@ void reset_timer_masked (void) |
|
|
|
|
{ |
|
|
|
|
/* reset time */ |
|
|
|
|
lastinc = READ_TIMER; /* capture current incrementer value time */ |
|
|
|
|
timestamp = 0; /* start "advancing" time stamp from 0 */ |
|
|
|
|
timestamp = 0; /* start "advancing" time stamp from 0 */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ulong get_timer_masked (void) |
|
|
|
|
{ |
|
|
|
|
ulong now = READ_TIMER; /* current tick value */ |
|
|
|
|
|
|
|
|
|
if (now >= lastinc) /* normal mode (non roll) */ |
|
|
|
|
if (now >= lastinc) /* normal mode (non roll) */ |
|
|
|
|
timestamp += (now - lastinc); /* move stamp fordward with absoulte diff ticks */ |
|
|
|
|
else /* we have rollover of incrementer */ |
|
|
|
|
else /* we have rollover of incrementer */ |
|
|
|
|
timestamp += (0xFFFFFFFF - lastinc) + now; |
|
|
|
|
lastinc = now; |
|
|
|
|
return timestamp; |
|
|
|
|