• Kamil Iskra's avatar
    ACPI / battery: Correct battery capacity values on Thinkpads · fd013d71
    Kamil Iskra authored
    commit 4000e626 upstream.
    
    Add a quirk to correctly report battery capacity on 2010 and 2011
    Lenovo Thinkpad models.
    
    The affected models that I tested (x201, t410, t410s, and x220)
    exhibit a problem where, when battery capacity reporting unit is mAh,
    the values being reported are wrong.  Pre-2010 and 2012 models appear
    to always report in mWh and are thus unaffected.  Also, in mid-2012
    Lenovo issued a BIOS update for the 2011 models that fixes the issue
    (tested on x220 with a post-1.29 BIOS).  No such update is available
    for the 2010 models, so those still need this patch.
    
    Problem description: for some reason, the affected Thinkpads switch
    the reporting unit between mAh and mWh; generally, mAh is used when a
    laptop is plugged in and mWh when it's unplugged, although a
    suspend/resume or rmmod/modprobe is needed for the switch to take
    effect.  The values reported in mAh are *always* wrong.  This does
    not appear to be a kernel regression; I believe that the values were
    never reported correctly.  I tested back to kernel 2.6.34, with
    multiple machines and BIOS versions.
    
    Simply plugging a laptop into mains before turning it on is enough to
    reproduce the problem.  Here's a sample /proc/acpi/battery/BAT0/info
    from Thinkpad x220 (before a BIOS update) with a 4-cell battery:
    
    present:                 yes
    design capacity:         2886 mAh
    last full capacity:      2909 mAh
    battery technology:      rechargeable
    design voltage:          14800 mV
    design capacity warning: 145 mAh
    design capacity low:     13 mAh
    cycle count:              0
    capacity granularity 1:  1 mAh
    capacity granularity 2:  1 mAh
    model number:            42T4899
    serial number:           21064
    battery type:            LION
    OEM info:                SANYO
    
    Once the laptop switches the unit to mWh (unplug from mains, suspend,
    resume), the output changes to:
    
    present:                 yes
    design capacity:         28860 mWh
    last full capacity:      29090 mWh
    battery technology:      rechargeable
    design voltage:          14800 mV
    design capacity warning: 1454 mWh
    design capacity low:     200 mWh
    cycle count:              0
    capacity granularity 1:  1 mWh
    capacity granularity 2:  1 mWh
    model number:            42T4899
    serial number:           21064
    battery type:            LION
    OEM info:                SANYO
    
    Can you see how the values for "design capacity", etc., differ by a
    factor of 10 instead of 14.8 (the design voltage of this battery)?
    On the battery itself it says: 14.8V, 1.95Ah, 29Wh, so clearly the
    values reported in mWh are correct and the ones in mAh are not.
    
    My guess is that this problem has been around ever since those
    machines were released, but because the most common Thinkpad
    batteries are rated at 10.8V, the error (8%) is small enough that it
    simply hasn't been noticed or at least nobody could be bothered to
    look into it.
    
    My patch works around the problem by adjusting the incorrectly
    reported mAh values by "10000 / design_voltage".  The patch also has
    code to figure out if it should be activated or not.  It only
    activates on Lenovo Thinkpads, only when the unit is mAh, and, as an
    extra precaution, only when the battery capacity reported through
    ACPI does not match what is reported through DMI (I've never
    encountered a machine where the first two conditions would be true
    but the last would not, but better safe than sorry).
    
    I've been using this patch for close to a year on several systems
    without any problems.
    
    References: https://bugzilla.kernel.org/show_bug.cgi?id=41062Acked-by: default avatarHenrique de Moraes Holschuh <hmh@hmh.eng.br>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    fd013d71
battery.c 34 KB