bq27x00_battery: Report -ENODATA if bq27000 battery was not calibrated
authorPali Rohár <pali.rohar@gmail.com>
Tue, 1 Nov 2011 00:43:05 +0000 (01:43 +0100)
committerAnton Vorontsov <cbouatmailru@gmail.com>
Fri, 25 Nov 2011 19:58:16 +0000 (23:58 +0400)
* CI (Capacity Inaccurate) flag is set after full reset on bq27000 battery
* when is set, all capacity properties should be reported incorrectly,
  because there was no learning cycle and battery was not calibrated
* instead reporting incorrect values, report -ENODATA

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
drivers/power/bq27x00_battery.c

index a5311225b964fd90686c6d534f3d8bd56979187d..6c8dfdb169a14fd4174386056a576f0468fd2968 100644 (file)
@@ -56,6 +56,7 @@
 #define BQ27000_REG_ILMD               0x76 /* Initial last measured discharge */
 #define BQ27000_FLAG_EDVF              BIT(0) /* Final End-of-Discharge-Voltage flag */
 #define BQ27000_FLAG_EDV1              BIT(1) /* First End-of-Discharge-Voltage flag */
+#define BQ27000_FLAG_CI                        BIT(4) /* Capacity Inaccurate flag */
 #define BQ27000_FLAG_FC                        BIT(5)
 #define BQ27000_FLAG_CHGS              BIT(7) /* Charge state flag */
 
@@ -265,12 +266,20 @@ static void bq27x00_update(struct bq27x00_device_info *di)
 
        cache.flags = bq27x00_read(di, BQ27x00_REG_FLAGS, is_bq27500);
        if (cache.flags >= 0) {
-               cache.capacity = bq27x00_battery_read_rsoc(di);
+               if (!is_bq27500 && (cache.flags & BQ27000_FLAG_CI)) {
+                       cache.capacity = -ENODATA;
+                       cache.time_to_empty = -ENODATA;
+                       cache.time_to_empty_avg = -ENODATA;
+                       cache.time_to_full = -ENODATA;
+                       cache.charge_full = -ENODATA;
+               } else {
+                       cache.capacity = bq27x00_battery_read_rsoc(di);
+                       cache.time_to_empty = bq27x00_battery_read_time(di, BQ27x00_REG_TTE);
+                       cache.time_to_empty_avg = bq27x00_battery_read_time(di, BQ27x00_REG_TTECP);
+                       cache.time_to_full = bq27x00_battery_read_time(di, BQ27x00_REG_TTF);
+                       cache.charge_full = bq27x00_battery_read_lmd(di);
+               }
                cache.temperature = bq27x00_read(di, BQ27x00_REG_TEMP, false);
-               cache.time_to_empty = bq27x00_battery_read_time(di, BQ27x00_REG_TTE);
-               cache.time_to_empty_avg = bq27x00_battery_read_time(di, BQ27x00_REG_TTECP);
-               cache.time_to_full = bq27x00_battery_read_time(di, BQ27x00_REG_TTF);
-               cache.charge_full = bq27x00_battery_read_lmd(di);
                cache.cycle_count = bq27x00_battery_read_cyct(di);
 
                /* We only have to read charge design full once */