tty: serial: imx: Add fast path when rs485 delays are 0
authorHarald Seiler <hws@denx.de>
Wed, 19 Jan 2022 14:52:03 +0000 (15:52 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Feb 2022 11:06:04 +0000 (12:06 +0100)
Right now, even when `delay_rts_before_send` and `delay_rts_after_send`
are 0, the hrtimer is triggered (with timeout 0) which can introduce a
few 100us of additional overhead on slower i.MX platforms.

Implement a fast path when the delays are 0, where the RTS signal is
toggled immediately instead of going through an hrtimer.  This fast path
behaves identical to the code before delay support was implemented.

Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Harald Seiler <hws@denx.de>
Link: https://lore.kernel.org/r/20220119145204.238767-1-hws@denx.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/imx.c

index d8034f16668619b696d199d4df76fb81706ba8f2..0b467ce8d737afa52706005ca77ea46fe077bbf0 100644 (file)
@@ -455,9 +455,14 @@ static void imx_uart_stop_tx(struct uart_port *port)
        if (port->rs485.flags & SER_RS485_ENABLED) {
                if (sport->tx_state == SEND) {
                        sport->tx_state = WAIT_AFTER_SEND;
-                       start_hrtimer_ms(&sport->trigger_stop_tx,
+
+                       if (port->rs485.delay_rts_after_send > 0) {
+                               start_hrtimer_ms(&sport->trigger_stop_tx,
                                         port->rs485.delay_rts_after_send);
-                       return;
+                               return;
+                       }
+
+                       /* continue without any delay */
                }
 
                if (sport->tx_state == WAIT_AFTER_RTS ||
@@ -698,9 +703,14 @@ static void imx_uart_start_tx(struct uart_port *port)
                                imx_uart_stop_rx(port);
 
                        sport->tx_state = WAIT_AFTER_RTS;
-                       start_hrtimer_ms(&sport->trigger_start_tx,
+
+                       if (port->rs485.delay_rts_before_send > 0) {
+                               start_hrtimer_ms(&sport->trigger_start_tx,
                                         port->rs485.delay_rts_before_send);
-                       return;
+                               return;
+                       }
+
+                       /* continue without any delay */
                }
 
                if (sport->tx_state == WAIT_AFTER_SEND