From 2281490485ef2c76f93bf37a5014f5e630d5a3d0 Mon Sep 17 00:00:00 2001
From: Wolfgang Denk <wd@pollux.denx.de>
Date: Sun, 12 Mar 2006 01:21:19 +0100
Subject: [PATCH] Word alignment fixes for word aligned NS16550 UART Patch by
 Jean-Paul Saman, 01 Mar 2005

---
 CHANGELOG         | 12 ++++++++++++
 include/ns16550.h | 20 ++++++++++----------
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index db50b57e85b..e3003e0ddad 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,18 @@
 Changes since U-Boot 1.1.4:
 ======================================================================
 
+* Word alignment fixes for word aligned NS16550 UART
+  Patch by Jean-Paul Saman, 01 Mar 2005
+
+  Fixes bug with UART that only supports word aligned access: removed
+  "__attribute__ ((packed));" for "(CFG_NS16550_REG_SIZE == 4)" some
+  (broken!) versions of GCC generate byte accesses when encountering
+  the packed attribute regardless if the struct is already correctly
+  aligned for a platform. Peripherals that can only handle word
+  aligned access won't work properly when accessed with byte access.
+  The struct NS16550 is already word aligned for REG_SIZE = 4, so
+  there is no need to packed the struct in that case.
+
 * Fix behaviour if gatewayip is not set
   Patch by Robin Gilks, 23 Dec 2004
 
diff --git a/include/ns16550.h b/include/ns16550.h
index e17a11edca6..d987a8b7edb 100644
--- a/include/ns16550.h
+++ b/include/ns16550.h
@@ -45,15 +45,15 @@ struct NS16550 {
 } __attribute__ ((packed));
 #elif (CFG_NS16550_REG_SIZE == 4)
 struct NS16550 {
-	unsigned long rbr;		/* 0 */
-	unsigned long ier;		/* 1 */
-	unsigned long fcr;		/* 2 */
-	unsigned long lcr;		/* 3 */
-	unsigned long mcr;		/* 4 */
-	unsigned long lsr;		/* 5 */
-	unsigned long msr;		/* 6 */
-	unsigned long scr;		/* 7 */
-} __attribute__ ((packed));
+	unsigned long rbr;		/* 0 r  */
+	unsigned long ier;		/* 1 rw */
+	unsigned long fcr;		/* 2 w  */
+	unsigned long lcr;		/* 3 rw */
+	unsigned long mcr;		/* 4 rw */
+	unsigned long lsr;		/* 5 r  */
+	unsigned long msr;		/* 6 r  */
+	unsigned long scr;		/* 7 rw */
+}; /* No need to pack an already aligned struct */
 #elif (CFG_NS16550_REG_SIZE == -4)
 struct NS16550 {
 	unsigned char rbr;		/* 0 */
@@ -102,7 +102,7 @@ typedef volatile struct NS16550 *NS16550_t;
 #define MCR_DMA_EN      0x04
 #define MCR_TX_DFR      0x08
 
-#define LCR_WLS_MSK	0x03		/* character length slect mask */
+#define LCR_WLS_MSK	0x03		/* character length select mask */
 #define LCR_WLS_5	0x00		/* 5 bit character length */
 #define LCR_WLS_6	0x01		/* 6 bit character length */
 #define LCR_WLS_7	0x02		/* 7 bit character length */
-- 
GitLab