Commit f44f3f83 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'tty-5.9-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

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
...@@ -5566,6 +5566,17 @@ static const struct pci_device_id serial_pci_tbl[] = { ...@@ -5566,6 +5566,17 @@ static const struct pci_device_id serial_pci_tbl[] = {
PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
0, 0, pbn_wch384_4 }, 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 */ /* Fintek PCI serial cards */
{ PCI_DEVICE(0x1c29, 0x1104), .driver_data = pbn_fintek_4 }, { PCI_DEVICE(0x1c29, 0x1104), .driver_data = pbn_fintek_4 },
{ PCI_DEVICE(0x1c29, 0x1108), .driver_data = pbn_fintek_8 }, { PCI_DEVICE(0x1c29, 0x1108), .driver_data = pbn_fintek_8 },
......
...@@ -1916,24 +1916,12 @@ static inline bool uart_console_enabled(struct uart_port *port) ...@@ -1916,24 +1916,12 @@ static inline bool uart_console_enabled(struct uart_port *port)
return uart_console(port) && (port->cons->flags & CON_ENABLED); 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); spin_lock_init(&port->lock);
lockdep_set_class(&port->lock, &port_lock_key); 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) #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
/** /**
* uart_console_write - write a console message to a serial port * 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, ...@@ -2086,6 +2074,14 @@ uart_set_options(struct uart_port *port, struct console *co,
struct ktermios termios; struct ktermios termios;
static struct ktermios dummy; 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); uart_port_spin_lock_init(port);
memset(&termios, 0, sizeof(struct ktermios)); memset(&termios, 0, sizeof(struct ktermios));
...@@ -2378,13 +2374,6 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state, ...@@ -2378,13 +2374,6 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
/* Power up port for set_mctrl() */ /* Power up port for set_mctrl() */
uart_change_pm(state, UART_PM_STATE_ON); 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. * Ensure that the modem control lines are de-activated.
* keep the DTR setting that is set in uart_set_options() * keep the DTR setting that is set in uart_set_options()
...@@ -2801,11 +2790,13 @@ static ssize_t console_store(struct device *dev, ...@@ -2801,11 +2790,13 @@ static ssize_t console_store(struct device *dev,
if (oldconsole && !newconsole) { if (oldconsole && !newconsole) {
ret = unregister_console(uport->cons); ret = unregister_console(uport->cons);
} else if (!oldconsole && newconsole) { } else if (!oldconsole && newconsole) {
if (uart_console(uport)) if (uart_console(uport)) {
uport->console_reinit = 1;
register_console(uport->cons); register_console(uport->cons);
else } else {
ret = -ENOENT; ret = -ENOENT;
} }
}
} else { } else {
ret = -ENXIO; ret = -ENXIO;
} }
...@@ -2900,6 +2891,11 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport) ...@@ -2900,6 +2891,11 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
goto out; 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); uart_port_spin_lock_init(uport);
if (uport->cons && uport->dev) if (uport->cons && uport->dev)
......
...@@ -2018,7 +2018,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width, ...@@ -2018,7 +2018,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
struct fb_var_screeninfo var = info->var; struct fb_var_screeninfo var = info->var;
int x_diff, y_diff, virt_w, virt_h, virt_fw, virt_fh; 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 size;
int pitch = PITCH(vc->vc_font.width); int pitch = PITCH(vc->vc_font.width);
......
...@@ -248,6 +248,7 @@ struct uart_port { ...@@ -248,6 +248,7 @@ struct uart_port {
unsigned char hub6; /* this should be in the 8250 driver */ unsigned char hub6; /* this should be in the 8250 driver */
unsigned char suspended; unsigned char suspended;
unsigned char console_reinit;
const char *name; /* port name */ const char *name; /* port name */
struct attribute_group *attr_group; /* port specific attributes */ struct attribute_group *attr_group; /* port specific attributes */
const struct attribute_group **tty_groups; /* all attributes (serial core use only) */ const struct attribute_group **tty_groups; /* all attributes (serial core use only) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment