[PATCH] platform/x86: msi-ec: Report valid charge thresholds when unset

From: Daasaradhi Mannava

Date: Wed Sep 16 2026 - 15:19:17 EST


The charge thresholds are computed by subtracting a fixed offset from
the raw EC value. When no charge limit has been set, the EC can hold a
value below range_min (0x80 on an MSI GL65 Leopard 9SCXK), and reading
the sysfs attributes returns nonsense:

charge_control_start_threshold: -10
charge_control_end_threshold: 0

Both attributes are documented to be within 0 - 100, and an end
threshold of 0 wrongly suggests that charging is disabled.

The store path already rejects values outside range_min..range_max.
Apply the same range to the show path and report the maximum threshold
for any value outside of it.

Tested on an MSI GL65 Leopard 9SCXK (EC firmware 16U8EMS2.100) with
the EC holding 0x80: the attributes now read 90 and 100.

Fixes: 392cacf2aa10 ("platform/x86: Add new msi-ec driver")
Assisted-by: LLM
Signed-off-by: Daasaradhi Mannava <daasaradhimannava@xxxxxxxxx>
---
drivers/platform/x86/msi-ec.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/drivers/platform/x86/msi-ec.c b/drivers/platform/x86/msi-ec.c
index 566dfc73c..1762551e0 100644
--- a/drivers/platform/x86/msi-ec.c
+++ b/drivers/platform/x86/msi-ec.c
@@ -1279,6 +1279,15 @@ static ssize_t charge_control_threshold_show(u8 offset,
if (result < 0)
return result;

+ /*
+ * The EC may hold an out-of-range value (e.g. 0x80) when no charge
+ * limit has been set. Report the maximum threshold instead of a
+ * meaningless (possibly negative) percentage.
+ */
+ if (rdata < conf.charge_control.range_min ||
+ rdata > conf.charge_control.range_max)
+ rdata = conf.charge_control.range_max;
+
return sysfs_emit(buf, "%i\n", rdata - offset);
}

--
2.55.0