Commit b6e7ef4b authored by Rasmus Villemoes's avatar Rasmus Villemoes Committed by Stefano Babic
Browse files

ARM: mxs: spl_boot.c: make early_delay more robust

It's true that booting normally doesn't take long enough for the
register to roll (which actually happens in a little over an hour, not
just a few seconds). However, the counter starts at power-on, and if
the board is held in reset to be booted over USB, one actually risks
hitting wrap-around during boot, which can both result in too short
delays (if the "st += delay" calculation makes st small) and
theoretically also unbound delays (if st ends up being UINT_MAX and
one just misses sampling digctl_microseconds at that point).

It doesn't take more code to DTRT, and once bitten, twice shy.
Signed-off-by: default avatarRasmus Villemoes <>
parent b1278a8e
......@@ -25,9 +25,7 @@ static bd_t bdata __section(".data");
* This delay function is intended to be used only in early stage of boot, where
* clock are not set up yet. The timer used here is reset on every boot and
* takes a few seconds to roll. The boot doesn't take that long, so to keep the
* code simple, it doesn't take rolling into consideration.
* clock are not set up yet.
void early_delay(int delay)
......@@ -35,8 +33,7 @@ void early_delay(int delay)
(struct mxs_digctl_regs *)MXS_DIGCTL_BASE;
uint32_t st = readl(&digctl_regs->hw_digctl_microseconds);
st += delay;
while (st > readl(&digctl_regs->hw_digctl_microseconds))
while (readl(&digctl_regs->hw_digctl_microseconds) - st <= delay)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment