Commit 526294e1 authored by Armin Wolf's avatar Armin Wolf Committed by Rafael J. Wysocki

ACPI: battery: Add support for charge limiting state

The ACPI specification says that bit 3 inside the battery state
signals that the battery is in charge limiting state. In this state,
the platform limits the battery from reaching its full capacity, the
exact limit is platform-specific.

This might explain why a number of batteries reported a "Unknown"
battery state in the past when using platform-specific interfaces to
stop battery charging at a user defined level.

Unfortunately not all platforms set this bit in such cases, so
"non-charging" is still the default state when the battery is neither
charging, discharging or full.

Tested on a Lenovo Ideapad S145-14IWL.
Signed-off-by: default avatarArmin Wolf <W_Armin@gmx.de>
Link: https://patch.msgid.link/20240620191410.3646-1-W_Armin@gmx.deSigned-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 6bad28cf
...@@ -38,9 +38,10 @@ ...@@ -38,9 +38,10 @@
/* Battery power unit: 0 means mW, 1 means mA */ /* Battery power unit: 0 means mW, 1 means mA */
#define ACPI_BATTERY_POWER_UNIT_MA 1 #define ACPI_BATTERY_POWER_UNIT_MA 1
#define ACPI_BATTERY_STATE_DISCHARGING 0x1 #define ACPI_BATTERY_STATE_DISCHARGING 0x1
#define ACPI_BATTERY_STATE_CHARGING 0x2 #define ACPI_BATTERY_STATE_CHARGING 0x2
#define ACPI_BATTERY_STATE_CRITICAL 0x4 #define ACPI_BATTERY_STATE_CRITICAL 0x4
#define ACPI_BATTERY_STATE_CHARGE_LIMITING 0x8
#define MAX_STRING_LENGTH 64 #define MAX_STRING_LENGTH 64
...@@ -155,7 +156,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery); ...@@ -155,7 +156,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery);
static int acpi_battery_is_charged(struct acpi_battery *battery) static int acpi_battery_is_charged(struct acpi_battery *battery)
{ {
/* charging, discharging or critical low */ /* charging, discharging, critical low or charge limited */
if (battery->state != 0) if (battery->state != 0)
return 0; return 0;
...@@ -215,6 +216,8 @@ static int acpi_battery_get_property(struct power_supply *psy, ...@@ -215,6 +216,8 @@ static int acpi_battery_get_property(struct power_supply *psy,
val->intval = acpi_battery_handle_discharging(battery); val->intval = acpi_battery_handle_discharging(battery);
else if (battery->state & ACPI_BATTERY_STATE_CHARGING) else if (battery->state & ACPI_BATTERY_STATE_CHARGING)
val->intval = POWER_SUPPLY_STATUS_CHARGING; val->intval = POWER_SUPPLY_STATUS_CHARGING;
else if (battery->state & ACPI_BATTERY_STATE_CHARGE_LIMITING)
val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
else if (acpi_battery_is_charged(battery)) else if (acpi_battery_is_charged(battery))
val->intval = POWER_SUPPLY_STATUS_FULL; val->intval = POWER_SUPPLY_STATUS_FULL;
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment