diff options
-rw-r--r-- | Documentation/devicetree/bindings/serial/cdns,uart.txt | 4 | ||||
-rw-r--r-- | Documentation/devicetree/bindings/serial/renesas,sci-serial.txt | 8 | ||||
-rw-r--r-- | drivers/tty/serial/8250/8250_lpss.c | 2 | ||||
-rw-r--r-- | drivers/tty/serial/8250/8250_port.c | 3 | ||||
-rw-r--r-- | drivers/tty/serial/8250/8250_uniphier.c | 4 | ||||
-rw-r--r-- | drivers/tty/serial/Kconfig | 1 | ||||
-rw-r--r-- | drivers/tty/serial/atmel_serial.c | 26 | ||||
-rw-r--r-- | drivers/tty/serial/fsl_lpuart.c | 3 | ||||
-rw-r--r-- | drivers/tty/serial/pch_uart.c | 1 | ||||
-rw-r--r-- | drivers/tty/serial/sc16is7xx.c | 8 | ||||
-rw-r--r-- | drivers/tty/serial/serial_core.c | 8 | ||||
-rw-r--r-- | drivers/tty/serial/stm32-usart.h | 2 | ||||
-rw-r--r-- | drivers/tty/serial/xilinx_uartps.c | 2 | ||||
-rw-r--r-- | drivers/tty/vt/vt.c | 7 |
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 @@ | |||
1 | Binding for Cadence UART Controller | 1 | Binding for Cadence UART Controller |
2 | 2 | ||
3 | Required properties: | 3 | Required 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 | |||
1625 | config SERIAL_STM32 | 1625 | config 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 | ||
365 | static void lpuart_dma_tx_complete(void *arg) | 364 | static 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 | ||
117 | static void uart_stop(struct tty_struct *tty) | 117 | static 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 */ |
37 | struct stm32_usart_info stm32f4_info = { | 37 | struct 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, | |||
1200 | OF_EARLYCON_DECLARE(cdns, "xlnx,xuartps", cdns_early_console_setup); | 1200 | OF_EARLYCON_DECLARE(cdns, "xlnx,xuartps", cdns_early_console_setup); |
1201 | OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup); | 1201 | OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup); |
1202 | OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup); | 1202 | OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup); |
1203 | OF_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 | }; |
1443 | MODULE_DEVICE_TABLE(of, cdns_uart_of_match); | 1445 | MODULE_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); |