diff options
author | Laszlo Toth <laszlth@gmail.com> | 2018-02-24 04:20:15 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2018-02-27 11:17:11 -0500 |
commit | a20136a67a995cd5b74e8c0fcb3b2f2e5b2848dd (patch) | |
tree | 7daabf42ed2d71c9966492595148993b93810998 | |
parent | 514bcc5dfa69d64f7772cb6442721b9d1b83504d (diff) |
ACPI: battery: do not export degraded capacity values over 100
With a degraded battery, full_charge_capacity can be less
than design_capacity, however it's not sure that capacity_now's
max will follow.
Example from an affected machine:
/sys/class/power_supply/BAT0/charge_full -> 4290000
/sys/class/power_supply/BAT0/charge_full_design -> 5900000
/sys/class/power_supply/BAT0/charge_now -> 5900000
/sys/class/power_supply/BAT0/capacity -> 137
The battery is a degraded one with a full charge, and
charge_now is the value of charge_full_design instead of
charge_full.
Added a new quirk to test and correct this, and
a new function to check if the battery is a degraded one
or not. This keeps the possibility to be over 100 if
it's really the case.
Signed-off-by: Laszlo Toth <laszlth@gmail.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | drivers/acpi/battery.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index b4580b2e8706..96ed134bacf8 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
@@ -121,6 +121,10 @@ enum { | |||
121 | post-1.29 BIOS), but as of Nov. 2012, no such update is | 121 | post-1.29 BIOS), but as of Nov. 2012, no such update is |
122 | available for the 2010 models. */ | 122 | available for the 2010 models. */ |
123 | ACPI_BATTERY_QUIRK_THINKPAD_MAH, | 123 | ACPI_BATTERY_QUIRK_THINKPAD_MAH, |
124 | /* for batteries reporting current capacity with design capacity | ||
125 | * on a full charge, but showing degradation in full charge cap. | ||
126 | */ | ||
127 | ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE, | ||
124 | }; | 128 | }; |
125 | 129 | ||
126 | struct acpi_battery { | 130 | struct acpi_battery { |
@@ -207,6 +211,12 @@ static int acpi_battery_is_charged(struct acpi_battery *battery) | |||
207 | return 0; | 211 | return 0; |
208 | } | 212 | } |
209 | 213 | ||
214 | static bool acpi_battery_is_degraded(struct acpi_battery *battery) | ||
215 | { | ||
216 | return battery->full_charge_capacity && battery->design_capacity && | ||
217 | battery->full_charge_capacity < battery->design_capacity; | ||
218 | } | ||
219 | |||
210 | static int acpi_battery_get_property(struct power_supply *psy, | 220 | static int acpi_battery_get_property(struct power_supply *psy, |
211 | enum power_supply_property psp, | 221 | enum power_supply_property psp, |
212 | union power_supply_propval *val) | 222 | union power_supply_propval *val) |
@@ -483,6 +493,10 @@ static int extract_battery_info(const int use_bix, | |||
483 | it's impossible to tell if they would need an adjustment | 493 | it's impossible to tell if they would need an adjustment |
484 | or not if their values were higher. */ | 494 | or not if their values were higher. */ |
485 | } | 495 | } |
496 | if (test_bit(ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE, &battery->flags) && | ||
497 | battery->capacity_now > battery->full_charge_capacity) | ||
498 | battery->capacity_now = battery->full_charge_capacity; | ||
499 | |||
486 | return result; | 500 | return result; |
487 | } | 501 | } |
488 | 502 | ||
@@ -575,6 +589,10 @@ static int acpi_battery_get_state(struct acpi_battery *battery) | |||
575 | battery->capacity_now = battery->capacity_now * | 589 | battery->capacity_now = battery->capacity_now * |
576 | 10000 / battery->design_voltage; | 590 | 10000 / battery->design_voltage; |
577 | } | 591 | } |
592 | if (test_bit(ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE, &battery->flags) && | ||
593 | battery->capacity_now > battery->full_charge_capacity) | ||
594 | battery->capacity_now = battery->full_charge_capacity; | ||
595 | |||
578 | return result; | 596 | return result; |
579 | } | 597 | } |
580 | 598 | ||
@@ -885,6 +903,15 @@ static void acpi_battery_quirks(struct acpi_battery *battery) | |||
885 | } | 903 | } |
886 | } | 904 | } |
887 | } | 905 | } |
906 | |||
907 | if (test_bit(ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE, &battery->flags)) | ||
908 | return; | ||
909 | |||
910 | if (acpi_battery_is_degraded(battery) && | ||
911 | battery->capacity_now > battery->full_charge_capacity) { | ||
912 | set_bit(ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE, &battery->flags); | ||
913 | battery->capacity_now = battery->full_charge_capacity; | ||
914 | } | ||
888 | } | 915 | } |
889 | 916 | ||
890 | static int acpi_battery_update(struct acpi_battery *battery, bool resume) | 917 | static int acpi_battery_update(struct acpi_battery *battery, bool resume) |