diff options
| -rw-r--r-- | arch/arm/mach-omap2/serial.c | 31 | 
1 files changed, 28 insertions, 3 deletions
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 5f3035ec0d6..b79bc8926cc 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -23,6 +23,7 @@  #include <linux/serial_reg.h>  #include <linux/clk.h>  #include <linux/io.h> +#include <linux/delay.h>  #include <plat/common.h>  #include <plat/board.h> @@ -160,6 +161,13 @@ static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,  	return (unsigned int)__raw_readb(up->membase + offset);  } +static inline void __serial_write_reg(struct uart_port *up, int offset, +		int value) +{ +	offset <<= up->regshift; +	__raw_writeb(value, up->membase + offset); +} +  static inline void serial_write_reg(struct plat_serial8250_port *p, int offset,  				    int value)  { @@ -620,6 +628,20 @@ static unsigned int serial_in_override(struct uart_port *up, int offset)  	return __serial_read_reg(up, offset);  } +static void serial_out_override(struct uart_port *up, int offset, int value) +{ +	unsigned int status, tmout = 10000; + +	status = __serial_read_reg(up, UART_LSR); +	while (!(status & UART_LSR_THRE)) { +		/* Wait up to 10ms for the character(s) to be sent. */ +		if (--tmout == 0) +			break; +		udelay(1); +		status = __serial_read_reg(up, UART_LSR); +	} +	__serial_write_reg(up, offset, value); +}  void __init omap_serial_early_init(void)  {  	int i; @@ -721,11 +743,14 @@ void __init omap_serial_init_port(int port)  	 * omap3xxx: Never read empty UART fifo on UARTs  	 * with IP rev >=0x52  	 */ -	if (cpu_is_omap44xx()) +	if (cpu_is_omap44xx()) {  		uart->p->serial_in = serial_in_override; -	else if ((serial_read_reg(uart->p, UART_OMAP_MVER) & 0xFF) -			>= UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV) +		uart->p->serial_out = serial_out_override; +	} else if ((serial_read_reg(uart->p, UART_OMAP_MVER) & 0xFF) +			>= UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV) {  		uart->p->serial_in = serial_in_override; +		uart->p->serial_out = serial_out_override; +	}  }  /**  |