From: Ian Jamison <[email protected]>

[ Upstream commit a0983c742a5885f82afb282166f83f1d3d8addf4 ]

UART core function uart_update_mctrl relies on a cached value of
modem control lines. This was used but not updated by local RTS
control functions within imx.c. These are used for RS485 line
driver enable signalling. Having an out-of-date value in the cached
mctrl can result in the transmitter being enabled when it shouldn't
be.

Fix this by updating the mctrl value before applying it.

Signed-off-by: Ian Jamison <[email protected]>
Origin: 
id:8195c96e674517b82a6ff7fe914c7ba0f86e702b.1505375165.git.ian....@arkver.com
Acked-by: Uwe Kleine-König <[email protected]>
Tested-by: Uwe Kleine-König <[email protected]>
Tested-by: Clemens Gruber <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---
 drivers/tty/serial/imx.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index dfeff3951f93..3657d745e90f 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -334,7 +334,8 @@ static void imx_port_rts_active(struct imx_port *sport, 
unsigned long *ucr2)
 {
        *ucr2 &= ~(UCR2_CTSC | UCR2_CTS);
 
-       mctrl_gpio_set(sport->gpios, sport->port.mctrl | TIOCM_RTS);
+       sport->port.mctrl |= TIOCM_RTS;
+       mctrl_gpio_set(sport->gpios, sport->port.mctrl);
 }
 
 static void imx_port_rts_inactive(struct imx_port *sport, unsigned long *ucr2)
@@ -342,7 +343,8 @@ static void imx_port_rts_inactive(struct imx_port *sport, 
unsigned long *ucr2)
        *ucr2 &= ~UCR2_CTSC;
        *ucr2 |= UCR2_CTS;
 
-       mctrl_gpio_set(sport->gpios, sport->port.mctrl & ~TIOCM_RTS);
+       sport->port.mctrl &= ~TIOCM_RTS;
+       mctrl_gpio_set(sport->gpios, sport->port.mctrl);
 }
 
 static void imx_port_rts_auto(struct imx_port *sport, unsigned long *ucr2)
-- 
2.11.0

Reply via email to