| From 5be605ac9af979265d7b64c160ad9928088a78be Mon Sep 17 00:00:00 2001 |
| From: Alexandre Belloni <alexandre.belloni@free-electrons.com> |
| Date: Tue, 12 Apr 2016 14:51:40 +0200 |
| Subject: tty/serial: atmel: fix hardware handshake selection |
| |
| From: Alexandre Belloni <alexandre.belloni@free-electrons.com> |
| |
| commit 5be605ac9af979265d7b64c160ad9928088a78be upstream. |
| |
| Commit 1cf6e8fc8341 ("tty/serial: at91: fix RTS line management when |
| hardware handshake is enabled") actually allowed to enable hardware |
| handshaking. |
| Before, the CRTSCTS flags was silently ignored. |
| |
| As the DMA controller can't drive RTS (as explain in the commit message). |
| Ensure that hardware flow control stays disabled when DMA is used and FIFOs |
| are not available. |
| |
| Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> |
| Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> |
| Fixes: 1cf6e8fc8341 ("tty/serial: at91: fix RTS line management when hardware handshake is enabled") |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/tty/serial/atmel_serial.c | 14 +++++++++++++- |
| 1 file changed, 13 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/tty/serial/atmel_serial.c |
| +++ b/drivers/tty/serial/atmel_serial.c |
| @@ -274,6 +274,13 @@ static bool atmel_use_dma_rx(struct uart |
| return atmel_port->use_dma_rx; |
| } |
| |
| +static bool atmel_use_fifo(struct uart_port *port) |
| +{ |
| + struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); |
| + |
| + return atmel_port->fifo_size; |
| +} |
| + |
| static unsigned int atmel_get_lines_status(struct uart_port *port) |
| { |
| struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); |
| @@ -2090,7 +2097,12 @@ static void atmel_set_termios(struct uar |
| mode |= ATMEL_US_USMODE_RS485; |
| } else if (termios->c_cflag & CRTSCTS) { |
| /* RS232 with hardware handshake (RTS/CTS) */ |
| - mode |= ATMEL_US_USMODE_HWHS; |
| + if (atmel_use_dma_rx(port) && !atmel_use_fifo(port)) { |
| + dev_info(port->dev, "not enabling hardware flow control because DMA is used"); |
| + termios->c_cflag &= ~CRTSCTS; |
| + } else { |
| + mode |= ATMEL_US_USMODE_HWHS; |
| + } |
| } else { |
| /* RS232 without hadware handshake */ |
| mode |= ATMEL_US_USMODE_NORMAL; |