diff options
author | Dimitris Lampridis <dlampridis@logikonlabs.com> | 2014-03-13 09:11:46 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-03-17 19:23:07 -0400 |
commit | cab53dc9e20f74fbd4776ea584ba3b21c957b1a8 (patch) | |
tree | 2779cee8bbdd970bbafaa7d979b8e3eb7488e889 /drivers/tty/serial | |
parent | 9b971cd206c019fc6aeeb7e04136a49f9312df4a (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.c | 5 |
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); |