Re: [U-Boot] [PATCH] fix s3c24x0 timer code

2011-12-06 Thread Albert ARIBAUD

Hi David,

Le 29/11/2010 16:33, "David Müller (ELSOFT AG)" a écrit :

Hello

The attached patch fixes the s3c24x0 timer code to work with the ARM
relocation feature.

Dave


Apparently this old patch never made it into the ARM tree... Can you 
rebase and resubmit?


Amicalement,
--
Albert.
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH] fix s3c24x0 timer code

2010-11-29 Thread David Müller (ELSOFT AG)
Hello

The attached patch fixes the s3c24x0 timer code to work with the ARM
relocation feature.

Dave

Signed-off-by: David Mueller 

diff --git a/arch/arm/cpu/arm920t/s3c24x0/timer.c 
b/arch/arm/cpu/arm920t/s3c24x0/timer.c
index 8cf9ff6..2903ba7 100644
--- a/arch/arm/cpu/arm920t/s3c24x0/timer.c
+++ b/arch/arm/cpu/arm920t/s3c24x0/timer.c
@@ -35,8 +35,7 @@
 #include 
 #include 
 
-int timer_load_val = 0;
-static ulong timer_clk;
+DECLARE_GLOBAL_DATA_PTR;
 
 /* macro to read the 16 bit timer */
 static inline ulong READ_TIMER(void)
@@ -46,9 +45,6 @@ static inline ulong READ_TIMER(void)
return readl(&timers->tcnto4) & 0x;
 }
 
-static ulong timestamp;
-static ulong lastdec;
-
 int timer_init(void)
 {
struct s3c24x0_timers *timers = s3c24x0_get_base_timers();
@@ -57,27 +53,27 @@ int timer_init(void)
/* use PWM Timer 4 because it has no output */
/* prescaler for Timer 4 is 16 */
writel(0x0f00, &timers->tcfg0);
-   if (timer_load_val == 0) {
+   if (gd->timer_load_val == 0) {
/*
 * for 10 ms clock period @ PCLK with 4 bit divider = 1/2
 * (default) and prescaler = 16. Should be 10390
 * @33.25MHz and 15625 @ 50 MHz
 */
-   timer_load_val = get_PCLK() / (2 * 16 * 100);
-   timer_clk = get_PCLK() / (2 * 16);
+   gd->timer_load_val = get_PCLK() / (2 * 16 * 100);
+   gd->timer_clk = get_PCLK() / (2 * 16);
}
/* load value for 10 ms timeout */
-   lastdec = timer_load_val;
-   writel(timer_load_val, &timers->tcntb4);
+   gd->lastdec = gd->timer_load_val;
+   writel(gd->timer_load_val, &timers->tcntb4);
/* auto load, manual update of timer 4 */
tmr = (readl(&timers->tcon) & ~0x070) | 0x060;
writel(tmr, &timers->tcon);
/* auto load, start timer 4 */
tmr = (tmr & ~0x070) | 0x050;
writel(tmr, &timers->tcon);
-   timestamp = 0;
+   gd->timestamp = 0;
 
-   return (0);
+   return 0;
 }
 
 /*
@@ -96,7 +92,7 @@ ulong get_timer(ulong base)
 
 void set_timer(ulong t)
 {
-   timestamp = t;
+   gd->timestamp = t;
 }
 
 void __udelay (unsigned long usec)
@@ -105,7 +101,7 @@ void __udelay (unsigned long usec)
ulong start = get_ticks();
 
tmo = usec / 1000;
-   tmo *= (timer_load_val * 100);
+   tmo *= (gd->timer_load_val * 100);
tmo /= 1000;
 
while ((ulong) (get_ticks() - start) < tmo)
@@ -115,15 +111,15 @@ void __udelay (unsigned long usec)
 void reset_timer_masked(void)
 {
/* reset time */
-   lastdec = READ_TIMER();
-   timestamp = 0;
+   gd->lastdec = READ_TIMER();
+   gd->timestamp = 0;
 }
 
 ulong get_timer_masked(void)
 {
ulong tmr = get_ticks();
 
-   return tmr / (timer_clk / CONFIG_SYS_HZ);
+   return tmr / (gd->timer_clk / CONFIG_SYS_HZ);
 }
 
 void udelay_masked(unsigned long usec)
@@ -134,10 +130,10 @@ void udelay_masked(unsigned long usec)
 
if (usec >= 1000) {
tmo = usec / 1000;
-   tmo *= (timer_load_val * 100);
+   tmo *= (gd->timer_load_val * 100);
tmo /= 1000;
} else {
-   tmo = usec * (timer_load_val * 100);
+   tmo = usec * (gd->timer_load_val * 100);
tmo /= (1000 * 1000);
}
 
@@ -157,16 +153,16 @@ unsigned long long get_ticks(void)
 {
ulong now = READ_TIMER();
 
-   if (lastdec >= now) {
+   if (gd->lastdec >= now) {
/* normal mode */
-   timestamp += lastdec - now;
+   gd->timestamp += gd->lastdec - now;
} else {
/* we have an overflow ... */
-   timestamp += lastdec + timer_load_val - now;
+   gd->timestamp += gd->lastdec + gd->timer_load_val - now;
}
-   lastdec = now;
+   gd->lastdec = now;
 
-   return timestamp;
+   return gd->timestamp;
 }
 
 /*
@@ -178,7 +174,7 @@ ulong get_tbclk(void)
ulong tbclk;
 
 #if defined(CONFIG_SMDK2400) || defined(CONFIG_TRAB)
-   tbclk = timer_load_val * 100;
+   tbclk = gd->timer_load_val * 100;
 #elif defined(CONFIG_SBC2410X) || \
   defined(CONFIG_SMDK2410) || \
defined(CONFIG_S3C2440) || \
diff --git a/arch/arm/include/asm/global_data.h 
b/arch/arm/include/asm/global_data.h
index ada3fbb..799943c 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -61,6 +61,13 @@ typedef  struct  global_data {
unsigned long   tbu;
unsigned long long  timer_reset_value;
 #endif
+#ifdef CONFIG_S3C24X0
+   /* "static data" needed by s3c24x0 timer.c */
+   unsigned long   timer_load_val;
+   unsigned long   timer_clk;
+   unsigned long   timestamp;
+   unsigned long   lastdec;
+#endif
unsigned long   relocaddr;  /* Start address of U-Boot in RAM */