[PATCH v1 2/3] serial: core: Allow drivers to enable TTY wakeup at registration
From: Stefano Radaelli
Date: Tue Nov 03 2026 - 11:09:34 EST
From: Stefano Radaelli <stefano.r@xxxxxxxxxxxxx>
The serial core marks registered TTY devices as wakeup capable but leaves
wakeup disabled. Drivers whose suspend path checks the TTY wakeup policy
cannot enable that policy by initializing wakeup on the physical parent.
Add tty_wakeup_default to struct uart_port so a driver can request that
the core enable wakeup when registering its TTY device. The field only
sets the initial policy; userspace can still change power/wakeup.
Apply the setting only to the matching TTY device, leaving serdev wakeup
policy unchanged. Drivers that do not set the field retain the existing
default. Warn if enabling wakeup fails without preventing port use.
Signed-off-by: Stefano Radaelli <stefano.r@xxxxxxxxxxxxx>
---
drivers/tty/serial/serial_core.c | 8 ++++++++
include/linux/serial_core.h | 1 +
2 files changed, 9 insertions(+)
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index c0deec0e6af4..aa18d0820060 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -3121,9 +3121,11 @@ static const struct attribute_group tty_dev_attr_group = {
*/
static int serial_core_add_one_port(struct uart_driver *drv, struct uart_port *uport)
{
+ struct uart_match match = { uport, drv };
struct uart_state *state;
struct tty_port *port;
struct device *tty_dev;
+ int ret;
if (uport->line >= drv->nr)
return -EINVAL;
@@ -3196,6 +3198,12 @@ static int serial_core_add_one_port(struct uart_driver *drv, struct uart_port *u
uport->tty_groups);
if (!IS_ERR(tty_dev)) {
device_set_wakeup_capable(tty_dev, 1);
+ /* Serdev clients manage their own wakeup policy. */
+ if (uport->tty_wakeup_default && serial_match_port(tty_dev, &match)) {
+ ret = device_set_wakeup_enable(tty_dev, true);
+ if (ret)
+ dev_warn(tty_dev, "Failed to enable wakeup: %d\n", ret);
+ }
} else {
uport->flags |= UPF_DEAD;
dev_err(uport->dev, "Cannot register tty device on line %u\n",
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index 4eeb8253752a..d5a0666d782f 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -573,6 +573,7 @@ struct uart_port {
bool hw_stopped; /* sw-assisted CTS flow state */
bool cons_flow; /* user specified console flow control */
+ bool tty_wakeup_default; /* Enable TTY wakeup at registration */
unsigned int mctrl; /* current modem ctrl settings */
unsigned int frame_time; /* frame timing in ns */
unsigned int type; /* port type */
--
2.47.3