[PATCH 2/6] serial: 8250: update .pm callbacks to return int
Praveen Talari <[email protected]> Thu, 09 Jul 2026 11:55:14 +0530
| Newsgroups | org.kernel.vger.linux-omap,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-mediatek,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel,org.kernel.vger.linux-mips,org.kernel.vger.linux-samsung-soc,org.kernel.vger.linux-serial |
|---|---|
| Message-ID | <20260709-add_return_check_for_uart_change_pm-v1-2-e85c6ffa8ec4@oss.qualcomm.com> |
The uart_ops.pm and uart_port.pm callback signatures have been changed from void to int. Update all 8250 .pm implementations to match. serial8250_do_pm() is the core 8250 power management helper, exported for use by sub-drivers. Change its return type from void to int and update its declaration in include/linux/serial_8250.h accordingly. serial8250_do_pm() always returns 0. serial8250_pm() is the uart_ops.pm entry point for the 8250 driver. It delegates to a per-port pm function stored in uart_port.pm or falls back to serial8250_do_pm(). Both paths are called for their side effects and the function returns 0. The remaining sub-driver callbacks perform their PM work through platform-specific helpers (clocks, runtime PM, GPIO) and currently have no error paths of their own. Update them to return 0 to satisfy the new signature; individual error propagation can be added per-driver as needed. 8250_exar: exar_pm() 8250_mtk: mtk8250_do_pm() 8250_omap: omap_8250_pm() 8250_pxa: serial_pxa_pm() No functional change intended. Signed-off-by: Praveen Talari <[email protected]> --- drivers/tty/serial/8250/8250_dw.c | 3 ++- drivers/tty/serial/8250/8250_exar.c | 4 +++- drivers/tty/serial/8250/8250_mtk.c | 4 +++- drivers/tty/serial/8250/8250_omap.c | 6 ++++-- drivers/tty/serial/8250/8250_port.c | 9 ++++++--- drivers/tty/serial/8250/8250_pxa.c | 6 ++++-- include/linux/serial_8250.h | 6 +++--- 7 files changed, 25 insertions(+), 13 deletions(-) diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index 5fba913f3301..7d5fa11d685f 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c @@ -458,7 +458,7 @@ static int dw8250_handle_irq(struct uart_port *p) return 1; } -static void +static int dw8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old) { if (!state) @@ -468,6 +468,7 @@ dw8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old) if (state) pm_runtime_put_sync_suspend(port->dev); + return 0; } static void dw8250_set_termios(struct uart_port *p, struct ktermios *termios, diff --git a/drivers/tty/serial/8250/8250_exar.c b/drivers/tty/serial/8250/8250_exar.c index c682c0d0dffa..0d0026ea155f 100644 --- a/drivers/tty/serial/8250/8250_exar.c +++ b/drivers/tty/serial/8250/8250_exar.c @@ -419,7 +419,7 @@ static const struct serial_rs485 generic_rs485_supported = { .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND, }; -static void exar_pm(struct uart_port *port, unsigned int state, unsigned int old) +static int exar_pm(struct uart_port *port, unsigned int state, unsigned int old) { /* * Exar UARTs have a SLEEP register that enables or disables each UART @@ -428,6 +428,8 @@ static void exar_pm(struct uart_port *port, unsigned int state, unsigned int old * the UART channel may only write to the corresponding bit. */ serial_port_out(port, UART_EXAR_SLEEP, state ? 0xff : 0); + + return 0; } /* diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c index e6a56cf54ae0..9184b1eeddd7 100644 --- a/drivers/tty/serial/8250/8250_mtk.c +++ b/drivers/tty/serial/8250/8250_mtk.c @@ -452,7 +452,7 @@ static int __maybe_unused mtk8250_runtime_resume(struct device *dev) return 0; } -static void +static int mtk8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old) { if (!state) @@ -462,6 +462,8 @@ mtk8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old) if (state) pm_runtime_put_sync_suspend(port->dev); + + return 0; } #ifdef CONFIG_SERIAL_8250_DMA diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c index c552c6b9a037..8f099afd6ff8 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c @@ -527,8 +527,8 @@ static void omap_8250_set_termios(struct uart_port *port, } /* same as 8250 except that we may have extra flow bits set in EFR */ -static void omap_8250_pm(struct uart_port *port, unsigned int state, - unsigned int oldstate) +static int omap_8250_pm(struct uart_port *port, unsigned int state, + unsigned int oldstate) { struct uart_8250_port *up = up_to_u8250p(port); u8 efr; @@ -546,6 +546,8 @@ static void omap_8250_pm(struct uart_port *port, unsigned int state, serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); serial_out(up, UART_EFR, efr); serial_out(up, UART_LCR, 0); + + return 0; } static void omap_serial_fill_features_erratas(struct uart_8250_port *up, diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 630deb7dd344..315e0a2fcc14 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -2848,16 +2848,18 @@ serial8250_set_ldisc(struct uart_port *port, struct ktermios *termios) serial8250_do_set_ldisc(port, termios); } -void serial8250_do_pm(struct uart_port *port, unsigned int state, - unsigned int oldstate) +int serial8250_do_pm(struct uart_port *port, unsigned int state, + unsigned int oldstate) { struct uart_8250_port *p = up_to_u8250p(port); serial8250_set_sleep(p, state != 0); + + return 0; } EXPORT_SYMBOL(serial8250_do_pm); -static void +static int serial8250_pm(struct uart_port *port, unsigned int state, unsigned int oldstate) { @@ -2865,6 +2867,7 @@ serial8250_pm(struct uart_port *port, unsigned int state, port->pm(port, state, oldstate); else serial8250_do_pm(port, state, oldstate); + return 0; } static unsigned int serial8250_port_size(struct uart_8250_port *pt) diff --git a/drivers/tty/serial/8250/8250_pxa.c b/drivers/tty/serial/8250/8250_pxa.c index 6dd0190b4843..02f0037e0a31 100644 --- a/drivers/tty/serial/8250/8250_pxa.c +++ b/drivers/tty/serial/8250/8250_pxa.c @@ -76,8 +76,8 @@ static void serial_pxa_dl_write(struct uart_8250_port *up, u32 value) } -static void serial_pxa_pm(struct uart_port *port, unsigned int state, - unsigned int oldstate) +static int serial_pxa_pm(struct uart_port *port, unsigned int state, + unsigned int oldstate) { struct pxa8250_data *data = port->private_data; @@ -85,6 +85,8 @@ static void serial_pxa_pm(struct uart_port *port, unsigned int state, clk_prepare_enable(data->clk); else clk_disable_unprepare(data->clk); + + return 0; } static int serial_pxa_probe(struct platform_device *pdev) diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index a95b2d143d24..12916189c20c 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h @@ -57,7 +57,7 @@ struct plat_serial8250_port { struct ktermios *); unsigned int (*get_mctrl)(struct uart_port *); int (*handle_irq)(struct uart_port *); - void (*pm)(struct uart_port *, unsigned int state, + int (*pm)(struct uart_port *port, unsigned int state, unsigned old); void (*handle_break)(struct uart_port *); }; @@ -189,8 +189,8 @@ void serial8250_do_set_ldisc(struct uart_port *port, struct ktermios *termios); unsigned int serial8250_do_get_mctrl(struct uart_port *port); int serial8250_do_startup(struct uart_port *port); void serial8250_do_shutdown(struct uart_port *port); -void serial8250_do_pm(struct uart_port *port, unsigned int state, - unsigned int oldstate); +int serial8250_do_pm(struct uart_port *port, unsigned int state, + unsigned int oldstate); void serial8250_do_set_mctrl(struct uart_port *port, unsigned int mctrl); void serial8250_do_set_divisor(struct uart_port *port, unsigned int baud, unsigned int quot); -- 2.34.1