Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bbbce516 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull tty/serial fixes from Greg KH:
 "Here are some tty and serial driver fixes for 4.0-rc3.

  Along with the atime fix that you know about, here are some other
  serial driver bugfixes as well.  Most notable is a wait_until_sent
  bugfix that was traced back to being around since before 2.6.12 that
  Johan has fixed up.

  All have been in linux-next successfully"

* tag 'tty-4.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  TTY: fix tty_wait_until_sent maximum timeout
  TTY: fix tty_wait_until_sent on 64-bit machines
  USB: serial: fix infinite wait_until_sent timeout
  TTY: bfin_jtag_comm: remove incorrect wait_until_sent operation
  net: irda: fix wait_until_sent poll timeout
  serial: uapi: Declare all userspace-visible io types
  serial: core: Fix iotype userspace breakage
  serial: sprd: Fix missing spin_unlock in sprd_handle_irq()
  console: Fix console name size mismatch
  tty: fix up atime/mtime mess, take four
  serial: 8250_dw: Fix get_mctrl behaviour
  serial:8250:8250_pci: delete unneeded quirk entries
  serial:8250:8250_pci: fix redundant entry report for WCH_CH352_2S
  Change email address for 8250_pci
  serial: 8250: Revert "tty: serial: 8250_core: read only RX if there is something in the FIFO"
  Revert "tty/serial: of_serial: add DT alias ID handling"
parents 47df986b c37bc682
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -21,6 +21,18 @@ Optional properties:
- reg-io-width : the size (in bytes) of the IO accesses that should be
  performed on the device.  If this property is not present then single byte
  accesses are used.
- dcd-override : Override the DCD modem status signal. This signal will always
  be reported as active instead of being obtained from the modem status
  register. Define this if your serial port does not use this pin.
- dsr-override : Override the DTS modem status signal. This signal will always
  be reported as active instead of being obtained from the modem status
  register. Define this if your serial port does not use this pin.
- cts-override : Override the CTS modem status signal. This signal will always
  be reported as active instead of being obtained from the modem status
  register. Define this if your serial port does not use this pin.
- ri-override : Override the RI modem status signal. This signal will always be
  reported as inactive instead of being obtained from the modem status register.
  Define this if your serial port does not use this pin.

Example:

@@ -31,6 +43,10 @@ Example:
		interrupts = <10>;
		reg-shift = <2>;
		reg-io-width = <4>;
		dcd-override;
		dsr-override;
		cts-override;
		ri-override;
	};

Example with one clock:
+0 −13
Original line number Diff line number Diff line
@@ -210,18 +210,6 @@ bfin_jc_chars_in_buffer(struct tty_struct *tty)
	return circ_cnt(&bfin_jc_write_buf);
}

static void
bfin_jc_wait_until_sent(struct tty_struct *tty, int timeout)
{
	unsigned long expire = jiffies + timeout;
	while (!circ_empty(&bfin_jc_write_buf)) {
		if (signal_pending(current))
			break;
		if (time_after(jiffies, expire))
			break;
	}
}

static const struct tty_operations bfin_jc_ops = {
	.open            = bfin_jc_open,
	.close           = bfin_jc_close,
@@ -230,7 +218,6 @@ static const struct tty_operations bfin_jc_ops = {
	.flush_chars     = bfin_jc_flush_chars,
	.write_room      = bfin_jc_write_room,
	.chars_in_buffer = bfin_jc_chars_in_buffer,
	.wait_until_sent = bfin_jc_wait_until_sent,
};

static int __init bfin_jc_init(void)
+5 −6
Original line number Diff line number Diff line
@@ -2138,7 +2138,7 @@ int serial8250_do_startup(struct uart_port *port)
	/*
	 * Clear the interrupt registers.
	 */
	if (serial_port_in(port, UART_LSR) & UART_LSR_DR)
	serial_port_in(port, UART_LSR);
	serial_port_in(port, UART_RX);
	serial_port_in(port, UART_IIR);
	serial_port_in(port, UART_MSR);
@@ -2300,7 +2300,7 @@ int serial8250_do_startup(struct uart_port *port)
	 * saved flags to avoid getting false values from polling
	 * routines or the previous session.
	 */
	if (serial_port_in(port, UART_LSR) & UART_LSR_DR)
	serial_port_in(port, UART_LSR);
	serial_port_in(port, UART_RX);
	serial_port_in(port, UART_IIR);
	serial_port_in(port, UART_MSR);
@@ -2394,7 +2394,6 @@ void serial8250_do_shutdown(struct uart_port *port)
	 * Read data port to reset things, and then unlink from
	 * the IRQ chain.
	 */
	if (serial_port_in(port, UART_LSR) & UART_LSR_DR)
	serial_port_in(port, UART_RX);
	serial8250_rpm_put(up);

+32 −0
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ struct dw8250_data {
	u8			usr_reg;
	int			last_mcr;
	int			line;
	int			msr_mask_on;
	int			msr_mask_off;
	struct clk		*clk;
	struct clk		*pclk;
	struct reset_control	*rst;
@@ -81,6 +83,12 @@ static inline int dw8250_modify_msr(struct uart_port *p, int offset, int value)
		value &= ~UART_MSR_DCTS;
	}

	/* Override any modem control signals if needed */
	if (offset == UART_MSR) {
		value |= d->msr_mask_on;
		value &= ~d->msr_mask_off;
	}

	return value;
}

@@ -334,6 +342,30 @@ static int dw8250_probe_of(struct uart_port *p,
	if (id >= 0)
		p->line = id;

	if (of_property_read_bool(np, "dcd-override")) {
		/* Always report DCD as active */
		data->msr_mask_on |= UART_MSR_DCD;
		data->msr_mask_off |= UART_MSR_DDCD;
	}

	if (of_property_read_bool(np, "dsr-override")) {
		/* Always report DSR as active */
		data->msr_mask_on |= UART_MSR_DSR;
		data->msr_mask_off |= UART_MSR_DDSR;
	}

	if (of_property_read_bool(np, "cts-override")) {
		/* Always report DSR as active */
		data->msr_mask_on |= UART_MSR_DSR;
		data->msr_mask_off |= UART_MSR_DDSR;
	}

	if (of_property_read_bool(np, "ri-override")) {
		/* Always report Ring indicator as inactive */
		data->msr_mask_off |= UART_MSR_RI;
		data->msr_mask_off |= UART_MSR_TERI;
	}

	/* clock got configured through clk api, all done */
	if (p->uartclk)
		return 0;
+1 −19
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ static void moan_device(const char *str, struct pci_dev *dev)
	       "Please send the output of lspci -vv, this\n"
	       "message (0x%04x,0x%04x,0x%04x,0x%04x), the\n"
	       "manufacturer and name of serial board or\n"
	       "modem board to rmk+serial@arm.linux.org.uk.\n",
	       "modem board to <linux-serial@vger.kernel.org>.\n",
	       pci_name(dev), str, dev->vendor, dev->device,
	       dev->subsystem_vendor, dev->subsystem_device);
}
@@ -1987,13 +1987,6 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
		.subdevice	= PCI_ANY_ID,
		.setup		= byt_serial_setup,
	},
	{
		.vendor		= PCI_VENDOR_ID_INTEL,
		.device		= PCI_DEVICE_ID_INTEL_QRK_UART,
		.subvendor	= PCI_ANY_ID,
		.subdevice	= PCI_ANY_ID,
		.setup		= pci_default_setup,
	},
	{
		.vendor		= PCI_VENDOR_ID_INTEL,
		.device		= PCI_DEVICE_ID_INTEL_BSW_UART1,
@@ -2199,13 +2192,6 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
	/*
	 * PLX
	 */
	{
		.vendor		= PCI_VENDOR_ID_PLX,
		.device		= PCI_DEVICE_ID_PLX_9030,
		.subvendor	= PCI_SUBVENDOR_ID_PERLE,
		.subdevice	= PCI_ANY_ID,
		.setup		= pci_default_setup,
	},
	{
		.vendor		= PCI_VENDOR_ID_PLX,
		.device		= PCI_DEVICE_ID_PLX_9050,
@@ -5415,10 +5401,6 @@ static struct pci_device_id serial_pci_tbl[] = {
		PCI_ANY_ID, PCI_ANY_ID,
		0, 0, pbn_b0_bt_2_115200 },

	{	PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH352_2S,
		PCI_ANY_ID, PCI_ANY_ID,
		0, 0, pbn_b0_bt_2_115200 },

	{	PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH384_4S,
		PCI_ANY_ID, PCI_ANY_ID,
		0, 0, pbn_wch384_4 },
Loading