Commit 62dcd5e1 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull tty/serial driver fixes from Greg KH:
 "Here are some small tty and serial driver fixes for 5.19-rc3 to
  resolve some reported problems:

   - 8250 lsr read bugfix

   - n_gsm line discipline allocation fix

   - qcom serial driver fix for reported lockups that happened in -rc1

   - goldfish tty driver fix

  All have been in linux-next for a while now with no reported issues"

* tag 'tty-5.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  serial: 8250: Store to lsr_save_flags after lsr read
  tty: goldfish: Fix free_irq() on remove
  tty: serial: qcom-geni-serial: Implement start_rx callback
  serial: core: Introduce callback for start_rx and do stop_rx in suspend only if this callback implementation is present.
  tty: n_gsm: Debug output allocation must use GFP_ATOMIC
parents 9057a646 be03b065
...@@ -426,7 +426,7 @@ static int goldfish_tty_remove(struct platform_device *pdev) ...@@ -426,7 +426,7 @@ static int goldfish_tty_remove(struct platform_device *pdev)
tty_unregister_device(goldfish_tty_driver, qtty->console.index); tty_unregister_device(goldfish_tty_driver, qtty->console.index);
iounmap(qtty->base); iounmap(qtty->base);
qtty->base = NULL; qtty->base = NULL;
free_irq(qtty->irq, pdev); free_irq(qtty->irq, qtty);
tty_port_destroy(&qtty->port); tty_port_destroy(&qtty->port);
goldfish_tty_current_line_count--; goldfish_tty_current_line_count--;
if (goldfish_tty_current_line_count == 0) if (goldfish_tty_current_line_count == 0)
......
...@@ -455,7 +455,7 @@ static void gsm_hex_dump_bytes(const char *fname, const u8 *data, ...@@ -455,7 +455,7 @@ static void gsm_hex_dump_bytes(const char *fname, const u8 *data,
return; return;
} }
prefix = kasprintf(GFP_KERNEL, "%s: ", fname); prefix = kasprintf(GFP_ATOMIC, "%s: ", fname);
if (!prefix) if (!prefix)
return; return;
print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_OFFSET, 16, 1, data, len, print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_OFFSET, 16, 1, data, len,
......
...@@ -1517,6 +1517,8 @@ static inline void __stop_tx(struct uart_8250_port *p) ...@@ -1517,6 +1517,8 @@ static inline void __stop_tx(struct uart_8250_port *p)
unsigned char lsr = serial_in(p, UART_LSR); unsigned char lsr = serial_in(p, UART_LSR);
u64 stop_delay = 0; u64 stop_delay = 0;
p->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
if (!(lsr & UART_LSR_THRE)) if (!(lsr & UART_LSR_THRE))
return; return;
/* /*
......
...@@ -1306,6 +1306,7 @@ static const struct uart_ops qcom_geni_console_pops = { ...@@ -1306,6 +1306,7 @@ static const struct uart_ops qcom_geni_console_pops = {
.stop_tx = qcom_geni_serial_stop_tx, .stop_tx = qcom_geni_serial_stop_tx,
.start_tx = qcom_geni_serial_start_tx, .start_tx = qcom_geni_serial_start_tx,
.stop_rx = qcom_geni_serial_stop_rx, .stop_rx = qcom_geni_serial_stop_rx,
.start_rx = qcom_geni_serial_start_rx,
.set_termios = qcom_geni_serial_set_termios, .set_termios = qcom_geni_serial_set_termios,
.startup = qcom_geni_serial_startup, .startup = qcom_geni_serial_startup,
.request_port = qcom_geni_serial_request_port, .request_port = qcom_geni_serial_request_port,
......
...@@ -2214,11 +2214,12 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) ...@@ -2214,11 +2214,12 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
/* /*
* Nothing to do if the console is not suspending * Nothing to do if the console is not suspending
* except stop_rx to prevent any asynchronous data * except stop_rx to prevent any asynchronous data
* over RX line. Re-start_rx, when required, is * over RX line. However ensure that we will be
* done by set_termios in resume sequence * able to Re-start_rx later.
*/ */
if (!console_suspend_enabled && uart_console(uport)) { if (!console_suspend_enabled && uart_console(uport)) {
uport->ops->stop_rx(uport); if (uport->ops->start_rx)
uport->ops->stop_rx(uport);
goto unlock; goto unlock;
} }
...@@ -2310,6 +2311,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) ...@@ -2310,6 +2311,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
if (console_suspend_enabled) if (console_suspend_enabled)
uart_change_pm(state, UART_PM_STATE_ON); uart_change_pm(state, UART_PM_STATE_ON);
uport->ops->set_termios(uport, &termios, NULL); uport->ops->set_termios(uport, &termios, NULL);
if (!console_suspend_enabled && uport->ops->start_rx)
uport->ops->start_rx(uport);
if (console_suspend_enabled) if (console_suspend_enabled)
console_start(uport->cons); console_start(uport->cons);
} }
......
...@@ -45,6 +45,7 @@ struct uart_ops { ...@@ -45,6 +45,7 @@ struct uart_ops {
void (*unthrottle)(struct uart_port *); void (*unthrottle)(struct uart_port *);
void (*send_xchar)(struct uart_port *, char ch); void (*send_xchar)(struct uart_port *, char ch);
void (*stop_rx)(struct uart_port *); void (*stop_rx)(struct uart_port *);
void (*start_rx)(struct uart_port *);
void (*enable_ms)(struct uart_port *); void (*enable_ms)(struct uart_port *);
void (*break_ctl)(struct uart_port *, int ctl); void (*break_ctl)(struct uart_port *, int ctl);
int (*startup)(struct uart_port *); int (*startup)(struct uart_port *);
......
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