[PATCH] mfd: wm8350: return an error for AUXADC timeouts

From: Pengpeng Hou

Date: Wed Jun 24 2026 - 10:48:29 EST


wm8350_read_auxadc() logs when the AUXADC poll bit remains set after the
conversion wait, but still returns result, which remains zero when no
conversion result was read.

Return -ETIMEDOUT after turning the ADC back off and releasing
auxadc_mutex so callers do not treat a timed out conversion as a valid
zero sample.

Signed-off-by: Pengpeng Hou <pengpeng@xxxxxxxxxxx>
---
drivers/mfd/wm8350-core.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c
index fbc77b218..214826e16 100644
--- a/drivers/mfd/wm8350-core.c
+++ b/drivers/mfd/wm8350-core.c
@@ -188,6 +188,7 @@ EXPORT_SYMBOL_GPL(wm8350_reg_unlock);
int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale, int vref)
{
u16 reg, result = 0;
+ int ret = 0;

if (channel < WM8350_AUXADC_AUX1 || channel > WM8350_AUXADC_TEMP)
return -EINVAL;
@@ -221,11 +222,13 @@ int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale, int vref)
wait_for_completion_timeout(&wm8350->auxadc_done, msecs_to_jiffies(5));

reg = wm8350_reg_read(wm8350, WM8350_DIGITISER_CONTROL_1);
- if (reg & WM8350_AUXADC_POLL)
+ if (reg & WM8350_AUXADC_POLL) {
dev_err(wm8350->dev, "adc chn %d read timeout\n", channel);
- else
+ ret = -ETIMEDOUT;
+ } else {
result = wm8350_reg_read(wm8350,
WM8350_AUX1_READBACK + channel);
+ }

/* Turn off the ADC */
reg = wm8350_reg_read(wm8350, WM8350_POWER_MGMT_5);
@@ -234,6 +237,9 @@ int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale, int vref)

mutex_unlock(&wm8350->auxadc_mutex);

+ if (ret)
+ return ret;
+
return result & WM8350_AUXADC_DATA1_MASK;
}
EXPORT_SYMBOL_GPL(wm8350_read_auxadc);
--
2.50.1 (Apple Git-155)