]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
serial: omap: don't disable rs485 if rts gpio is missing
authorDario Binacchi <dariobin@libero.it>
Thu, 15 Apr 2021 21:09:45 +0000 (23:09 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 22 Apr 2021 10:06:59 +0000 (12:06 +0200)
There are rs485 transceivers (e.g. MAX13487E/MAX13488E) which
automatically disable or enable the driver and receiver to keep the bus
in the correct state.
In these cases we don't need a GPIO for flow control.

Fixes: 4a0ac0f55b18 ("OMAP: add RS485 support")
Signed-off-by: Dario Binacchi <dariobin@libero.it>
Link: https://lore.kernel.org/r/20210415210945.25863-1-dariobin@libero.it
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/omap-serial.c

index 76b94d0ff58659472f286a2ed526c96e9d1ab8a6..1583e93b2202b0f4957b0f85c1202c4bcd408477 100644 (file)
@@ -302,7 +302,8 @@ static void serial_omap_stop_tx(struct uart_port *port)
                        serial_out(up, UART_OMAP_SCR, up->scr);
                        res = (port->rs485.flags & SER_RS485_RTS_AFTER_SEND) ?
                                1 : 0;
-                       if (gpiod_get_value(up->rts_gpiod) != res) {
+                       if (up->rts_gpiod &&
+                           gpiod_get_value(up->rts_gpiod) != res) {
                                if (port->rs485.delay_rts_after_send > 0)
                                        mdelay(
                                        port->rs485.delay_rts_after_send);
@@ -411,7 +412,7 @@ static void serial_omap_start_tx(struct uart_port *port)
 
                /* if rts not already enabled */
                res = (port->rs485.flags & SER_RS485_RTS_ON_SEND) ? 1 : 0;
-               if (gpiod_get_value(up->rts_gpiod) != res) {
+               if (up->rts_gpiod && gpiod_get_value(up->rts_gpiod) != res) {
                        gpiod_set_value(up->rts_gpiod, res);
                        if (port->rs485.delay_rts_before_send > 0)
                                mdelay(port->rs485.delay_rts_before_send);
@@ -1407,18 +1408,13 @@ serial_omap_config_rs485(struct uart_port *port, struct serial_rs485 *rs485)
        /* store new config */
        port->rs485 = *rs485;
 
-       /*
-        * Just as a precaution, only allow rs485
-        * to be enabled if the gpio pin is valid
-        */
        if (up->rts_gpiod) {
                /* enable / disable rts */
                val = (port->rs485.flags & SER_RS485_ENABLED) ?
                        SER_RS485_RTS_AFTER_SEND : SER_RS485_RTS_ON_SEND;
                val = (port->rs485.flags & val) ? 1 : 0;
                gpiod_set_value(up->rts_gpiod, val);
-       } else
-               port->rs485.flags &= ~SER_RS485_ENABLED;
+       }
 
        /* Enable interrupts */
        up->ier = mode;