Skip to content
Snippets Groups Projects
Commit d54cc007 authored by David Andrey's avatar David Andrey Committed by Michal Simek
Browse files

arm: zynq: U-Boot udelay < 1000 FIX


Rework the __udelay function of U-Boot Zynq Arch to handle
delay < 1000 usec

Signed-off-by: default avatarDavid Andrey <david.andrey@netmodule.com>
Signed-off-by: default avatarMichal Simek <michal.simek@xilinx.com>
Reviewed-by: default avatarTom Rini <trini@ti.com>
parent d10f68ae
No related branches found
No related tags found
No related merge requests found
......@@ -114,15 +114,43 @@ ulong get_timer_masked(void)
void __udelay(unsigned long usec)
{
unsigned long long tmp;
ulong tmo;
tmo = usec / (1000000 / CONFIG_SYS_HZ);
tmp = get_ticks() + tmo; /* Get current timestamp */
while (get_ticks() < tmp) { /* Loop till event */
/* NOP */;
}
u32 countticks;
u32 timeend;
u32 timediff;
u32 timenow;
if (usec == 0)
return;
countticks = (u32) (((unsigned long long) TIMER_TICK_HZ * usec) /
1000000);
/* decrementing timer */
timeend = readl(&timer_base->counter) - countticks;
#if TIMER_LOAD_VAL != 0xFFFFFFFF
/* do not manage multiple overflow */
if (countticks >= TIMER_LOAD_VAL)
countticks = TIMER_LOAD_VAL - 1;
#endif
do {
timenow = readl(&timer_base->counter);
if (timenow >= timeend) {
/* normal case */
timediff = timenow - timeend;
} else {
if ((TIMER_LOAD_VAL - timeend + timenow) <=
countticks) {
/* overflow */
timediff = TIMER_LOAD_VAL - timeend + timenow;
} else {
/* missed the exact match */
break;
}
}
} while (timediff > 0);
}
/* Timer without interrupts */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment