in supply/bq256xx_charger.c [948:1131]
static int bq256xx_get_charger_property(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{
struct bq256xx_device *bq = power_supply_get_drvdata(psy);
struct bq256xx_state state;
int ret = 0;
mutex_lock(&bq->lock);
ret = bq256xx_get_state(bq, &state);
mutex_unlock(&bq->lock);
if (ret)
return ret;
switch (psp) {
case POWER_SUPPLY_PROP_STATUS:
if (state.vbus_stat == BQ256XX_VBUS_STAT_NO_INPUT ||
state.vbus_stat == BQ256XX_VBUS_STAT_USB_OTG)
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
else if (state.chrg_stat == BQ256XX_CHRG_STAT_NOT_CHRGING)
val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
else if (state.chrg_stat == BQ256XX_CHRG_STAT_CHRG_TERM)
val->intval = POWER_SUPPLY_STATUS_FULL;
else
val->intval = POWER_SUPPLY_STATUS_CHARGING;
break;
case POWER_SUPPLY_PROP_HEALTH:
val->intval = POWER_SUPPLY_HEALTH_UNKNOWN;
if (state.wdt_fault) {
val->intval =
POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE;
} else if (state.bat_fault) {
val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
} else {
switch (state.chrg_stat) {
case BQ256XX_CHRG_FAULT_INPUT:
val->intval =
POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
break;
case BQ256XX_CHRG_FAULT_THERM:
val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
break;
case BQ256XX_CHRG_FAULT_CST_EXPIRE:
val->intval =
POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
break;
default:
break;
}
switch (state.ntc_fault) {
case BQ256XX_NTC_FAULT_WARM:
val->intval = POWER_SUPPLY_HEALTH_WARM;
break;
case BQ256XX_NTC_FAULT_COOL:
val->intval = POWER_SUPPLY_HEALTH_COOL;
break;
case BQ256XX_NTC_FAULT_COLD:
val->intval = POWER_SUPPLY_HEALTH_COLD;
break;
case BQ256XX_NTC_FAULT_HOT:
val->intval = POWER_SUPPLY_HEALTH_HOT;
break;
default:
val->intval = POWER_SUPPLY_HEALTH_GOOD;
break;
}
}
break;
case POWER_SUPPLY_PROP_USB_TYPE:
if (bq->chip_info->has_usb_detect) {
switch (state.vbus_stat) {
case BQ256XX_VBUS_STAT_USB_SDP:
val->intval = POWER_SUPPLY_USB_TYPE_SDP;
break;
case BQ256XX_VBUS_STAT_USB_CDP:
val->intval = POWER_SUPPLY_USB_TYPE_CDP;
break;
case BQ256XX_VBUS_STAT_USB_DCP:
val->intval = POWER_SUPPLY_USB_TYPE_DCP;
break;
case BQ256XX_VBUS_STAT_USB_OTG:
val->intval = POWER_SUPPLY_USB_TYPE_ACA;
break;
default:
val->intval = POWER_SUPPLY_USB_TYPE_UNKNOWN;
break;
}
} else {
switch (state.vbus_stat) {
case BQ256XX_VBUS_STAT_USB_SDP:
val->intval = POWER_SUPPLY_USB_TYPE_SDP;
break;
case BQ256XX_VBUS_STAT_USB_OTG:
val->intval = POWER_SUPPLY_USB_TYPE_ACA;
break;
default:
val->intval = POWER_SUPPLY_USB_TYPE_UNKNOWN;
break;
}
}
break;
case POWER_SUPPLY_PROP_CHARGE_TYPE:
switch (state.chrg_stat) {
case BQ256XX_CHRG_STAT_NOT_CHRGING:
val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
break;
case BQ256XX_CHRG_STAT_PRECHRGING:
val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
break;
case BQ256XX_CHRG_STAT_FAST_CHRGING:
val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
break;
case BQ256XX_CHRG_STAT_CHRG_TERM:
val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
break;
default:
val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
}
break;
case POWER_SUPPLY_PROP_MANUFACTURER:
val->strval = BQ256XX_MANUFACTURER;
break;
case POWER_SUPPLY_PROP_MODEL_NAME:
val->strval = bq->model_name;
break;
case POWER_SUPPLY_PROP_ONLINE:
val->intval = state.online;
break;
case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
ret = bq->chip_info->bq256xx_get_vindpm(bq);
if (ret < 0)
return ret;
val->intval = ret;
break;
case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
ret = bq->chip_info->bq256xx_get_iindpm(bq);
if (ret < 0)
return ret;
val->intval = ret;
break;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
ret = bq->chip_info->bq256xx_get_vbatreg(bq);
if (ret < 0)
return ret;
val->intval = ret;
break;
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
ret = bq->chip_info->bq256xx_get_ichg(bq);
if (ret < 0)
return ret;
val->intval = ret;
break;
case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
ret = bq->chip_info->bq256xx_get_iprechg(bq);
if (ret < 0)
return ret;
val->intval = ret;
break;
case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
ret = bq->chip_info->bq256xx_get_iterm(bq);
if (ret < 0)
return ret;
val->intval = ret;
break;
default:
return -EINVAL;
}
return ret;
}