in supply/surface_battery.c [543:663]
static int spwr_battery_get_property(struct power_supply *psy, enum power_supply_property psp,
union power_supply_propval *val)
{
struct spwr_battery_device *bat = power_supply_get_drvdata(psy);
u32 value;
int status;
mutex_lock(&bat->lock);
status = spwr_battery_update_bst_unlocked(bat, true);
if (status)
goto out;
/* Abort if battery is not present. */
if (!spwr_battery_present(bat) && psp != POWER_SUPPLY_PROP_PRESENT) {
status = -ENODEV;
goto out;
}
switch (psp) {
case POWER_SUPPLY_PROP_STATUS:
val->intval = spwr_battery_prop_status(bat);
break;
case POWER_SUPPLY_PROP_PRESENT:
val->intval = spwr_battery_present(bat);
break;
case POWER_SUPPLY_PROP_TECHNOLOGY:
val->intval = spwr_battery_prop_technology(bat);
break;
case POWER_SUPPLY_PROP_CYCLE_COUNT:
value = get_unaligned_le32(&bat->bix.cycle_count);
if (value != SPWR_BATTERY_VALUE_UNKNOWN)
val->intval = value;
else
status = -ENODATA;
break;
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
value = get_unaligned_le32(&bat->bix.design_voltage);
if (value != SPWR_BATTERY_VALUE_UNKNOWN)
val->intval = value * 1000;
else
status = -ENODATA;
break;
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
value = get_unaligned_le32(&bat->bst.present_voltage);
if (value != SPWR_BATTERY_VALUE_UNKNOWN)
val->intval = value * 1000;
else
status = -ENODATA;
break;
case POWER_SUPPLY_PROP_CURRENT_NOW:
case POWER_SUPPLY_PROP_POWER_NOW:
value = get_unaligned_le32(&bat->bst.present_rate);
if (value != SPWR_BATTERY_VALUE_UNKNOWN)
val->intval = value * 1000;
else
status = -ENODATA;
break;
case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
value = get_unaligned_le32(&bat->bix.design_cap);
if (value != SPWR_BATTERY_VALUE_UNKNOWN)
val->intval = value * 1000;
else
status = -ENODATA;
break;
case POWER_SUPPLY_PROP_CHARGE_FULL:
case POWER_SUPPLY_PROP_ENERGY_FULL:
value = get_unaligned_le32(&bat->bix.last_full_charge_cap);
if (value != SPWR_BATTERY_VALUE_UNKNOWN)
val->intval = value * 1000;
else
status = -ENODATA;
break;
case POWER_SUPPLY_PROP_CHARGE_NOW:
case POWER_SUPPLY_PROP_ENERGY_NOW:
value = get_unaligned_le32(&bat->bst.remaining_cap);
if (value != SPWR_BATTERY_VALUE_UNKNOWN)
val->intval = value * 1000;
else
status = -ENODATA;
break;
case POWER_SUPPLY_PROP_CAPACITY:
val->intval = spwr_battery_prop_capacity(bat);
break;
case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
val->intval = spwr_battery_prop_capacity_level(bat);
break;
case POWER_SUPPLY_PROP_MODEL_NAME:
val->strval = bat->bix.model;
break;
case POWER_SUPPLY_PROP_MANUFACTURER:
val->strval = bat->bix.oem_info;
break;
case POWER_SUPPLY_PROP_SERIAL_NUMBER:
val->strval = bat->bix.serial;
break;
default:
status = -EINVAL;
break;
}
out:
mutex_unlock(&bat->lock);
return status;
}