diff options
| -rw-r--r-- | drivers/tty/serial/omap-serial.c | 112 | 
1 files changed, 53 insertions, 59 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c index 9f54cef5676..4888bd1ab32 100644 --- a/drivers/tty/serial/omap-serial.c +++ b/drivers/tty/serial/omap-serial.c @@ -707,63 +707,6 @@ static void serial_omap_shutdown(struct uart_port *port)  	free_irq(up->port.irq, up);  } -static inline void -serial_omap_configure_xonxoff -		(struct uart_omap_port *up, struct ktermios *termios) -{ -	up->lcr = serial_in(up, UART_LCR); -	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); -	up->efr = serial_in(up, UART_EFR); -	serial_out(up, UART_EFR, up->efr & ~UART_EFR_ECB); - -	serial_out(up, UART_XON1, termios->c_cc[VSTART]); -	serial_out(up, UART_XOFF1, termios->c_cc[VSTOP]); - -	/* clear SW control mode bits */ -	up->efr &= OMAP_UART_SW_CLR; - -	/* -	 * IXON Flag: -	 * Enable XON/XOFF flow control on output. -	 * Transmit XON1, XOFF1 -	 */ -	if (termios->c_iflag & IXON) -		up->efr |= OMAP_UART_SW_TX; - -	/* -	 * IXOFF Flag: -	 * Enable XON/XOFF flow control on input. -	 * Receiver compares XON1, XOFF1. -	 */ -	if (termios->c_iflag & IXOFF) -		up->efr |= OMAP_UART_SW_RX; - -	serial_out(up, UART_EFR, up->efr | UART_EFR_ECB); -	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A); - -	up->mcr = serial_in(up, UART_MCR); - -	/* -	 * IXANY Flag: -	 * Enable any character to restart output. -	 * Operation resumes after receiving any -	 * character after recognition of the XOFF character -	 */ -	if (termios->c_iflag & IXANY) -		up->mcr |= UART_MCR_XONANY; -	else -		up->mcr &= ~UART_MCR_XONANY; - -	serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR); -	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); -	serial_out(up, UART_TI752_TCR, OMAP_UART_TCR_TRIG); -	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A); -	serial_out(up, UART_MCR, up->mcr & ~UART_MCR_TCRTLR); -	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); -	serial_out(up, UART_EFR, up->efr); -	serial_out(up, UART_LCR, up->lcr); -} -  static void serial_omap_uart_qos_work(struct work_struct *work)  {  	struct uart_omap_port *up = container_of(work, struct uart_omap_port, @@ -984,8 +927,59 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,  	}  	/* Software Flow Control Configuration */ -	if (up->port.flags & UPF_SOFT_FLOW) -		serial_omap_configure_xonxoff(up, termios); +	if (up->port.flags & UPF_SOFT_FLOW) { +		up->lcr = serial_in(up, UART_LCR); +		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); +		up->efr = serial_in(up, UART_EFR); +		serial_out(up, UART_EFR, up->efr & ~UART_EFR_ECB); + +		serial_out(up, UART_XON1, termios->c_cc[VSTART]); +		serial_out(up, UART_XOFF1, termios->c_cc[VSTOP]); + +		/* clear SW control mode bits */ +		up->efr &= OMAP_UART_SW_CLR; + +		/* +		 * IXON Flag: +		 * Enable XON/XOFF flow control on output. +		 * Transmit XON1, XOFF1 +		 */ +		if (termios->c_iflag & IXON) +			up->efr |= OMAP_UART_SW_TX; + +		/* +		 * IXOFF Flag: +		 * Enable XON/XOFF flow control on input. +		 * Receiver compares XON1, XOFF1. +		 */ +		if (termios->c_iflag & IXOFF) +			up->efr |= OMAP_UART_SW_RX; + +		serial_out(up, UART_EFR, up->efr | UART_EFR_ECB); +		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A); + +		up->mcr = serial_in(up, UART_MCR); + +		/* +		 * IXANY Flag: +		 * Enable any character to restart output. +		 * Operation resumes after receiving any +		 * character after recognition of the XOFF character +		 */ +		if (termios->c_iflag & IXANY) +			up->mcr |= UART_MCR_XONANY; +		else +			up->mcr &= ~UART_MCR_XONANY; + +		serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR); +		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); +		serial_out(up, UART_TI752_TCR, OMAP_UART_TCR_TRIG); +		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A); +		serial_out(up, UART_MCR, up->mcr & ~UART_MCR_TCRTLR); +		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); +		serial_out(up, UART_EFR, up->efr); +		serial_out(up, UART_LCR, up->lcr); +	}  	serial_omap_set_mctrl(&up->port, up->port.mctrl);  |