On 20:08 Sun 21 Dec , Stefan Althoefer wrote: > This fixes bugs in non-interupt timer code for IXP425 > > Fixed udelay() implementation to be more accurate. > The timing error of udelay() was caused by > too much looping overhead. The actual timing routine > was called repeatedly for each microsecond. When > bigger slices are used, it becomes more accurate. > CONFIG_SYS_TIMER_CLK_FREQ can be set by config file > if clock speed differs from IXP425 default (66,666MHz). > > Fixed get_timer() to return correct time in units > of CONFIG_SYS_HZ. The code now works for times > in execess of 64 seconds (the timer overflow > limit), assumed get_timer() is called with a period > < 64 seconds. > > do_sleep() now works correctly. >
some general comments please check the coding style and please use the readx/writex accessors > Signed-off-by: Stefan Althoefer <stefan.althoe...@web.de> > --- > cpu/ixp/timer.c | 64 > ++++++++++++++++++++++++++++++++++++++++++------------- > 1 files changed, 49 insertions(+), 15 deletions(-) > > diff --git a/cpu/ixp/timer.c b/cpu/ixp/timer.c > index 09d8ad5..d30adbc 100644 > --- a/cpu/ixp/timer.c > +++ b/cpu/ixp/timer.c > @@ -33,18 +33,28 @@ > #include <asm/arch/ixp425.h> > > #ifndef CONFIG_USE_IRQ > + > +#ifndef CONFIG_SYS_TIMER_CLK_FREQ > +#define CONFIG_SYS_TIMER_CLK_FREQ 66666666 > +#endif > + > ulong get_timer (ulong base) > { > - return get_timer_masked () - base; > + return get_timer_masked () - base; > } > > -void ixp425_udelay(unsigned long usec) > +/* udelay uses timer 1 */ > + > +void ixp425_udelay (unsigned long usec) > { > /* > * This function has a max usec, but since it is called from udelay > * we should not have to worry... be happy > */ > - unsigned long usecs = CONFIG_SYS_HZ/1000000L & ~IXP425_OST_RELOAD_MASK; > + unsigned long usecs = CONFIG_SYS_TIMER_CLK_FREQ/1000000L please add a space before and after '/' > + & ~IXP425_OST_RELOAD_MASK; > + > + usecs *= usec; > > *IXP425_OSST = IXP425_OSST_TIMER_1_PEND; > usecs |= IXP425_OST_ONE_SHOT | IXP425_OST_ENABLE; > @@ -54,30 +64,54 @@ void ixp425_udelay(unsigned long usec) > > void udelay (unsigned long usec) > { > - while (usec--) ixp425_udelay(1); > + /* ipx425_udelay has big overhead, so call it in bigger slices */ > + while (usec>1000) { please add a space before and after '>' > + ixp425_udelay (1000); > + usec -= 1000; > + } > + /* and now the rest */ > + ixp425_udelay (usec); > } > Best Regards, J. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot