mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-26 20:37:16 +00:00
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: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
This commit is contained in:
parent
b1278a8e3e
commit
b6e7ef4bf7
1 changed files with 2 additions and 5 deletions
|
@ -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
|
* 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
|
* clock are not set up yet.
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
void early_delay(int delay)
|
void early_delay(int delay)
|
||||||
{
|
{
|
||||||
|
@ -35,8 +33,7 @@ void early_delay(int delay)
|
||||||
(struct mxs_digctl_regs *)MXS_DIGCTL_BASE;
|
(struct mxs_digctl_regs *)MXS_DIGCTL_BASE;
|
||||||
|
|
||||||
uint32_t st = readl(&digctl_regs->hw_digctl_microseconds);
|
uint32_t st = readl(&digctl_regs->hw_digctl_microseconds);
|
||||||
st += delay;
|
while (readl(&digctl_regs->hw_digctl_microseconds) - st <= delay)
|
||||||
while (st > readl(&digctl_regs->hw_digctl_microseconds))
|
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue