Commit 1776fd05 authored by Alexey Pelykh's avatar Alexey Pelykh Committed by Greg Kroah-Hartman

OMAP/serial: Fix incorrect Rx FIFO threshold setting, LSR validation on Tx,...

OMAP/serial: Fix incorrect Rx FIFO threshold setting, LSR validation on Tx, and Tx FIFO IRQ generation

Original configuration of Rx FIFO threshold contained an error
that resulted Rx threshold to be effectively set to 1 character
instead of 16 characters, as noted in comments.
Checking LSR to contain UART_LSR_THRE bit set caused issue when
not all UART_IER_THRI interrupts have been properly handled.
This caused gap in Tx data, visible on high baud rates using
oscilloscope.
Setting OMAP_UART_SCR_TX_EMPTY bit in SCR caused UART_IER_THRI
interrupt to be raised only when Tx FIFO and Tx shift registers
are empty.
Signed-off-by: default avatarAlexey Pelykh <alexey.pelykh@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f26402e8
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
/* SCR register bitmasks */ /* SCR register bitmasks */
#define OMAP_UART_SCR_RX_TRIG_GRANU1_MASK (1 << 7) #define OMAP_UART_SCR_RX_TRIG_GRANU1_MASK (1 << 7)
#define OMAP_UART_SCR_TX_TRIG_GRANU1_MASK (1 << 6)
#define OMAP_UART_SCR_TX_EMPTY (1 << 3) #define OMAP_UART_SCR_TX_EMPTY (1 << 3)
/* FCR register bitmasks */ /* FCR register bitmasks */
...@@ -320,9 +321,6 @@ static void transmit_chars(struct uart_omap_port *up, unsigned int lsr) ...@@ -320,9 +321,6 @@ static void transmit_chars(struct uart_omap_port *up, unsigned int lsr)
struct circ_buf *xmit = &up->port.state->xmit; struct circ_buf *xmit = &up->port.state->xmit;
int count; int count;
if (!(lsr & UART_LSR_THRE))
return;
if (up->port.x_char) { if (up->port.x_char) {
serial_out(up, UART_TX, up->port.x_char); serial_out(up, UART_TX, up->port.x_char);
up->port.icount.tx++; up->port.icount.tx++;
...@@ -864,7 +862,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios, ...@@ -864,7 +862,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
serial_out(up, UART_IER, up->ier); serial_out(up, UART_IER, up->ier);
serial_out(up, UART_LCR, cval); /* reset DLAB */ serial_out(up, UART_LCR, cval); /* reset DLAB */
up->lcr = cval; up->lcr = cval;
up->scr = OMAP_UART_SCR_TX_EMPTY; up->scr = 0;
/* FIFOs and DMA Settings */ /* FIFOs and DMA Settings */
...@@ -888,8 +886,6 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios, ...@@ -888,8 +886,6 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR); serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR);
/* FIFO ENABLE, DMA MODE */ /* FIFO ENABLE, DMA MODE */
up->scr |= OMAP_UART_SCR_RX_TRIG_GRANU1_MASK;
/* Set receive FIFO threshold to 16 characters and /* Set receive FIFO threshold to 16 characters and
* transmit FIFO threshold to 16 spaces * transmit FIFO threshold to 16 spaces
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment