serial: imx: Allow passing 'rst-gpios' for rs485 mode
authorFabio Estevam <fabio.estevam@nxp.com>
Sat, 7 Jan 2017 21:29:13 +0000 (19:29 -0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Jan 2017 10:51:25 +0000 (11:51 +0100)
According to Documentation/devicetree/bindings/serial/serial.txt the
generic 'rts-gpios' property can be used to specify the GPIO for RTS
functionality.

Currently it is not possible to use the imx UART port in rs485 mode when
the 'rts-gpios' property is passed in the device tree.

The imx uart driver only checks for the presence of the built-in RTS pin,
via 'uart-has-rtscts' property and disable the rs485 flag if this property
is absent.

So fix this logic by also checking if RTS pin has been passed via GPIO.

Tested on a imx6dl based board.

Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
Tested-by: Clemens Gruber <clemens.gruber@pqgruber.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/imx.c

index a70356dad1b75a4a1e4a5d68344aaf51f6f96ef7..33fcc84e756b2d89a47d9f0bcaf976db9580ff03 100644 (file)
@@ -205,6 +205,7 @@ struct imx_port {
        struct timer_list       timer;
        unsigned int            old_status;
        unsigned int            have_rtscts:1;
+       unsigned int            have_rtsgpio:1;
        unsigned int            dte_mode:1;
        unsigned int            irda_inv_rx:1;
        unsigned int            irda_inv_tx:1;
@@ -1725,7 +1726,7 @@ static int imx_rs485_config(struct uart_port *port,
        rs485conf->delay_rts_after_send = 0;
 
        /* RTS is required to control the transmitter */
-       if (!sport->have_rtscts)
+       if (!sport->have_rtscts && !sport->have_rtsgpio)
                rs485conf->flags &= ~SER_RS485_ENABLED;
 
        if (rs485conf->flags & SER_RS485_ENABLED) {
@@ -2048,6 +2049,9 @@ static int serial_imx_probe_dt(struct imx_port *sport,
        if (of_get_property(np, "fsl,dte-mode", NULL))
                sport->dte_mode = 1;
 
+       if (of_get_property(np, "rts-gpios", NULL))
+               sport->have_rtsgpio = 1;
+
        return 0;
 }
 #else