static int sec_chg_set_property(struct power_supply *psy, enum power_supply_property psp, const union power_supply_propval *val) { struct sec_charger_info *charger = container_of(psy, struct sec_charger_info, psy_chg); switch (psp) { case POWER_SUPPLY_PROP_STATUS: charger->status = val->intval; break; /* val->intval : type */ case POWER_SUPPLY_PROP_ONLINE: charger->cable_type = val->intval; if (val->intval == POWER_SUPPLY_TYPE_BATTERY) charger->is_charging = false; else charger->is_charging = true; /* current setting */ charger->charging_current = charger->pdata->charging_current[ val->intval].fast_charging_current; if (!sec_hal_chg_set_property(charger->client, psp, val)) return -EINVAL; break; /* val->intval : charging current */ case POWER_SUPPLY_PROP_CURRENT_NOW: charger->charging_current = val->intval; if (!sec_hal_chg_set_property(charger->client, psp, val)) return -EINVAL; break; default: return -EINVAL; } return 0; }
static int sec_chg_set_property(struct power_supply *psy, enum power_supply_property psp, const union power_supply_propval *val) { struct sec_charger_info *charger = container_of(psy, struct sec_charger_info, psy_chg); union power_supply_propval input_value; switch (psp) { case POWER_SUPPLY_PROP_STATUS: charger->status = val->intval; break; /* val->intval : type */ case POWER_SUPPLY_PROP_ONLINE: charger->cable_type = val->intval; if (val->intval == POWER_SUPPLY_TYPE_BATTERY) charger->is_charging = false; else charger->is_charging = true; /* current setting */ charger->charging_current_max = charger->pdata->charging_current[ val->intval].input_current_limit; charger->charging_current = charger->pdata->charging_current[ val->intval].fast_charging_current; if (!sec_hal_chg_set_property(charger_variable, psp, val)) return -EINVAL; break; /* val->intval : input current limit set */ case POWER_SUPPLY_PROP_CURRENT_MAX: charger->charging_current_max = val->intval; /* to control charging current, * use input current limit and set charging current as much as possible * so we only control input current limit to control charge current */ case POWER_SUPPLY_PROP_CURRENT_NOW: if (!sec_hal_chg_set_property(charger_variable, psp, val)) return -EINVAL; break; /* val->intval : charging current */ case POWER_SUPPLY_PROP_CURRENT_AVG: charger->charging_current = val->intval; if (!sec_hal_chg_set_property(charger_variable, psp, val)) return -EINVAL; break; /* val->intval : SIOP level (%) * SIOP charging current setting */ case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: /* change val as charging current by SIOP level * do NOT change initial charging current setting */ input_value.intval = charger->charging_current * val->intval / 100; /* charging current should be over than USB charging current */ if (charger->pdata->chg_functions_setting & SEC_CHARGER_MINIMUM_SIOP_CHARGING_CURRENT) { if (input_value.intval > 0 && input_value.intval < charger->pdata->charging_current[ POWER_SUPPLY_TYPE_USB].fast_charging_current) input_value.intval = charger->pdata->charging_current[ POWER_SUPPLY_TYPE_USB].fast_charging_current; } /* set charging current as new value */ if (!sec_hal_chg_set_property(charger_variable, POWER_SUPPLY_PROP_CURRENT_AVG, &input_value)) return -EINVAL; break; default: return -EINVAL; } return 0; }