Skip to content

Commit

Permalink
Merge tag 'tty-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/gregkh/tty

Pull tty/serial updates from Greg KH:
 "Here is the "big" TTY/Serial patch updates for 4.12-rc1

  Not a lot of new things here, the normal number of serial driver
  updates and additions, tiny bugs fixed, and some core files split up
  to make future changes a bit easier for Nicolas's "tiny-tty" work.

  All of these have been in linux-next for a while"

* tag 'tty-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (62 commits)
  serial: small Makefile reordering
  tty: split job control support into a file of its own
  tty: move baudrate handling code to a file of its own
  console: move console_init() out of tty_io.c
  serial: 8250_early: Add earlycon support for Palmchip UART
  tty: pl011: use "qdf2400_e44" as the earlycon name for QDF2400 E44
  vt: make mouse selection of non-ASCII consistent
  vt: set mouse selection word-chars to gpm's default
  imx-serial: Reduce RX DMA startup latency when opening for reading
  serial: omap: suspend device on probe errors
  serial: omap: fix runtime-pm handling on unbind
  tty: serial: omap: add UPF_BOOT_AUTOCONF flag for DT init
  serial: samsung: Remove useless spinlock
  serial: samsung: Add missing checks for dma_map_single failure
  serial: samsung: Use right device for DMA-mapping calls
  serial: imx: setup DCEDTE early and ensure DCD and RI irqs to be off
  tty: fix comment typo s/repsonsible/responsible/
  tty: amba-pl011: Fix spurious TX interrupts
  serial: xuartps: Enable clocks in the pm disable case also
  serial: core: Re-use struct uart_port {name} field
  ...
  • Loading branch information
torvalds committed May 9, 2017
2 parents bf5f894 + 8e1c21f commit 8f3207c
Show file tree
Hide file tree
Showing 48 changed files with 1,393 additions and 1,031 deletions.
13 changes: 8 additions & 5 deletions Documentation/devicetree/bindings/arm/sprd.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
Spreadtrum SoC Platforms Device Tree Bindings
----------------------------------------------------

Sharkl64 is a Spreadtrum's SoC Platform which is based
on ARM 64-bit processor.
SC9836 openphone Board
Required root node properties:
- compatible = "sprd,sc9836-openphone", "sprd,sc9836";

SC9836 openphone board with SC9836 SoC based on the
Sharkl64 Platform shall have the following properties.
SC9860 SoC
Required root node properties:
- compatible = "sprd,sc9860"

SP9860G 3GFHD Board
Required root node properties:
- compatible = "sprd,sc9836-openphone", "sprd,sc9836";
- compatible = "sprd,sp9860g-1h10", "sprd,sc9860";
14 changes: 13 additions & 1 deletion Documentation/devicetree/bindings/serial/sprd-uart.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
* Spreadtrum serial UART

Required properties:
- compatible: must be "sprd,sc9836-uart"
- compatible: must be one of:
* "sprd,sc9836-uart"
* "sprd,sc9860-uart", "sprd,sc9836-uart"

- reg: offset and length of the register set for the device
- interrupts: exactly one interrupt specifier
- clocks: phandles to input clocks.

Example:
uart0: serial@0 {
compatible = "sprd,sc9860-uart",
"sprd,sc9836-uart";
reg = <0x0 0x100>;
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ext_26m>;
};
2 changes: 1 addition & 1 deletion MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -8418,7 +8418,7 @@ MICROCHIP / ATMEL AT91 / AT32 SERIAL DRIVER
M: Richard Genoud <[email protected]>
S: Maintained
F: drivers/tty/serial/atmel_serial.c
F: include/linux/atmel_serial.h
F: drivers/tty/serial/atmel_serial.h

MICROCHIP / ATMEL DMA DRIVER
M: Ludovic Desroches <[email protected]>
Expand Down
3 changes: 2 additions & 1 deletion drivers/tty/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
obj-$(CONFIG_TTY) += tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o \
tty_buffer.o tty_port.o tty_mutex.o tty_ldsem.o
tty_buffer.o tty_port.o tty_mutex.o \
tty_ldsem.o tty_baudrate.o tty_jobctrl.o
obj-$(CONFIG_LEGACY_PTYS) += pty.o
obj-$(CONFIG_UNIX98_PTYS) += pty.o
obj-$(CONFIG_AUDIT) += tty_audit.o
Expand Down
4 changes: 2 additions & 2 deletions drivers/tty/hvc/hvc_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -920,17 +920,17 @@ int hvc_remove(struct hvc_struct *hp)

tty = tty_port_tty_get(&hp->port);

console_lock();
spin_lock_irqsave(&hp->lock, flags);
if (hp->index < MAX_NR_HVC_CONSOLES) {
console_lock();
vtermnos[hp->index] = -1;
cons_ops[hp->index] = NULL;
console_unlock();
}

/* Don't whack hp->irq because tty_hangup() will need to free the irq. */

spin_unlock_irqrestore(&hp->lock, flags);
console_unlock();

/*
* We 'put' the instance that was grabbed when the kref instance
Expand Down
2 changes: 1 addition & 1 deletion drivers/tty/hvc/hvcs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1575,7 +1575,7 @@ static int __init hvcs_module_init(void)
*/
rc = driver_create_file(&(hvcs_vio_driver.driver), &driver_attr_rescan);
if (rc)
pr_warning("HVCS: Failed to create rescan file (err %d)\n", rc);
pr_warn("HVCS: Failed to create rescan file (err %d)\n", rc);

return 0;
}
Expand Down
21 changes: 6 additions & 15 deletions drivers/tty/n_gsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,18 +89,14 @@ module_param(debug, int, 0600);
/**
* struct gsm_mux_net - network interface
* @struct gsm_dlci* dlci
* @struct net_device_stats stats;
*
* Created when net interface is initialized.
**/
struct gsm_mux_net {
struct kref ref;
struct gsm_dlci *dlci;
struct net_device_stats stats;
};

#define STATS(net) (((struct gsm_mux_net *)netdev_priv(net))->stats)

/*
* Each block of data we have queued to go out is in the form of
* a gsm_msg which holds everything we need in a link layer independent
Expand Down Expand Up @@ -2613,10 +2609,6 @@ static int gsm_mux_net_close(struct net_device *net)
return 0;
}

static struct net_device_stats *gsm_mux_net_get_stats(struct net_device *net)
{
return &((struct gsm_mux_net *)netdev_priv(net))->stats;
}
static void dlci_net_free(struct gsm_dlci *dlci)
{
if (!dlci->net) {
Expand Down Expand Up @@ -2660,8 +2652,8 @@ static int gsm_mux_net_start_xmit(struct sk_buff *skb,
muxnet_get(mux_net);

skb_queue_head(&dlci->skb_list, skb);
STATS(net).tx_packets++;
STATS(net).tx_bytes += skb->len;
net->stats.tx_packets++;
net->stats.tx_bytes += skb->len;
gsm_dlci_data_kick(dlci);
/* And tell the kernel when the last transmit started. */
netif_trans_update(net);
Expand All @@ -2676,7 +2668,7 @@ static void gsm_mux_net_tx_timeout(struct net_device *net)
dev_dbg(&net->dev, "Tx timed out.\n");

/* Update statistics */
STATS(net).tx_errors++;
net->stats.tx_errors++;
}

static void gsm_mux_rx_netchar(struct gsm_dlci *dlci,
Expand All @@ -2691,7 +2683,7 @@ static void gsm_mux_rx_netchar(struct gsm_dlci *dlci,
skb = dev_alloc_skb(size + NET_IP_ALIGN);
if (!skb) {
/* We got no receive buffer. */
STATS(net).rx_dropped++;
net->stats.rx_dropped++;
muxnet_put(mux_net);
return;
}
Expand All @@ -2705,8 +2697,8 @@ static void gsm_mux_rx_netchar(struct gsm_dlci *dlci,
netif_rx(skb);

/* update out statistics */
STATS(net).rx_packets++;
STATS(net).rx_bytes += size;
net->stats.rx_packets++;
net->stats.rx_bytes += size;
muxnet_put(mux_net);
return;
}
Expand All @@ -2718,7 +2710,6 @@ static void gsm_mux_net_init(struct net_device *net)
.ndo_stop = gsm_mux_net_close,
.ndo_start_xmit = gsm_mux_net_start_xmit,
.ndo_tx_timeout = gsm_mux_net_tx_timeout,
.ndo_get_stats = gsm_mux_net_get_stats,
};

net->netdev_ops = &gsm_netdev_ops;
Expand Down
7 changes: 1 addition & 6 deletions drivers/tty/pty.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,16 +216,11 @@ static int pty_signal(struct tty_struct *tty, int sig)
static void pty_flush_buffer(struct tty_struct *tty)
{
struct tty_struct *to = tty->link;
struct tty_ldisc *ld;

if (!to)
return;

ld = tty_ldisc_ref(to);
tty_buffer_flush(to, ld);
if (ld)
tty_ldisc_deref(ld);

tty_buffer_flush(to, NULL);
if (to->packet) {
spin_lock_irq(&tty->ctrl_lock);
tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
Expand Down
36 changes: 31 additions & 5 deletions drivers/tty/serdev/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -116,17 +116,41 @@ void serdev_device_close(struct serdev_device *serdev)
}
EXPORT_SYMBOL_GPL(serdev_device_close);

int serdev_device_write_buf(struct serdev_device *serdev,
const unsigned char *buf, size_t count)
void serdev_device_write_wakeup(struct serdev_device *serdev)
{
complete(&serdev->write_comp);
}
EXPORT_SYMBOL_GPL(serdev_device_write_wakeup);

int serdev_device_write(struct serdev_device *serdev,
const unsigned char *buf, size_t count,
unsigned long timeout)
{
struct serdev_controller *ctrl = serdev->ctrl;
int ret;

if (!ctrl || !ctrl->ops->write_buf)
if (!ctrl || !ctrl->ops->write_buf ||
(timeout && !serdev->ops->write_wakeup))
return -EINVAL;

return ctrl->ops->write_buf(ctrl, buf, count);
mutex_lock(&serdev->write_lock);
do {
reinit_completion(&serdev->write_comp);

ret = ctrl->ops->write_buf(ctrl, buf, count);
if (ret < 0)
break;

buf += ret;
count -= ret;

} while (count &&
(timeout = wait_for_completion_timeout(&serdev->write_comp,
timeout)));
mutex_unlock(&serdev->write_lock);
return ret < 0 ? ret : (count ? -ETIMEDOUT : 0);
}
EXPORT_SYMBOL_GPL(serdev_device_write_buf);
EXPORT_SYMBOL_GPL(serdev_device_write);

void serdev_device_write_flush(struct serdev_device *serdev)
{
Expand Down Expand Up @@ -262,6 +286,8 @@ struct serdev_device *serdev_device_alloc(struct serdev_controller *ctrl)
serdev->dev.parent = &ctrl->dev;
serdev->dev.bus = &serdev_bus_type;
serdev->dev.type = &serdev_device_type;
init_completion(&serdev->write_comp);
mutex_init(&serdev->write_lock);
return serdev;
}
EXPORT_SYMBOL_GPL(serdev_device_alloc);
Expand Down
2 changes: 1 addition & 1 deletion drivers/tty/serial/8250/8250_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ static int serial_link_irq_chain(struct uart_8250_port *up)
spin_unlock_irq(&i->lock);
irq_flags |= up->port.irqflags;
ret = request_irq(up->port.irq, serial8250_interrupt,
irq_flags, "serial", i);
irq_flags, up->port.name, i);
if (ret < 0)
serial_do_unlink(i, up);
}
Expand Down
13 changes: 5 additions & 8 deletions drivers/tty/serial/8250/8250_dw.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,12 +530,11 @@ static int dw8250_probe(struct platform_device *pdev)
}

data->rst = devm_reset_control_get_optional(dev, NULL);
if (IS_ERR(data->rst) && PTR_ERR(data->rst) == -EPROBE_DEFER) {
err = -EPROBE_DEFER;
if (IS_ERR(data->rst)) {
err = PTR_ERR(data->rst);
goto err_pclk;
}
if (!IS_ERR(data->rst))
reset_control_deassert(data->rst);
reset_control_deassert(data->rst);

dw8250_quirks(p, data);

Expand Down Expand Up @@ -567,8 +566,7 @@ static int dw8250_probe(struct platform_device *pdev)
return 0;

err_reset:
if (!IS_ERR(data->rst))
reset_control_assert(data->rst);
reset_control_assert(data->rst);

err_pclk:
if (!IS_ERR(data->pclk))
Expand All @@ -589,8 +587,7 @@ static int dw8250_remove(struct platform_device *pdev)

serial8250_unregister_port(data->line);

if (!IS_ERR(data->rst))
reset_control_assert(data->rst);
reset_control_assert(data->rst);

if (!IS_ERR(data->pclk))
clk_disable_unprepare(data->pclk);
Expand Down
24 changes: 24 additions & 0 deletions drivers/tty/serial/8250/8250_early.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@

static unsigned int __init serial8250_early_in(struct uart_port *port, int offset)
{
int reg_offset = offset;
offset <<= port->regshift;

switch (port->iotype) {
Expand All @@ -52,13 +53,16 @@ static unsigned int __init serial8250_early_in(struct uart_port *port, int offse
return ioread32be(port->membase + offset);
case UPIO_PORT:
return inb(port->iobase + offset);
case UPIO_AU:
return port->serial_in(port, reg_offset);
default:
return 0;
}
}

static void __init serial8250_early_out(struct uart_port *port, int offset, int value)
{
int reg_offset = offset;
offset <<= port->regshift;

switch (port->iotype) {
Expand All @@ -77,6 +81,9 @@ static void __init serial8250_early_out(struct uart_port *port, int offset, int
case UPIO_PORT:
outb(value, port->iobase + offset);
break;
case UPIO_AU:
port->serial_out(port, reg_offset, value);
break;
}
}

Expand Down Expand Up @@ -172,3 +179,20 @@ OF_EARLYCON_DECLARE(omap8250, "ti,omap3-uart", early_omap8250_setup);
OF_EARLYCON_DECLARE(omap8250, "ti,omap4-uart", early_omap8250_setup);

#endif

#ifdef CONFIG_SERIAL_8250_RT288X

unsigned int au_serial_in(struct uart_port *p, int offset);
void au_serial_out(struct uart_port *p, int offset, int value);

static int __init early_au_setup(struct earlycon_device *dev, const char *opt)
{
dev->port.serial_in = au_serial_in;
dev->port.serial_out = au_serial_out;
dev->port.iotype = UPIO_AU;
dev->con->write = early_serial8250_write;
return 0;
}
OF_EARLYCON_DECLARE(palmchip, "ralink,rt2880-uart", early_au_setup);

#endif
2 changes: 1 addition & 1 deletion drivers/tty/serial/8250/8250_exar.c
Original file line number Diff line number Diff line change
Expand Up @@ -483,5 +483,5 @@ static struct pci_driver exar_pci_driver = {
module_pci_driver(exar_pci_driver);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Exar Serial Dricer");
MODULE_DESCRIPTION("Exar Serial Driver");
MODULE_AUTHOR("Sudip Mukherjee <[email protected]>");
Loading

0 comments on commit 8f3207c

Please sign in to comment.