[PATCH v2 2/2] acpi: battery: Handle Valve steamdeck devices quirk
From: Umang Jain
Date: Wed Sep 23 2026 - 04:28:35 EST
Valve steamdeck devices can report battery status as
charging, even when low-powered power supply is connected
to the device. The battery status is reported as charging
through sysfs, even though in reality, it is discharging.
To handle this case, we introduce a battery quirk for steamdeck
devices ACPI_BATTERY_QUIRK_VALVE_STEAMDECK. Additionally, it has been
found that on such devices, Battery Charge Time ("_BCT") is reported
accurately, hence use that information for report charging vs
discharging status. Battery Charge Time("_BCT") with an eligible power
supply unit will have valid values whereas with a low-powered supply
unit, it shall report ACPI_BATTERY_VALUE_UNKNOWN. Use this as a
differentiator to determine, whether the battery of steamdeck devices
is really charging or not.
Signed-off-by: Umang Jain <uajain@xxxxxxxxxx>
---
drivers/acpi/battery.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index a1b7a821abaf..8defafd2b7c7 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -95,6 +95,14 @@ enum {
* on a full charge, but showing degradation in full charge cap.
*/
ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE,
+ /*
+ * Valve steamdeck devices can get discharged even when battery status
+ * is charging. This happens typically when low power supply unit is
+ * connected. To accurately determine this scenario, we shall read
+ * battery charge time ("_BCT"). This is the key differentiator to
+ * determine whether the steamdeck is actually charging or not.
+ */
+ ACPI_BATTERY_QUIRK_VALVE_STEAMDECK,
};
struct acpi_battery {
@@ -236,7 +244,7 @@ static int acpi_battery_get_property(struct power_supply *psy,
: POWER_SUPPLY_STATUS_DISCHARGING;
return 0;
}
- else if (battery->state & ACPI_BATTERY_STATE_CHARGING)
+ else if (battery->state & ACPI_BATTERY_STATE_CHARGING) {
/* Check the rate and capacity to validate the status. */
if (!acpi_battery_is_full(battery) ||
(battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN &&
@@ -246,6 +254,12 @@ static int acpi_battery_get_property(struct power_supply *psy,
/* Full and zero rate. */
val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
}
+
+ if (test_bit(ACPI_BATTERY_QUIRK_VALVE_STEAMDECK, &battery->flags) &&
+ test_bit(ACPI_BATTERY_BCT_PRESENT, &battery->flags) &&
+ battery->charge_time == ACPI_BATTERY_VALUE_UNKNOWN)
+ val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
+ }
else if (battery->state & ACPI_BATTERY_STATE_CHARGE_LIMITING)
val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
else if (acpi_battery_is_charged(battery))
@@ -1072,6 +1086,18 @@ static void acpi_battery_quirks(struct acpi_battery *battery)
set_bit(ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE, &battery->flags);
battery->capacity_now = battery->full_charge_capacity;
}
+
+ if (test_bit(ACPI_BATTERY_QUIRK_VALVE_STEAMDECK, &battery->flags))
+ return;
+
+ if (dmi_name_in_vendors("Valve")) {
+ const char *name;
+
+ name = dmi_get_system_info(DMI_PRODUCT_NAME);
+ if ((name && (!strncmp("Jupiter", name, 7))) ||
+ (name && (!strncmp("Galileo", name, 7))))
+ set_bit(ACPI_BATTERY_QUIRK_VALVE_STEAMDECK, &battery->flags);
+ }
}
static int acpi_battery_update(struct acpi_battery *battery, bool resume)
--
2.55.0