Commit ed6eb421 authored by Russell King's avatar Russell King

[SERIAL] Add FCR setting to serial8250_config structure.

This allows us to adapt the FCR for each port type in a much more
flexible way, and allows us to set the transmit trigger levels.
parent d3069b4d
...@@ -157,23 +157,109 @@ static struct irq_info irq_lists[NR_IRQS]; ...@@ -157,23 +157,109 @@ static struct irq_info irq_lists[NR_IRQS];
/* /*
* Here we define the default xmit fifo size used for each type of UART. * Here we define the default xmit fifo size used for each type of UART.
*/ */
static const struct serial8250_config uart_config[PORT_MAX_8250+1] = { static const struct serial8250_config uart_config[] = {
{ "unknown", 1, 1, 0 }, [PORT_UNKNOWN] = {
{ "8250", 1, 1, 0 }, .name = "unknown",
{ "16450", 1, 1, 0 }, .fifo_size = 1,
{ "16550", 1, 1, 0 }, .tx_loadsz = 1,
{ "16550A", 16, 16, UART_CAP_FIFO }, },
{ "Cirrus", 1, 1, 0 }, [PORT_8250] = {
{ "ST16650", 1, 1, UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_EFR }, .name = "8250",
{ "ST16650V2", 32, 16, UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_EFR }, .fifo_size = 1,
{ "TI16750", 64, 64, UART_CAP_FIFO | UART_CAP_SLEEP }, .tx_loadsz = 1,
{ "Startech", 1, 1, 0 }, },
{ "16C950/954", 128, 128, UART_CAP_FIFO }, [PORT_16450] = {
{ "ST16654", 64, 32, UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_EFR }, .name = "16450",
{ "XR16850", 128, 128, UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_EFR }, .fifo_size = 1,
{ "RSA", 2048, 2048, UART_CAP_FIFO }, .tx_loadsz = 1,
{ "NS16550A", 16, 16, UART_CAP_FIFO | UART_NATSEMI }, },
{ "XScale", 32, 32, UART_CAP_FIFO }, [PORT_16550] = {
.name = "16550",
.fifo_size = 1,
.tx_loadsz = 1,
},
[PORT_16550A] = {
.name = "16550A",
.fifo_size = 16,
.tx_loadsz = 16,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
.flags = UART_CAP_FIFO,
},
[PORT_CIRRUS] = {
.name = "Cirrus",
.fifo_size = 1,
.tx_loadsz = 1,
},
[PORT_16650] = {
.name = "ST16650",
.fifo_size = 1,
.tx_loadsz = 1,
.flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
},
[PORT_16650V2] = {
.name = "ST16650V2",
.fifo_size = 32,
.tx_loadsz = 16,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
UART_FCR_T_TRIG_00,
.flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
},
[PORT_16750] = {
.name = "TI16750",
.fifo_size = 64,
.tx_loadsz = 64,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
UART_FCR7_64BYTE,
.flags = UART_CAP_FIFO | UART_CAP_SLEEP,
},
[PORT_STARTECH] = {
.name = "Startech",
.fifo_size = 1,
.tx_loadsz = 1,
},
[PORT_16C950] = {
.name = "16C950/954",
.fifo_size = 128,
.tx_loadsz = 128,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
.flags = UART_CAP_FIFO,
},
[PORT_16654] = {
.name = "ST16654",
.fifo_size = 64,
.tx_loadsz = 32,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
UART_FCR_T_TRIG_10,
.flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
},
[PORT_16850] = {
.name = "XR16850",
.fifo_size = 128,
.tx_loadsz = 128,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
.flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
},
[PORT_RSA] = {
.name = "RSA",
.fifo_size = 2048,
.tx_loadsz = 2048,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
.flags = UART_CAP_FIFO,
},
[PORT_NS16550A] = {
.name = "NS16550A",
.fifo_size = 16,
.tx_loadsz = 16,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
.flags = UART_CAP_FIFO | UART_NATSEMI,
},
[PORT_XSCALE] = {
.name = "XScale",
.fifo_size = 32,
.tx_loadsz = 32,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
.flags = UART_CAP_FIFO,
},
}; };
static _INLINE_ unsigned int serial_in(struct uart_8250_port *up, int offset) static _INLINE_ unsigned int serial_in(struct uart_8250_port *up, int offset)
...@@ -1493,12 +1579,8 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, ...@@ -1493,12 +1579,8 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) { if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) {
if (baud < 2400) if (baud < 2400)
fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1; fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
#ifdef CONFIG_SERIAL_8250_RSA
else if (up->port.type == PORT_RSA)
fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_14;
#endif
else else
fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8; fcr = uart_config[up->port.type].fcr;
} }
/* /*
...@@ -1510,8 +1592,6 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios, ...@@ -1510,8 +1592,6 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
up->mcr &= ~UART_MCR_AFE; up->mcr &= ~UART_MCR_AFE;
if (termios->c_cflag & CRTSCTS) if (termios->c_cflag & CRTSCTS)
up->mcr |= UART_MCR_AFE; up->mcr |= UART_MCR_AFE;
fcr |= UART_FCR7_64BYTE;
} }
/* /*
...@@ -1797,7 +1877,7 @@ serial8250_verify_port(struct uart_port *port, struct serial_struct *ser) ...@@ -1797,7 +1877,7 @@ serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
{ {
if (ser->irq >= NR_IRQS || ser->irq < 0 || if (ser->irq >= NR_IRQS || ser->irq < 0 ||
ser->baud_base < 9600 || ser->type < PORT_UNKNOWN || ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
ser->type > PORT_MAX_8250 || ser->type == PORT_CIRRUS || ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
ser->type == PORT_STARTECH) ser->type == PORT_STARTECH)
return -EINVAL; return -EINVAL;
return 0; return 0;
......
...@@ -38,8 +38,9 @@ struct old_serial_port { ...@@ -38,8 +38,9 @@ struct old_serial_port {
*/ */
struct serial8250_config { struct serial8250_config {
const char *name; const char *name;
unsigned int fifo_size; unsigned short fifo_size;
unsigned int tx_loadsz; unsigned short tx_loadsz;
unsigned char fcr;
unsigned int flags; unsigned int flags;
}; };
......
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