More cleanly support batteries that report both energy and charge, but do not report power_now. One battery driver in drivers/power (bq20z75) supports reporting energy and charge natively from the fuel gauge, but does not report power_now. The previous legacy behavior would ignore the existence of charge and treat current_now as being in units of power.
Signed-off-by: Benson Leung <ble...@chromium.org> -- diff -rupN a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c --- a/src/linux/up-device-supply.c 2011-03-23 14:39:54.079130000 -0700 +++ b/src/linux/up-device-supply.c 2011-03-23 18:18:39.032724000 -0700 @@ -557,16 +557,32 @@ up_device_supply_refresh_battery (UpDevi /* this is the new value in uW */ energy_rate = fabs (sysfs_get_double (native_path, "power_now") / 1000000.0); if (energy_rate == 0) { - /* get the old rate, rate; which is either in uVh or uWh */ - energy_rate = fabs (sysfs_get_double (native_path, "current_now") / 1000000.0); - - /* convert charge to energy */ - if (energy == 0) { - energy = sysfs_get_double (native_path, "charge_now") / 1000000.0; - if (energy == 0) - energy = sysfs_get_double (native_path, "charge_avg") / 1000000.0; - energy *= voltage_design; - energy_rate *= voltage_design; + gdouble current; + gdouble charge; + /* Depending on type of system, current_now may report as power (uW). + * Determine below. */ + current = fabs (sysfs_get_double (native_path, "current_now") / 1000000.0); + + charge = sysfs_get_double (native_path, "charge_now") / 1000000.0; + if (charge == 0) + charge = sysfs_get_double (native_path, "charge_avg") / 1000000.0; + + if (energy == 0 && charge != 0) { + /* convert charge to energy */ + energy = charge * voltage_design; + energy_rate = current * voltage_design; + } else if (energy != 0 && charge == 0) { + /* energy values only. "current_now" is actually power in uW */ + energy_rate = current; + } else if (energy != 0 && charge != 0) { + /* both exist. Use reported energy for energy, + * and calculate energy_rate from current */ + energy_rate = current * voltage_design; + } else { + /* neither energy nor charge found. */ + g_warning ("neither energy nor charge found."); + ret = FALSE; + goto out; } } _______________________________________________ devkit-devel mailing list devkit-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/devkit-devel