ns16550: change to allow 32 bit access to registers
PATCH v4 1/1 ns16550: change to allow 32 bit access to registers
If CONFIG_SYS_NS16550_MEM32 is defined then 32 bit memory mapped access will be used to read/write the uart registers.
This is especially useful for SoC devices that implement 16550 compatible uarts but that have peripheral access width constraints.
---
Changes for v2:
- Add endian support
Changes for v3:
- Use in_be32()/out_be32() and in_le32/out_le32() functions to provide endian support
Changes for v4:
- use u32 instead of unsigned int in include/ns16550.h to remove any ambiguity about the register size
drivers/serial/ns16550.c | 6 ++++++ include/ns16550.h | 4 ++++ 2 files changed, 10 insertions(+), 0 deletions(-)
drivers/serial/ns16550.c +6 -0
@@ -19,6 +19,12 @@#ifdef CONFIG_SYS_NS16550_PORT_MAPPED #define serial_out (x,y) outb(x,(ulong)y)#define serial_in (y) inb((ulong)y) +#elif defined(CONFIG_SYS_NS16550_MEM32 ) && (CONFIG_SYS_NS16550_REG_SIZE >0 ) +#define serial_out (x,y) out_be32(y,x) +#define serial_in (y) in_be32(y) +#elif defined(CONFIG_SYS_NS16550_MEM32 ) && (CONFIG_SYS_NS16550_REG_SIZE <0 ) +#define serial_out (x,y) out_le32(y,x) +#define serial_in (y) in_le32(y)#else #define serial_out (x,y) writeb(x,y)#define serial_in (y) readb(y)
include/ns16550.h +4 -0
@@ -21,8 +21,12 @@* will not allocate storage for arrays of size 0 */ +#include <linux/types.h> +#if !defined(CONFIG_SYS_NS16550_REG_SIZE ) || (CONFIG_SYS_NS16550_REG_SIZE ==0 )#error "Please define NS16550 registers size." +#elif defined(CONFIG_SYS_NS16550_MEM32 ) +#define UART_REG (x) u32 x#elif (CONFIG_SYS_NS16550_REG_SIZE >0 )#define UART_REG (x) \ unsigned char prepad_##x[CONFIG_SYS_NS16550_REG_SIZE - 1]; \
--
1.7.3.4
PATCH v4 1/1 ns16550: change to allow 32 bit access to registers
Dear Dave Aldridge,
Quoted 2 lines · In message <[email protected]> you wrote:
If
CONFIG_SYS_NS16550_MEM32is defined then 32 bit memory mapped access will be used to read/write the uart registers.
...
drivers/serial/ns16550.c line 25
Quoted 4 lines
drivers/serial/ns16550.c +4
-0+#elif defined(CONFIG_SYS_NS16550_MEM32 ) && (CONFIG_SYS_NS16550_REG_SIZE >0 ) +#define serial_out (x,y) out_be32(y,x) +#define serial_in (y) in_be32(y) +#elif defined(CONFIG_SYS_NS16550_MEM32 ) && (CONFIG_SYS_NS16550_REG_SIZE <0 )
Please see comment to previous version.
Best regards,
Wolfgang Denk
Signature · 5 lines
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: [email protected] For every complex problem, there is a solution that is simple, neat, and wrong. - Mark Twain
PATCH v4 1/1 ns16550: change to allow 32 bit access to registers
Hi Wolfgang
Quoted 5 lines · Wolfgang Denk
Dear Dave Aldridge,
Quoted 2 lines · In message <[email protected]> you wrote:
If
CONFIG_SYS_NS16550_MEM32is defined then 32 bit memory mapped access will be used to read/write the uart registers.
Quoted 7 lines
...
drivers/serial/ns16550.c line 25
Quoted 4 lines
drivers/serial/ns16550.c +4
-0+#elif defined(CONFIG_SYS_NS16550_MEM32 ) && (CONFIG_SYS_NS16550_REG_SIZE >0 ) +#define serial_out (x,y) out_be32(y,x) +#define serial_in (y) in_be32(y) +#elif defined(CONFIG_SYS_NS16550_MEM32 ) && (CONFIG_SYS_NS16550_REG_SIZE <0 )Please see comment to previous version.
I think the discussions in the '[U-Boot] [PATCH v3] ns16550:' confirm the above usage of the _REG_SIZE macro for determining the endianess of the uart is correct.
I can also confirm that the patch does work for me.
Cheers
Dave
Wolfgang Denk
AppliedPATCH v4 1/1 ns16550: change to allow 32 bit access to registers
In reply to Dave AldridgeDear Dave Aldridge,
Quoted 15 lines · In message <[email protected]> you wrote:
If
CONFIG_SYS_NS16550_MEM32is defined then 32 bit memory mapped access will be used to read/write the uart registers.This is especially useful for SoC devices that implement 16550 compatible uarts but that have peripheral access width constraints.
Signed-off-by Dave Aldridge <[email protected]>---
Changes for v2:
- Add endian supportChanges for v3:
- Use in_be32()/out_be32() and in_le32/out_le32() functions to provide endian support
Quoted 7 lines
Changes for v4:
- use u32 instead of unsigned int ininclude/ns16550.hto remove any ambiguity about the register sizedrivers/serial/ns16550.c | 6 ++++++ include/ns16550.h | 4 ++++ 2 files changed, 10 insertions(+), 0 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 4 lines
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: wd at denx.de Of course there's no reason for it, it's just our policy.