aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-10-29 13:17:52 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-29 13:17:52 -0400
commit37cc6bb8f28aee667835a97b4d00e6a20e0e4b62 (patch)
tree86c8ad77595af96b5c9123a8664448956beb59a8
parent9af6f26a1a7f152f7736c0c20247eef0ab3df190 (diff)
parentd0f4bce2bce7e998abc906f3590e9032af7a41ba (diff)
Merge tag 'tty-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial driver fixes from Greg KH: "Here are a number of small tty and serial driver fixes for reported issues for 4.9-rc3. Nothing major, but they do resolve a bunch of problems with the tty core changes that are in 4.9-rc1, and finally the atmel serial driver is back working properly. All have been in linux-next with no reported issues" * tag 'tty-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: tty: serial_core: fix NULL struct tty pointer access in uart_write_wakeup tty: serial_core: Fix serial console crash on port shutdown tty/serial: at91: fix hardware handshake on Atmel platforms vt: clear selection before resizing sc16is7xx: always write state when configuring GPIO as an output sh-sci: document R8A7743/5 support tty: serial: 8250: 8250_core: NXP SC16C2552 workaround tty: limit terminal size to 4M chars tty: serial: fsl_lpuart: Fix Tx DMA edge case serial: 8250_lpss: enable MSI for sure serial: core: fix console problems on uart_close serial: 8250_uniphier: fix clearing divisor latch access bit serial: 8250_uniphier: fix more unterminated string serial: pch_uart: add terminate entry for dmi_system_id tables devicetree: bindings: uart: Add new compatible string for ZynqMP serial: xuartps: Add new compatible string for ZynqMP serial: SERIAL_STM32 should depend on HAS_DMA serial: stm32: Fix comparisons with undefined register tty: vt, fix bogus division in csi_J
-rw-r--r--Documentation/devicetree/bindings/serial/cdns,uart.txt4
-rw-r--r--Documentation/devicetree/bindings/serial/renesas,sci-serial.txt8
-rw-r--r--drivers/tty/serial/8250/8250_lpss.c2
-rw-r--r--drivers/tty/serial/8250/8250_port.c3
-rw-r--r--drivers/tty/serial/8250/8250_uniphier.c4
-rw-r--r--drivers/tty/serial/Kconfig1
-rw-r--r--drivers/tty/serial/atmel_serial.c26
-rw-r--r--drivers/tty/serial/fsl_lpuart.c3
-rw-r--r--drivers/tty/serial/pch_uart.c1
-rw-r--r--drivers/tty/serial/sc16is7xx.c8
-rw-r--r--drivers/tty/serial/serial_core.c8
-rw-r--r--drivers/tty/serial/stm32-usart.h2
-rw-r--r--drivers/tty/serial/xilinx_uartps.c2
-rw-r--r--drivers/tty/vt/vt.c7
14 files changed, 60 insertions, 19 deletions
diff --git a/Documentation/devicetree/bindings/serial/cdns,uart.txt b/Documentation/devicetree/bindings/serial/cdns,uart.txt
index a3eb154c32ca..227bb770b027 100644
--- a/Documentation/devicetree/bindings/serial/cdns,uart.txt
+++ b/Documentation/devicetree/bindings/serial/cdns,uart.txt
@@ -1,7 +1,9 @@
1Binding for Cadence UART Controller 1Binding for Cadence UART Controller
2 2
3Required properties: 3Required properties:
4- compatible : should be "cdns,uart-r1p8", or "xlnx,xuartps" 4- compatible :
5 Use "xlnx,xuartps","cdns,uart-r1p8" for Zynq-7xxx SoC.
6 Use "xlnx,zynqmp-uart","cdns,uart-r1p12" for Zynq Ultrascale+ MPSoC.
5- reg: Should contain UART controller registers location and length. 7- reg: Should contain UART controller registers location and length.
6- interrupts: Should contain UART controller interrupts. 8- interrupts: Should contain UART controller interrupts.
7- clocks: Must contain phandles to the UART clocks 9- clocks: Must contain phandles to the UART clocks
diff --git a/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt b/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
index 1e4000d83aee..8d27d1a603e7 100644
--- a/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
+++ b/Documentation/devicetree/bindings/serial/renesas,sci-serial.txt
@@ -9,6 +9,14 @@ Required properties:
9 - "renesas,scifb-r8a73a4" for R8A73A4 (R-Mobile APE6) SCIFB compatible UART. 9 - "renesas,scifb-r8a73a4" for R8A73A4 (R-Mobile APE6) SCIFB compatible UART.
10 - "renesas,scifa-r8a7740" for R8A7740 (R-Mobile A1) SCIFA compatible UART. 10 - "renesas,scifa-r8a7740" for R8A7740 (R-Mobile A1) SCIFA compatible UART.
11 - "renesas,scifb-r8a7740" for R8A7740 (R-Mobile A1) SCIFB compatible UART. 11 - "renesas,scifb-r8a7740" for R8A7740 (R-Mobile A1) SCIFB compatible UART.
12 - "renesas,scif-r8a7743" for R8A7743 (RZ/G1M) SCIF compatible UART.
13 - "renesas,scifa-r8a7743" for R8A7743 (RZ/G1M) SCIFA compatible UART.
14 - "renesas,scifb-r8a7743" for R8A7743 (RZ/G1M) SCIFB compatible UART.
15 - "renesas,hscif-r8a7743" for R8A7743 (RZ/G1M) HSCIF compatible UART.
16 - "renesas,scif-r8a7745" for R8A7745 (RZ/G1E) SCIF compatible UART.
17 - "renesas,scifa-r8a7745" for R8A7745 (RZ/G1E) SCIFA compatible UART.
18 - "renesas,scifb-r8a7745" for R8A7745 (RZ/G1E) SCIFB compatible UART.
19 - "renesas,hscif-r8a7745" for R8A7745 (RZ/G1E) HSCIF compatible UART.
12 - "renesas,scif-r8a7778" for R8A7778 (R-Car M1) SCIF compatible UART. 20 - "renesas,scif-r8a7778" for R8A7778 (R-Car M1) SCIF compatible UART.
13 - "renesas,scif-r8a7779" for R8A7779 (R-Car H1) SCIF compatible UART. 21 - "renesas,scif-r8a7779" for R8A7779 (R-Car H1) SCIF compatible UART.
14 - "renesas,scif-r8a7790" for R8A7790 (R-Car H2) SCIF compatible UART. 22 - "renesas,scif-r8a7790" for R8A7790 (R-Car H2) SCIF compatible UART.
diff --git a/drivers/tty/serial/8250/8250_lpss.c b/drivers/tty/serial/8250/8250_lpss.c
index 886fcf37f291..b9923464599f 100644
--- a/drivers/tty/serial/8250/8250_lpss.c
+++ b/drivers/tty/serial/8250/8250_lpss.c
@@ -213,7 +213,7 @@ static int qrk_serial_setup(struct lpss8250 *lpss, struct uart_port *port)
213 struct pci_dev *pdev = to_pci_dev(port->dev); 213 struct pci_dev *pdev = to_pci_dev(port->dev);
214 int ret; 214 int ret;
215 215
216 ret = pci_alloc_irq_vectors(pdev, 1, 1, 0); 216 ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
217 if (ret < 0) 217 if (ret < 0)
218 return ret; 218 return ret;
219 219
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index 1bfb6fdbaa20..1731b98d2471 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -83,7 +83,8 @@ static const struct serial8250_config uart_config[] = {
83 .name = "16550A", 83 .name = "16550A",
84 .fifo_size = 16, 84 .fifo_size = 16,
85 .tx_loadsz = 16, 85 .tx_loadsz = 16,
86 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, 86 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
87 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT,
87 .rxtrig_bytes = {1, 4, 8, 14}, 88 .rxtrig_bytes = {1, 4, 8, 14},
88 .flags = UART_CAP_FIFO, 89 .flags = UART_CAP_FIFO,
89 }, 90 },
diff --git a/drivers/tty/serial/8250/8250_uniphier.c b/drivers/tty/serial/8250/8250_uniphier.c
index b8d9c8c9d02a..417d9e7038e1 100644
--- a/drivers/tty/serial/8250/8250_uniphier.c
+++ b/drivers/tty/serial/8250/8250_uniphier.c
@@ -99,7 +99,7 @@ static void uniphier_serial_out(struct uart_port *p, int offset, int value)
99 case UART_LCR: 99 case UART_LCR:
100 valshift = UNIPHIER_UART_LCR_SHIFT; 100 valshift = UNIPHIER_UART_LCR_SHIFT;
101 /* Divisor latch access bit does not exist. */ 101 /* Divisor latch access bit does not exist. */
102 value &= ~(UART_LCR_DLAB << valshift); 102 value &= ~UART_LCR_DLAB;
103 /* fall through */ 103 /* fall through */
104 case UART_MCR: 104 case UART_MCR:
105 offset = UNIPHIER_UART_LCR_MCR; 105 offset = UNIPHIER_UART_LCR_MCR;
@@ -199,7 +199,7 @@ static int uniphier_uart_probe(struct platform_device *pdev)
199 199
200 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 200 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
201 if (!regs) { 201 if (!regs) {
202 dev_err(dev, "failed to get memory resource"); 202 dev_err(dev, "failed to get memory resource\n");
203 return -EINVAL; 203 return -EINVAL;
204 } 204 }
205 205
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index c7831407a882..25c1d7bc0100 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
@@ -1625,6 +1625,7 @@ config SERIAL_SPRD_CONSOLE
1625config SERIAL_STM32 1625config SERIAL_STM32
1626 tristate "STMicroelectronics STM32 serial port support" 1626 tristate "STMicroelectronics STM32 serial port support"
1627 select SERIAL_CORE 1627 select SERIAL_CORE
1628 depends on HAS_DMA
1628 depends on ARM || COMPILE_TEST 1629 depends on ARM || COMPILE_TEST
1629 help 1630 help
1630 This driver is for the on-chip Serial Controller on 1631 This driver is for the on-chip Serial Controller on
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index fd8aa1f4ba78..168b10cad47b 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -2132,11 +2132,29 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
2132 mode |= ATMEL_US_USMODE_RS485; 2132 mode |= ATMEL_US_USMODE_RS485;
2133 } else if (termios->c_cflag & CRTSCTS) { 2133 } else if (termios->c_cflag & CRTSCTS) {
2134 /* RS232 with hardware handshake (RTS/CTS) */ 2134 /* RS232 with hardware handshake (RTS/CTS) */
2135 if (atmel_use_dma_rx(port) && !atmel_use_fifo(port)) { 2135 if (atmel_use_fifo(port) &&
2136 dev_info(port->dev, "not enabling hardware flow control because DMA is used"); 2136 !mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_CTS)) {
2137 termios->c_cflag &= ~CRTSCTS; 2137 /*
2138 } else { 2138 * with ATMEL_US_USMODE_HWHS set, the controller will
2139 * be able to drive the RTS pin high/low when the RX
2140 * FIFO is above RXFTHRES/below RXFTHRES2.
2141 * It will also disable the transmitter when the CTS
2142 * pin is high.
2143 * This mode is not activated if CTS pin is a GPIO
2144 * because in this case, the transmitter is always
2145 * disabled (there must be an internal pull-up
2146 * responsible for this behaviour).
2147 * If the RTS pin is a GPIO, the controller won't be
2148 * able to drive it according to the FIFO thresholds,
2149 * but it will be handled by the driver.
2150 */
2139 mode |= ATMEL_US_USMODE_HWHS; 2151 mode |= ATMEL_US_USMODE_HWHS;
2152 } else {
2153 /*
2154 * For platforms without FIFO, the flow control is
2155 * handled by the driver.
2156 */
2157 mode |= ATMEL_US_USMODE_NORMAL;
2140 } 2158 }
2141 } else { 2159 } else {
2142 /* RS232 without hadware handshake */ 2160 /* RS232 without hadware handshake */
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
index de9d5107c00a..76103f2c4a80 100644
--- a/drivers/tty/serial/fsl_lpuart.c
+++ b/drivers/tty/serial/fsl_lpuart.c
@@ -328,7 +328,7 @@ static void lpuart_dma_tx(struct lpuart_port *sport)
328 328
329 sport->dma_tx_bytes = uart_circ_chars_pending(xmit); 329 sport->dma_tx_bytes = uart_circ_chars_pending(xmit);
330 330
331 if (xmit->tail < xmit->head) { 331 if (xmit->tail < xmit->head || xmit->head == 0) {
332 sport->dma_tx_nents = 1; 332 sport->dma_tx_nents = 1;
333 sg_init_one(sgl, xmit->buf + xmit->tail, sport->dma_tx_bytes); 333 sg_init_one(sgl, xmit->buf + xmit->tail, sport->dma_tx_bytes);
334 } else { 334 } else {
@@ -359,7 +359,6 @@ static void lpuart_dma_tx(struct lpuart_port *sport)
359 sport->dma_tx_in_progress = true; 359 sport->dma_tx_in_progress = true;
360 sport->dma_tx_cookie = dmaengine_submit(sport->dma_tx_desc); 360 sport->dma_tx_cookie = dmaengine_submit(sport->dma_tx_desc);
361 dma_async_issue_pending(sport->dma_tx_chan); 361 dma_async_issue_pending(sport->dma_tx_chan);
362
363} 362}
364 363
365static void lpuart_dma_tx_complete(void *arg) 364static void lpuart_dma_tx_complete(void *arg)
diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
index d391650b82e7..42caccb5e87e 100644
--- a/drivers/tty/serial/pch_uart.c
+++ b/drivers/tty/serial/pch_uart.c
@@ -419,6 +419,7 @@ static struct dmi_system_id pch_uart_dmi_table[] = {
419 }, 419 },
420 (void *)MINNOW_UARTCLK, 420 (void *)MINNOW_UARTCLK,
421 }, 421 },
422 { }
422}; 423};
423 424
424/* Return UART clock, checking for board specific clocks. */ 425/* Return UART clock, checking for board specific clocks. */
diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
index 2675792a8f59..fb0672554123 100644
--- a/drivers/tty/serial/sc16is7xx.c
+++ b/drivers/tty/serial/sc16is7xx.c
@@ -1130,9 +1130,13 @@ static int sc16is7xx_gpio_direction_output(struct gpio_chip *chip,
1130{ 1130{
1131 struct sc16is7xx_port *s = gpiochip_get_data(chip); 1131 struct sc16is7xx_port *s = gpiochip_get_data(chip);
1132 struct uart_port *port = &s->p[0].port; 1132 struct uart_port *port = &s->p[0].port;
1133 u8 state = sc16is7xx_port_read(port, SC16IS7XX_IOSTATE_REG);
1133 1134
1134 sc16is7xx_port_update(port, SC16IS7XX_IOSTATE_REG, BIT(offset), 1135 if (val)
1135 val ? BIT(offset) : 0); 1136 state |= BIT(offset);
1137 else
1138 state &= ~BIT(offset);
1139 sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state);
1136 sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset), 1140 sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset),
1137 BIT(offset)); 1141 BIT(offset));
1138 1142
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 6e4f63627479..f2303f390345 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -111,7 +111,7 @@ void uart_write_wakeup(struct uart_port *port)
111 * closed. No cookie for you. 111 * closed. No cookie for you.
112 */ 112 */
113 BUG_ON(!state); 113 BUG_ON(!state);
114 tty_wakeup(state->port.tty); 114 tty_port_tty_wakeup(&state->port);
115} 115}
116 116
117static void uart_stop(struct tty_struct *tty) 117static void uart_stop(struct tty_struct *tty)
@@ -632,7 +632,7 @@ static void uart_flush_buffer(struct tty_struct *tty)
632 if (port->ops->flush_buffer) 632 if (port->ops->flush_buffer)
633 port->ops->flush_buffer(port); 633 port->ops->flush_buffer(port);
634 uart_port_unlock(port, flags); 634 uart_port_unlock(port, flags);
635 tty_wakeup(tty); 635 tty_port_tty_wakeup(&state->port);
636} 636}
637 637
638/* 638/*
@@ -2746,8 +2746,6 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
2746 uport->cons = drv->cons; 2746 uport->cons = drv->cons;
2747 uport->minor = drv->tty_driver->minor_start + uport->line; 2747 uport->minor = drv->tty_driver->minor_start + uport->line;
2748 2748
2749 port->console = uart_console(uport);
2750
2751 /* 2749 /*
2752 * If this port is a console, then the spinlock is already 2750 * If this port is a console, then the spinlock is already
2753 * initialised. 2751 * initialised.
@@ -2761,6 +2759,8 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
2761 2759
2762 uart_configure_port(drv, state, uport); 2760 uart_configure_port(drv, state, uport);
2763 2761
2762 port->console = uart_console(uport);
2763
2764 num_groups = 2; 2764 num_groups = 2;
2765 if (uport->attr_group) 2765 if (uport->attr_group)
2766 num_groups++; 2766 num_groups++;
diff --git a/drivers/tty/serial/stm32-usart.h b/drivers/tty/serial/stm32-usart.h
index 41d974923102..cd97ceb76e4f 100644
--- a/drivers/tty/serial/stm32-usart.h
+++ b/drivers/tty/serial/stm32-usart.h
@@ -31,7 +31,7 @@ struct stm32_usart_info {
31 struct stm32_usart_config cfg; 31 struct stm32_usart_config cfg;
32}; 32};
33 33
34#define UNDEF_REG ~0 34#define UNDEF_REG 0xff
35 35
36/* Register offsets */ 36/* Register offsets */
37struct stm32_usart_info stm32f4_info = { 37struct stm32_usart_info stm32f4_info = {
diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index f37edaa5ac75..dd4c02fa4820 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -1200,6 +1200,7 @@ static int __init cdns_early_console_setup(struct earlycon_device *device,
1200OF_EARLYCON_DECLARE(cdns, "xlnx,xuartps", cdns_early_console_setup); 1200OF_EARLYCON_DECLARE(cdns, "xlnx,xuartps", cdns_early_console_setup);
1201OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup); 1201OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup);
1202OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup); 1202OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup);
1203OF_EARLYCON_DECLARE(cdns, "xlnx,zynqmp-uart", cdns_early_console_setup);
1203 1204
1204/** 1205/**
1205 * cdns_uart_console_write - perform write operation 1206 * cdns_uart_console_write - perform write operation
@@ -1438,6 +1439,7 @@ static const struct of_device_id cdns_uart_of_match[] = {
1438 { .compatible = "xlnx,xuartps", }, 1439 { .compatible = "xlnx,xuartps", },
1439 { .compatible = "cdns,uart-r1p8", }, 1440 { .compatible = "cdns,uart-r1p8", },
1440 { .compatible = "cdns,uart-r1p12", .data = &zynqmp_uart_def }, 1441 { .compatible = "cdns,uart-r1p12", .data = &zynqmp_uart_def },
1442 { .compatible = "xlnx,zynqmp-uart", .data = &zynqmp_uart_def },
1441 {} 1443 {}
1442}; 1444};
1443MODULE_DEVICE_TABLE(of, cdns_uart_of_match); 1445MODULE_DEVICE_TABLE(of, cdns_uart_of_match);
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 06fb39c1d6dd..8c3bf3d613c0 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -870,10 +870,15 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
870 if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) 870 if (new_cols == vc->vc_cols && new_rows == vc->vc_rows)
871 return 0; 871 return 0;
872 872
873 if (new_screen_size > (4 << 20))
874 return -EINVAL;
873 newscreen = kmalloc(new_screen_size, GFP_USER); 875 newscreen = kmalloc(new_screen_size, GFP_USER);
874 if (!newscreen) 876 if (!newscreen)
875 return -ENOMEM; 877 return -ENOMEM;
876 878
879 if (vc == sel_cons)
880 clear_selection();
881
877 old_rows = vc->vc_rows; 882 old_rows = vc->vc_rows;
878 old_row_size = vc->vc_size_row; 883 old_row_size = vc->vc_size_row;
879 884
@@ -1176,7 +1181,7 @@ static void csi_J(struct vc_data *vc, int vpar)
1176 break; 1181 break;
1177 case 3: /* erase scroll-back buffer (and whole display) */ 1182 case 3: /* erase scroll-back buffer (and whole display) */
1178 scr_memsetw(vc->vc_screenbuf, vc->vc_video_erase_char, 1183 scr_memsetw(vc->vc_screenbuf, vc->vc_video_erase_char,
1179 vc->vc_screenbuf_size >> 1); 1184 vc->vc_screenbuf_size);
1180 set_origin(vc); 1185 set_origin(vc);
1181 if (con_is_visible(vc)) 1186 if (con_is_visible(vc))
1182 update_screen(vc); 1187 update_screen(vc);