]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/tty/serial/imx.c
Merge tag 'sound-4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[karo-tx-linux.git] / drivers / tty / serial / imx.c
index a70356dad1b75a4a1e4a5d68344aaf51f6f96ef7..e3e152cbc75e71d7bc4e966f8a4ec3a1884c2b95 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;
@@ -335,15 +336,15 @@ static void imx_port_ucrs_restore(struct uart_port *port,
 
 static void imx_port_rts_active(struct imx_port *sport, unsigned long *ucr2)
 {
-       *ucr2 &= ~UCR2_CTSC;
-       *ucr2 |= UCR2_CTS;
+       *ucr2 &= ~(UCR2_CTSC | UCR2_CTS);
 
        mctrl_gpio_set(sport->gpios, sport->port.mctrl | TIOCM_RTS);
 }
 
 static void imx_port_rts_inactive(struct imx_port *sport, unsigned long *ucr2)
 {
-       *ucr2 &= ~(UCR2_CTSC | UCR2_CTS);
+       *ucr2 &= ~UCR2_CTSC;
+       *ucr2 |= UCR2_CTS;
 
        mctrl_gpio_set(sport->gpios, sport->port.mctrl & ~TIOCM_RTS);
 }
@@ -376,9 +377,9 @@ static void imx_stop_tx(struct uart_port *port)
            readl(port->membase + USR2) & USR2_TXDC) {
                temp = readl(port->membase + UCR2);
                if (port->rs485.flags & SER_RS485_RTS_AFTER_SEND)
-                       imx_port_rts_inactive(sport, &temp);
-               else
                        imx_port_rts_active(sport, &temp);
+               else
+                       imx_port_rts_inactive(sport, &temp);
                temp |= UCR2_RXEN;
                writel(temp, port->membase + UCR2);
 
@@ -584,9 +585,9 @@ static void imx_start_tx(struct uart_port *port)
        if (port->rs485.flags & SER_RS485_ENABLED) {
                temp = readl(port->membase + UCR2);
                if (port->rs485.flags & SER_RS485_RTS_ON_SEND)
-                       imx_port_rts_inactive(sport, &temp);
-               else
                        imx_port_rts_active(sport, &temp);
+               else
+                       imx_port_rts_inactive(sport, &temp);
                if (!(port->rs485.flags & SER_RS485_RX_DURING_TX))
                        temp &= ~UCR2_RXEN;
                writel(temp, port->membase + UCR2);
@@ -1476,9 +1477,9 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
                                 */
                                if (port->rs485.flags &
                                    SER_RS485_RTS_AFTER_SEND)
-                                       imx_port_rts_inactive(sport, &ucr2);
-                               else
                                        imx_port_rts_active(sport, &ucr2);
+                               else
+                                       imx_port_rts_inactive(sport, &ucr2);
                        } else {
                                imx_port_rts_auto(sport, &ucr2);
                        }
@@ -1488,9 +1489,9 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
        } else if (port->rs485.flags & SER_RS485_ENABLED) {
                /* disable transmitter */
                if (port->rs485.flags & SER_RS485_RTS_AFTER_SEND)
-                       imx_port_rts_inactive(sport, &ucr2);
-               else
                        imx_port_rts_active(sport, &ucr2);
+               else
+                       imx_port_rts_inactive(sport, &ucr2);
        }
 
 
@@ -1725,16 +1726,16 @@ 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) {
                /* disable transmitter */
                temp = readl(sport->port.membase + UCR2);
                if (rs485conf->flags & SER_RS485_RTS_AFTER_SEND)
-                       imx_port_rts_inactive(sport, &temp);
-               else
                        imx_port_rts_active(sport, &temp);
+               else
+                       imx_port_rts_inactive(sport, &temp);
                writel(temp, sport->port.membase + UCR2);
        }
 
@@ -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