Commit 234f7155 authored by Peter Marheine's avatar Peter Marheine Committed by Rafael J. Wysocki
Browse files

ACPI: battery: negate current when discharging



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: default avatarPeter Marheine <pmarheine@chromium.org>
Link: https://patch.msgid.link/20250508024146.1436129-1-pmarheine@chromium.org


Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 46d839ad
Loading
Loading
Loading
Loading
+16 −3
Original line number Diff line number Diff line
@@ -243,10 +243,23 @@ static int acpi_battery_get_property(struct power_supply *psy,
		break;
	case POWER_SUPPLY_PROP_CURRENT_NOW:
	case POWER_SUPPLY_PROP_POWER_NOW:
		if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
		if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN) {
			ret = -ENODEV;
		else
			break;
		}

		val->intval = battery->rate_now * 1000;
		/*
		 * When discharging, the current should be reported as a
		 * negative number as per the power supply class interface
		 * definition.
		 */
		if (psp == POWER_SUPPLY_PROP_CURRENT_NOW &&
		    (battery->state & ACPI_BATTERY_STATE_DISCHARGING) &&
		    acpi_battery_handle_discharging(battery)
				== POWER_SUPPLY_STATUS_DISCHARGING)
			val->intval = -val->intval;

		break;
	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
	case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: