Skip to content

Commit

Permalink
olpc-battery: Add VOLTAGE_MAX_DESIGN property
Browse files Browse the repository at this point in the history
upowerd wants to compute the energy in the battery by looking at this
property.  If it's not present then it falls back on using the reported
voltage of the battery at time upowerd loads.  That's close but also
means that every time you boot you get a slightly different energy
capacity.

Adding the VOLTAGE_MAX_DESIGN property allows upowerd to compute the
same energy every time.

Signed-off-by: Richard A. Smith <richard@laptop.org>
Signed-off-by: Daniel Drake <dsd@laptop.org>
Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
  • Loading branch information
Richard A. Smith authored and Anton Vorontsov committed Jul 16, 2012
1 parent c472755 commit 5619d0b
Showing 1 changed file with 56 additions and 0 deletions.
56 changes: 56 additions & 0 deletions drivers/power/olpc_battery.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,55 @@ static int olpc_bat_get_charge_now(union power_supply_propval *val)
return 0;
}

static int olpc_bat_get_voltage_max_design(union power_supply_propval *val)
{
uint8_t ec_byte;
union power_supply_propval tech;
int mfr;
int ret;

ret = olpc_bat_get_tech(&tech);
if (ret)
return ret;

ec_byte = BAT_ADDR_MFR_TYPE;
ret = olpc_ec_cmd(EC_BAT_EEPROM, &ec_byte, 1, &ec_byte, 1);
if (ret)
return ret;

mfr = ec_byte >> 4;

switch (tech.intval) {
case POWER_SUPPLY_TECHNOLOGY_NiMH:
switch (mfr) {
case 1: /* Gold Peak */
val->intval = 6000000;
break;
default:
return -EIO;
}
break;

case POWER_SUPPLY_TECHNOLOGY_LiFe:
switch (mfr) {
case 1: /* Gold Peak */
val->intval = 6400000;
break;
case 2: /* BYD */
val->intval = 6500000;
break;
default:
return -EIO;
}
break;

default:
return -EIO;
}

return ret;
}

/*********************************************************************
* Battery properties
*********************************************************************/
Expand Down Expand Up @@ -401,6 +450,11 @@ static int olpc_bat_get_property(struct power_supply *psy,
sprintf(bat_serial, "%016llx", (long long)be64_to_cpu(ser_buf));
val->strval = bat_serial;
break;
case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
ret = olpc_bat_get_voltage_max_design(val);
if (ret)
return ret;
break;
default:
ret = -EINVAL;
break;
Expand Down Expand Up @@ -428,6 +482,7 @@ static enum power_supply_property olpc_xo1_bat_props[] = {
POWER_SUPPLY_PROP_MANUFACTURER,
POWER_SUPPLY_PROP_SERIAL_NUMBER,
POWER_SUPPLY_PROP_CHARGE_COUNTER,
POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
};

/* XO-1.5 does not have ambient temperature property */
Expand All @@ -449,6 +504,7 @@ static enum power_supply_property olpc_xo15_bat_props[] = {
POWER_SUPPLY_PROP_MANUFACTURER,
POWER_SUPPLY_PROP_SERIAL_NUMBER,
POWER_SUPPLY_PROP_CHARGE_COUNTER,
POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
};

/* EEPROM reading goes completely around the power_supply API, sadly */
Expand Down

0 comments on commit 5619d0b

Please sign in to comment.