diff options
author | Wolfgang Denk <wd@pollux.denx.de> | 2006-03-12 00:21:19 (GMT) |
---|---|---|
committer | Wolfgang Denk <wd@pollux.denx.de> | 2006-03-12 00:21:19 (GMT) |
commit | 2281490485ef2c76f93bf37a5014f5e630d5a3d0 (patch) | |
tree | ad8753cb05655d0579b42c91b1a8bdf122f08fa2 | |
parent | d509b81210e8126d8f953fda419f93c8065e314a (diff) | |
download | u-boot-2281490485ef2c76f93bf37a5014f5e630d5a3d0.tar.xz |
Word alignment fixes for word aligned NS16550 UART
Patch by Jean-Paul Saman, 01 Mar 2005
-rw-r--r-- | CHANGELOG | 12 | ||||
-rw-r--r-- | include/ns16550.h | 20 |
2 files changed, 22 insertions, 10 deletions
@@ -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 e17a11e..d987a8b 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 */ |