From 356a0d9f3123b57392935febd300ce32e63f1278 Mon Sep 17 00:00:00 2001
From: wdenk <wdenk>
Date: Wed, 9 Jun 2004 00:10:59 +0000
Subject: [PATCH] Patch by Markus Pietrek, 04 May 2004: Fix clear_bss code for
 ARM systems (all except s3c44b0 which doesn't clear BSS at all?)

---
 CHANGELOG              | 10 ++++++++++
 cpu/arm720t/start.S    |  1 -
 cpu/arm920t/start.S    |  1 -
 cpu/arm925t/start.S    |  1 -
 cpu/arm926ejs/start.S  |  1 -
 cpu/at91rm9200/start.S |  1 -
 cpu/ixp/start.S        |  1 -
 cpu/pxa/start.S        |  1 -
 cpu/sa1100/start.S     |  1 -
 drivers/inca-ip_sw.c   | 12 ++++++++++--
 10 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 4cd62f66e65..82d977ee2d2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,16 @@
 Changes since U-Boot 1.1.1:
 ======================================================================
 
+* Patch by Markus Pietrek, 04 May 2004:
+  Fix clear_bss code for ARM systems (all except s3c44b0 which
+  doesn't clear BSS at all?)
+
+* Fix "ping" problem on INC-IP board. Strange problem:
+  Sometimes the store word instruction hangs while writing to one of
+  the Switch registers, but only if the next instruction is 16-byte
+  aligned. Moving the instruction into a separate function somehow
+  makes the problem go away.
+
 * Patch by Rishi Bhattacharya, 08 May 2004:
   Add support for TI OMAP5912 OSK Board
 
diff --git a/cpu/arm720t/start.S b/cpu/arm720t/start.S
index 791049a2f54..f6ae9d67a4a 100644
--- a/cpu/arm720t/start.S
+++ b/cpu/arm720t/start.S
@@ -154,7 +154,6 @@ stack_setup:
 
 clear_bss:
 	ldr	r0, _bss_start		/* find start of bss segment        */
-	add	r0, r0, #4		/* start at first byte of bss       */
 	ldr	r1, _bss_end		/* stop here                        */
 	mov 	r2, #0x00000000		/* clear                            */
 
diff --git a/cpu/arm920t/start.S b/cpu/arm920t/start.S
index 49264da9927..0e372d0e4ce 100644
--- a/cpu/arm920t/start.S
+++ b/cpu/arm920t/start.S
@@ -191,7 +191,6 @@ stack_setup:
 
 clear_bss:
 	ldr	r0, _bss_start		/* find start of bss segment        */
-	add	r0, r0, #4		/* start at first byte of bss       */
 	ldr	r1, _bss_end		/* stop here                        */
 	mov 	r2, #0x00000000		/* clear                            */
 
diff --git a/cpu/arm925t/start.S b/cpu/arm925t/start.S
index da84de19bd3..134a57639e2 100644
--- a/cpu/arm925t/start.S
+++ b/cpu/arm925t/start.S
@@ -197,7 +197,6 @@ stack_setup:
 
 clear_bss:
 	ldr	r0, _bss_start		/* find start of bss segment        */
-	add	r0, r0, #4		/* start at first byte of bss       */
 	ldr	r1, _bss_end		/* stop here                        */
 	mov 	r2, #0x00000000		/* clear                            */
 
diff --git a/cpu/arm926ejs/start.S b/cpu/arm926ejs/start.S
index ad5d84770e5..70be4de6289 100644
--- a/cpu/arm926ejs/start.S
+++ b/cpu/arm926ejs/start.S
@@ -172,7 +172,6 @@ stack_setup:
 
 clear_bss:
 	ldr	r0, _bss_start		/* find start of bss segment        */
-	add	r0, r0, #4		/* start at first byte of bss       */
 	ldr	r1, _bss_end		/* stop here                        */
 	mov 	r2, #0x00000000		/* clear                            */
 
diff --git a/cpu/at91rm9200/start.S b/cpu/at91rm9200/start.S
index b9b889ab8cd..d73af20dfb1 100644
--- a/cpu/at91rm9200/start.S
+++ b/cpu/at91rm9200/start.S
@@ -147,7 +147,6 @@ stack_setup:
 
 clear_bss:
 	ldr	r0, _bss_start		/* find start of bss segment        */
-	add	r0, r0, #4		/* start at first byte of bss       */
 	ldr	r1, _bss_end		/* stop here                        */
 	mov 	r2, #0x00000000		/* clear                            */
 
diff --git a/cpu/ixp/start.S b/cpu/ixp/start.S
index 09ecc73a00c..9240b5cd3e6 100644
--- a/cpu/ixp/start.S
+++ b/cpu/ixp/start.S
@@ -289,7 +289,6 @@ stack_setup:
 
 clear_bss:
 	ldr	r0, _bss_start		/* find start of bss segment        */
-	add	r0, r0, #4		/* start at first byte of bss       */
 	ldr	r1, _bss_end		/* stop here                        */
 	mov 	r2, #0x00000000		/* clear                            */
 
diff --git a/cpu/pxa/start.S b/cpu/pxa/start.S
index de2a084aadf..b1f6e7e615b 100644
--- a/cpu/pxa/start.S
+++ b/cpu/pxa/start.S
@@ -141,7 +141,6 @@ stack_setup:
 
 clear_bss:
 	ldr	r0, _bss_start		/* find start of bss segment        */
-	add	r0, r0, #4		/* start at first byte of bss       */
 	ldr	r1, _bss_end		/* stop here                        */
 	mov 	r2, #0x00000000		/* clear                            */
 
diff --git a/cpu/sa1100/start.S b/cpu/sa1100/start.S
index fe1316cbe76..52f2c5d36e3 100644
--- a/cpu/sa1100/start.S
+++ b/cpu/sa1100/start.S
@@ -154,7 +154,6 @@ stack_setup:
 
 clear_bss:
 	ldr	r0, _bss_start		/* find start of bss segment        */
-	add	r0, r0, #4		/* start at first byte of bss       */
 	ldr	r1, _bss_end		/* stop here                        */
 	mov 	r2, #0x00000000		/* clear                            */
 
diff --git a/drivers/inca-ip_sw.c b/drivers/inca-ip_sw.c
index f8fe52ea26d..ab22b4d5385 100644
--- a/drivers/inca-ip_sw.c
+++ b/drivers/inca-ip_sw.c
@@ -41,13 +41,21 @@
 
 
 #define DELAY	udelay(10000)
+  /* Sometimes the store word instruction hangs while writing to one
+   * of the Switch registers. Moving the instruction into a separate
+   * function somehow makes the problem go away.
+   */
+static void SWORD(volatile u32 * reg, u32 value)
+{
+	*reg = value;
+}
 
 #define DMA_WRITE_REG(reg, value) *((volatile u32 *)reg) = (u32)value;
 #define DMA_READ_REG(reg, value)    value = (u32)*((volatile u32*)reg)
 #define SW_WRITE_REG(reg, value)   \
-	*((volatile u32*)reg) = (u32)value;\
+	SWORD(reg, value);\
 	DELAY;\
-	*((volatile u32*)reg) = (u32)value;
+	SWORD(reg, value);
 
 #define SW_READ_REG(reg, value)	   \
 	value = (u32)*((volatile u32*)reg);\
-- 
GitLab