aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/8250.c
diff options
context:
space:
mode:
authorSøren Holm <sgh@sgh.dk>2011-09-02 16:55:37 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-09-22 18:50:38 -0400
commit06315348b16178e4c006e7892ef8e5e65f49c66a (patch)
tree5be7085d5584e0cafdd0a51188e1658ddadb410d /drivers/tty/serial/8250.c
parent2f7861de111bb8e33e6ab9f9607583c6fbc00132 (diff)
serial: Support the EFR-register of XR1715x uarts.
The EFR (Enhenced-Features-Register) is located at a different offset than the other devices supporting UART_CAP_EFR. This change add a special setup quick to set UPF_EXAR_EFR on the port. UPF_EXAR_EFR is then used to the port type to PORT_XR17D15X since it is for sure a XR17D15X uart. Signed-off-by: Søren Holm <sgh@sgh.dk> Acked-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/tty/serial/8250.c')
-rw-r--r--drivers/tty/serial/8250.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c
index 435ce14e676c..82ca71aa9d10 100644
--- a/drivers/tty/serial/8250.c
+++ b/drivers/tty/serial/8250.c
@@ -309,6 +309,13 @@ static const struct serial8250_config uart_config[] = {
309 UART_FCR_T_TRIG_01, 309 UART_FCR_T_TRIG_01,
310 .flags = UART_CAP_FIFO | UART_CAP_RTOIE, 310 .flags = UART_CAP_FIFO | UART_CAP_RTOIE,
311 }, 311 },
312 [PORT_XR17D15X] = {
313 .name = "XR17D15X",
314 .fifo_size = 64,
315 .tx_loadsz = 64,
316 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
317 .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR,
318 },
312}; 319};
313 320
314#if defined(CONFIG_MIPS_ALCHEMY) 321#if defined(CONFIG_MIPS_ALCHEMY)
@@ -1075,6 +1082,14 @@ static void autoconfig_16550a(struct uart_8250_port *up)
1075 serial_outp(up, UART_IER, iersave); 1082 serial_outp(up, UART_IER, iersave);
1076 1083
1077 /* 1084 /*
1085 * Exar uarts have EFR in a weird location
1086 */
1087 if (up->port.flags & UPF_EXAR_EFR) {
1088 up->port.type = PORT_XR17D15X;
1089 up->capabilities |= UART_CAP_AFE | UART_CAP_EFR;
1090 }
1091
1092 /*
1078 * We distinguish between 16550A and U6 16550A by counting 1093 * We distinguish between 16550A and U6 16550A by counting
1079 * how many bytes are in the FIFO. 1094 * how many bytes are in the FIFO.
1080 */ 1095 */
@@ -2417,7 +2432,10 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2417 efr |= UART_EFR_CTS; 2432 efr |= UART_EFR_CTS;
2418 2433
2419 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B); 2434 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
2420 serial_outp(up, UART_EFR, efr); 2435 if (up->port.flags & UPF_EXAR_EFR)
2436 serial_outp(up, UART_XR_EFR, efr);
2437 else
2438 serial_outp(up, UART_EFR, efr);
2421 } 2439 }
2422 2440
2423#ifdef CONFIG_ARCH_OMAP 2441#ifdef CONFIG_ARCH_OMAP