From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B8DD3750CB for ; Wed, 5 Aug 2026 01:42:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.173 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785894166; cv=none; b=f1Ny8YPgVanjfiFMDyyxvPPUSk7H/eZEeigZzovtC/mOoGvVgCBWMla2t8jueCGB0yjga+ET3/94swAfhX7DyYuJRynLX1XMRAByHVQZsRYij3MJoIb4a8AGnSe1RRb2AuOyh3rby4xNekmOwjgttCUr7htNqqnbVFSPwIOPZmM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785894166; c=relaxed/simple; bh=ekYyjbGDCMIjKTojcaxhwQ+AMRhdvTKOaGTvjM0ayMw=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=uOnuRJwQ2xs9qE2urgaF1sN+BTnuwVOTqveAbkzlpubttwrczRJ6ui6AI0Avai5z0Wtq//FxLZ4TCK/3HsZDXMNdPegTcBppGgquN8rkG/oGDnd0u3513WpddcTzEW7c/cYDVzX2pkNVpj5uHrooCwhQGIedG8waP7otmvnMsoc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZWb4GEdq; arc=none smtp.client-ip=209.85.215.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZWb4GEdq" Received: by mail-pg1-f173.google.com with SMTP id 41be03b00d2f7-ca00f126b7eso273480a12.2 for ; Tue, 04 Aug 2026 18:42:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785894160; x=1786498960; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=WtsicDUzlvcscfC5dX4W8BMmJ9vs/CpiKg/Y+8Yj9KE=; b=ZWb4GEdqrrrlv0oCe5ue9ABZJ+TAXWSJ6Fkvrv6mi/rdkZ2TDVVqzNJ+aIckx1iPX9 f6HiZXK4tDl1qCmsbQAZY1oTP2sc44yCN3OYM0HULT5VQYFkBsPUt1PvO6zOCo0HvexS cPnJsvzxnGlbFyDKKFEMA0Ew31wU+P7lcFan6PIjxkcgzZ7QqYhyYTupn8eNHAoWfxFf 796t5fQzxwbMBn8tDuhgHkBGX9EkToxTVQntw88dzh7BvdUZom89DBF1qtWwOVnbKLzA 2phMf/CBYQ3pNO9TXxcD9XaYOOycNPSryUC1+JxjRowmD6uZUEITqyqqcT8zMDfm9Mur G7hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785894160; x=1786498960; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=WtsicDUzlvcscfC5dX4W8BMmJ9vs/CpiKg/Y+8Yj9KE=; b=iWBZsvefdd1pIULg1tgtCyoviBMncHLMmDkNuTvMQMzv++FCzohdDYANmnbgWMA0RV EuTKhcjuWuoZoRNL9wC+RRSTKLlOE7nDRSEs9rxbFqeMRFuNTAUk7qkvyyW8LXN/oAwq gnkz8eZIusqiCNRY4U+d+jdKolC9Grm07Q8RMNQ2W81uagylz5gU30/QHUVj9LfNzJrI ID1ca5R5qKg0pNy8hwreR++hiyRmNhz/nJX4cc7rUUVYmaH20VLW94ItaGM/sOD94FIl u1pYl+ZYr/gy+7lOlTBaTZ4f9eiQCIvppzfbv1OHoTSNZcIpo4WBFgsK62IaM5P5NA+M cyew== X-Forwarded-Encrypted: i=1; AHgh+Rrgz8bzYUybgwzEWptLeXRziPB6hOfTLUvVQGuSYIchsNDe0NSea0miAnXxLBGb3AM9DXMu2f8FZCuT8Eo=@vger.kernel.org X-Gm-Message-State: AOJu0YxFDA17sH4l0krXqXns+r2x/JC8Vcz42qXHRGf28n6hvs2Qyegm cp7wjmMNpBJZWeSkr7437mOJVJalU/KeQxvXxJmTMGSKLCTiJxvbAbZ0 X-Gm-Gg: AR+sD11LkSpgSrtUsCZiJXc6RNZLvYqpUpJ5wclKPYMme9XPcWr++HO4Ohhq19AY1f3 KKVZai/gFE/a7SbUh/1x5f09m/yFZ6jOHzY6aHXlov3XumvgIAnmLy0DzfXOUcNIXGG17tshoha tLANjxGIdU1W2mY2raJFG9KhzoYagDAC14vnG8l6nAW9DR40l1xJQVPZB1JEUkr+M9DMGAE04BR EoshgHr7/n0V+AJr0VqRkPekRUEDiKYmjnZQ1AcWazV7e4VxyPKT4kHPBehUZKjyJ+TflCxaow4 1JXC3fHLLCW+d7984XnEfQ0Idm9aNsOJYnzim0DmZsjK9fQ5Bky2JG1MQwQuoJkNgGH2+PIwGt1 8TXQ1bG4z99VkeQ+dSe3abg5HV1Qko+bf9Z5URBCjr4+HEoKzE8jJnpOiGaKbQycyEFrtdfAQXQ IczBE2pAhNwaa8LN4gUlNgOtJdjQxJAwQpPVwMff1pHoFTF8MPHHbp6i4Z+BFXJV+wL/l5q+7+2 hrj3+GLQwG30HVadMNDdpVI2MPq5U8g599USGh3wj0IwVoVtjdFMF4QAJx9 X-Received: by 2002:a05:6a00:6c95:b0:847:8449:2bb6 with SMTP id d2e1a72fcca58-84f2e022798mr3333888b3a.4.1785894160046; Tue, 04 Aug 2026 18:42:40 -0700 (PDT) Received: from bloom.localdomain ([2604:3d09:178e:e100::6868]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84f2e507c38sm333744b3a.43.2026.08.04.18.42.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2026 18:42:39 -0700 (PDT) From: Ivy Lopez To: lee@kernel.org, sre@kernel.org, linux@roeck-us.net Cc: patches@opensource.cirrus.com, mfd@lists.linux.dev, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-hwmon@vger.kernel.org, Ivy Lopez Subject: [PATCH] mfd: wm8350: propagate ADC read timeout instead of returning 0 Date: Tue, 4 Aug 2026 19:42:21 -0600 Message-ID: <20260805014221.16412-1-skunkolee@gmail.com> X-Mailer: git-send-email 2.55.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit wm8350_read_auxadc() logs an error via dev_err() when the AUX ADC read times out, but then falls through to return the masked value of `result`, which was left at its initial value of 0. Callers have no way to distinguish a genuine 0V reading from a failed read. Return -ETIMEDOUT on timeout instead, and update the wm8350 hwmon and power_supply drivers, which call this function directly, to check for a negative return and propagate the error rather than using it as a voltage value. Signed-off-by: Ivy Lopez --- drivers/hwmon/wm8350-hwmon.c | 9 ++++-- drivers/mfd/wm8350-core.c | 14 ++++++--- drivers/power/supply/wm8350_power.c | 45 ++++++++++++++++++++++------- 3 files changed, 51 insertions(+), 17 deletions(-) diff --git a/drivers/hwmon/wm8350-hwmon.c b/drivers/hwmon/wm8350-hwmon.c index 10e17bb79895..a455e1c5476c 100644 --- a/drivers/hwmon/wm8350-hwmon.c +++ b/drivers/hwmon/wm8350-hwmon.c @@ -23,14 +23,17 @@ static const char * const input_names[] = { }; static ssize_t show_voltage(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, char *buf) { struct wm8350 *wm8350 = dev_get_drvdata(dev); int channel = to_sensor_dev_attr(attr)->index; int val; - val = wm8350_read_auxadc(wm8350, channel, 0, 0) * WM8350_AUX_COEFF; - val = DIV_ROUND_CLOSEST(val, 1000); + val = wm8350_read_auxadc(wm8350, channel, 0, 0); + if (val < 0) + return val; + + val = DIV_ROUND_CLOSEST(val * WM8350_AUX_COEFF, 1000); return sprintf(buf, "%d\n", val); } diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c index fbc77b218215..3120c6b8fa3f 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,19 +222,24 @@ 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); + WM8350_AUX1_READBACK + channel); + } /* Turn off the ADC */ reg = wm8350_reg_read(wm8350, WM8350_POWER_MGMT_5); wm8350_reg_write(wm8350, WM8350_POWER_MGMT_5, - reg & ~WM8350_AUXADC_ENA); + reg & ~WM8350_AUXADC_ENA); mutex_unlock(&wm8350->auxadc_mutex); + if (ret) + return ret; + return result & WM8350_AUXADC_DATA1_MASK; } EXPORT_SYMBOL_GPL(wm8350_read_auxadc); diff --git a/drivers/power/supply/wm8350_power.c b/drivers/power/supply/wm8350_power.c index b0eb6e0ce8bc..111373027905 100644 --- a/drivers/power/supply/wm8350_power.c +++ b/drivers/power/supply/wm8350_power.c @@ -19,20 +19,32 @@ static int wm8350_read_battery_uvolts(struct wm8350 *wm8350) { - return wm8350_read_auxadc(wm8350, WM8350_AUXADC_BATT, 0, 0) - * WM8350_AUX_COEFF; + int val = wm8350_read_auxadc(wm8350, WM8350_AUXADC_BATT, 0, 0); + + if (val < 0) + return val; + + return val * WM8350_AUX_COEFF; } static int wm8350_read_line_uvolts(struct wm8350 *wm8350) { - return wm8350_read_auxadc(wm8350, WM8350_AUXADC_LINE, 0, 0) - * WM8350_AUX_COEFF; + int val = wm8350_read_auxadc(wm8350, WM8350_AUXADC_LINE, 0, 0); + + if (val < 0) + return val; + + return val * WM8350_AUX_COEFF; } static int wm8350_read_usb_uvolts(struct wm8350 *wm8350) { - return wm8350_read_auxadc(wm8350, WM8350_AUXADC_USB, 0, 0) - * WM8350_AUX_COEFF; + int val = wm8350_read_auxadc(wm8350, WM8350_AUXADC_USB, 0, 0); + + if (val < 0) + return val; + + return val * WM8350_AUX_COEFF; } #define WM8350_BATT_SUPPLY 1 @@ -257,7 +269,10 @@ static int wm8350_ac_get_prop(struct power_supply *psy, WM8350_LINE_SUPPLY); break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: - val->intval = wm8350_read_line_uvolts(wm8350); + ret = wm8350_read_line_uvolts(wm8350); + if (ret < 0) + return ret; + val->intval = ret; break; default: ret = -EINVAL; @@ -287,7 +302,10 @@ static int wm8350_usb_get_prop(struct power_supply *psy, WM8350_USB_SUPPLY); break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: - val->intval = wm8350_read_usb_uvolts(wm8350); + ret = wm8350_read_usb_uvolts(wm8350); + if (ret < 0) + return ret; + val->intval = ret; break; default: ret = -EINVAL; @@ -308,8 +326,12 @@ static enum power_supply_property wm8350_usb_props[] = { static int wm8350_bat_check_health(struct wm8350 *wm8350) { u16 reg; + int uvolts = wm8350_read_battery_uvolts(wm8350); + + if (uvolts < 0) + return POWER_SUPPLY_HEALTH_UNKNOWN; - if (wm8350_read_battery_uvolts(wm8350) < 2850000) + if (uvolts < 2850000) return POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; reg = wm8350_reg_read(wm8350, WM8350_CHARGER_OVERRIDES); @@ -356,7 +378,10 @@ static int wm8350_bat_get_property(struct power_supply *psy, WM8350_BATT_SUPPLY); break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: - val->intval = wm8350_read_battery_uvolts(wm8350); + ret = wm8350_read_battery_uvolts(wm8350); + if (ret < 0) + return ret; + val->intval = ret; break; case POWER_SUPPLY_PROP_HEALTH: val->intval = wm8350_bat_check_health(wm8350); -- 2.55.0