diff options
| author | Sherry Sun <sherry.sun@nxp.com> | 2025-10-02 07:52:59 +0300 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2025-10-22 13:06:35 +0300 |
| commit | 0cfadf4bcd283de6d5cb06748dfb1d65e993dbf9 (patch) | |
| tree | c6c377ef08f0623a6d026c0134dc235dccdcc5ef | |
| parent | d55f3d2375ceeb08330d30f1e08196993c0b6583 (diff) | |
| download | linux-0cfadf4bcd283de6d5cb06748dfb1d65e993dbf9.tar.xz | |
tty: serial: imx: Add missing wakeup event reporting
Current imx uart wakeup event would not report itself as wakeup source
through sysfs. Add pm_wakeup_event() to support it.
Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20251002045259.2725461-3-sherry.sun@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
| -rw-r--r-- | drivers/tty/serial/imx.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 90e2ea1e8afe..c488e5d372ff 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -30,7 +30,7 @@ #include <linux/iopoll.h> #include <linux/dma-mapping.h> -#include <asm/irq.h> +#include <linux/irq.h> #include <linux/dma/imx-dma.h> #include "serial_mctrl_gpio.h" @@ -2699,8 +2699,8 @@ static void imx_uart_enable_wakeup(struct imx_port *sport, bool on) { struct tty_port *port = &sport->port.state->port; struct device *tty_dev; - bool may_wake = false; - u32 ucr3; + bool may_wake = false, wake_active = false; + u32 ucr3, usr1; scoped_guard(tty_port_tty, port) { struct tty_struct *tty = scoped_tty(); @@ -2715,12 +2715,14 @@ static void imx_uart_enable_wakeup(struct imx_port *sport, bool on) uart_port_lock_irq(&sport->port); + usr1 = imx_uart_readl(sport, USR1); ucr3 = imx_uart_readl(sport, UCR3); if (on) { imx_uart_writel(sport, USR1_AWAKE, USR1); ucr3 |= UCR3_AWAKEN; } else { ucr3 &= ~UCR3_AWAKEN; + wake_active = usr1 & USR1_AWAKE; } imx_uart_writel(sport, ucr3, UCR3); @@ -2731,10 +2733,14 @@ static void imx_uart_enable_wakeup(struct imx_port *sport, bool on) ucr1 |= UCR1_RTSDEN; } else { ucr1 &= ~UCR1_RTSDEN; + wake_active = wake_active || (usr1 & USR1_RTSD); } imx_uart_writel(sport, ucr1, UCR1); } + if (wake_active && irqd_is_wakeup_set(irq_get_irq_data(sport->port.irq))) + pm_wakeup_event(tty_port_tty_get(port)->dev, 0); + uart_port_unlock_irq(&sport->port); } |
