From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jean-Christophe PLAGNIOL-VILLARD Date: Sun, 4 Jan 2009 08:40:04 +0100 Subject: [U-Boot] [PATCH] IXP425: Fixing timer code Part 1/1 In-Reply-To: References: <49384728.LMggwd1oTzMugOAp%stefan.althoefer@web.de> <20081215232625.2BBDC832E8A1@gemini.denx.de> Message-ID: <20090104074004.GD6960@game.jcrosoft.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 > --- > 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 > > #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.