diff options
author | Peter Hurley <peter@hurleysoftware.com> | 2015-01-25 14:44:52 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-02-02 13:11:28 -0500 |
commit | 9719acce37803d179fc94884c8d50b883fc8186e (patch) | |
tree | 6733045f07039bd64f197917505aaef6b1b827f6 /drivers/tty/serial/8250 | |
parent | 391f93f2ec9f857c83bdd21a14dcf7e699f38579 (diff) |
serial: 8250_omap: Use UPSTAT_AUTORTS for RTS handling
Commit 88838d3112702 ("serial: omap_8250: Fix RTS handling") fixed
RTS pin control when in autoRTS mode.
New support added in "serial: core: Rework hw-assisted flow control support"
enables a much simpler approach; rather than masking out autoRTS
whenever writing the EFR register, use the UPSTAT_* mode to determine if
autoRTS should be enabled when raising RTS (in omap8250_set_mctrl()).
Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/8250')
-rw-r--r-- | drivers/tty/serial/8250/8250_omap.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c index 6e4ff7148ead..fe6d2e51da09 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c | |||
@@ -120,10 +120,11 @@ static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl) | |||
120 | */ | 120 | */ |
121 | lcr = serial_in(up, UART_LCR); | 121 | lcr = serial_in(up, UART_LCR); |
122 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); | 122 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); |
123 | if (mctrl & TIOCM_RTS) | 123 | if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS)) |
124 | serial_out(up, UART_EFR, priv->efr); | 124 | priv->efr |= UART_EFR_RTS; |
125 | else | 125 | else |
126 | serial_out(up, UART_EFR, priv->efr & ~UART_EFR_RTS); | 126 | priv->efr &= ~UART_EFR_RTS; |
127 | serial_out(up, UART_EFR, priv->efr); | ||
127 | serial_out(up, UART_LCR, lcr); | 128 | serial_out(up, UART_LCR, lcr); |
128 | } | 129 | } |
129 | 130 | ||
@@ -272,10 +273,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up) | |||
272 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); | 273 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); |
273 | serial_dl_write(up, priv->quot); | 274 | serial_dl_write(up, priv->quot); |
274 | 275 | ||
275 | if (up->port.mctrl & TIOCM_RTS) | 276 | serial_out(up, UART_EFR, priv->efr); |
276 | serial_out(up, UART_EFR, priv->efr); | ||
277 | else | ||
278 | serial_out(up, UART_EFR, priv->efr & ~UART_EFR_RTS); | ||
279 | 277 | ||
280 | /* Configure flow control */ | 278 | /* Configure flow control */ |
281 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); | 279 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); |
@@ -424,9 +422,9 @@ static void omap_8250_set_termios(struct uart_port *port, | |||
424 | up->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS | UPSTAT_AUTOXOFF); | 422 | up->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS | UPSTAT_AUTOXOFF); |
425 | 423 | ||
426 | if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW) { | 424 | if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW) { |
427 | /* Enable AUTORTS and AUTOCTS */ | 425 | /* Enable AUTOCTS (autoRTS is enabled when RTS is raised) */ |
428 | up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS; | 426 | up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS; |
429 | priv->efr |= UART_EFR_CTS | UART_EFR_RTS; | 427 | priv->efr |= UART_EFR_CTS; |
430 | } else if (up->port.flags & UPF_SOFT_FLOW) { | 428 | } else if (up->port.flags & UPF_SOFT_FLOW) { |
431 | /* | 429 | /* |
432 | * IXON Flag: | 430 | * IXON Flag: |