aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSonic Zhang <sonic.zhang@analog.com>2012-05-16 02:22:25 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-17 16:25:56 -0400
commit3c2d0ed221a22ce2c1c9fe1e2d6142374917642e (patch)
tree2cd3baf5f365b8cf0b6f5be019594f77b409d3c0 /drivers
parent239c25b1a03cf57193b9a52623deb918adf6132e (diff)
serial: bfin_uart: RTS and CTS MMRs can be either 16-bit width or 32-bit width.
Change hardware flow control code to adapt to both bf5xx and bf60x. Disabled serial device before set termios for bf60x. Signed-off-by: Sonic Zhang <sonic.zhang@analog.com> Signed-off-by: Bob Liu <lliubbo@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/tty/serial/bfin_uart.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/tty/serial/bfin_uart.c b/drivers/tty/serial/bfin_uart.c
index 56b95b0447d9..7924ba6d5dfb 100644
--- a/drivers/tty/serial/bfin_uart.c
+++ b/drivers/tty/serial/bfin_uart.c
@@ -549,7 +549,7 @@ static irqreturn_t bfin_serial_dma_tx_int(int irq, void *dev_id)
549static irqreturn_t bfin_serial_dma_rx_int(int irq, void *dev_id) 549static irqreturn_t bfin_serial_dma_rx_int(int irq, void *dev_id)
550{ 550{
551 struct bfin_serial_port *uart = dev_id; 551 struct bfin_serial_port *uart = dev_id;
552 unsigned short irqstat; 552 unsigned int irqstat;
553 int x_pos, pos; 553 int x_pos, pos;
554 554
555 spin_lock(&uart->rx_lock); 555 spin_lock(&uart->rx_lock);
@@ -582,7 +582,7 @@ static irqreturn_t bfin_serial_dma_rx_int(int irq, void *dev_id)
582static unsigned int bfin_serial_tx_empty(struct uart_port *port) 582static unsigned int bfin_serial_tx_empty(struct uart_port *port)
583{ 583{
584 struct bfin_serial_port *uart = (struct bfin_serial_port *)port; 584 struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
585 unsigned short lsr; 585 unsigned int lsr;
586 586
587 lsr = UART_GET_LSR(uart); 587 lsr = UART_GET_LSR(uart);
588 if (lsr & TEMT) 588 if (lsr & TEMT)
@@ -741,7 +741,7 @@ static int bfin_serial_startup(struct uart_port *port)
741 } 741 }
742 742
743 /* CTS RTS PINs are negative assertive. */ 743 /* CTS RTS PINs are negative assertive. */
744 UART_PUT_MCR(uart, ACTS); 744 UART_PUT_MCR(uart, UART_GET_MCR(uart) | ACTS);
745 UART_SET_IER(uart, EDSSI); 745 UART_SET_IER(uart, EDSSI);
746 } 746 }
747#endif 747#endif
@@ -799,7 +799,7 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios,
799 struct bfin_serial_port *uart = (struct bfin_serial_port *)port; 799 struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
800 unsigned long flags; 800 unsigned long flags;
801 unsigned int baud, quot; 801 unsigned int baud, quot;
802 unsigned short val, ier, lcr = 0; 802 unsigned int ier, lcr = 0;
803 803
804 switch (termios->c_cflag & CSIZE) { 804 switch (termios->c_cflag & CSIZE) {
805 case CS8: 805 case CS8:
@@ -871,6 +871,7 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios,
871 871
872 /* Disable UART */ 872 /* Disable UART */
873 ier = UART_GET_IER(uart); 873 ier = UART_GET_IER(uart);
874 UART_PUT_GCTL(uart, UART_GET_GCTL(uart) & ~UCEN);
874 UART_DISABLE_INTS(uart); 875 UART_DISABLE_INTS(uart);
875 876
876 /* Set DLAB in LCR to Access CLK */ 877 /* Set DLAB in LCR to Access CLK */
@@ -882,14 +883,11 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios,
882 /* Clear DLAB in LCR to Access THR RBR IER */ 883 /* Clear DLAB in LCR to Access THR RBR IER */
883 UART_CLEAR_DLAB(uart); 884 UART_CLEAR_DLAB(uart);
884 885
885 UART_PUT_LCR(uart, lcr); 886 UART_PUT_LCR(uart, (UART_GET_LCR(uart) & ~LCR_MASK) | lcr);
886 887
887 /* Enable UART */ 888 /* Enable UART */
888 UART_ENABLE_INTS(uart, ier); 889 UART_ENABLE_INTS(uart, ier);
889 890 UART_PUT_GCTL(uart, UART_GET_GCTL(uart) | UCEN);
890 val = UART_GET_GCTL(uart);
891 val |= UCEN;
892 UART_PUT_GCTL(uart, val);
893 891
894 /* Port speed changed, update the per-port timeout. */ 892 /* Port speed changed, update the per-port timeout. */
895 uart_update_timeout(port, termios->c_cflag, baud); 893 uart_update_timeout(port, termios->c_cflag, baud);
@@ -949,7 +947,7 @@ bfin_serial_verify_port(struct uart_port *port, struct serial_struct *ser)
949static void bfin_serial_set_ldisc(struct uart_port *port, int ld) 947static void bfin_serial_set_ldisc(struct uart_port *port, int ld)
950{ 948{
951 struct bfin_serial_port *uart = (struct bfin_serial_port *)port; 949 struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
952 unsigned short val; 950 unsigned int val;
953 951
954 switch (ld) { 952 switch (ld) {
955 case N_IRDA: 953 case N_IRDA:
@@ -967,7 +965,7 @@ static void bfin_serial_set_ldisc(struct uart_port *port, int ld)
967static void bfin_serial_reset_irda(struct uart_port *port) 965static void bfin_serial_reset_irda(struct uart_port *port)
968{ 966{
969 struct bfin_serial_port *uart = (struct bfin_serial_port *)port; 967 struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
970 unsigned short val; 968 unsigned int val;
971 969
972 val = UART_GET_GCTL(uart); 970 val = UART_GET_GCTL(uart);
973 val &= ~(UMOD_MASK | RPOLC); 971 val &= ~(UMOD_MASK | RPOLC);
@@ -1065,7 +1063,7 @@ static void __init
1065bfin_serial_console_get_options(struct bfin_serial_port *uart, int *baud, 1063bfin_serial_console_get_options(struct bfin_serial_port *uart, int *baud,
1066 int *parity, int *bits) 1064 int *parity, int *bits)
1067{ 1065{
1068 unsigned short status; 1066 unsigned int status;
1069 1067
1070 status = UART_GET_IER(uart) & (ERBFI | ETBEI); 1068 status = UART_GET_IER(uart) & (ERBFI | ETBEI);
1071 if (status == (ERBFI | ETBEI)) { 1069 if (status == (ERBFI | ETBEI)) {