OMAP/serial: Fix incorrect Rx FIFO threshold setting, LSR validation on Tx, and Tx...
authorAlexey Pelykh <alexey.pelykh@gmail.com>
Mon, 4 Feb 2013 17:19:46 +0000 (12:19 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 5 Feb 2013 19:13:16 +0000 (11:13 -0800)
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: Alexey Pelykh <alexey.pelykh@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/omap-serial.c

index 9915e4d1418cf060005b1a95370b4c081168fc7e..4dc41408ecb7f659c70ee4daedd96148bb96382d 100644 (file)
@@ -59,6 +59,7 @@
 
 /* SCR register bitmasks */
 #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)
 
 /* FCR register bitmasks */
@@ -320,9 +321,6 @@ static void transmit_chars(struct uart_omap_port *up, unsigned int lsr)
        struct circ_buf *xmit = &up->port.state->xmit;
        int count;
 
-       if (!(lsr & UART_LSR_THRE))
-               return;
-
        if (up->port.x_char) {
                serial_out(up, UART_TX, up->port.x_char);
                up->port.icount.tx++;
@@ -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_LCR, cval);         /* reset DLAB */
        up->lcr = cval;
-       up->scr = OMAP_UART_SCR_TX_EMPTY;
+       up->scr = 0;
 
        /* FIFOs and DMA Settings */
 
@@ -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);
        /* FIFO ENABLE, DMA MODE */
 
-       up->scr |= OMAP_UART_SCR_RX_TRIG_GRANU1_MASK;
-
        /* Set receive FIFO threshold to 16 characters and
         * transmit FIFO threshold to 16 spaces
         */