Hello Andrew,

Thank you for reviewing. It's always good to see somebody taking the time and effort to improve the code. Though by the level of broken-ness it seems nobody is actually using U-Boot on the MIPS platform anymore, except for us. The timer was broken, the whole GTH2 board support is broken and the other boards are full of warnings...


> Why did you change the while loop and add the rollover code?  The old code:
> -   while ((ulong)((mips_count_get() - start)) < tmo)
> -      /*NOP*/;
> seems perfectly sane to me and should work whether or not you use
> read_32bit_cp0_register(CP0_COUNT) or mips_count_get() assuming tmo
> gets set correctly.


I have to dig deep for that; It's almost a year ago since I changed that. It may be an Obi Wan, but whatever the problem was, this implementation is perectly sane too ;-)

> Is this something NXP specific?

No, it's MIPS specific: There's no use for a 'mips_count_get'-function. The proper way to read the count register is to use the already available function 'read_32bit_cp0_register', because the count register is just another MIPS coprocessor 0 register.

> In udelay() I don't like this part that silently truncates delays.
> This could lead to some ugly hard to find timing bugs.
>
> +   /* Safeguard for too-long delays */
> +   if (delayTicks >= 0x80000000)
> +      delayTicks = 0x7FFFFFFF;

Well, it still beats the previous implementation that allowed a wrap-around, resulting in a much shorter delay than desired. And with no error logging in place, truncating is the only thing that could be done.

> I would calculate the max. count you can handle in the code and run
> the timer polling loop multiple times if need be.

We're talking about delays of over 35 seconds being truncated. I think it's hardly worth the extra code to support such long delays in a function called 'udelay'. People using it for delays that long have other problems.

> long lines

> might be a good idea to throw in a compile time warning message if
> CFG_HZ != 1000

No, I'm sorry; I can't put a warning everywhere people might make a mistake ;-). Besides that, this would have to be global warning, covering all targets. If such a check would be desired, a mechanism should be implemented for that, which could also check other commonly made mistakes. But I'd rather suggest people to read the manual ;-)

With kind regards,

Robert.