|
|
@@ -2132,11 +2132,29 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
|
mode |= ATMEL_US_USMODE_RS485;
|
|
|
} else if (termios->c_cflag & CRTSCTS) {
|
|
|
/* RS232 with hardware handshake (RTS/CTS) */
|
|
|
- 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 {
|
|
|
+ if (atmel_use_fifo(port) &&
|
|
|
+ !mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_CTS)) {
|
|
|
+ /*
|
|
|
+ * with ATMEL_US_USMODE_HWHS set, the controller will
|
|
|
+ * be able to drive the RTS pin high/low when the RX
|
|
|
+ * FIFO is above RXFTHRES/below RXFTHRES2.
|
|
|
+ * It will also disable the transmitter when the CTS
|
|
|
+ * pin is high.
|
|
|
+ * This mode is not activated if CTS pin is a GPIO
|
|
|
+ * because in this case, the transmitter is always
|
|
|
+ * disabled (there must be an internal pull-up
|
|
|
+ * responsible for this behaviour).
|
|
|
+ * If the RTS pin is a GPIO, the controller won't be
|
|
|
+ * able to drive it according to the FIFO thresholds,
|
|
|
+ * but it will be handled by the driver.
|
|
|
+ */
|
|
|
mode |= ATMEL_US_USMODE_HWHS;
|
|
|
+ } else {
|
|
|
+ /*
|
|
|
+ * For platforms without FIFO, the flow control is
|
|
|
+ * handled by the driver.
|
|
|
+ */
|
|
|
+ mode |= ATMEL_US_USMODE_NORMAL;
|
|
|
}
|
|
|
} else {
|
|
|
/* RS232 without hadware handshake */
|