aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/tty/serial/omap-serial.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 6129fe515932..10256fa04b40 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -681,7 +681,7 @@ static unsigned int serial_omap_get_mctrl(struct uart_port *port)
681static void serial_omap_set_mctrl(struct uart_port *port, unsigned int mctrl) 681static void serial_omap_set_mctrl(struct uart_port *port, unsigned int mctrl)
682{ 682{
683 struct uart_omap_port *up = to_uart_omap_port(port); 683 struct uart_omap_port *up = to_uart_omap_port(port);
684 unsigned char mcr = 0, old_mcr; 684 unsigned char mcr = 0, old_mcr, lcr;
685 685
686 dev_dbg(up->port.dev, "serial_omap_set_mctrl+%d\n", up->port.line); 686 dev_dbg(up->port.dev, "serial_omap_set_mctrl+%d\n", up->port.line);
687 if (mctrl & TIOCM_RTS) 687 if (mctrl & TIOCM_RTS)
@@ -701,6 +701,17 @@ static void serial_omap_set_mctrl(struct uart_port *port, unsigned int mctrl)
701 UART_MCR_DTR | UART_MCR_RTS); 701 UART_MCR_DTR | UART_MCR_RTS);
702 up->mcr = old_mcr | mcr; 702 up->mcr = old_mcr | mcr;
703 serial_out(up, UART_MCR, up->mcr); 703 serial_out(up, UART_MCR, up->mcr);
704
705 /* Turn off autoRTS if RTS is lowered; restore autoRTS if RTS raised */
706 lcr = serial_in(up, UART_LCR);
707 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
708 if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS))
709 up->efr |= UART_EFR_RTS;
710 else
711 up->efr &= UART_EFR_RTS;
712 serial_out(up, UART_EFR, up->efr);
713 serial_out(up, UART_LCR, lcr);
714
704 pm_runtime_mark_last_busy(up->dev); 715 pm_runtime_mark_last_busy(up->dev);
705 pm_runtime_put_autosuspend(up->dev); 716 pm_runtime_put_autosuspend(up->dev);
706} 717}
@@ -756,8 +767,6 @@ static int serial_omap_startup(struct uart_port *port)
756 * (they will be reenabled in set_termios()) 767 * (they will be reenabled in set_termios())
757 */ 768 */
758 serial_omap_clear_fifos(up); 769 serial_omap_clear_fifos(up);
759 /* For Hardware flow control */
760 serial_out(up, UART_MCR, UART_MCR_RTS);
761 770
762 /* 771 /*
763 * Clear the interrupt registers. 772 * Clear the interrupt registers.
@@ -1056,12 +1065,9 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
1056 up->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS | UPSTAT_AUTOXOFF); 1065 up->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS | UPSTAT_AUTOXOFF);
1057 1066
1058 if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW) { 1067 if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW) {
1059 /* Enable AUTORTS and AUTOCTS */ 1068 /* Enable AUTOCTS (autoRTS is enabled when RTS is raised) */
1060 up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS; 1069 up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
1061 up->efr |= UART_EFR_CTS | UART_EFR_RTS; 1070 up->efr |= UART_EFR_CTS;
1062
1063 /* Ensure MCR RTS is asserted */
1064 up->mcr |= UART_MCR_RTS;
1065 } else { 1071 } else {
1066 /* Disable AUTORTS and AUTOCTS */ 1072 /* Disable AUTORTS and AUTOCTS */
1067 up->efr &= ~(UART_EFR_CTS | UART_EFR_RTS); 1073 up->efr &= ~(UART_EFR_CTS | UART_EFR_RTS);