aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/battery.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/battery.c')
-rw-r--r--drivers/acpi/battery.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index 65132f920459..69cbc57c2d1c 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -138,6 +138,29 @@ static int acpi_battery_technology(struct acpi_battery *battery)
138 138
139static int acpi_battery_get_state(struct acpi_battery *battery); 139static int acpi_battery_get_state(struct acpi_battery *battery);
140 140
141static int acpi_battery_is_charged(struct acpi_battery *battery)
142{
143 /* either charging or discharging */
144 if (battery->state != 0)
145 return 0;
146
147 /* battery not reporting charge */
148 if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN ||
149 battery->capacity_now == 0)
150 return 0;
151
152 /* good batteries update full_charge as the batteries degrade */
153 if (battery->full_charge_capacity == battery->capacity_now)
154 return 1;
155
156 /* fallback to using design values for broken batteries */
157 if (battery->design_capacity == battery->capacity_now)
158 return 1;
159
160 /* we don't do any sort of metric based on percentages */
161 return 0;
162}
163
141static int acpi_battery_get_property(struct power_supply *psy, 164static int acpi_battery_get_property(struct power_supply *psy,
142 enum power_supply_property psp, 165 enum power_supply_property psp,
143 union power_supply_propval *val) 166 union power_supply_propval *val)
@@ -155,7 +178,7 @@ static int acpi_battery_get_property(struct power_supply *psy,
155 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; 178 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
156 else if (battery->state & 0x02) 179 else if (battery->state & 0x02)
157 val->intval = POWER_SUPPLY_STATUS_CHARGING; 180 val->intval = POWER_SUPPLY_STATUS_CHARGING;
158 else if (battery->state == 0) 181 else if (acpi_battery_is_charged(battery))
159 val->intval = POWER_SUPPLY_STATUS_FULL; 182 val->intval = POWER_SUPPLY_STATUS_FULL;
160 else 183 else
161 val->intval = POWER_SUPPLY_STATUS_UNKNOWN; 184 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;