diff mbox series

ACPI: battery: negate current when discharging

Message ID 20250507042954.43674-1-pmarheine@chromium.org
State New
Headers show
Series ACPI: battery: negate current when discharging | expand

Commit Message

Peter Marheine May 7, 2025, 4:29 a.m. UTC
The ACPI specification requires that battery rate is always positive,
but the kernel ABI for POWER_SUPPLY_PROP_CURRENT_NOW
(Documentation/ABI/testing/sysfs-class-power) specifies that it should
be negative when a battery is discharging. When reporting CURRENT_NOW,
massage the value to match the documented ABI.

This only changes the sign of `current_now` and not `power_now` because
documentation doesn't describe any particular meaning for `power_now` so
leaving `power_now` unchanged is less likely to confuse userspace
unnecessarily, whereas becoming consistent with the documented ABI is
worth potentially confusing clients that read `current_now`.

Signed-off-by: Peter Marheine <pmarheine@chromium.org>
---
 drivers/acpi/battery.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)
diff mbox series

Patch

diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index 6760330a8a..0ef03142fd 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -242,6 +242,18 @@  static int acpi_battery_get_property(struct power_supply *psy,
 			val->intval = battery->voltage_now * 1000;
 		break;
 	case POWER_SUPPLY_PROP_CURRENT_NOW:
+		if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
+			ret = -ENODEV;
+		else if ((battery->state & ACPI_BATTERY_STATE_DISCHARGING) &&
+			 acpi_battery_handle_discharging(battery)
+				== POWER_SUPPLY_STATUS_DISCHARGING)
+			/* ACPI specifies battery rate should always be
+			 * positive, but this prop is negative when discharging.
+			 */
+			val->intval = battery->rate_now * -1000;
+		else
+			val->intval = battery->rate_now * 1000;
+		break;
 	case POWER_SUPPLY_PROP_POWER_NOW:
 		if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
 			ret = -ENODEV;