aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial
diff options
context:
space:
mode:
authorDimitris Lampridis <dlampridis@logikonlabs.com>2014-03-13 09:11:46 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-03-17 19:23:07 -0400
commitcab53dc9e20f74fbd4776ea584ba3b21c957b1a8 (patch)
tree2779cee8bbdd970bbafaa7d979b8e3eb7488e889 /drivers/tty/serial
parent9b971cd206c019fc6aeeb7e04136a49f9312df4a (diff)
tty/serial: omap: fix RX interrupt enable/disable in half-duplex TX
Make sure that serial_omap_stop_rx() also disables RDI (Receiver Data Interrupt), otherwise the interrupt handler will call serial_omap_rdi() to read the new data, resulting in the transmission being echoed back. When the half-duplex transmission is complete, in order to reverse the effects of serial_omap_stop_rx(), we should re-enable: * the RX interrupts _without_ overwriting up->ier * the UART_LSR_DR bit of the up->port.read_status_mask Signed-off-by: Dimitris Lampridis <dlampridis@logikonlabs.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial')
-rw-r--r--drivers/tty/serial/omap-serial.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 77f035158d6c..65abea2c6e47 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -342,7 +342,8 @@ static void serial_omap_stop_tx(struct uart_port *port)
342 342
343 if ((up->rs485.flags & SER_RS485_ENABLED) && 343 if ((up->rs485.flags & SER_RS485_ENABLED) &&
344 !(up->rs485.flags & SER_RS485_RX_DURING_TX)) { 344 !(up->rs485.flags & SER_RS485_RX_DURING_TX)) {
345 up->ier = UART_IER_RLSI | UART_IER_RDI; 345 up->ier |= UART_IER_RLSI | UART_IER_RDI;
346 up->port.read_status_mask |= UART_LSR_DR;
346 serial_out(up, UART_IER, up->ier); 347 serial_out(up, UART_IER, up->ier);
347 } 348 }
348 349
@@ -355,7 +356,7 @@ static void serial_omap_stop_rx(struct uart_port *port)
355 struct uart_omap_port *up = to_uart_omap_port(port); 356 struct uart_omap_port *up = to_uart_omap_port(port);
356 357
357 pm_runtime_get_sync(up->dev); 358 pm_runtime_get_sync(up->dev);
358 up->ier &= ~UART_IER_RLSI; 359 up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
359 up->port.read_status_mask &= ~UART_LSR_DR; 360 up->port.read_status_mask &= ~UART_LSR_DR;
360 serial_out(up, UART_IER, up->ier); 361 serial_out(up, UART_IER, up->ier);
361 pm_runtime_mark_last_busy(up->dev); 362 pm_runtime_mark_last_busy(up->dev);