[PATCH 0/6] tty: serial: propagate errors from uart_ops.pm callback
Praveen Talari <[email protected]> Thu, 09 Jul 2026 11:55:12 +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-0-e85c6ffa8ec4@oss.qualcomm.com> |
The uart_ops.pm callback has been declared void since its introduction, which means any error from a driver's power management implementation is silently discarded by uart_change_pm(). Beyond losing the error information, uart_change_pm() unconditionally updates state->pm_state even when the underlying hardware transition failed. This causes the serial core to track a power state that does not reflect reality: subsequent calls to uart_change_pm() see the stale cached state as matching the requested state and skip the callback entirely, leaving the hardware permanently stuck with no further recovery attempt. On modern platforms where the .pm callback performs real work — enabling clock trees, interacting with runtime PM, asserting voltage regulators — this is a correctness gap. Failures are invisible to the PM framework, the port proceeds to call ops->startup() on potentially unpowered hardware, and suspend/resume errors are hidden from the core that needs to handle them. This series fixes the problem in four steps: Patch 1 changes the uart_ops.pm callback signature from void to int, updates uart_change_pm() to propagate errors and only commit state->pm_state on success, and handles the return value at every call site in serial_core.c with appropriate policy per context (propagate, log, or skip-on-failure). Patch 2 updates the 8250 driver family: serial8250_do_pm() and serial8250_pm() are updated to return int (with the exported symbol declaration updated in serial_8250.h), and the 8250 sub-driver pm callbacks are updated to return 0. Patch 3 updates the remaining non-8250 serial drivers. All .pm implementations are updated to return 0. The sh-sci forward declaration shared with rsci is also updated. Patch 4 updates arch-level implementations: SA1100 (assabet, h3xxx), OMAP1/ams-delta (modem_pm, now propagates regulator errors), and MIPS/Alchemy (alchemy_8250_pm). All existing .pm implementations return 0, so there is no functional change for any current driver. The series purely adds the infrastructure for drivers to report errors going forward, with the serial core ready to handle them correctly. Signed-off-by: Praveen Talari <[email protected]> --- Praveen Talari (6): tty: serial: change uart_ops.pm callback to return int serial: 8250: update .pm callbacks to return int tty: serial: update .pm callbacks to return int arch: update uart pm callbacks to return int tty: serial: propagate uart_configure_port failure to uart_add_one_port serial: qcom-geni: check return value of pm_runtime_resume_and_get() arch/arm/mach-omap1/board-ams-delta.c | 10 +-- arch/arm/mach-sa1100/assabet.c | 3 +- arch/arm/mach-sa1100/h3xxx.c | 3 +- arch/mips/alchemy/common/platform.c | 5 +- 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 +- drivers/tty/serial/atmel_serial.c | 5 +- drivers/tty/serial/fsl_lpuart.c | 3 +- drivers/tty/serial/msm_serial.c | 5 +- drivers/tty/serial/omap-serial.c | 3 +- drivers/tty/serial/pxa.c | 3 +- drivers/tty/serial/qcom_geni_serial.c | 16 +++-- drivers/tty/serial/samsung_tty.c | 5 +- drivers/tty/serial/sc16is7xx.c | 5 +- drivers/tty/serial/serial_core.c | 104 ++++++++++++++++++++-------- drivers/tty/serial/serial_txx9.c | 3 +- drivers/tty/serial/sh-sci-common.h | 4 +- drivers/tty/serial/sh-sci.c | 5 +- drivers/tty/serial/sprd_serial.c | 5 +- drivers/tty/serial/st-asc.c | 5 +- drivers/tty/serial/stm32-usart.c | 5 +- drivers/tty/serial/uartlite.c | 5 +- drivers/tty/serial/xilinx_uartps.c | 5 +- include/linux/platform_data/sa11x0-serial.h | 2 +- include/linux/serial_8250.h | 6 +- include/linux/serial_core.h | 10 +-- 30 files changed, 171 insertions(+), 86 deletions(-) --- base-commit: 8cdeaa50eae8dad34885515f62559ee83e7e8dda change-id: 20260706-add_return_check_for_uart_change_pm-d2cb365202f3 Best regards, -- Praveen Talari <[email protected]>