in supply/sc27xx_fuel_gauge.c [573:699]
static int sc27xx_fgu_get_property(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{
struct sc27xx_fgu_data *data = power_supply_get_drvdata(psy);
int ret = 0;
int value;
mutex_lock(&data->lock);
switch (psp) {
case POWER_SUPPLY_PROP_STATUS:
ret = sc27xx_fgu_get_status(data, &value);
if (ret)
goto error;
val->intval = value;
break;
case POWER_SUPPLY_PROP_HEALTH:
ret = sc27xx_fgu_get_health(data, &value);
if (ret)
goto error;
val->intval = value;
break;
case POWER_SUPPLY_PROP_PRESENT:
val->intval = data->bat_present;
break;
case POWER_SUPPLY_PROP_TEMP:
ret = sc27xx_fgu_get_temp(data, &value);
if (ret)
goto error;
val->intval = value;
break;
case POWER_SUPPLY_PROP_TECHNOLOGY:
val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
break;
case POWER_SUPPLY_PROP_CAPACITY:
ret = sc27xx_fgu_get_capacity(data, &value);
if (ret)
goto error;
val->intval = value;
break;
case POWER_SUPPLY_PROP_VOLTAGE_AVG:
ret = sc27xx_fgu_get_vbat_vol(data, &value);
if (ret)
goto error;
val->intval = value * 1000;
break;
case POWER_SUPPLY_PROP_VOLTAGE_OCV:
ret = sc27xx_fgu_get_vbat_ocv(data, &value);
if (ret)
goto error;
val->intval = value;
break;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
ret = sc27xx_fgu_get_charge_vol(data, &value);
if (ret)
goto error;
val->intval = value;
break;
case POWER_SUPPLY_PROP_CURRENT_AVG:
ret = sc27xx_fgu_get_current(data, &value);
if (ret)
goto error;
val->intval = value * 1000;
break;
case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
val->intval = data->total_cap * 1000;
break;
case POWER_SUPPLY_PROP_CHARGE_NOW:
ret = sc27xx_fgu_get_clbcnt(data, &value);
if (ret)
goto error;
value = DIV_ROUND_CLOSEST(value * 10,
36 * SC27XX_FGU_SAMPLE_HZ);
val->intval = sc27xx_fgu_adc_to_current(data, value);
break;
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
ret = sc27xx_fgu_get_vol_now(data, &value);
if (ret)
goto error;
val->intval = value * 1000;
break;
case POWER_SUPPLY_PROP_CURRENT_NOW:
ret = sc27xx_fgu_get_cur_now(data, &value);
if (ret)
goto error;
val->intval = value * 1000;
break;
case POWER_SUPPLY_PROP_VOLTAGE_BOOT:
val->intval = data->boot_volt;
break;
default:
ret = -EINVAL;
break;
}
error:
mutex_unlock(&data->lock);
return ret;
}