serial: 8250: Add missing wakeup event reporting
authorFlorian Fainelli <f.fainelli@gmail.com>
Fri, 14 Apr 2023 17:02:39 +0000 (10:02 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Apr 2023 11:43:09 +0000 (13:43 +0200)
An 8250 UART configured as a wake-up source would not have reported
itself through sysfs as being the source of wake-up, correct that.

Fixes: b3b708fa2780 ("wake up from a serial port")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20230414170241.2016255-1-f.fainelli@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_port.c

index dfbc501cf9d1561e3da462a1557ab62c35e45d81..fe8d79c4ae95e5c0cb944c6906f9b286832f46e6 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/moduleparam.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
+#include <linux/irq.h>
 #include <linux/console.h>
 #include <linux/gpio/consumer.h>
 #include <linux/sysrq.h>
@@ -1932,6 +1933,7 @@ static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
 int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
 {
        struct uart_8250_port *up = up_to_u8250p(port);
+       struct tty_port *tport = &port->state->port;
        bool skip_rx = false;
        unsigned long flags;
        u16 status;
@@ -1957,6 +1959,8 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
                skip_rx = true;
 
        if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) {
+               if (irqd_is_wakeup_set(irq_get_irq_data(port->irq)))
+                       pm_wakeup_event(tport->tty->dev, 0);
                if (!up->dma || handle_rx_dma(up, iir))
                        status = serial8250_rx_chars(up, status);
        }