aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2012-10-15 11:50:59 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-11-04 07:14:22 -0500
commit01d70bb37ccb74a1b5c9e3e08c9a69eacc8d84f4 (patch)
tree446990b623f8588e7dba8c598e73f223790b62c0 /drivers/tty
parent820344fe3de78e9fdc7691cd6076703683f5a6f4 (diff)
SERIAL: omap: serial_omap_configure_xonxoff() contents into set_termios
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/omap-serial.c112
1 files changed, 53 insertions, 59 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 9f54cef56765..4888bd1ab322 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)
707 free_irq(up->port.irq, up); 707 free_irq(up->port.irq, up);
708} 708}
709 709
710static inline void
711serial_omap_configure_xonxoff
712 (struct uart_omap_port *up, struct ktermios *termios)
713{
714 up->lcr = serial_in(up, UART_LCR);
715 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
716 up->efr = serial_in(up, UART_EFR);
717 serial_out(up, UART_EFR, up->efr & ~UART_EFR_ECB);
718
719 serial_out(up, UART_XON1, termios->c_cc[VSTART]);
720 serial_out(up, UART_XOFF1, termios->c_cc[VSTOP]);
721
722 /* clear SW control mode bits */
723 up->efr &= OMAP_UART_SW_CLR;
724
725 /*
726 * IXON Flag:
727 * Enable XON/XOFF flow control on output.
728 * Transmit XON1, XOFF1
729 */
730 if (termios->c_iflag & IXON)
731 up->efr |= OMAP_UART_SW_TX;
732
733 /*
734 * IXOFF Flag:
735 * Enable XON/XOFF flow control on input.
736 * Receiver compares XON1, XOFF1.
737 */
738 if (termios->c_iflag & IXOFF)
739 up->efr |= OMAP_UART_SW_RX;
740
741 serial_out(up, UART_EFR, up->efr | UART_EFR_ECB);
742 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
743
744 up->mcr = serial_in(up, UART_MCR);
745
746 /*
747 * IXANY Flag:
748 * Enable any character to restart output.
749 * Operation resumes after receiving any
750 * character after recognition of the XOFF character
751 */
752 if (termios->c_iflag & IXANY)
753 up->mcr |= UART_MCR_XONANY;
754 else
755 up->mcr &= ~UART_MCR_XONANY;
756
757 serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR);
758 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
759 serial_out(up, UART_TI752_TCR, OMAP_UART_TCR_TRIG);
760 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
761 serial_out(up, UART_MCR, up->mcr & ~UART_MCR_TCRTLR);
762 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
763 serial_out(up, UART_EFR, up->efr);
764 serial_out(up, UART_LCR, up->lcr);
765}
766
767static void serial_omap_uart_qos_work(struct work_struct *work) 710static void serial_omap_uart_qos_work(struct work_struct *work)
768{ 711{
769 struct uart_omap_port *up = container_of(work, struct uart_omap_port, 712 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,
984 } 927 }
985 928
986 /* Software Flow Control Configuration */ 929 /* Software Flow Control Configuration */
987 if (up->port.flags & UPF_SOFT_FLOW) 930 if (up->port.flags & UPF_SOFT_FLOW) {
988 serial_omap_configure_xonxoff(up, termios); 931 up->lcr = serial_in(up, UART_LCR);
932 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
933 up->efr = serial_in(up, UART_EFR);
934 serial_out(up, UART_EFR, up->efr & ~UART_EFR_ECB);
935
936 serial_out(up, UART_XON1, termios->c_cc[VSTART]);
937 serial_out(up, UART_XOFF1, termios->c_cc[VSTOP]);
938
939 /* clear SW control mode bits */
940 up->efr &= OMAP_UART_SW_CLR;
941
942 /*
943 * IXON Flag:
944 * Enable XON/XOFF flow control on output.
945 * Transmit XON1, XOFF1
946 */
947 if (termios->c_iflag & IXON)
948 up->efr |= OMAP_UART_SW_TX;
949
950 /*
951 * IXOFF Flag:
952 * Enable XON/XOFF flow control on input.
953 * Receiver compares XON1, XOFF1.
954 */
955 if (termios->c_iflag & IXOFF)
956 up->efr |= OMAP_UART_SW_RX;
957
958 serial_out(up, UART_EFR, up->efr | UART_EFR_ECB);
959 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
960
961 up->mcr = serial_in(up, UART_MCR);
962
963 /*
964 * IXANY Flag:
965 * Enable any character to restart output.
966 * Operation resumes after receiving any
967 * character after recognition of the XOFF character
968 */
969 if (termios->c_iflag & IXANY)
970 up->mcr |= UART_MCR_XONANY;
971 else
972 up->mcr &= ~UART_MCR_XONANY;
973
974 serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR);
975 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
976 serial_out(up, UART_TI752_TCR, OMAP_UART_TCR_TRIG);
977 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
978 serial_out(up, UART_MCR, up->mcr & ~UART_MCR_TCRTLR);
979 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
980 serial_out(up, UART_EFR, up->efr);
981 serial_out(up, UART_LCR, up->lcr);
982 }
989 983
990 serial_omap_set_mctrl(&up->port, up->port.mctrl); 984 serial_omap_set_mctrl(&up->port, up->port.mctrl);
991 985