From 46b11b07485e25ebddf3733143ee534945f39116 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Fri, 12 Nov 2010 13:11:21 -0800 Subject: [PATCH] report energy and charge full --- drivers/power/efikasb_battery.c | 56 +++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/drivers/power/efikasb_battery.c b/drivers/power/efikasb_battery.c index a5f563d1acc..40144a81827 100644 --- a/drivers/power/efikasb_battery.c +++ b/drivers/power/efikasb_battery.c @@ -219,7 +219,9 @@ static enum power_supply_property efikasb_batt_props[] = { POWER_SUPPLY_PROP_MANUFACTURER, POWER_SUPPLY_PROP_SERIAL_NUMBER, POWER_SUPPLY_PROP_ENERGY_NOW, + POWER_SUPPLY_PROP_ENERGY_FULL, POWER_SUPPLY_PROP_CHARGE_NOW, + POWER_SUPPLY_PROP_CHARGE_FULL, }; static enum power_supply_property efikasb_ac_charger_props[] = { @@ -396,6 +398,27 @@ static int efikasb_batt_get_energy_now(struct efikasb_batt_dev_info *di, return ret; } +static int efikasb_batt_get_energy_full(struct efikasb_batt_dev_info *di, + u32 *value) +{ + int ret; + u32 battery_mode; + + ret = efikasb_batt_read(di->client, SBS_BATTERY_MODE, &battery_mode); + if (ret < 0) + return ret; + + efikasb_batt_write(di->client, SBS_BATTERY_MODE, + battery_mode | SBS_CAPACITY_MODE); + + ret = efikasb_batt_read(di->client, SBS_FULL_CHARGE_CAPACITY, value); + if (ret == 0) { + *value *= 10000; /* 10 mWh -> uWh */ + } + + return ret; +} + static int efikasb_batt_get_charge_now(struct efikasb_batt_dev_info *di, u32 *value) { @@ -417,6 +440,27 @@ static int efikasb_batt_get_charge_now(struct efikasb_batt_dev_info *di, return ret; } +static int efikasb_batt_get_charge_full(struct efikasb_batt_dev_info *di, + u32 *value) +{ + int ret; + u32 battery_mode; + + ret = efikasb_batt_read(di->client, SBS_BATTERY_MODE, &battery_mode); + if (ret < 0) + return ret; + + efikasb_batt_write(di->client, SBS_BATTERY_MODE, + battery_mode & SBS_CAPACITY_MODE); + + ret = efikasb_batt_read(di->client, SBS_FULL_CHARGE_CAPACITY, value); + if (ret == 0) { + *value *= 1000; /* mAh -> uAh */ + } + + return ret; +} + #define to_efikasb_batt_device_info(x) container_of((x), \ struct efikasb_batt_dev_info, bat); @@ -537,12 +581,24 @@ static int efikasb_batt_get_property(struct power_supply *psy, return ret; val->intval = value; break; + case POWER_SUPPLY_PROP_ENERGY_FULL: + ret = efikasb_batt_get_energy_full(di, &value); + if (ret != 0) + return ret; + val->intval = value; + break; case POWER_SUPPLY_PROP_CHARGE_NOW: ret = efikasb_batt_get_charge_now(di, &value); if (ret != 0) return ret; val->intval = value; break; + case POWER_SUPPLY_PROP_CHARGE_FULL: + ret = efikasb_batt_get_charge_full(di, &value); + if (ret != 0) + return ret; + val->intval = value; + break; default: return -EINVAL; }