diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
| commit | 1f16f116b01c110db20ab808562c8b8bc3ee3d6e (patch) | |
| tree | 44db563f64cf5f8d62af8f99a61e2b248c44ea3a /drivers/tty | |
| parent | 03724ac3d48f8f0e3caf1d30fa134f8fd96c94e2 (diff) | |
| parent | f9eccf24615672896dc13251410c3f2f33a14f95 (diff) | |
Merge branches 'clockevents/4.4-fixes' and 'clockevents/4.5-fixes' of http://git.linaro.org/people/daniel.lezcano/linux into timers/urgent
Pull in fixes from Daniel Lezcano:
- Fix the vt8500 timer leading to a system lock up when dealing with too
small delta (Roman Volkov)
- Select the CLKSRC_MMIO when the fsl_ftm_timer is enabled with COMPILE_TEST
(Daniel Lezcano)
- Prevent to compile timers using the 'iomem' API when the architecture has
not HAS_IOMEM set (Richard Weinberger)
Diffstat (limited to 'drivers/tty')
| -rw-r--r-- | drivers/tty/n_tty.c | 22 | ||||
| -rw-r--r-- | drivers/tty/serial/8250/8250_uniphier.c | 8 | ||||
| -rw-r--r-- | drivers/tty/serial/earlycon.c | 2 | ||||
| -rw-r--r-- | drivers/tty/serial/sh-sci.c | 2 | ||||
| -rw-r--r-- | drivers/tty/serial/sunhv.c | 12 | ||||
| -rw-r--r-- | drivers/tty/tty_buffer.c | 2 |
6 files changed, 26 insertions, 22 deletions
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index ed776149261e..e49c2bce551d 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
| @@ -2054,13 +2054,13 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, | |||
| 2054 | size_t eol; | 2054 | size_t eol; |
| 2055 | size_t tail; | 2055 | size_t tail; |
| 2056 | int ret, found = 0; | 2056 | int ret, found = 0; |
| 2057 | bool eof_push = 0; | ||
| 2058 | 2057 | ||
| 2059 | /* N.B. avoid overrun if nr == 0 */ | 2058 | /* N.B. avoid overrun if nr == 0 */ |
| 2060 | n = min(*nr, smp_load_acquire(&ldata->canon_head) - ldata->read_tail); | 2059 | if (!*nr) |
| 2061 | if (!n) | ||
| 2062 | return 0; | 2060 | return 0; |
| 2063 | 2061 | ||
| 2062 | n = min(*nr + 1, smp_load_acquire(&ldata->canon_head) - ldata->read_tail); | ||
| 2063 | |||
| 2064 | tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1); | 2064 | tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1); |
| 2065 | size = min_t(size_t, tail + n, N_TTY_BUF_SIZE); | 2065 | size = min_t(size_t, tail + n, N_TTY_BUF_SIZE); |
| 2066 | 2066 | ||
| @@ -2081,12 +2081,11 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, | |||
| 2081 | n = eol - tail; | 2081 | n = eol - tail; |
| 2082 | if (n > N_TTY_BUF_SIZE) | 2082 | if (n > N_TTY_BUF_SIZE) |
| 2083 | n += N_TTY_BUF_SIZE; | 2083 | n += N_TTY_BUF_SIZE; |
| 2084 | n += found; | 2084 | c = n + found; |
| 2085 | c = n; | ||
| 2086 | 2085 | ||
| 2087 | if (found && !ldata->push && read_buf(ldata, eol) == __DISABLED_CHAR) { | 2086 | if (!found || read_buf(ldata, eol) != __DISABLED_CHAR) { |
| 2088 | n--; | 2087 | c = min(*nr, c); |
| 2089 | eof_push = !n && ldata->read_tail != ldata->line_start; | 2088 | n = c; |
| 2090 | } | 2089 | } |
| 2091 | 2090 | ||
| 2092 | n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu size:%zu more:%zu\n", | 2091 | n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu size:%zu more:%zu\n", |
| @@ -2116,7 +2115,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, | |||
| 2116 | ldata->push = 0; | 2115 | ldata->push = 0; |
| 2117 | tty_audit_push(tty); | 2116 | tty_audit_push(tty); |
| 2118 | } | 2117 | } |
| 2119 | return eof_push ? -EAGAIN : 0; | 2118 | return 0; |
| 2120 | } | 2119 | } |
| 2121 | 2120 | ||
| 2122 | extern ssize_t redirected_tty_write(struct file *, const char __user *, | 2121 | extern ssize_t redirected_tty_write(struct file *, const char __user *, |
| @@ -2273,10 +2272,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, | |||
| 2273 | 2272 | ||
| 2274 | if (ldata->icanon && !L_EXTPROC(tty)) { | 2273 | if (ldata->icanon && !L_EXTPROC(tty)) { |
| 2275 | retval = canon_copy_from_read_buf(tty, &b, &nr); | 2274 | retval = canon_copy_from_read_buf(tty, &b, &nr); |
| 2276 | if (retval == -EAGAIN) { | 2275 | if (retval) |
| 2277 | retval = 0; | ||
| 2278 | continue; | ||
| 2279 | } else if (retval) | ||
| 2280 | break; | 2276 | break; |
| 2281 | } else { | 2277 | } else { |
| 2282 | int uncopied; | 2278 | int uncopied; |
diff --git a/drivers/tty/serial/8250/8250_uniphier.c b/drivers/tty/serial/8250/8250_uniphier.c index d11621e2cf1d..245edbb68d4b 100644 --- a/drivers/tty/serial/8250/8250_uniphier.c +++ b/drivers/tty/serial/8250/8250_uniphier.c | |||
| @@ -115,12 +115,16 @@ static void uniphier_serial_out(struct uart_port *p, int offset, int value) | |||
| 115 | */ | 115 | */ |
| 116 | static int uniphier_serial_dl_read(struct uart_8250_port *up) | 116 | static int uniphier_serial_dl_read(struct uart_8250_port *up) |
| 117 | { | 117 | { |
| 118 | return readl(up->port.membase + UNIPHIER_UART_DLR); | 118 | int offset = UNIPHIER_UART_DLR << up->port.regshift; |
| 119 | |||
| 120 | return readl(up->port.membase + offset); | ||
| 119 | } | 121 | } |
| 120 | 122 | ||
| 121 | static void uniphier_serial_dl_write(struct uart_8250_port *up, int value) | 123 | static void uniphier_serial_dl_write(struct uart_8250_port *up, int value) |
| 122 | { | 124 | { |
| 123 | writel(value, up->port.membase + UNIPHIER_UART_DLR); | 125 | int offset = UNIPHIER_UART_DLR << up->port.regshift; |
| 126 | |||
| 127 | writel(value, up->port.membase + offset); | ||
| 124 | } | 128 | } |
| 125 | 129 | ||
| 126 | static int uniphier_of_serial_setup(struct device *dev, struct uart_port *port, | 130 | static int uniphier_of_serial_setup(struct device *dev, struct uart_port *port, |
diff --git a/drivers/tty/serial/earlycon.c b/drivers/tty/serial/earlycon.c index f09636083426..b5b2f2be6be7 100644 --- a/drivers/tty/serial/earlycon.c +++ b/drivers/tty/serial/earlycon.c | |||
| @@ -115,6 +115,7 @@ static int __init register_earlycon(char *buf, const struct earlycon_id *match) | |||
| 115 | if (buf && !parse_options(&early_console_dev, buf)) | 115 | if (buf && !parse_options(&early_console_dev, buf)) |
| 116 | buf = NULL; | 116 | buf = NULL; |
| 117 | 117 | ||
| 118 | spin_lock_init(&port->lock); | ||
| 118 | port->uartclk = BASE_BAUD * 16; | 119 | port->uartclk = BASE_BAUD * 16; |
| 119 | if (port->mapbase) | 120 | if (port->mapbase) |
| 120 | port->membase = earlycon_map(port->mapbase, 64); | 121 | port->membase = earlycon_map(port->mapbase, 64); |
| @@ -202,6 +203,7 @@ int __init of_setup_earlycon(unsigned long addr, | |||
| 202 | int err; | 203 | int err; |
| 203 | struct uart_port *port = &early_console_dev.port; | 204 | struct uart_port *port = &early_console_dev.port; |
| 204 | 205 | ||
| 206 | spin_lock_init(&port->lock); | ||
| 205 | port->iotype = UPIO_MEM; | 207 | port->iotype = UPIO_MEM; |
| 206 | port->mapbase = addr; | 208 | port->mapbase = addr; |
| 207 | port->uartclk = BASE_BAUD * 16; | 209 | port->uartclk = BASE_BAUD * 16; |
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 960e50a97558..51c7507b0444 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c | |||
| @@ -1437,7 +1437,7 @@ static void sci_request_dma(struct uart_port *port) | |||
| 1437 | sg_init_table(sg, 1); | 1437 | sg_init_table(sg, 1); |
| 1438 | s->rx_buf[i] = buf; | 1438 | s->rx_buf[i] = buf; |
| 1439 | sg_dma_address(sg) = dma; | 1439 | sg_dma_address(sg) = dma; |
| 1440 | sg->length = s->buf_len_rx; | 1440 | sg_dma_len(sg) = s->buf_len_rx; |
| 1441 | 1441 | ||
| 1442 | buf += s->buf_len_rx; | 1442 | buf += s->buf_len_rx; |
| 1443 | dma += s->buf_len_rx; | 1443 | dma += s->buf_len_rx; |
diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c index 064031870ba0..ca0d3802f2af 100644 --- a/drivers/tty/serial/sunhv.c +++ b/drivers/tty/serial/sunhv.c | |||
| @@ -148,8 +148,10 @@ static int receive_chars_read(struct uart_port *port) | |||
| 148 | uart_handle_dcd_change(port, 1); | 148 | uart_handle_dcd_change(port, 1); |
| 149 | } | 149 | } |
| 150 | 150 | ||
| 151 | for (i = 0; i < bytes_read; i++) | 151 | if (port->sysrq != 0 && *con_read_page) { |
| 152 | uart_handle_sysrq_char(port, con_read_page[i]); | 152 | for (i = 0; i < bytes_read; i++) |
| 153 | uart_handle_sysrq_char(port, con_read_page[i]); | ||
| 154 | } | ||
| 153 | 155 | ||
| 154 | if (port->state == NULL) | 156 | if (port->state == NULL) |
| 155 | continue; | 157 | continue; |
| @@ -168,17 +170,17 @@ struct sunhv_ops { | |||
| 168 | int (*receive_chars)(struct uart_port *port); | 170 | int (*receive_chars)(struct uart_port *port); |
| 169 | }; | 171 | }; |
| 170 | 172 | ||
| 171 | static struct sunhv_ops bychar_ops = { | 173 | static const struct sunhv_ops bychar_ops = { |
| 172 | .transmit_chars = transmit_chars_putchar, | 174 | .transmit_chars = transmit_chars_putchar, |
| 173 | .receive_chars = receive_chars_getchar, | 175 | .receive_chars = receive_chars_getchar, |
| 174 | }; | 176 | }; |
| 175 | 177 | ||
| 176 | static struct sunhv_ops bywrite_ops = { | 178 | static const struct sunhv_ops bywrite_ops = { |
| 177 | .transmit_chars = transmit_chars_write, | 179 | .transmit_chars = transmit_chars_write, |
| 178 | .receive_chars = receive_chars_read, | 180 | .receive_chars = receive_chars_read, |
| 179 | }; | 181 | }; |
| 180 | 182 | ||
| 181 | static struct sunhv_ops *sunhv_ops = &bychar_ops; | 183 | static const struct sunhv_ops *sunhv_ops = &bychar_ops; |
| 182 | 184 | ||
| 183 | static struct tty_port *receive_chars(struct uart_port *port) | 185 | static struct tty_port *receive_chars(struct uart_port *port) |
| 184 | { | 186 | { |
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index 9a479e61791a..3cd31e0d4bd9 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c | |||
| @@ -450,7 +450,7 @@ receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count) | |||
| 450 | count = disc->ops->receive_buf2(tty, p, f, count); | 450 | count = disc->ops->receive_buf2(tty, p, f, count); |
| 451 | else { | 451 | else { |
| 452 | count = min_t(int, count, tty->receive_room); | 452 | count = min_t(int, count, tty->receive_room); |
| 453 | if (count) | 453 | if (count && disc->ops->receive_buf) |
| 454 | disc->ops->receive_buf(tty, p, f, count); | 454 | disc->ops->receive_buf(tty, p, f, count); |
| 455 | } | 455 | } |
| 456 | return count; | 456 | return count; |
