[U-Boot] [PATCH] ppc4xx: UART: Use NS16550 struct instead of offset macros

Stefan Roese sr at denx.de
Tue Sep 14 10:42:45 CEST 2010


This patch changes the PPC4xx UART driver to use the NS16550 struct
instead  of macros for the register offsets.

Signed-off-by: Stefan Roese <sr at denx.de>
---
 arch/powerpc/cpu/ppc4xx/4xx_uart.c |  170 ++++++++++++++----------------------
 1 files changed, 66 insertions(+), 104 deletions(-)

diff --git a/arch/powerpc/cpu/ppc4xx/4xx_uart.c b/arch/powerpc/cpu/ppc4xx/4xx_uart.c
index e6ab570..fbfd691 100644
--- a/arch/powerpc/cpu/ppc4xx/4xx_uart.c
+++ b/arch/powerpc/cpu/ppc4xx/4xx_uart.c
@@ -50,6 +50,7 @@
 #include <asm/io.h>
 #include <watchdog.h>
 #include <ppc4xx.h>
+#include <ns16550.h>
 
 #ifdef CONFIG_SERIAL_MULTI
 #include <serial.h>
@@ -154,31 +155,6 @@ DECLARE_GLOBAL_DATA_PTR;
 #error "External serial clock not supported on AMCC PPC405EP!"
 #endif
 
-#define UART_RBR    0x00
-#define UART_THR    0x00
-#define UART_IER    0x01
-#define UART_IIR    0x02
-#define UART_FCR    0x02
-#define UART_LCR    0x03
-#define UART_MCR    0x04
-#define UART_LSR    0x05
-#define UART_MSR    0x06
-#define UART_SCR    0x07
-#define UART_DLL    0x00
-#define UART_DLM    0x01
-
-/*-----------------------------------------------------------------------------+
-  | Line Status Register.
-  +-----------------------------------------------------------------------------*/
-#define asyncLSRDataReady1            0x01
-#define asyncLSROverrunError1         0x02
-#define asyncLSRParityError1          0x04
-#define asyncLSRFramingError1         0x08
-#define asyncLSRBreakInterrupt1       0x10
-#define asyncLSRTxHoldEmpty1          0x20
-#define asyncLSRTxShiftEmpty1         0x40
-#define asyncLSRRxFifoError1          0x80
-
 #ifdef CONFIG_SERIAL_SOFTWARE_FIFO
 /*-----------------------------------------------------------------------------+
   | Fifo
@@ -192,7 +168,7 @@ typedef struct {
 volatile static serial_buffer_t buf_info;
 #endif
 
-static void serial_init_common(u32 base, u32 udiv, u16 bdiv)
+static void serial_init_common(struct NS16550 *com_port, u32 udiv, u16 bdiv)
 {
 	PPC4xx_SYS_INFO sys_info;
 	u8 val;
@@ -208,16 +184,16 @@ static void serial_init_common(u32 base, u32 udiv, u16 bdiv)
 	gd->uart_clk = sys_info.freqUART / udiv;
 #endif
 
-	out_8((u8 *)base + UART_LCR, 0x80);	/* set DLAB bit */
-	out_8((u8 *)base + UART_DLL, bdiv);	/* set baudrate divisor */
-	out_8((u8 *)base + UART_DLM, bdiv >> 8); /* set baudrate divisor */
-	out_8((u8 *)base + UART_LCR, 0x03);	/* clear DLAB; set 8 bits, no parity */
-	out_8((u8 *)base + UART_FCR, 0x00);	/* disable FIFO */
-	out_8((u8 *)base + UART_MCR, 0x00);	/* no modem control DTR RTS */
-	val = in_8((u8 *)base + UART_LSR);	/* clear line status */
-	val = in_8((u8 *)base + UART_RBR);	/* read receive buffer */
-	out_8((u8 *)base + UART_SCR, 0x00);	/* set scratchpad */
-	out_8((u8 *)base + UART_IER, 0x00);	/* set interrupt enable reg */
+	out_8(&com_port->lcr, 0x80);	/* set DLAB bit */
+	out_8(&com_port->dll, bdiv);	/* set baudrate divisor */
+	out_8(&com_port->dlm, bdiv >> 8); /* set baudrate divisor */
+	out_8(&com_port->lcr, 0x03);	/* clear DLAB; set 8 bits, no parity */
+	out_8(&com_port->fcr, 0x00);	/* disable FIFO */
+	out_8(&com_port->mcr, 0x00);	/* no modem control DTR RTS */
+	val = in_8(&com_port->lsr);	/* clear line status */
+	val = in_8(&com_port->rbr);	/* read receive buffer */
+	out_8(&com_port->scr, 0x00);	/* set scratchpad */
+	out_8(&com_port->ier, 0x00);	/* set interrupt enable reg */
 }
 
 #if (defined(CONFIG_440) || defined(CONFIG_405EX)) &&	\
@@ -326,7 +302,7 @@ static void serial_divs (int baudrate, unsigned long *pudiv,
  */
 
 #if defined(CONFIG_440)
-int serial_init_dev(unsigned long base)
+int serial_init_dev(struct NS16550 *com_port)
 {
 	unsigned long reg;
 	unsigned long udiv;
@@ -368,14 +344,14 @@ int serial_init_dev(unsigned long base)
 	MTREG(UART3_SDR, reg);
 #endif
 
-	serial_init_common(base, udiv, bdiv);
+	serial_init_common(com_port, udiv, bdiv);
 
 	return (0);
 }
 
 #else /* !defined(CONFIG_440) */
 
-int serial_init_dev (unsigned long base)
+int serial_init_dev (struct NS16550 *com_port)
 {
 	unsigned long reg;
 	unsigned long tmp;
@@ -445,42 +421,42 @@ int serial_init_dev (unsigned long base)
 	bdiv = (clk + tmp / 2) / tmp;
 #endif /* CONFIG_405EX */
 
-	serial_init_common(base, udiv, bdiv);
+	serial_init_common(com_port, udiv, bdiv);
 
 	return (0);
 }
 
 #endif /* if defined(CONFIG_440) */
 
-void serial_setbrg_dev(unsigned long base)
+void serial_setbrg_dev(struct NS16550 *com_port)
 {
-	serial_init_dev(base);
+	serial_init_dev(com_port);
 }
 
-void serial_putc_dev(unsigned long base, const char c)
+void serial_putc_dev(struct NS16550 *com_port, const char c)
 {
 	int i;
 
 	if (c == '\n')
-		serial_putc_dev(base, '\r');
+		serial_putc_dev(com_port, '\r');
 
 	/* check THRE bit, wait for transmiter available */
-	for (i = 1; i < 3500; i++) {
-		if ((in_8((u8 *)base + UART_LSR) & 0x20) == 0x20)
+	for (i = 0; i < 3500; i++) {
+		if (in_8(&com_port->lsr) & UART_LSR_THRE)
 			break;
 		udelay (100);
 	}
 
-	out_8((u8 *)base + UART_THR, c);	/* put character out */
+	out_8(&com_port->thr, c);	/* put character out */
 }
 
-void serial_puts_dev (unsigned long base, const char *s)
+void serial_puts_dev (struct NS16550 *com_port, const char *s)
 {
 	while (*s)
-		serial_putc_dev (base, *s++);
+		serial_putc_dev (com_port, *s++);
 }
 
-int serial_getc_dev (unsigned long base)
+int serial_getc_dev (struct NS16550 *com_port)
 {
 	unsigned char status = 0;
 
@@ -489,42 +465,32 @@ int serial_getc_dev (unsigned long base)
 		WATCHDOG_RESET ();	/* Reset HW Watchdog, if needed */
 #endif	/* CONFIG_HW_WATCHDOG */
 
-		status = in_8((u8 *)base + UART_LSR);
-		if ((status & asyncLSRDataReady1) != 0x0)
+		status = in_8(&com_port->lsr);
+		if (status & UART_LSR_DR)
 			break;
 
-		if ((status & ( asyncLSRFramingError1 |
-				asyncLSROverrunError1 |
-				asyncLSRParityError1  |
-				asyncLSRBreakInterrupt1 )) != 0) {
-			out_8((u8 *)base + UART_LSR,
-			      asyncLSRFramingError1 |
-			      asyncLSROverrunError1 |
-			      asyncLSRParityError1  |
-			      asyncLSRBreakInterrupt1);
+		if ((status & (UART_LSR_FE | UART_LSR_OE |
+			       UART_LSR_PE | UART_LSR_BI)) != 0) {
+			out_8(&com_port->lsr, UART_LSR_FE | UART_LSR_OE |
+			      UART_LSR_PE | UART_LSR_BI);
 		}
 	}
 
-	return (0x000000ff & (int) in_8((u8 *)base));
+	return 0xff & in_8(&com_port->rbr);
 }
 
-int serial_tstc_dev (unsigned long base)
+int serial_tstc_dev (struct NS16550 *com_port)
 {
 	unsigned char status;
 
-	status = in_8((u8 *)base + UART_LSR);
-	if ((status & asyncLSRDataReady1) != 0x0)
-		return (1);
-
-	if ((status & ( asyncLSRFramingError1 |
-			asyncLSROverrunError1 |
-			asyncLSRParityError1  |
-			asyncLSRBreakInterrupt1 )) != 0) {
-		out_8((u8 *)base + UART_LSR,
-		      asyncLSRFramingError1 |
-		      asyncLSROverrunError1 |
-		      asyncLSRParityError1  |
-		      asyncLSRBreakInterrupt1);
+	status = in_8(&com_port->lsr);
+	if ((status & UART_LSR_DR) != 0x0)
+		return 1;
+
+	if ((status & (UART_LSR_FE | UART_LSR_OE |
+		       UART_LSR_PE | UART_LSR_BI)) != 0) {
+		out_8(&com_port->lsr, UART_LSR_FE | UART_LSR_OE |
+		      UART_LSR_PE | UART_LSR_BI);
 	}
 
 	return 0;
@@ -703,22 +669,18 @@ int getDebugChar (void)
 
 	while (1) {
 		status = in_8((u8 *)ACTING_UART1_BASE + UART_LSR);
-		if ((status & asyncLSRDataReady1) != 0x0)
+		if ((status & UART_LSR_DR) != 0x0)
 			break;
 
-		if ((status & (asyncLSRFramingError1 |
-			       asyncLSROverrunError1 |
-			       asyncLSRParityError1  |
-			       asyncLSRBreakInterrupt1 )) != 0) {
+		if ((status & (UART_LSR_FE | UART_LSR_OE |
+			       UART_LSR_PE | UART_LSR_BI)) != 0) {
 			out_8((u8 *)ACTING_UART1_BASE + UART_LSR,
-			      asyncLSRFramingError1 |
-			      asyncLSROverrunError1 |
-			      asyncLSRParityError1  |
-			      asyncLSRBreakInterrupt1);
+			      UART_LSR_FE | UART_LSR_OE |
+			      UART_LSR_PE | UART_LSR_BI);
 		}
 	}
 
-	return (0x000000ff & (int) in_8((u8 *)ACTING_UART1_BASE));
+	return (0x000000ff & (int) in_8((u8 *)ACTING_UART1_BASE->rbr));
 }
 
 void kgdb_interruptible (int yes)
@@ -759,62 +721,62 @@ void kgdb_interruptible (int yes)
 #if defined(CONFIG_SERIAL_MULTI)
 int serial0_init(void)
 {
-	return (serial_init_dev(UART0_BASE));
+	return serial_init_dev((struct NS16550 *)UART0_BASE);
 }
 
 int serial1_init(void)
 {
-	return (serial_init_dev(UART1_BASE));
+	return serial_init_dev((struct NS16550 *)UART1_BASE);
 }
 
 void serial0_setbrg (void)
 {
-	serial_setbrg_dev(UART0_BASE);
+	serial_setbrg_dev((struct NS16550 *)UART0_BASE);
 }
 
 void serial1_setbrg (void)
 {
-	serial_setbrg_dev(UART1_BASE);
+	serial_setbrg_dev((struct NS16550 *)UART1_BASE);
 }
 
 void serial0_putc(const char c)
 {
-	serial_putc_dev(UART0_BASE,c);
+	serial_putc_dev((struct NS16550 *)UART0_BASE, c);
 }
 
 void serial1_putc(const char c)
 {
-	serial_putc_dev(UART1_BASE, c);
+	serial_putc_dev((struct NS16550 *)UART1_BASE, c);
 }
 
 void serial0_puts(const char *s)
 {
-	serial_puts_dev(UART0_BASE, s);
+	serial_puts_dev((struct NS16550 *)UART0_BASE, s);
 }
 
 void serial1_puts(const char *s)
 {
-	serial_puts_dev(UART1_BASE, s);
+	serial_puts_dev((struct NS16550 *)UART1_BASE, s);
 }
 
 int serial0_getc(void)
 {
-	return(serial_getc_dev(UART0_BASE));
+	return serial_getc_dev((struct NS16550 *)UART0_BASE);
 }
 
 int serial1_getc(void)
 {
-	return(serial_getc_dev(UART1_BASE));
+	return serial_getc_dev((struct NS16550 *)UART1_BASE);
 }
 
 int serial0_tstc(void)
 {
-	return (serial_tstc_dev(UART0_BASE));
+	return serial_tstc_dev((struct NS16550 *)UART0_BASE);
 }
 
 int serial1_tstc(void)
 {
-	return (serial_tstc_dev(UART1_BASE));
+	return serial_tstc_dev((struct NS16550 *)UART1_BASE);
 }
 
 struct serial_device serial0_device =
@@ -848,32 +810,32 @@ struct serial_device serial1_device =
  */
 int serial_init(void)
 {
-	return serial_init_dev(ACTING_UART0_BASE);
+	return serial_init_dev((struct NS16550 *)ACTING_UART0_BASE);
 }
 
 void serial_setbrg(void)
 {
-	serial_setbrg_dev(ACTING_UART0_BASE);
+	serial_setbrg_dev((struct NS16550 *)ACTING_UART0_BASE);
 }
 
 void serial_putc(const char c)
 {
-	serial_putc_dev(ACTING_UART0_BASE, c);
+	serial_putc_dev((struct NS16550 *)ACTING_UART0_BASE, c);
 }
 
 void serial_puts(const char *s)
 {
-	serial_puts_dev(ACTING_UART0_BASE, s);
+	serial_puts_dev((struct NS16550 *)ACTING_UART0_BASE, s);
 }
 
 int serial_getc(void)
 {
-	return serial_getc_dev(ACTING_UART0_BASE);
+	return serial_getc_dev((struct NS16550 *)ACTING_UART0_BASE);
 }
 
 int serial_tstc(void)
 {
-	return serial_tstc_dev(ACTING_UART0_BASE);
+	return serial_tstc_dev((struct NS16550 *)ACTING_UART0_BASE);
 }
 #endif /* CONFIG_SERIAL_MULTI */
 
-- 
1.7.2.3



More information about the U-Boot mailing list