]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
serial: Make retrieval of rs485 properties platform-agnostic
authorLukas Wunner <lukas@wunner.de>
Fri, 24 Nov 2017 22:26:40 +0000 (23:26 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 28 Nov 2017 15:04:57 +0000 (16:04 +0100)
Commit ef838a81dd4d ("serial: Add common rs485 device tree parsing
function") consolidated retrieval of rs485 OF properties in a common
helper function but did not #ifdef it to CONFIG_OF.  The function is
therefore included on ACPI platforms as well even though it's not used.

On the other hand ACPI platforms with rs485 do exist (e.g. Siemens
IOT2040) and they may leverage _DSD to store rs485 properties.  Likewise,
UART platform devices instantiated from an MFD should be able to specify
rs485 properties.  In fact, the tty subsystem maintainer had asked for
a "generic" function during review of commit ef838a81dd4d:
https://marc.info/?l=linux-serial&m=150143441725194&w=4

Thus, instead of constraining the helper to OF platforms, make it
platform-agnostic by converting it to device_property_*() functions
and renaming it accordingly.

In imx.c, move the invocation of uart_get_rs485_mode() from
serial_imx_probe_dt() to serial_imx_probe() so that it also gets called
for non-OF devices.

In omap-serial.c, move its invocation further up within
serial_omap_probe_rs485() so that the RTS polarity can be overridden
with the driver-specific "rs485-rts-active-high" property once we
introduce a generic "rs485-rts-active-low" property.

Cc: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Richard Genoud <richard.genoud@gmail.com>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/atmel_serial.c
drivers/tty/serial/fsl_lpuart.c
drivers/tty/serial/imx.c
drivers/tty/serial/omap-serial.c
drivers/tty/serial/serial_core.c
include/linux/serial_core.h

index efa25611ca0c36eb73c8abc49a3767ebecb77cb3..df46a9e88c34dd89eaa766603fd5738c6d99ac9a 100644 (file)
@@ -2345,7 +2345,7 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port,
        atmel_init_property(atmel_port, pdev);
        atmel_set_ops(port);
 
-       of_get_rs485_mode(pdev->dev.of_node, &port->rs485);
+       uart_get_rs485_mode(&pdev->dev, &port->rs485);
 
        port->iotype            = UPIO_MEM;
        port->flags             = UPF_BOOT_AUTOCONF | UPF_IOREMAP;
index 1c4d3f38713863f2ebc2e5e7f13ff5f38ac0715d..38e76f95490e62e4c0332df24b3be10d80480bfc 100644 (file)
@@ -2206,7 +2206,7 @@ static int lpuart_probe(struct platform_device *pdev)
        if (ret)
                goto failed_attach_port;
 
-       of_get_rs485_mode(np, &sport->port.rs485);
+       uart_get_rs485_mode(&pdev->dev, &sport->port.rs485);
 
        if (sport->port.rs485.flags & SER_RS485_RX_DURING_TX) {
                dev_err(&pdev->dev, "driver doesn't support RX during TX\n");
index 16311a24b483285dd6a6ec65da67914b744ae4d4..aca3b7dbd09c8929952afd2f7549d06db64f5cb9 100644 (file)
@@ -1999,8 +1999,6 @@ static int serial_imx_probe_dt(struct imx_port *sport,
        if (of_get_property(np, "rts-gpios", NULL))
                sport->have_rtsgpio = 1;
 
-       of_get_rs485_mode(np, &sport->port.rs485);
-
        return 0;
 }
 #else
@@ -2093,6 +2091,8 @@ static int serial_imx_probe(struct platform_device *pdev)
                return ret;
        }
 
+       uart_get_rs485_mode(&pdev->dev, &sport->port.rs485);
+
        /* Disable interrupts before requesting them */
        reg = readl_relaxed(sport->port.membase + UCR1);
        reg &= ~(UCR1_ADEN | UCR1_TRDYEN | UCR1_IDEN | UCR1_RRDYEN |
index 53d59e9b944ad4e71fb6a5137410fbb23fd2a929..227347548fff61790e1f4974f2f5b19231e3d93b 100644 (file)
@@ -1611,6 +1611,8 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up,
        if (!np)
                return 0;
 
+       uart_get_rs485_mode(up->dev, rs485conf);
+
        if (of_property_read_bool(np, "rs485-rts-active-high"))
                rs485conf->flags |= SER_RS485_RTS_ON_SEND;
        else
@@ -1632,8 +1634,6 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up,
                up->rts_gpio = -EINVAL;
        }
 
-       of_get_rs485_mode(np, rs485conf);
-
        return 0;
 }
 
index 854995e1cae7d0d256d35d4d048836747ad81063..a59184a7afb03f2f7d63af0a2c7d9f86240603fa 100644 (file)
@@ -3013,19 +3013,20 @@ EXPORT_SYMBOL(uart_add_one_port);
 EXPORT_SYMBOL(uart_remove_one_port);
 
 /**
- * of_get_rs485_mode() - Implement parsing rs485 properties
- * @np: uart node
+ * uart_get_rs485_mode() - retrieve rs485 properties for given uart
+ * @dev: uart device
  * @rs485conf: output parameter
  *
  * This function implements the device tree binding described in
  * Documentation/devicetree/bindings/serial/rs485.txt.
  */
-void of_get_rs485_mode(struct device_node *np, struct serial_rs485 *rs485conf)
+void uart_get_rs485_mode(struct device *dev, struct serial_rs485 *rs485conf)
 {
        u32 rs485_delay[2];
        int ret;
 
-       ret = of_property_read_u32_array(np, "rs485-rts-delay", rs485_delay, 2);
+       ret = device_property_read_u32_array(dev, "rs485-rts-delay",
+                                            rs485_delay, 2);
        if (!ret) {
                rs485conf->delay_rts_before_send = rs485_delay[0];
                rs485conf->delay_rts_after_send = rs485_delay[1];
@@ -3040,13 +3041,13 @@ void of_get_rs485_mode(struct device_node *np, struct serial_rs485 *rs485conf)
         */
        rs485conf->flags &= ~(SER_RS485_RX_DURING_TX | SER_RS485_ENABLED);
 
-       if (of_property_read_bool(np, "rs485-rx-during-tx"))
+       if (device_property_read_bool(dev, "rs485-rx-during-tx"))
                rs485conf->flags |= SER_RS485_RX_DURING_TX;
 
-       if (of_property_read_bool(np, "linux,rs485-enabled-at-boot-time"))
+       if (device_property_read_bool(dev, "linux,rs485-enabled-at-boot-time"))
                rs485conf->flags |= SER_RS485_ENABLED;
 }
-EXPORT_SYMBOL_GPL(of_get_rs485_mode);
+EXPORT_SYMBOL_GPL(uart_get_rs485_mode);
 
 MODULE_DESCRIPTION("Serial driver core");
 MODULE_LICENSE("GPL");
index 37b044e78333ab28b01c6460e5f00484658cc20e..b60b225c0a599245e85d2abe5f726a736a6ea234 100644 (file)
@@ -501,9 +501,5 @@ static inline int uart_handle_break(struct uart_port *port)
                                         (cflag) & CRTSCTS || \
                                         !((cflag) & CLOCAL))
 
-/*
- * Common device tree parsing helpers
- */
-void of_get_rs485_mode(struct device_node *np, struct serial_rs485 *rs485conf);
-
+void uart_get_rs485_mode(struct device *dev, struct serial_rs485 *rs485conf);
 #endif /* LINUX_SERIAL_CORE_H */