olpc_battery: Ensure that the TRICKLE bit is checked
authorAndres Salomon <dilinger@collabora.co.uk>
Tue, 30 Jun 2009 06:16:17 +0000 (02:16 -0400)
committerAnton Vorontsov <cbouatmailru@gmail.com>
Tue, 30 Jun 2009 22:36:58 +0000 (02:36 +0400)
There are times when the battery is present but trickle charging,
and the EC sets only the TRICKLE bit. So we must check for the bit
when we're checking the charging/present status.

Signed-off-by: Andres Salomon <dilinger@collabora.co.uk>
Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
drivers/power/olpc_battery.c

index 9c216dd..58e4192 100644 (file)
@@ -36,6 +36,7 @@
 #define BAT_STAT_AC            0x10
 #define BAT_STAT_CHARGING      0x20
 #define BAT_STAT_DISCHARGING   0x40
+#define BAT_STAT_TRICKLE       0x80
 
 #define BAT_ERR_INFOFAIL       0x02
 #define BAT_ERR_OVERVOLTAGE    0x04
@@ -90,7 +91,7 @@ static char bat_serial[17]; /* Ick */
 static int olpc_bat_get_status(union power_supply_propval *val, uint8_t ec_byte)
 {
        if (olpc_platform_info.ecver > 0x44) {
-               if (ec_byte & BAT_STAT_CHARGING)
+               if (ec_byte & (BAT_STAT_CHARGING | BAT_STAT_TRICKLE))
                        val->intval = POWER_SUPPLY_STATUS_CHARGING;
                else if (ec_byte & BAT_STAT_DISCHARGING)
                        val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
@@ -220,7 +221,8 @@ static int olpc_bat_get_property(struct power_supply *psy,
           It doesn't matter though -- the EC will return the last-known
           information, and it's as if we just ran that _little_ bit faster
           and managed to read it out before the battery went away. */
-       if (!(ec_byte & BAT_STAT_PRESENT) && psp != POWER_SUPPLY_PROP_PRESENT)
+       if (!(ec_byte & (BAT_STAT_PRESENT | BAT_STAT_TRICKLE)) &&
+                       psp != POWER_SUPPLY_PROP_PRESENT)
                return -ENODEV;
 
        switch (psp) {
@@ -230,7 +232,8 @@ static int olpc_bat_get_property(struct power_supply *psy,
                        return ret;
                break;
        case POWER_SUPPLY_PROP_PRESENT:
-               val->intval = !!(ec_byte & BAT_STAT_PRESENT);
+               val->intval = !!(ec_byte & (BAT_STAT_PRESENT |
+                                           BAT_STAT_TRICKLE));
                break;
 
        case POWER_SUPPLY_PROP_HEALTH: