summaryrefslogtreecommitdiff
path: root/drivers/acpi/battery.c
diff options
context:
space:
mode:
authorRoland Dreier <roland@digitalvampire.org>2007-11-07 15:09:09 -0800
committerLen Brown <lenb@t61.(none)>2007-11-08 15:08:15 -0500
commit4c41d3ad6544f1c9aec37c441af04f5d0ad3a731 (patch)
treea219cf7ae81282beba10c821e2179326f8429939 /drivers/acpi/battery.c
parentdbeeb816e805091e7cfc03baf36dc40b4adb2bbd (diff)
downloadlinux-3.10-4c41d3ad6544f1c9aec37c441af04f5d0ad3a731.tar.gz
linux-3.10-4c41d3ad6544f1c9aec37c441af04f5d0ad3a731.tar.bz2
linux-3.10-4c41d3ad6544f1c9aec37c441af04f5d0ad3a731.zip
ACPI: Always return valid 'status' from acpi_battery_get_property()
If a battery is at a critical charge level and not being charged or discharged, then the ACPI _BST method will return a state of 4, and the current acpi_battery_get_property() code will not set any property value for POWER_SUPPLY_PROP_STATUS. This will cause an oops in power_supply_show_property() when it reads off the end of the status_text array. This actually was causing a 100% reproducible crash on boot on my laptop with two batteries, when one battery was completely drained and the laptop was not plugged in. Fix this by making sure acpi_battery_get_property() returns POWER_SUPPLY_STATUS_UNKNOWN for any battery state it doesn't already handle explicitly. There doesn't seem to be any status enum value defined that makes more sense than 'unknown' for a battery at a critical charge level. Signed-off-by: Roland Dreier <roland@digitalvampire.org> Acked-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <lenb@t61.(none)>
Diffstat (limited to 'drivers/acpi/battery.c')
-rw-r--r--drivers/acpi/battery.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index c2ce0ad2169..cbb27b4ddea 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -152,6 +152,8 @@ static int acpi_battery_get_property(struct power_supply *psy,
val->intval = POWER_SUPPLY_STATUS_CHARGING;
else if (battery->state == 0)
val->intval = POWER_SUPPLY_STATUS_FULL;
+ else
+ val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
break;
case POWER_SUPPLY_PROP_PRESENT:
val->intval = acpi_battery_present(battery);