| From 908f47126b1be47ea0d80b4dc6cfb62e64c6c492 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 4 Nov 2025 17:54:25 +0300 |
| Subject: serial: 8250_dw: handle clock enable errors in runtime_resume |
| |
| From: Artem Shimko <a.shimko.dev@gmail.com> |
| |
| [ Upstream commit d31228143a489ba6ba797896a07541ce06828c09 ] |
| |
| Add error checking for clk_prepare_enable() calls in |
| dw8250_runtime_resume(). Currently if either clock fails to enable, |
| the function returns success while leaving clocks in inconsistent state. |
| |
| This change implements comprehensive error handling by checking the return |
| values of both clk_prepare_enable() calls. If the second clock enable |
| operation fails after the first clock has already been successfully |
| enabled, the code now properly cleans up by disabling and unpreparing |
| the first clock before returning. The error code is then propagated to |
| the caller, ensuring that clock enable failures are properly reported |
| rather than being silently ignored. |
| |
| Signed-off-by: Artem Shimko <a.shimko.dev@gmail.com> |
| Link: https://patch.msgid.link/20251104145433.2316165-2-a.shimko.dev@gmail.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/tty/serial/8250/8250_dw.c | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c |
| index bcf770f344dac..211dc88ce4e2c 100644 |
| --- a/drivers/tty/serial/8250/8250_dw.c |
| +++ b/drivers/tty/serial/8250/8250_dw.c |
| @@ -684,11 +684,18 @@ static int dw8250_runtime_suspend(struct device *dev) |
| |
| static int dw8250_runtime_resume(struct device *dev) |
| { |
| + int ret; |
| struct dw8250_data *data = dev_get_drvdata(dev); |
| |
| - clk_prepare_enable(data->pclk); |
| + ret = clk_prepare_enable(data->pclk); |
| + if (ret) |
| + return ret; |
| |
| - clk_prepare_enable(data->clk); |
| + ret = clk_prepare_enable(data->clk); |
| + if (ret) { |
| + clk_disable_unprepare(data->pclk); |
| + return ret; |
| + } |
| |
| return 0; |
| } |
| -- |
| 2.51.0 |
| |