diff options
author | Søren Holm <sgh@sgh.dk> | 2011-09-02 16:55:37 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-09-22 18:50:38 -0400 |
commit | 06315348b16178e4c006e7892ef8e5e65f49c66a (patch) | |
tree | 5be7085d5584e0cafdd0a51188e1658ddadb410d /drivers/tty/serial/8250.c | |
parent | 2f7861de111bb8e33e6ab9f9607583c6fbc00132 (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.c | 20 |
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 |