Re: [U-Boot] [PATCH v2 1/2] arm: a320 timer: move static data to global_data struct

2011-01-24 Thread Albert ARIBAUD
Le 20/12/2010 10:00, Po-Yu Chuang a écrit :
> From: Po-Yu Chuang
>
> timer.c used static data and are called before relocation.
> Move all static variables into global_data structure. Also cleanup
> timer.c from unused stubs and make it truly use 64 bit tick values.
>
> Based on Reinhard Meyer's patch
> 5dca710a3d7703e41da0e9894f2d71f9e25bea6b
>
> Signed-off-by: Po-Yu Chuang
> ---
> v2:
> rebase
> use gd->timer_rate_hz.
> remove unused global variable timestamp and lastdec.
> move register bases to local variables
>
>   arch/arm/cpu/arm920t/a320/timer.c |  147 
> ++---
>   1 files changed, 56 insertions(+), 91 deletions(-)
>
> diff --git a/arch/arm/cpu/arm920t/a320/timer.c 
> b/arch/arm/cpu/arm920t/a320/timer.c
> index d2e316f..5af94c2 100644
> --- a/arch/arm/cpu/arm920t/a320/timer.c
> +++ b/arch/arm/cpu/arm920t/a320/timer.c
> @@ -18,21 +18,36 @@
>*/
>
>   #include
> +#include
>   #include
>   #include
>   #include
>
> -static ulong timestamp;
> -static ulong lastdec;
> -
> -static struct fttmr010 *tmr = (struct fttmr010 *)CONFIG_FTTMR010_BASE;
> -static struct ftpmu010 *pmu = (struct ftpmu010 *)CONFIG_FTPMU010_BASE;
> +DECLARE_GLOBAL_DATA_PTR;
>
>   #define TIMER_CLOCK 32768
>   #define TIMER_LOAD_VAL  0x
>
> +static inline unsigned long long tick_to_time(unsigned long long tick)
> +{
> + tick *= CONFIG_SYS_HZ;
> + do_div(tick, gd->timer_rate_hz);
> +
> + return tick;
> +}
> +
> +static inline unsigned long long usec_to_tick(unsigned long long usec)
> +{
> + usec *= gd->timer_rate_hz;
> + do_div(usec, 100);
> +
> + return usec;
> +}
> +
>   int timer_init(void)
>   {
> + struct fttmr010 *tmr = (struct fttmr010 *)CONFIG_FTTMR010_BASE;
> + struct ftpmu010 *pmu = (struct ftpmu010 *)CONFIG_FTPMU010_BASE;
>   unsigned int oscc;
>   unsigned int cr;
>
> @@ -76,118 +91,68 @@ int timer_init(void)
>   cr |= FTTMR010_TM3_ENABLE;
>   writel(cr,&tmr->cr);
>
> - /* init the timestamp and lastdec value */
> - reset_timer_masked();
> + gd->timer_rate_hz = TIMER_CLOCK;
> + gd->tbu = gd->tbl = 0;
>
>   return 0;
>   }
>
>   /*
> - * timer without interrupts
> - */
> -
> -/*
> - * reset time
> + * Get the current 64 bit timer tick count
>*/
> -void reset_timer_masked(void)
> +unsigned long long get_ticks(void)
>   {
> - /* capure current decrementer value time */
> - lastdec = readl(&tmr->timer3_counter) / (TIMER_CLOCK / CONFIG_SYS_HZ);
> - timestamp = 0;  /* start "advancing" time stamp from 0 */
> -
> - debug("%s(): lastdec = %lx\n", __func__, lastdec);
> -}
> + struct fttmr010 *tmr = (struct fttmr010 *)CONFIG_FTTMR010_BASE;
> + ulong now = TIMER_LOAD_VAL - readl(&tmr->timer3_counter);
>
> -void reset_timer(void)
> -{
>   debug("%s()\n", __func__);
> - reset_timer_masked();
> -}
>
> -/*
> - * return timer ticks
> - */
> -ulong get_timer_masked(void)
> -{
> - /* current tick value */
> - ulong now = readl(&tmr->timer3_counter) / (TIMER_CLOCK / CONFIG_SYS_HZ);
> -
> - debug("%s(): now = %lx, lastdec = %lx\n", __func__, now, lastdec);
> -
> - if (lastdec>= now) {
> - /*
> -  * normal mode (non roll)
> -  * move stamp fordward with absoulte diff ticks
> -  */
> - timestamp += lastdec - now;
> - } else {
> - /*
> -  * we have overflow of the count down timer
> -  *
> -  * nts = ts + ld + (TLV - now)
> -  * ts=old stamp, ld=time that passed before passing through -1
> -  * (TLV-now) amount of time after passing though -1
> -  * nts = new "advancing time stamp"...it could also roll and
> -  * cause problems.
> -  */
> - timestamp += lastdec + TIMER_LOAD_VAL - now;
> - }
> -
> - lastdec = now;
> -
> - debug("%s() returns %lx\n", __func__, timestamp);
> -
> - return timestamp;
> -}
> -
> -/*
> - * return difference between timer ticks and base
> - */
> -ulong get_timer(ulong base)
> -{
> - debug("%s(%lx)\n", __func__, base);
> - return get_timer_masked() - base;
> -}
> -
> -void set_timer(ulong t)
> -{
> - debug("%s(%lx)\n", __func__, t);
> - timestamp = t;
> + /* increment tbu if tbl has rolled over */
> + if (now<  gd->tbl)
> + gd->tbu++;
> + gd->tbl = now;
> + return (((unsigned long long)gd->tbu)<<  32) | gd->tbl;
>   }
>
>   /* delay x useconds AND preserve advance timestamp value */
>   void __udelay(unsigned long usec)
>   {
> - long tmo = usec * (TIMER_CLOCK / 1000) / 1000;
> - unsigned long now, last = readl(&tmr->timer3_counter);
> -
> - debug("%s(%lu)\n", __func__, usec);
> - while (tmo>  0) {
> - now = readl(&tmr->timer3_counter);
> - if (now>  last) /* count down timer overflow */
> - tmo -= TIMER_LOAD_VAL + last - now;
> - else
>

Re: [U-Boot] [PATCH v2 1/2] arm: a320 timer: move static data to global_data struct

2011-01-18 Thread Po-Yu Chuang
Dear Wolfgang,

On Wed, Jan 19, 2011 at 5:45 AM, Wolfgang Denk  wrote:
> Dear Po-Yu Chuang,
> In message  you 
> wrote:
>> Would you please check this patch series?
>> Or should I rebase and resubmit?
>
> This is mostly in the responsibility of Albert, the ARM custodian.

Sorry, I didn't noticed that we have new custodian now.

Thanks,
Po-Yu Chuang
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v2 1/2] arm: a320 timer: move static data to global_data struct

2011-01-18 Thread Wolfgang Denk
Dear Po-Yu Chuang,

In message  you 
wrote:
> 
> > From: Po-Yu Chuang 
> >
> > timer.c used static data and are called before relocation.
> > Move all static variables into global_data structure. Also cleanup
> > timer.c from unused stubs and make it truly use 64 bit tick values.
...
> Would you please check this patch series?
> Or should I rebase and resubmit?

This is mostly in the responsibility of Albert, the ARM custodian.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
Presidency:  The greased pig in the field game of American politics.
- Ambrose Bierce
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v2 1/2] arm: a320 timer: move static data to global_data struct

2011-01-16 Thread Po-Yu Chuang
Dear Wolfgang,

On Mon, Dec 20, 2010 at 5:00 PM, Po-Yu Chuang  wrote:
> From: Po-Yu Chuang 
>
> timer.c used static data and are called before relocation.
> Move all static variables into global_data structure. Also cleanup
> timer.c from unused stubs and make it truly use 64 bit tick values.
>
> Based on Reinhard Meyer 's patch
> 5dca710a3d7703e41da0e9894f2d71f9e25bea6b
>
> Signed-off-by: Po-Yu Chuang 
> ---
> v2:
> rebase
> use gd->timer_rate_hz.
> remove unused global variable timestamp and lastdec.
> move register bases to local variables
>
>  arch/arm/cpu/arm920t/a320/timer.c |  147 
> ++---
>  1 files changed, 56 insertions(+), 91 deletions(-)

Would you please check this patch series?
Or should I rebase and resubmit?

best regards,
Po-Yu Chuang
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH v2 1/2] arm: a320 timer: move static data to global_data struct

2010-12-20 Thread Po-Yu Chuang
From: Po-Yu Chuang 

timer.c used static data and are called before relocation.
Move all static variables into global_data structure. Also cleanup
timer.c from unused stubs and make it truly use 64 bit tick values.

Based on Reinhard Meyer 's patch
5dca710a3d7703e41da0e9894f2d71f9e25bea6b

Signed-off-by: Po-Yu Chuang 
---
v2:
rebase
use gd->timer_rate_hz.
remove unused global variable timestamp and lastdec.
move register bases to local variables

 arch/arm/cpu/arm920t/a320/timer.c |  147 ++---
 1 files changed, 56 insertions(+), 91 deletions(-)

diff --git a/arch/arm/cpu/arm920t/a320/timer.c 
b/arch/arm/cpu/arm920t/a320/timer.c
index d2e316f..5af94c2 100644
--- a/arch/arm/cpu/arm920t/a320/timer.c
+++ b/arch/arm/cpu/arm920t/a320/timer.c
@@ -18,21 +18,36 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 #include 
 
-static ulong timestamp;
-static ulong lastdec;
-
-static struct fttmr010 *tmr = (struct fttmr010 *)CONFIG_FTTMR010_BASE;
-static struct ftpmu010 *pmu = (struct ftpmu010 *)CONFIG_FTPMU010_BASE;
+DECLARE_GLOBAL_DATA_PTR;
 
 #define TIMER_CLOCK32768
 #define TIMER_LOAD_VAL 0x
 
+static inline unsigned long long tick_to_time(unsigned long long tick)
+{
+   tick *= CONFIG_SYS_HZ;
+   do_div(tick, gd->timer_rate_hz);
+
+   return tick;
+}
+
+static inline unsigned long long usec_to_tick(unsigned long long usec)
+{
+   usec *= gd->timer_rate_hz;
+   do_div(usec, 100);
+
+   return usec;
+}
+
 int timer_init(void)
 {
+   struct fttmr010 *tmr = (struct fttmr010 *)CONFIG_FTTMR010_BASE;
+   struct ftpmu010 *pmu = (struct ftpmu010 *)CONFIG_FTPMU010_BASE;
unsigned int oscc;
unsigned int cr;
 
@@ -76,118 +91,68 @@ int timer_init(void)
cr |= FTTMR010_TM3_ENABLE;
writel(cr, &tmr->cr);
 
-   /* init the timestamp and lastdec value */
-   reset_timer_masked();
+   gd->timer_rate_hz = TIMER_CLOCK;
+   gd->tbu = gd->tbl = 0;
 
return 0;
 }
 
 /*
- * timer without interrupts
- */
-
-/*
- * reset time
+ * Get the current 64 bit timer tick count
  */
-void reset_timer_masked(void)
+unsigned long long get_ticks(void)
 {
-   /* capure current decrementer value time */
-   lastdec = readl(&tmr->timer3_counter) / (TIMER_CLOCK / CONFIG_SYS_HZ);
-   timestamp = 0;  /* start "advancing" time stamp from 0 */
-
-   debug("%s(): lastdec = %lx\n", __func__, lastdec);
-}
+   struct fttmr010 *tmr = (struct fttmr010 *)CONFIG_FTTMR010_BASE;
+   ulong now = TIMER_LOAD_VAL - readl(&tmr->timer3_counter);
 
-void reset_timer(void)
-{
debug("%s()\n", __func__);
-   reset_timer_masked();
-}
 
-/*
- * return timer ticks
- */
-ulong get_timer_masked(void)
-{
-   /* current tick value */
-   ulong now = readl(&tmr->timer3_counter) / (TIMER_CLOCK / CONFIG_SYS_HZ);
-
-   debug("%s(): now = %lx, lastdec = %lx\n", __func__, now, lastdec);
-
-   if (lastdec >= now) {
-   /*
-* normal mode (non roll)
-* move stamp fordward with absoulte diff ticks
-*/
-   timestamp += lastdec - now;
-   } else {
-   /*
-* we have overflow of the count down timer
-*
-* nts = ts + ld + (TLV - now)
-* ts=old stamp, ld=time that passed before passing through -1
-* (TLV-now) amount of time after passing though -1
-* nts = new "advancing time stamp"...it could also roll and
-* cause problems.
-*/
-   timestamp += lastdec + TIMER_LOAD_VAL - now;
-   }
-
-   lastdec = now;
-
-   debug("%s() returns %lx\n", __func__, timestamp);
-
-   return timestamp;
-}
-
-/*
- * return difference between timer ticks and base
- */
-ulong get_timer(ulong base)
-{
-   debug("%s(%lx)\n", __func__, base);
-   return get_timer_masked() - base;
-}
-
-void set_timer(ulong t)
-{
-   debug("%s(%lx)\n", __func__, t);
-   timestamp = t;
+   /* increment tbu if tbl has rolled over */
+   if (now < gd->tbl)
+   gd->tbu++;
+   gd->tbl = now;
+   return (((unsigned long long)gd->tbu) << 32) | gd->tbl;
 }
 
 /* delay x useconds AND preserve advance timestamp value */
 void __udelay(unsigned long usec)
 {
-   long tmo = usec * (TIMER_CLOCK / 1000) / 1000;
-   unsigned long now, last = readl(&tmr->timer3_counter);
-
-   debug("%s(%lu)\n", __func__, usec);
-   while (tmo > 0) {
-   now = readl(&tmr->timer3_counter);
-   if (now > last) /* count down timer overflow */
-   tmo -= TIMER_LOAD_VAL + last - now;
-   else
-   tmo -= last - now;
-   last = now;
-   }
+   unsigned long long tmp;
+   ulong tmo;
+
+   tmo = usec_to_tick(usec);
+   tmp = get_ticks() + tmo;/* get current timestamp */
+
+