serial: core: Add option to output RS485 RX_DURING_TX state via GPIO
authorChristoph Niedermaier <cniedermaier@dh-electronics.com>
Fri, 2 Dec 2022 10:41:25 +0000 (11:41 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Jan 2023 15:01:35 +0000 (16:01 +0100)
This patch provides a generic GPIO variable for outputting the state
of RS485 RX_DURING_TX. The GPIO is defined by the devicetree property
"rs485-rx-during-tx-gpios". To use it in a low level serial driver,
the evaluation of this variable must be implemented there accordingly.

Signed-off-by: Christoph Niedermaier <cniedermaier@dh-electronics.com>
Link: https://lore.kernel.org/r/20221202104127.122761-2-cniedermaier@dh-electronics.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_core.c
include/linux/serial_core.h

index b9fbbee..867f267 100644 (file)
@@ -3410,6 +3410,7 @@ int uart_get_rs485_mode(struct uart_port *port)
        struct device *dev = port->dev;
        u32 rs485_delay[2];
        int ret;
+       int rx_during_tx_gpio_flag;
 
        ret = device_property_read_u32_array(dev, "rs485-rts-delay",
                                             rs485_delay, 2);
@@ -3458,6 +3459,17 @@ int uart_get_rs485_mode(struct uart_port *port)
        if (port->rs485_term_gpio)
                port->rs485_supported.flags |= SER_RS485_TERMINATE_BUS;
 
+       rx_during_tx_gpio_flag = (rs485conf->flags & SER_RS485_RX_DURING_TX) ?
+                                GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
+       port->rs485_rx_during_tx_gpio = devm_gpiod_get_optional(dev,
+                                                               "rs485-rx-during-tx",
+                                                               rx_during_tx_gpio_flag);
+       if (IS_ERR(port->rs485_rx_during_tx_gpio)) {
+               ret = PTR_ERR(port->rs485_rx_during_tx_gpio);
+               port->rs485_rx_during_tx_gpio = NULL;
+               return dev_err_probe(dev, ret, "Cannot get rs485-rx-during-tx-gpios\n");
+       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(uart_get_rs485_mode);
index 026294c..0b37a86 100644 (file)
@@ -579,6 +579,7 @@ struct uart_port {
        struct serial_rs485     rs485;
        struct serial_rs485     rs485_supported;        /* Supported mask for serial_rs485 */
        struct gpio_desc        *rs485_term_gpio;       /* enable RS485 bus termination */
+       struct gpio_desc        *rs485_rx_during_tx_gpio; /* Output GPIO that sets the state of RS485 RX during TX */
        struct serial_iso7816   iso7816;
        void                    *private_data;          /* generic platform data pointer */
 };