diff options
-rw-r--r-- | drivers/tty/serial/8250/Kconfig | 8 | ||||
-rw-r--r-- | drivers/tty/serial/amba-pl011.c | 23 | ||||
-rw-r--r-- | drivers/tty/serial/atmel_serial.c | 8 | ||||
-rw-r--r-- | drivers/tty/serial/mxs-auart.c | 2 |
4 files changed, 36 insertions, 5 deletions
diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig index a65fb8197aec..0e3f529d50e9 100644 --- a/drivers/tty/serial/8250/Kconfig +++ b/drivers/tty/serial/8250/Kconfig | |||
@@ -128,9 +128,13 @@ config SERIAL_8250_PCI | |||
128 | by the parport_serial driver, enabled with CONFIG_PARPORT_SERIAL. | 128 | by the parport_serial driver, enabled with CONFIG_PARPORT_SERIAL. |
129 | 129 | ||
130 | config SERIAL_8250_EXAR | 130 | config SERIAL_8250_EXAR |
131 | tristate "8250/16550 PCI device support" | 131 | tristate "8250/16550 Exar/Commtech PCI/PCIe device support" |
132 | depends on SERIAL_8250_PCI | 132 | depends on SERIAL_8250_PCI |
133 | default SERIAL_8250 | 133 | default SERIAL_8250 |
134 | help | ||
135 | This builds support for XR17C1xx, XR17V3xx and some Commtech | ||
136 | 422x PCIe serial cards that are not covered by the more generic | ||
137 | SERIAL_8250_PCI option. | ||
134 | 138 | ||
135 | config SERIAL_8250_HP300 | 139 | config SERIAL_8250_HP300 |
136 | tristate | 140 | tristate |
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 56f92d7348bf..b0a377725d63 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c | |||
@@ -2452,18 +2452,37 @@ static void pl011_early_write(struct console *con, const char *s, unsigned n) | |||
2452 | uart_console_write(&dev->port, s, n, pl011_putc); | 2452 | uart_console_write(&dev->port, s, n, pl011_putc); |
2453 | } | 2453 | } |
2454 | 2454 | ||
2455 | /* | ||
2456 | * On non-ACPI systems, earlycon is enabled by specifying | ||
2457 | * "earlycon=pl011,<address>" on the kernel command line. | ||
2458 | * | ||
2459 | * On ACPI ARM64 systems, an "early" console is enabled via the SPCR table, | ||
2460 | * by specifying only "earlycon" on the command line. Because it requires | ||
2461 | * SPCR, the console starts after ACPI is parsed, which is later than a | ||
2462 | * traditional early console. | ||
2463 | * | ||
2464 | * To get the traditional early console that starts before ACPI is parsed, | ||
2465 | * specify the full "earlycon=pl011,<address>" option. | ||
2466 | */ | ||
2455 | static int __init pl011_early_console_setup(struct earlycon_device *device, | 2467 | static int __init pl011_early_console_setup(struct earlycon_device *device, |
2456 | const char *opt) | 2468 | const char *opt) |
2457 | { | 2469 | { |
2458 | if (!device->port.membase) | 2470 | if (!device->port.membase) |
2459 | return -ENODEV; | 2471 | return -ENODEV; |
2460 | 2472 | ||
2461 | device->con->write = qdf2400_e44_present ? | 2473 | /* On QDF2400 SOCs affected by Erratum 44, the "qdf2400_e44" must |
2462 | qdf2400_e44_early_write : pl011_early_write; | 2474 | * also be specified, e.g. "earlycon=pl011,<address>,qdf2400_e44". |
2475 | */ | ||
2476 | if (!strcmp(device->options, "qdf2400_e44")) | ||
2477 | device->con->write = qdf2400_e44_early_write; | ||
2478 | else | ||
2479 | device->con->write = pl011_early_write; | ||
2480 | |||
2463 | return 0; | 2481 | return 0; |
2464 | } | 2482 | } |
2465 | OF_EARLYCON_DECLARE(pl011, "arm,pl011", pl011_early_console_setup); | 2483 | OF_EARLYCON_DECLARE(pl011, "arm,pl011", pl011_early_console_setup); |
2466 | OF_EARLYCON_DECLARE(pl011, "arm,sbsa-uart", pl011_early_console_setup); | 2484 | OF_EARLYCON_DECLARE(pl011, "arm,sbsa-uart", pl011_early_console_setup); |
2485 | EARLYCON_DECLARE(qdf2400_e44, pl011_early_console_setup); | ||
2467 | 2486 | ||
2468 | #else | 2487 | #else |
2469 | #define AMBA_CONSOLE NULL | 2488 | #define AMBA_CONSOLE NULL |
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index dcebb28ffbc4..1f50a83ef958 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c | |||
@@ -1951,6 +1951,11 @@ static void atmel_flush_buffer(struct uart_port *port) | |||
1951 | atmel_uart_writel(port, ATMEL_PDC_TCR, 0); | 1951 | atmel_uart_writel(port, ATMEL_PDC_TCR, 0); |
1952 | atmel_port->pdc_tx.ofs = 0; | 1952 | atmel_port->pdc_tx.ofs = 0; |
1953 | } | 1953 | } |
1954 | /* | ||
1955 | * in uart_flush_buffer(), the xmit circular buffer has just | ||
1956 | * been cleared, so we have to reset tx_len accordingly. | ||
1957 | */ | ||
1958 | atmel_port->tx_len = 0; | ||
1954 | } | 1959 | } |
1955 | 1960 | ||
1956 | /* | 1961 | /* |
@@ -2483,6 +2488,9 @@ static void atmel_console_write(struct console *co, const char *s, u_int count) | |||
2483 | pdc_tx = atmel_uart_readl(port, ATMEL_PDC_PTSR) & ATMEL_PDC_TXTEN; | 2488 | pdc_tx = atmel_uart_readl(port, ATMEL_PDC_PTSR) & ATMEL_PDC_TXTEN; |
2484 | atmel_uart_writel(port, ATMEL_PDC_PTCR, ATMEL_PDC_TXTDIS); | 2489 | atmel_uart_writel(port, ATMEL_PDC_PTCR, ATMEL_PDC_TXTDIS); |
2485 | 2490 | ||
2491 | /* Make sure that tx path is actually able to send characters */ | ||
2492 | atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_TXEN); | ||
2493 | |||
2486 | uart_console_write(port, s, count, atmel_console_putchar); | 2494 | uart_console_write(port, s, count, atmel_console_putchar); |
2487 | 2495 | ||
2488 | /* | 2496 | /* |
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c index 6989b227d134..be94246b6fcc 100644 --- a/drivers/tty/serial/mxs-auart.c +++ b/drivers/tty/serial/mxs-auart.c | |||
@@ -1088,7 +1088,7 @@ static void mxs_auart_settermios(struct uart_port *u, | |||
1088 | AUART_LINECTRL_BAUD_DIV_MAX); | 1088 | AUART_LINECTRL_BAUD_DIV_MAX); |
1089 | baud_max = u->uartclk * 32 / AUART_LINECTRL_BAUD_DIV_MIN; | 1089 | baud_max = u->uartclk * 32 / AUART_LINECTRL_BAUD_DIV_MIN; |
1090 | baud = uart_get_baud_rate(u, termios, old, baud_min, baud_max); | 1090 | baud = uart_get_baud_rate(u, termios, old, baud_min, baud_max); |
1091 | div = u->uartclk * 32 / baud; | 1091 | div = DIV_ROUND_CLOSEST(u->uartclk * 32, baud); |
1092 | } | 1092 | } |
1093 | 1093 | ||
1094 | ctrl |= AUART_LINECTRL_BAUD_DIVFRAC(div & 0x3F); | 1094 | ctrl |= AUART_LINECTRL_BAUD_DIVFRAC(div & 0x3F); |