diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-07-25 23:05:07 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-07-25 23:05:07 -0400 |
| commit | 82b35f376c71fbd60f5ea0ce27b3c835fa50ed6d (patch) | |
| tree | 903ad77762684699b9135d6b82ef959951d95806 /drivers | |
| parent | b0de415aa7469606ddf618caf3e2fdc94fa28733 (diff) | |
| parent | 61e86cc90af49cecef9c54ccea1f572fbcb695ac (diff) | |
Merge tag 'tty-4.2-rc4' 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 serial and tty fixes for reported issues.
All have been in linux-next successfully"
* tag 'tty-4.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
tty: vt: Fix !TASK_RUNNING diagnostic warning from paste_selection()
serial: core: Fix crashes while echoing when closing
m32r: Add ioreadXX/iowriteXX big-endian mmio accessors
Revert "serial: imx: initialized DMA w/o HW flow enabled"
sc16is7xx: fix FIFO address of secondary UART
sc16is7xx: fix Kconfig dependencies
serial: etraxfs-uart: Fix release etraxfs_uart_ports
tty/vt: Fix the memory leak in visual_init
serial: amba-pl011: Fix devm_ioremap_resource return value check
n_tty: signal and flush atomically
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/tty/n_tty.c | 16 | ||||
| -rw-r--r-- | drivers/tty/serial/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/tty/serial/amba-pl011.c | 4 | ||||
| -rw-r--r-- | drivers/tty/serial/etraxfs-uart.c | 2 | ||||
| -rw-r--r-- | drivers/tty/serial/imx.c | 15 | ||||
| -rw-r--r-- | drivers/tty/serial/sc16is7xx.c | 30 | ||||
| -rw-r--r-- | drivers/tty/serial/serial_core.c | 3 | ||||
| -rw-r--r-- | drivers/tty/vt/selection.c | 1 | ||||
| -rw-r--r-- | drivers/tty/vt/vt.c | 2 |
9 files changed, 52 insertions, 23 deletions
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index c9c27f69e101..ee8bfacf2071 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
| @@ -1108,19 +1108,29 @@ static void eraser(unsigned char c, struct tty_struct *tty) | |||
| 1108 | * Locking: ctrl_lock | 1108 | * Locking: ctrl_lock |
| 1109 | */ | 1109 | */ |
| 1110 | 1110 | ||
| 1111 | static void isig(int sig, struct tty_struct *tty) | 1111 | static void __isig(int sig, struct tty_struct *tty) |
| 1112 | { | 1112 | { |
| 1113 | struct n_tty_data *ldata = tty->disc_data; | ||
| 1114 | struct pid *tty_pgrp = tty_get_pgrp(tty); | 1113 | struct pid *tty_pgrp = tty_get_pgrp(tty); |
| 1115 | if (tty_pgrp) { | 1114 | if (tty_pgrp) { |
| 1116 | kill_pgrp(tty_pgrp, sig, 1); | 1115 | kill_pgrp(tty_pgrp, sig, 1); |
| 1117 | put_pid(tty_pgrp); | 1116 | put_pid(tty_pgrp); |
| 1118 | } | 1117 | } |
| 1118 | } | ||
| 1119 | 1119 | ||
| 1120 | if (!L_NOFLSH(tty)) { | 1120 | static void isig(int sig, struct tty_struct *tty) |
| 1121 | { | ||
| 1122 | struct n_tty_data *ldata = tty->disc_data; | ||
| 1123 | |||
| 1124 | if (L_NOFLSH(tty)) { | ||
| 1125 | /* signal only */ | ||
| 1126 | __isig(sig, tty); | ||
| 1127 | |||
| 1128 | } else { /* signal and flush */ | ||
| 1121 | up_read(&tty->termios_rwsem); | 1129 | up_read(&tty->termios_rwsem); |
| 1122 | down_write(&tty->termios_rwsem); | 1130 | down_write(&tty->termios_rwsem); |
| 1123 | 1131 | ||
| 1132 | __isig(sig, tty); | ||
| 1133 | |||
| 1124 | /* clear echo buffer */ | 1134 | /* clear echo buffer */ |
| 1125 | mutex_lock(&ldata->output_lock); | 1135 | mutex_lock(&ldata->output_lock); |
| 1126 | ldata->echo_head = ldata->echo_tail = 0; | 1136 | ldata->echo_head = ldata->echo_tail = 0; |
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index 76e65b714471..15b4079a335e 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig | |||
| @@ -1185,7 +1185,7 @@ config SERIAL_SC16IS7XX_CORE | |||
| 1185 | config SERIAL_SC16IS7XX | 1185 | config SERIAL_SC16IS7XX |
| 1186 | tristate "SC16IS7xx serial support" | 1186 | tristate "SC16IS7xx serial support" |
| 1187 | select SERIAL_CORE | 1187 | select SERIAL_CORE |
| 1188 | depends on I2C || SPI_MASTER | 1188 | depends on (SPI_MASTER && !I2C) || I2C |
| 1189 | help | 1189 | help |
| 1190 | This selects support for SC16IS7xx serial ports. | 1190 | This selects support for SC16IS7xx serial ports. |
| 1191 | Supported ICs are SC16IS740, SC16IS741, SC16IS750, SC16IS752, | 1191 | Supported ICs are SC16IS740, SC16IS741, SC16IS750, SC16IS752, |
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 50cf5b10ceed..fd27e986b1dd 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c | |||
| @@ -2310,8 +2310,8 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap, | |||
| 2310 | void __iomem *base; | 2310 | void __iomem *base; |
| 2311 | 2311 | ||
| 2312 | base = devm_ioremap_resource(dev, mmiobase); | 2312 | base = devm_ioremap_resource(dev, mmiobase); |
| 2313 | if (!base) | 2313 | if (IS_ERR(base)) |
| 2314 | return -ENOMEM; | 2314 | return PTR_ERR(base); |
| 2315 | 2315 | ||
| 2316 | index = pl011_probe_dt_alias(index, dev); | 2316 | index = pl011_probe_dt_alias(index, dev); |
| 2317 | 2317 | ||
diff --git a/drivers/tty/serial/etraxfs-uart.c b/drivers/tty/serial/etraxfs-uart.c index a57301a6fe42..679709f51fd4 100644 --- a/drivers/tty/serial/etraxfs-uart.c +++ b/drivers/tty/serial/etraxfs-uart.c | |||
| @@ -950,7 +950,7 @@ static int etraxfs_uart_remove(struct platform_device *pdev) | |||
| 950 | 950 | ||
| 951 | port = platform_get_drvdata(pdev); | 951 | port = platform_get_drvdata(pdev); |
| 952 | uart_remove_one_port(&etraxfs_uart_driver, port); | 952 | uart_remove_one_port(&etraxfs_uart_driver, port); |
| 953 | etraxfs_uart_ports[pdev->id] = NULL; | 953 | etraxfs_uart_ports[port->line] = NULL; |
| 954 | 954 | ||
| 955 | return 0; | 955 | return 0; |
| 956 | } | 956 | } |
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 2c90dc31bfaa..54fdc7866ea1 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c | |||
| @@ -1121,11 +1121,6 @@ static int imx_startup(struct uart_port *port) | |||
| 1121 | 1121 | ||
| 1122 | writel(temp & ~UCR4_DREN, sport->port.membase + UCR4); | 1122 | writel(temp & ~UCR4_DREN, sport->port.membase + UCR4); |
| 1123 | 1123 | ||
| 1124 | /* Can we enable the DMA support? */ | ||
| 1125 | if (is_imx6q_uart(sport) && !uart_console(port) && | ||
| 1126 | !sport->dma_is_inited) | ||
| 1127 | imx_uart_dma_init(sport); | ||
| 1128 | |||
| 1129 | spin_lock_irqsave(&sport->port.lock, flags); | 1124 | spin_lock_irqsave(&sport->port.lock, flags); |
| 1130 | /* Reset fifo's and state machines */ | 1125 | /* Reset fifo's and state machines */ |
| 1131 | i = 100; | 1126 | i = 100; |
| @@ -1143,9 +1138,6 @@ static int imx_startup(struct uart_port *port) | |||
| 1143 | writel(USR1_RTSD, sport->port.membase + USR1); | 1138 | writel(USR1_RTSD, sport->port.membase + USR1); |
| 1144 | writel(USR2_ORE, sport->port.membase + USR2); | 1139 | writel(USR2_ORE, sport->port.membase + USR2); |
| 1145 | 1140 | ||
| 1146 | if (sport->dma_is_inited && !sport->dma_is_enabled) | ||
| 1147 | imx_enable_dma(sport); | ||
| 1148 | |||
| 1149 | temp = readl(sport->port.membase + UCR1); | 1141 | temp = readl(sport->port.membase + UCR1); |
| 1150 | temp |= UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN; | 1142 | temp |= UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN; |
| 1151 | 1143 | ||
| @@ -1316,6 +1308,11 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios, | |||
| 1316 | } else { | 1308 | } else { |
| 1317 | ucr2 |= UCR2_CTSC; | 1309 | ucr2 |= UCR2_CTSC; |
| 1318 | } | 1310 | } |
| 1311 | |||
| 1312 | /* Can we enable the DMA support? */ | ||
| 1313 | if (is_imx6q_uart(sport) && !uart_console(port) | ||
| 1314 | && !sport->dma_is_inited) | ||
| 1315 | imx_uart_dma_init(sport); | ||
| 1319 | } else { | 1316 | } else { |
| 1320 | termios->c_cflag &= ~CRTSCTS; | 1317 | termios->c_cflag &= ~CRTSCTS; |
| 1321 | } | 1318 | } |
| @@ -1432,6 +1429,8 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios, | |||
| 1432 | if (UART_ENABLE_MS(&sport->port, termios->c_cflag)) | 1429 | if (UART_ENABLE_MS(&sport->port, termios->c_cflag)) |
| 1433 | imx_enable_ms(&sport->port); | 1430 | imx_enable_ms(&sport->port); |
| 1434 | 1431 | ||
| 1432 | if (sport->dma_is_inited && !sport->dma_is_enabled) | ||
| 1433 | imx_enable_dma(sport); | ||
| 1435 | spin_unlock_irqrestore(&sport->port.lock, flags); | 1434 | spin_unlock_irqrestore(&sport->port.lock, flags); |
| 1436 | } | 1435 | } |
| 1437 | 1436 | ||
diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c index 9e6576004a42..5ccc698cbbfa 100644 --- a/drivers/tty/serial/sc16is7xx.c +++ b/drivers/tty/serial/sc16is7xx.c | |||
| @@ -354,6 +354,26 @@ static void sc16is7xx_port_write(struct uart_port *port, u8 reg, u8 val) | |||
| 354 | (reg << SC16IS7XX_REG_SHIFT) | port->line, val); | 354 | (reg << SC16IS7XX_REG_SHIFT) | port->line, val); |
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | static void sc16is7xx_fifo_read(struct uart_port *port, unsigned int rxlen) | ||
| 358 | { | ||
| 359 | struct sc16is7xx_port *s = dev_get_drvdata(port->dev); | ||
| 360 | u8 addr = (SC16IS7XX_RHR_REG << SC16IS7XX_REG_SHIFT) | port->line; | ||
| 361 | |||
| 362 | regcache_cache_bypass(s->regmap, true); | ||
| 363 | regmap_raw_read(s->regmap, addr, s->buf, rxlen); | ||
| 364 | regcache_cache_bypass(s->regmap, false); | ||
| 365 | } | ||
| 366 | |||
| 367 | static void sc16is7xx_fifo_write(struct uart_port *port, u8 to_send) | ||
| 368 | { | ||
| 369 | struct sc16is7xx_port *s = dev_get_drvdata(port->dev); | ||
| 370 | u8 addr = (SC16IS7XX_THR_REG << SC16IS7XX_REG_SHIFT) | port->line; | ||
| 371 | |||
| 372 | regcache_cache_bypass(s->regmap, true); | ||
| 373 | regmap_raw_write(s->regmap, addr, s->buf, to_send); | ||
| 374 | regcache_cache_bypass(s->regmap, false); | ||
| 375 | } | ||
| 376 | |||
| 357 | static void sc16is7xx_port_update(struct uart_port *port, u8 reg, | 377 | static void sc16is7xx_port_update(struct uart_port *port, u8 reg, |
| 358 | u8 mask, u8 val) | 378 | u8 mask, u8 val) |
| 359 | { | 379 | { |
| @@ -508,10 +528,7 @@ static void sc16is7xx_handle_rx(struct uart_port *port, unsigned int rxlen, | |||
| 508 | s->buf[0] = sc16is7xx_port_read(port, SC16IS7XX_RHR_REG); | 528 | s->buf[0] = sc16is7xx_port_read(port, SC16IS7XX_RHR_REG); |
| 509 | bytes_read = 1; | 529 | bytes_read = 1; |
| 510 | } else { | 530 | } else { |
| 511 | regcache_cache_bypass(s->regmap, true); | 531 | sc16is7xx_fifo_read(port, rxlen); |
| 512 | regmap_raw_read(s->regmap, SC16IS7XX_RHR_REG, | ||
| 513 | s->buf, rxlen); | ||
| 514 | regcache_cache_bypass(s->regmap, false); | ||
| 515 | bytes_read = rxlen; | 532 | bytes_read = rxlen; |
| 516 | } | 533 | } |
| 517 | 534 | ||
| @@ -591,9 +608,8 @@ static void sc16is7xx_handle_tx(struct uart_port *port) | |||
| 591 | s->buf[i] = xmit->buf[xmit->tail]; | 608 | s->buf[i] = xmit->buf[xmit->tail]; |
| 592 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 609 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
| 593 | } | 610 | } |
| 594 | regcache_cache_bypass(s->regmap, true); | 611 | |
| 595 | regmap_raw_write(s->regmap, SC16IS7XX_THR_REG, s->buf, to_send); | 612 | sc16is7xx_fifo_write(port, to_send); |
| 596 | regcache_cache_bypass(s->regmap, false); | ||
| 597 | } | 613 | } |
| 598 | 614 | ||
| 599 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 615 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index 7ae1592f7ec9..f36852067f20 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c | |||
| @@ -1418,7 +1418,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp) | |||
| 1418 | mutex_lock(&port->mutex); | 1418 | mutex_lock(&port->mutex); |
| 1419 | uart_shutdown(tty, state); | 1419 | uart_shutdown(tty, state); |
| 1420 | tty_port_tty_set(port, NULL); | 1420 | tty_port_tty_set(port, NULL); |
| 1421 | tty->closing = 0; | 1421 | |
| 1422 | spin_lock_irqsave(&port->lock, flags); | 1422 | spin_lock_irqsave(&port->lock, flags); |
| 1423 | 1423 | ||
| 1424 | if (port->blocked_open) { | 1424 | if (port->blocked_open) { |
| @@ -1444,6 +1444,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp) | |||
| 1444 | mutex_unlock(&port->mutex); | 1444 | mutex_unlock(&port->mutex); |
| 1445 | 1445 | ||
| 1446 | tty_ldisc_flush(tty); | 1446 | tty_ldisc_flush(tty); |
| 1447 | tty->closing = 0; | ||
| 1447 | } | 1448 | } |
| 1448 | 1449 | ||
| 1449 | static void uart_wait_until_sent(struct tty_struct *tty, int timeout) | 1450 | static void uart_wait_until_sent(struct tty_struct *tty, int timeout) |
diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c index ea27804d87af..381a2b13682c 100644 --- a/drivers/tty/vt/selection.c +++ b/drivers/tty/vt/selection.c | |||
| @@ -356,6 +356,7 @@ int paste_selection(struct tty_struct *tty) | |||
| 356 | schedule(); | 356 | schedule(); |
| 357 | continue; | 357 | continue; |
| 358 | } | 358 | } |
| 359 | __set_current_state(TASK_RUNNING); | ||
| 359 | count = sel_buffer_lth - pasted; | 360 | count = sel_buffer_lth - pasted; |
| 360 | count = tty_ldisc_receive_buf(ld, sel_buffer + pasted, NULL, | 361 | count = tty_ldisc_receive_buf(ld, sel_buffer + pasted, NULL, |
| 361 | count); | 362 | count); |
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 8fe52989b380..4462d167900c 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c | |||
| @@ -742,6 +742,8 @@ static void visual_init(struct vc_data *vc, int num, int init) | |||
| 742 | __module_get(vc->vc_sw->owner); | 742 | __module_get(vc->vc_sw->owner); |
| 743 | vc->vc_num = num; | 743 | vc->vc_num = num; |
| 744 | vc->vc_display_fg = &master_display_fg; | 744 | vc->vc_display_fg = &master_display_fg; |
| 745 | if (vc->vc_uni_pagedir_loc) | ||
| 746 | con_free_unimap(vc); | ||
| 745 | vc->vc_uni_pagedir_loc = &vc->vc_uni_pagedir; | 747 | vc->vc_uni_pagedir_loc = &vc->vc_uni_pagedir; |
| 746 | vc->vc_uni_pagedir = NULL; | 748 | vc->vc_uni_pagedir = NULL; |
| 747 | vc->vc_hi_font_mask = 0; | 749 | vc->vc_hi_font_mask = 0; |
