Commit d6a03f19 authored by Russell King's avatar Russell King

[SERIAL] Add support for TI16C750 hardware flow control.

parent 99ca6b83
...@@ -133,6 +133,7 @@ struct uart_8250_port { ...@@ -133,6 +133,7 @@ struct uart_8250_port {
unsigned char acr; unsigned char acr;
unsigned char ier; unsigned char ier;
unsigned char lcr; unsigned char lcr;
unsigned char mcr;
unsigned char mcr_mask; /* mask of user bits */ unsigned char mcr_mask; /* mask of user bits */
unsigned char mcr_force; /* mask of forced bits */ unsigned char mcr_force; /* mask of forced bits */
unsigned char lsr_break_flag; unsigned char lsr_break_flag;
...@@ -1176,7 +1177,7 @@ static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl) ...@@ -1176,7 +1177,7 @@ static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
if (mctrl & TIOCM_LOOP) if (mctrl & TIOCM_LOOP)
mcr |= UART_MCR_LOOP; mcr |= UART_MCR_LOOP;
mcr = (mcr & up->mcr_mask) | up->mcr_force; mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
serial_out(up, UART_MCR, mcr); serial_out(up, UART_MCR, mcr);
} }
...@@ -1202,6 +1203,7 @@ static int serial8250_startup(struct uart_port *port) ...@@ -1202,6 +1203,7 @@ static int serial8250_startup(struct uart_port *port)
int retval; int retval;
up->capabilities = uart_config[up->port.type].flags; up->capabilities = uart_config[up->port.type].flags;
up->mcr = 0;
if (up->port.type == PORT_16C950) { if (up->port.type == PORT_16C950) {
/* Wake up and initialize UART */ /* Wake up and initialize UART */
...@@ -1451,8 +1453,19 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, ...@@ -1451,8 +1453,19 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
else else
fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8; fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8;
} }
if (up->port.type == PORT_16750)
/*
* TI16C750: hardware flow control and 64 byte FIFOs. When AFE is
* enabled, RTS will be deasserted when the receive FIFO contains
* more characters than the trigger, or the MCR RTS bit is cleared.
*/
if (up->port.type == PORT_16750) {
up->mcr &= ~UART_MCR_AFE;
if (termios->c_cflag & CRTSCTS)
up->mcr |= UART_MCR_AFE;
fcr |= UART_FCR7_64BYTE; fcr |= UART_FCR7_64BYTE;
}
/* /*
* Ok, we're now changing the port state. Do it with * Ok, we're now changing the port state. Do it with
...@@ -1514,10 +1527,17 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, ...@@ -1514,10 +1527,17 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
} else { } else {
serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */ serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
} }
serial_outp(up, UART_DLL, quot & 0xff); /* LS of divisor */ serial_outp(up, UART_DLL, quot & 0xff); /* LS of divisor */
serial_outp(up, UART_DLM, quot >> 8); /* MS of divisor */ serial_outp(up, UART_DLM, quot >> 8); /* MS of divisor */
/*
* LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
* is written without DLAB set, this mode will be disabled.
*/
if (up->port.type == PORT_16750) if (up->port.type == PORT_16750)
serial_outp(up, UART_FCR, fcr); /* set fcr */ serial_outp(up, UART_FCR, fcr);
serial_outp(up, UART_LCR, cval); /* reset DLAB */ serial_outp(up, UART_LCR, cval); /* reset DLAB */
up->lcr = cval; /* Save LCR */ up->lcr = cval; /* Save LCR */
if (up->port.type != PORT_16750) { if (up->port.type != PORT_16750) {
...@@ -1527,6 +1547,7 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, ...@@ -1527,6 +1547,7 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
} }
serial_outp(up, UART_FCR, fcr); /* set fcr */ serial_outp(up, UART_FCR, fcr); /* set fcr */
} }
serial8250_set_mctrl(&up->port, up->port.mctrl);
spin_unlock_irqrestore(&up->port.lock, flags); spin_unlock_irqrestore(&up->port.lock, flags);
} }
......
...@@ -121,6 +121,7 @@ ...@@ -121,6 +121,7 @@
/* /*
* These are the definitions for the Modem Control Register * These are the definitions for the Modem Control Register
*/ */
#define UART_MCR_AFE 0x20 /* Enable auto-RTS/CTS (TI16C750) */
#define UART_MCR_LOOP 0x10 /* Enable loopback test mode */ #define UART_MCR_LOOP 0x10 /* Enable loopback test mode */
#define UART_MCR_OUT2 0x08 /* Out2 complement */ #define UART_MCR_OUT2 0x08 /* Out2 complement */
#define UART_MCR_OUT1 0x04 /* Out1 complement */ #define UART_MCR_OUT1 0x04 /* Out1 complement */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment