Commit f44f3f83 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull tty/serial/fbcon fixes from Greg KH:
 "Here are some small tty/serial and one more fbcon fix.

  They include:

   - serial core locking regression fixes

   - new device ids for 8250_pci driver

   - fbcon fix for syzbot found issue

  All have been in linux-next with no reported issues"

* tag 'tty-5.9-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  fbcon: Fix user font detection test at fbcon_resize().
  serial: 8250_pci: Add Realtek 816a and 816b
  serial: core: fix console port-lock regression
  serial: core: fix port-lock initialisation
parents aac5925b ec0972ad
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -5566,6 +5566,17 @@ static const struct pci_device_id serial_pci_tbl[] = {
		PCI_ANY_ID, PCI_ANY_ID,
		0, 0, pbn_wch384_4 },

	/*
	 * Realtek RealManage
	 */
	{	PCI_VENDOR_ID_REALTEK, 0x816a,
		PCI_ANY_ID, PCI_ANY_ID,
		0, 0, pbn_b0_1_115200 },

	{	PCI_VENDOR_ID_REALTEK, 0x816b,
		PCI_ANY_ID, PCI_ANY_ID,
		0, 0, pbn_b0_1_115200 },

	/* Fintek PCI serial cards */
	{ PCI_DEVICE(0x1c29, 0x1104), .driver_data = pbn_fintek_4 },
	{ PCI_DEVICE(0x1c29, 0x1108), .driver_data = pbn_fintek_8 },
+20 −24
Original line number Diff line number Diff line
@@ -1916,24 +1916,12 @@ static inline bool uart_console_enabled(struct uart_port *port)
	return uart_console(port) && (port->cons->flags & CON_ENABLED);
}

static void __uart_port_spin_lock_init(struct uart_port *port)
static void uart_port_spin_lock_init(struct uart_port *port)
{
	spin_lock_init(&port->lock);
	lockdep_set_class(&port->lock, &port_lock_key);
}

/*
 * Ensure that the serial console lock is initialised early.
 * If this port is a console, then the spinlock is already initialised.
 */
static inline void uart_port_spin_lock_init(struct uart_port *port)
{
	if (uart_console(port))
		return;

	__uart_port_spin_lock_init(port);
}

#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
/**
 *	uart_console_write - write a console message to a serial port
@@ -2086,6 +2074,14 @@ uart_set_options(struct uart_port *port, struct console *co,
	struct ktermios termios;
	static struct ktermios dummy;

	/*
	 * Ensure that the serial-console lock is initialised early.
	 *
	 * Note that the console-enabled check is needed because of kgdboc,
	 * which can end up calling uart_set_options() for an already enabled
	 * console via tty_find_polling_driver() and uart_poll_init().
	 */
	if (!uart_console_enabled(port) && !port->console_reinit)
		uart_port_spin_lock_init(port);

	memset(&termios, 0, sizeof(struct ktermios));
@@ -2378,13 +2374,6 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
		/* Power up port for set_mctrl() */
		uart_change_pm(state, UART_PM_STATE_ON);

		/*
		 * If this driver supports console, and it hasn't been
		 * successfully registered yet, initialise spin lock for it.
		 */
		if (port->cons && !(port->cons->flags & CON_ENABLED))
			__uart_port_spin_lock_init(port);

		/*
		 * Ensure that the modem control lines are de-activated.
		 * keep the DTR setting that is set in uart_set_options()
@@ -2801,11 +2790,13 @@ static ssize_t console_store(struct device *dev,
		if (oldconsole && !newconsole) {
			ret = unregister_console(uport->cons);
		} else if (!oldconsole && newconsole) {
			if (uart_console(uport))
			if (uart_console(uport)) {
				uport->console_reinit = 1;
				register_console(uport->cons);
			else
			} else {
				ret = -ENOENT;
			}
		}
	} else {
		ret = -ENXIO;
	}
@@ -2900,6 +2891,11 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
		goto out;
	}

	/*
	 * If this port is in use as a console then the spinlock is already
	 * initialised.
	 */
	if (!uart_console_enabled(uport))
		uart_port_spin_lock_init(uport);

	if (uport->cons && uport->dev)
+1 −1
Original line number Diff line number Diff line
@@ -2018,7 +2018,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
	struct fb_var_screeninfo var = info->var;
	int x_diff, y_diff, virt_w, virt_h, virt_fw, virt_fh;

	if (ops->p && ops->p->userfont && FNTSIZE(vc->vc_font.data)) {
	if (p->userfont && FNTSIZE(vc->vc_font.data)) {
		int size;
		int pitch = PITCH(vc->vc_font.width);

+1 −0
Original line number Diff line number Diff line
@@ -248,6 +248,7 @@ struct uart_port {

	unsigned char		hub6;			/* this should be in the 8250 driver */
	unsigned char		suspended;
	unsigned char		console_reinit;
	const char		*name;			/* port name */
	struct attribute_group	*attr_group;		/* port specific attributes */
	const struct attribute_group **tty_groups;	/* all attributes (serial core use only) */