[U-Boot] [PATCH-ARM] CONFIG_SYS_HZ fix for ARM902T S3C24X0 Boards
Gary Jennejohn
garyj at denx.de
Mon Sep 7 13:44:57 CEST 2009
On Sat, 05 Sep 2009 16:33:13 +0100
"kevin.morfitt at fearnside-systems.co.uk" <kevin.morfitt at fearnside-systems.co.uk> wrote:
> This sets CONFIG_SYS_HZ to 1000 for all boards that use the s3c2400 and
> s3c2410 cpu's which fixes various problems such as the timeouts in tftp being
> too short.
>
> Tested on an Embest SBC2440-II Board with local u-boot patches as I don't
> have any s3c2400 or s3c2410 boards but need this patch applying before I can
> submit patches for the SBC2440-II Board. Also, ran MAKEALL for all ARM9 targets
> and no new warnings or errors were found.
>
> It was originally submitted on 21/06/2009 but didn't get into the 2009.08
> release, and Jean-Pierre made one comment on the original patch (see
> http://lists.denx.de/pipermail/u-boot/2009-July/055470.html). I've made two
> changes to the original patch:
> - it's been re-based to the current release
> - I've re-named get_timer_raw() to get_ticks() in response to Jean-Pierre's comment
>
> This affects the sbc2410, smdk2400, smdk2410 and trab boards. I've copied it
> directly to the maintainers of all except the sbc2410 which doesn't have an
> entry in MAINTAINERS.
>
> Signed-off-by: Kevin Morfitt <kmorfitt at aselaptop-1.localdomain>
> ---
> cpu/arm920t/s3c24x0/timer.c | 36 ++++++++++++++++++++----------------
> include/configs/sbc2410x.h | 4 +---
> include/configs/smdk2400.h | 4 +---
> include/configs/smdk2410.h | 4 +---
> include/configs/trab.h | 12 +-----------
> 5 files changed, 24 insertions(+), 36 deletions(-)
>
> diff --git a/cpu/arm920t/s3c24x0/timer.c b/cpu/arm920t/s3c24x0/timer.c
> index c8c7cdb..db472bf 100644
> --- a/cpu/arm920t/s3c24x0/timer.c
> +++ b/cpu/arm920t/s3c24x0/timer.c
> @@ -39,6 +39,7 @@
> #endif
>
> int timer_load_val = 0;
> +static ulong timer_clk;
>
> /* macro to read the 16 bit timer */
> static inline ulong READ_TIMER(void)
> @@ -66,6 +67,7 @@ int timer_init (void)
> * @33.25MHz and 15625 @ 50 MHz
> */
> timer_load_val = get_PCLK()/(2 * 16 * 100);
> + timer_clk = get_PCLK() / (2 * 16);
> }
> /* load value for 10 ms timeout */
> lastdec = timers->TCNTB4 = timer_load_val;
> @@ -100,13 +102,13 @@ void set_timer (ulong t)
> void udelay (unsigned long usec)
> {
> ulong tmo;
> - ulong start = get_timer(0);
> + ulong start = get_ticks();
>
> tmo = usec / 1000;
> tmo *= (timer_load_val * 100);
> tmo /= 1000;
>
> - while ((ulong)(get_timer_masked () - start) < tmo)
> + while ((ulong) (get_ticks() - start) < tmo)
> /*NOP*/;
> }
>
> @@ -119,18 +121,9 @@ void reset_timer_masked (void)
>
> ulong get_timer_masked (void)
> {
> - ulong now = READ_TIMER();
> -
> - if (lastdec >= now) {
> - /* normal mode */
> - timestamp += lastdec - now;
> - } else {
> - /* we have an overflow ... */
> - timestamp += lastdec + timer_load_val - now;
> - }
> - lastdec = now;
> + ulong tmr = get_ticks();
>
> - return timestamp;
> + return tmr / (timer_clk / CONFIG_SYS_HZ);
> }
>
> void udelay_masked (unsigned long usec)
> @@ -148,10 +141,10 @@ void udelay_masked (unsigned long usec)
> tmo /= (1000*1000);
> }
>
> - endtime = get_timer_masked () + tmo;
> + endtime = get_ticks() + tmo;
>
> do {
> - ulong now = get_timer_masked ();
> + ulong now = get_ticks();
> diff = endtime - now;
> } while (diff >= 0);
> }
> @@ -162,7 +155,18 @@ void udelay_masked (unsigned long usec)
> */
> unsigned long long get_ticks(void)
> {
> - return get_timer(0);
> + ulong now = READ_TIMER();
> +
> + if (lastdec >= now) {
> + /* normal mode */
> + timestamp += lastdec - now;
> + } else {
> + /* we have an overflow ... */
> + timestamp += lastdec + timer_load_val - now;
> + }
> + lastdec = now;
> +
> + return timestamp;
> }
>
> /*
> diff --git a/include/configs/sbc2410x.h b/include/configs/sbc2410x.h
> index f2ea926..e6886cf 100644
> --- a/include/configs/sbc2410x.h
> +++ b/include/configs/sbc2410x.h
> @@ -139,9 +139,7 @@
>
> #define CONFIG_SYS_LOAD_ADDR 0x33000000 /* default load address */
>
> -/* the PWM TImer 4 uses a counter of 15625 for 10 ms, so we need */
> -/* it to wrap 100 times (total 1562500) to get 1 sec. */
> -#define CONFIG_SYS_HZ 1562500
> +#define CONFIG_SYS_HZ 1000
>
> /* valid baudrates */
> #define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
> diff --git a/include/configs/smdk2400.h b/include/configs/smdk2400.h
> index c234177..a1beb65 100644
> --- a/include/configs/smdk2400.h
> +++ b/include/configs/smdk2400.h
> @@ -141,9 +141,7 @@
>
> #define CONFIG_SYS_LOAD_ADDR 0x0cf00000 /* default load address */
>
> -/* the PWM TImer 4 uses a counter of 15625 for 10 ms, so we need */
> -/* it to wrap 100 times (total 1562500) to get 1 sec. */
> -#define CONFIG_SYS_HZ 1562500
> +#define CONFIG_SYS_HZ 1000
>
> /* valid baudrates */
> #define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
> diff --git a/include/configs/smdk2410.h b/include/configs/smdk2410.h
> index d340098..c57751b 100644
> --- a/include/configs/smdk2410.h
> +++ b/include/configs/smdk2410.h
> @@ -124,9 +124,7 @@
>
> #define CONFIG_SYS_LOAD_ADDR 0x33000000 /* default load address */
>
> -/* the PWM TImer 4 uses a counter of 15625 for 10 ms, so we need */
> -/* it to wrap 100 times (total 1562500) to get 1 sec. */
> -#define CONFIG_SYS_HZ 1562500
> +#define CONFIG_SYS_HZ 1000
>
> /* valid baudrates */
> #define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
> diff --git a/include/configs/trab.h b/include/configs/trab.h
> index 43c191b..97f30ce 100644
> --- a/include/configs/trab.h
> +++ b/include/configs/trab.h
> @@ -320,17 +320,7 @@
>
> #define CONFIG_SYS_LOAD_ADDR 0x0CF00000 /* default load address */
>
> -#ifdef CONFIG_TRAB_50MHZ
> -/* the PWM TImer 4 uses a counter of 15625 for 10 ms, so we need */
> -/* it to wrap 100 times (total 1562500) to get 1 sec. */
> -/* this should _really_ be calculated !! */
> -#define CONFIG_SYS_HZ 1562500
> -#else
> -/* the PWM TImer 4 uses a counter of 10390 for 10 ms, so we need */
> -/* it to wrap 100 times (total 1039000) to get 1 sec. */
> -/* this should _really_ be calculated !! */
> -#define CONFIG_SYS_HZ 1039000
> -#endif
> +#define CONFIG_SYS_HZ 1000
>
> /* valid baudrates */
> #define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
> --
> 1.6.0.6
I don't have any hardware to test this on, but I strongly suspect that
your changes break get_tbclk() for SMDK2400 and TRAB.
It looks like the correct fix would be to remove all the idef's and
simply set tbclk = CONFIG_SYS_HZ for all boards in get_tbclk().
---
Gary Jennejohn
*********************************************************************
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
*********************************************************************
More information about the U-Boot
mailing list