lkml.org 
[lkml]   [2020]   [Feb]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.5 096/367] ACPI / battery: Deal with design or full capacity being reported as -1
    Date
    From: Hans de Goede <hdegoede@redhat.com>

    commit cc99f0ad52467028cb1251160f23ad4bb65baf20 upstream.

    Commit b41901a2cf06 ("ACPI / battery: Do not export energy_full[_design]
    on devices without full_charge_capacity") added support for some (broken)
    devices which always report 0 for both design- and full_charge-capacity.

    This assumes that if the capacity is not being reported it is 0. The
    ThunderSoft TS178 tablet's _BIX implementation falsifies this assumption.
    It reports ACPI_BATTERY_VALUE_UNKNOWN (-1) as full_charge_capacity, which
    we treat as a valid value which causes several problems.

    This commit fixes this by adding a new ACPI_BATTERY_CAPACITY_VALID() helper
    which checks that the value is not 0 and not -1; and using this whenever we
    need to test if either design_capacity or full_charge_capacity is valid.

    Fixes: b41901a2cf06 ("ACPI / battery: Do not export energy_full[_design] on devices without full_charge_capacity")
    Cc: 4.19+ <stable@vger.kernel.org> # 4.19+
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/acpi/battery.c | 19 ++++++++++++-------
    1 file changed, 12 insertions(+), 7 deletions(-)

    --- a/drivers/acpi/battery.c
    +++ b/drivers/acpi/battery.c
    @@ -38,6 +38,8 @@
    #define PREFIX "ACPI: "

    #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
    +#define ACPI_BATTERY_CAPACITY_VALID(capacity) \
    + ((capacity) != 0 && (capacity) != ACPI_BATTERY_VALUE_UNKNOWN)

    #define ACPI_BATTERY_DEVICE_NAME "Battery"

    @@ -192,7 +194,8 @@ static int acpi_battery_is_charged(struc

    static bool acpi_battery_is_degraded(struct acpi_battery *battery)
    {
    - return battery->full_charge_capacity && battery->design_capacity &&
    + return ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) &&
    + ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity) &&
    battery->full_charge_capacity < battery->design_capacity;
    }

    @@ -263,14 +266,14 @@ static int acpi_battery_get_property(str
    break;
    case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
    case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
    - if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
    + if (!ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity))
    ret = -ENODEV;
    else
    val->intval = battery->design_capacity * 1000;
    break;
    case POWER_SUPPLY_PROP_CHARGE_FULL:
    case POWER_SUPPLY_PROP_ENERGY_FULL:
    - if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
    + if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity))
    ret = -ENODEV;
    else
    val->intval = battery->full_charge_capacity * 1000;
    @@ -283,11 +286,12 @@ static int acpi_battery_get_property(str
    val->intval = battery->capacity_now * 1000;
    break;
    case POWER_SUPPLY_PROP_CAPACITY:
    - if (battery->capacity_now && battery->full_charge_capacity)
    + if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN ||
    + !ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity))
    + ret = -ENODEV;
    + else
    val->intval = battery->capacity_now * 100/
    battery->full_charge_capacity;
    - else
    - val->intval = 0;
    break;
    case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
    if (battery->state & ACPI_BATTERY_STATE_CRITICAL)
    @@ -799,7 +803,8 @@ static int sysfs_add_battery(struct acpi
    battery->bat_desc.properties = charge_battery_props;
    battery->bat_desc.num_properties =
    ARRAY_SIZE(charge_battery_props);
    - } else if (battery->full_charge_capacity == 0) {
    + } else if (!ACPI_BATTERY_CAPACITY_VALID(
    + battery->full_charge_capacity)) {
    battery->bat_desc.properties =
    energy_battery_full_cap_broken_props;
    battery->bat_desc.num_properties =

    \
     
     \ /
      Last update: 2020-02-10 14:05    [W:4.021 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site