Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

serial: sprd: Return -EPROBE_DEFER when uart clock is not ready

In sprd_clk_init(), when devm_clk_get() returns -EPROBE_DEFER
for either uart or source clock, we should propagate the
error instead of just warning and continuing with NULL clocks.

Currently the driver only emits a warning when clock acquisition
fails and proceeds with NULL clock pointers. This can lead to
issues later when the clocks are actually needed. More importantly,
when the clock provider is not ready yet and returns -EPROBE_DEFER,
we should return this error to allow deferred probing.

This change adds explicit checks for -EPROBE_DEFER after both:
1. devm_clk_get(uport->dev, uart)
2. devm_clk_get(uport->dev, source)

When -EPROBE_DEFER is encountered, the function now returns
-EPROBE_DEFER to let the driver framework retry probing
later when the clock dependencies are resolved.

Signed-off-by: Wenhua Lin <Wenhua.Lin@unisoc.com>
Link: https://patch.msgid.link/20251022030840.956589-1-Wenhua.Lin@unisoc.com
Reviewed-by: Cixi Geng <cixi.geng@linux.dev>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Wenhua Lin and committed by
Greg Kroah-Hartman
29e8a0c5 f0a6e936

+6
+6
drivers/tty/serial/sprd_serial.c
··· 1133 1133 1134 1134 clk_uart = devm_clk_get(uport->dev, "uart"); 1135 1135 if (IS_ERR(clk_uart)) { 1136 + if (PTR_ERR(clk_uart) == -EPROBE_DEFER) 1137 + return -EPROBE_DEFER; 1138 + 1136 1139 dev_warn(uport->dev, "uart%d can't get uart clock\n", 1137 1140 uport->line); 1138 1141 clk_uart = NULL; ··· 1143 1140 1144 1141 clk_parent = devm_clk_get(uport->dev, "source"); 1145 1142 if (IS_ERR(clk_parent)) { 1143 + if (PTR_ERR(clk_parent) == -EPROBE_DEFER) 1144 + return -EPROBE_DEFER; 1145 + 1146 1146 dev_warn(uport->dev, "uart%d can't get source clock\n", 1147 1147 uport->line); 1148 1148 clk_parent = NULL;