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 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 | ||
710 | static inline void | ||
711 | serial_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 | |||
767 | static void serial_omap_uart_qos_work(struct work_struct *work) | 710 | static 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 | ||