]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPI: battery: fix incorrect charging status when current is zero
authorAta İlhan Köktürk <atailhan2006@gmail.com>
Thu, 29 Jan 2026 14:48:56 +0000 (17:48 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sun, 1 Feb 2026 12:48:23 +0000 (13:48 +0100)
On some laptops, such as the Huawei Matebook series, the embedded
controller continues to report "Charging" status even when the
charge threshold is reached and no current is being drawn.

This incorrect reporting prevents the system from switching to battery
power profiles, leading to significantly higher power (e.g., 18W instead
of 7W during browsing) and missed remaining battery time estimation.

Validate the "Charging" state by checking if rate_now is zero. If the
hardware reports charging but the current is zero, report "Not Charging"
to user space.

Signed-off-by: Ata İlhan Köktürk <atailhan2006@gmail.com>
[ rjw: Whitespace fix, braces added to an inner if (), new comment rewrite ]
[ rjw: Changelog edits ]
Link: https://patch.msgid.link/20260129144856.43058-1-atailhan2006@gmail.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/battery.c

index 151a9f645511368a6ca24cc2b2479eb1265f7d5d..3bbddd6f622c8e1ec726d12fb75d5556838f3e38 100644 (file)
@@ -212,7 +212,14 @@ static int acpi_battery_get_property(struct power_supply *psy,
                if (battery->state & ACPI_BATTERY_STATE_DISCHARGING)
                        val->intval = acpi_battery_handle_discharging(battery);
                else if (battery->state & ACPI_BATTERY_STATE_CHARGING)
-                       val->intval = POWER_SUPPLY_STATUS_CHARGING;
+                       /* Validate the status by checking the current. */
+                       if (battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN &&
+                           battery->rate_now == 0) {
+                               /* On charge but no current (0W/0mA). */
+                               val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
+                       } else {
+                               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))