Merge "qcom: qnovo: Update fcc and fv through batt psy"
This commit is contained in:
commit
713e5d786e
7 changed files with 106 additions and 60 deletions
|
@ -263,6 +263,8 @@ static struct device_attribute power_supply_attrs[] = {
|
||||||
POWER_SUPPLY_ATTR(dp_dm),
|
POWER_SUPPLY_ATTR(dp_dm),
|
||||||
POWER_SUPPLY_ATTR(input_current_limited),
|
POWER_SUPPLY_ATTR(input_current_limited),
|
||||||
POWER_SUPPLY_ATTR(input_current_now),
|
POWER_SUPPLY_ATTR(input_current_now),
|
||||||
|
POWER_SUPPLY_ATTR(current_qnovo),
|
||||||
|
POWER_SUPPLY_ATTR(voltage_qnovo),
|
||||||
POWER_SUPPLY_ATTR(rerun_aicl),
|
POWER_SUPPLY_ATTR(rerun_aicl),
|
||||||
POWER_SUPPLY_ATTR(cycle_count_id),
|
POWER_SUPPLY_ATTR(cycle_count_id),
|
||||||
POWER_SUPPLY_ATTR(safety_timer_expired),
|
POWER_SUPPLY_ATTR(safety_timer_expired),
|
||||||
|
|
|
@ -298,6 +298,19 @@ static int pl_fcc_vote_callback(struct votable *votable, void *data,
|
||||||
if (!chip->main_psy)
|
if (!chip->main_psy)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (chip->batt_psy) {
|
||||||
|
rc = power_supply_get_property(chip->batt_psy,
|
||||||
|
POWER_SUPPLY_PROP_CURRENT_QNOVO,
|
||||||
|
&pval);
|
||||||
|
if (rc < 0) {
|
||||||
|
pr_err("Couldn't get qnovo fcc, rc=%d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pval.intval != -EINVAL)
|
||||||
|
total_fcc_ua = pval.intval;
|
||||||
|
}
|
||||||
|
|
||||||
if (chip->pl_mode == POWER_SUPPLY_PARALLEL_NONE
|
if (chip->pl_mode == POWER_SUPPLY_PARALLEL_NONE
|
||||||
|| get_effective_result_locked(chip->pl_disable_votable)) {
|
|| get_effective_result_locked(chip->pl_disable_votable)) {
|
||||||
pval.intval = total_fcc_ua;
|
pval.intval = total_fcc_ua;
|
||||||
|
@ -343,6 +356,7 @@ static int pl_fv_vote_callback(struct votable *votable, void *data,
|
||||||
struct pl_data *chip = data;
|
struct pl_data *chip = data;
|
||||||
union power_supply_propval pval = {0, };
|
union power_supply_propval pval = {0, };
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
int effective_fv_uv = fv_uv;
|
||||||
|
|
||||||
if (fv_uv < 0)
|
if (fv_uv < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -350,7 +364,21 @@ static int pl_fv_vote_callback(struct votable *votable, void *data,
|
||||||
if (!chip->main_psy)
|
if (!chip->main_psy)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pval.intval = fv_uv;
|
if (chip->batt_psy) {
|
||||||
|
rc = power_supply_get_property(chip->batt_psy,
|
||||||
|
POWER_SUPPLY_PROP_VOLTAGE_QNOVO,
|
||||||
|
&pval);
|
||||||
|
if (rc < 0) {
|
||||||
|
pr_err("Couldn't get qnovo fv, rc=%d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pval.intval != -EINVAL)
|
||||||
|
effective_fv_uv = pval.intval;
|
||||||
|
}
|
||||||
|
|
||||||
|
pval.intval = effective_fv_uv;
|
||||||
|
|
||||||
rc = power_supply_set_property(chip->main_psy,
|
rc = power_supply_set_property(chip->main_psy,
|
||||||
POWER_SUPPLY_PROP_VOLTAGE_MAX, &pval);
|
POWER_SUPPLY_PROP_VOLTAGE_MAX, &pval);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
|
@ -359,7 +387,7 @@ static int pl_fv_vote_callback(struct votable *votable, void *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chip->pl_mode != POWER_SUPPLY_PARALLEL_NONE) {
|
if (chip->pl_mode != POWER_SUPPLY_PARALLEL_NONE) {
|
||||||
pval.intval = fv_uv + PARALLEL_FLOAT_VOLTAGE_DELTA_UV;
|
pval.intval += PARALLEL_FLOAT_VOLTAGE_DELTA_UV;
|
||||||
rc = power_supply_set_property(chip->pl_psy,
|
rc = power_supply_set_property(chip->pl_psy,
|
||||||
POWER_SUPPLY_PROP_VOLTAGE_MAX, &pval);
|
POWER_SUPPLY_PROP_VOLTAGE_MAX, &pval);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
|
@ -514,9 +542,9 @@ static bool is_parallel_available(struct pl_data *chip)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Note that pl_mode only be udpated to anything other than a _NONE
|
* Note that pl_mode will be updated to anything other than a _NONE
|
||||||
* only after pl_psy is found. IOW pl_mode != _NONE implies that
|
* only after pl_psy is found. IOW pl_mode != _NONE implies that
|
||||||
* pl_psy is present and valid
|
* pl_psy is present and valid.
|
||||||
*/
|
*/
|
||||||
chip->pl_mode = pval.intval;
|
chip->pl_mode = pval.intval;
|
||||||
vote(chip->pl_disable_votable, PARALLEL_PSY_VOTER, false, 0);
|
vote(chip->pl_disable_votable, PARALLEL_PSY_VOTER, false, 0);
|
||||||
|
|
|
@ -148,8 +148,6 @@ struct qnovo {
|
||||||
struct work_struct status_change_work;
|
struct work_struct status_change_work;
|
||||||
int fv_uV_request;
|
int fv_uV_request;
|
||||||
int fcc_uA_request;
|
int fcc_uA_request;
|
||||||
struct votable *fcc_max_votable;
|
|
||||||
struct votable *fv_votable;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int debug_mask;
|
static int debug_mask;
|
||||||
|
@ -226,6 +224,50 @@ unlock:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_batt_available(struct qnovo *chip)
|
||||||
|
{
|
||||||
|
if (!chip->batt_psy)
|
||||||
|
chip->batt_psy = power_supply_get_by_name("battery");
|
||||||
|
|
||||||
|
if (!chip->batt_psy)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qnovo_batt_psy_update(struct qnovo *chip, bool disable)
|
||||||
|
{
|
||||||
|
union power_supply_propval pval = {0};
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (!is_batt_available(chip))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (chip->fv_uV_request != -EINVAL) {
|
||||||
|
pval.intval = disable ? -EINVAL : chip->fv_uV_request;
|
||||||
|
rc = power_supply_set_property(chip->batt_psy,
|
||||||
|
POWER_SUPPLY_PROP_VOLTAGE_QNOVO,
|
||||||
|
&pval);
|
||||||
|
if (rc < 0) {
|
||||||
|
pr_err("Couldn't set prop qnovo_fv rc = %d\n", rc);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chip->fcc_uA_request != -EINVAL) {
|
||||||
|
pval.intval = disable ? -EINVAL : chip->fcc_uA_request;
|
||||||
|
rc = power_supply_set_property(chip->batt_psy,
|
||||||
|
POWER_SUPPLY_PROP_CURRENT_QNOVO,
|
||||||
|
&pval);
|
||||||
|
if (rc < 0) {
|
||||||
|
pr_err("Couldn't set prop qnovo_fcc rc = %d\n", rc);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static int qnovo_disable_cb(struct votable *votable, void *data, int disable,
|
static int qnovo_disable_cb(struct votable *votable, void *data, int disable,
|
||||||
const char *client)
|
const char *client)
|
||||||
{
|
{
|
||||||
|
@ -233,15 +275,9 @@ static int qnovo_disable_cb(struct votable *votable, void *data, int disable,
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (disable) {
|
if (disable) {
|
||||||
if (chip->fv_uV_request != -EINVAL) {
|
rc = qnovo_batt_psy_update(chip, true);
|
||||||
if (chip->fv_votable)
|
if (rc < 0)
|
||||||
vote(chip->fv_votable, QNOVO_VOTER, false, 0);
|
return rc;
|
||||||
}
|
|
||||||
if (chip->fcc_uA_request != -EINVAL) {
|
|
||||||
if (chip->fcc_max_votable)
|
|
||||||
vote(chip->fcc_max_votable, QNOVO_VOTER,
|
|
||||||
false, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = qnovo_masked_write(chip, QNOVO_PTRAIN_EN, QNOVO_PTRAIN_EN_BIT,
|
rc = qnovo_masked_write(chip, QNOVO_PTRAIN_EN, QNOVO_PTRAIN_EN_BIT,
|
||||||
|
@ -253,20 +289,9 @@ static int qnovo_disable_cb(struct votable *votable, void *data, int disable,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!disable) {
|
if (!disable) {
|
||||||
if (chip->fv_uV_request != -EINVAL) {
|
rc = qnovo_batt_psy_update(chip, false);
|
||||||
if (!chip->fv_votable)
|
if (rc < 0)
|
||||||
chip->fv_votable = find_votable("FV");
|
return rc;
|
||||||
if (chip->fv_votable)
|
|
||||||
vote(chip->fv_votable, QNOVO_VOTER,
|
|
||||||
true, chip->fv_uV_request);
|
|
||||||
}
|
|
||||||
if (chip->fcc_uA_request != -EINVAL) {
|
|
||||||
if (!chip->fcc_max_votable)
|
|
||||||
chip->fcc_max_votable = find_votable("FCC_MAX");
|
|
||||||
if (chip->fcc_max_votable)
|
|
||||||
vote(chip->fcc_max_votable, QNOVO_VOTER,
|
|
||||||
true, chip->fcc_uA_request);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -979,10 +1004,7 @@ static ssize_t batt_prop_show(struct class *c, struct class_attribute *attr,
|
||||||
int prop = params[i].start_addr;
|
int prop = params[i].start_addr;
|
||||||
union power_supply_propval pval = {0};
|
union power_supply_propval pval = {0};
|
||||||
|
|
||||||
if (!chip->batt_psy)
|
if (!is_batt_available(chip))
|
||||||
chip->batt_psy = power_supply_get_by_name("battery");
|
|
||||||
|
|
||||||
if (!chip->batt_psy)
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
rc = power_supply_get_property(chip->batt_psy, prop, &pval);
|
rc = power_supply_get_property(chip->batt_psy, prop, &pval);
|
||||||
|
|
|
@ -836,7 +836,6 @@ static enum power_supply_property smb2_batt_props[] = {
|
||||||
POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
||||||
POWER_SUPPLY_PROP_VOLTAGE_MAX,
|
POWER_SUPPLY_PROP_VOLTAGE_MAX,
|
||||||
POWER_SUPPLY_PROP_CURRENT_NOW,
|
POWER_SUPPLY_PROP_CURRENT_NOW,
|
||||||
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
|
|
||||||
POWER_SUPPLY_PROP_TEMP,
|
POWER_SUPPLY_PROP_TEMP,
|
||||||
POWER_SUPPLY_PROP_TECHNOLOGY,
|
POWER_SUPPLY_PROP_TECHNOLOGY,
|
||||||
POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED,
|
POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED,
|
||||||
|
@ -897,12 +896,14 @@ static int smb2_batt_get_prop(struct power_supply *psy,
|
||||||
case POWER_SUPPLY_PROP_VOLTAGE_MAX:
|
case POWER_SUPPLY_PROP_VOLTAGE_MAX:
|
||||||
val->intval = get_client_vote(chg->fv_votable, DEFAULT_VOTER);
|
val->intval = get_client_vote(chg->fv_votable, DEFAULT_VOTER);
|
||||||
break;
|
break;
|
||||||
|
case POWER_SUPPLY_PROP_VOLTAGE_QNOVO:
|
||||||
|
val->intval = chg->qnovo_fv_uv;
|
||||||
|
break;
|
||||||
case POWER_SUPPLY_PROP_CURRENT_NOW:
|
case POWER_SUPPLY_PROP_CURRENT_NOW:
|
||||||
rc = smblib_get_prop_batt_current_now(chg, val);
|
rc = smblib_get_prop_batt_current_now(chg, val);
|
||||||
break;
|
break;
|
||||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
|
case POWER_SUPPLY_PROP_CURRENT_QNOVO:
|
||||||
val->intval = get_client_vote(chg->fcc_max_votable,
|
val->intval = chg->qnovo_fcc_ua;
|
||||||
DEFAULT_VOTER);
|
|
||||||
break;
|
break;
|
||||||
case POWER_SUPPLY_PROP_TEMP:
|
case POWER_SUPPLY_PROP_TEMP:
|
||||||
rc = smblib_get_prop_batt_temp(chg, val);
|
rc = smblib_get_prop_batt_temp(chg, val);
|
||||||
|
@ -960,8 +961,13 @@ static int smb2_batt_set_prop(struct power_supply *psy,
|
||||||
case POWER_SUPPLY_PROP_VOLTAGE_MAX:
|
case POWER_SUPPLY_PROP_VOLTAGE_MAX:
|
||||||
vote(chg->fv_votable, DEFAULT_VOTER, true, val->intval);
|
vote(chg->fv_votable, DEFAULT_VOTER, true, val->intval);
|
||||||
break;
|
break;
|
||||||
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
|
case POWER_SUPPLY_PROP_VOLTAGE_QNOVO:
|
||||||
vote(chg->fcc_max_votable, DEFAULT_VOTER, true, val->intval);
|
chg->qnovo_fv_uv = val->intval;
|
||||||
|
rc = rerun_election(chg->fv_votable);
|
||||||
|
break;
|
||||||
|
case POWER_SUPPLY_PROP_CURRENT_QNOVO:
|
||||||
|
chg->qnovo_fcc_ua = val->intval;
|
||||||
|
rc = rerun_election(chg->fcc_votable);
|
||||||
break;
|
break;
|
||||||
case POWER_SUPPLY_PROP_SET_SHIP_MODE:
|
case POWER_SUPPLY_PROP_SET_SHIP_MODE:
|
||||||
/* Not in ship mode as long as the device is active */
|
/* Not in ship mode as long as the device is active */
|
||||||
|
@ -1377,7 +1383,7 @@ static int smb2_init_hw(struct smb2 *chip)
|
||||||
DEFAULT_VOTER, chip->dt.no_battery, 0);
|
DEFAULT_VOTER, chip->dt.no_battery, 0);
|
||||||
vote(chg->dc_suspend_votable,
|
vote(chg->dc_suspend_votable,
|
||||||
DEFAULT_VOTER, chip->dt.no_battery, 0);
|
DEFAULT_VOTER, chip->dt.no_battery, 0);
|
||||||
vote(chg->fcc_max_votable,
|
vote(chg->fcc_votable,
|
||||||
DEFAULT_VOTER, true, chip->dt.fcc_ua);
|
DEFAULT_VOTER, true, chip->dt.fcc_ua);
|
||||||
vote(chg->fv_votable,
|
vote(chg->fv_votable,
|
||||||
DEFAULT_VOTER, true, chip->dt.fv_uv);
|
DEFAULT_VOTER, true, chip->dt.fv_uv);
|
||||||
|
|
|
@ -766,14 +766,6 @@ static int smblib_dc_suspend_vote_callback(struct votable *votable, void *data,
|
||||||
return smblib_set_dc_suspend(chg, (bool)suspend);
|
return smblib_set_dc_suspend(chg, (bool)suspend);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smblib_fcc_max_vote_callback(struct votable *votable, void *data,
|
|
||||||
int fcc_ua, const char *client)
|
|
||||||
{
|
|
||||||
struct smb_charger *chg = data;
|
|
||||||
|
|
||||||
return vote(chg->fcc_votable, FCC_MAX_RESULT_VOTER, true, fcc_ua);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define USBIN_25MA 25000
|
#define USBIN_25MA 25000
|
||||||
#define USBIN_100MA 100000
|
#define USBIN_100MA 100000
|
||||||
#define USBIN_150MA 150000
|
#define USBIN_150MA 150000
|
||||||
|
@ -3759,14 +3751,6 @@ static int smblib_create_votables(struct smb_charger *chg)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
chg->fcc_max_votable = create_votable("FCC_MAX", VOTE_MAX,
|
|
||||||
smblib_fcc_max_vote_callback,
|
|
||||||
chg);
|
|
||||||
if (IS_ERR(chg->fcc_max_votable)) {
|
|
||||||
rc = PTR_ERR(chg->fcc_max_votable);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
chg->usb_icl_votable = create_votable("USB_ICL", VOTE_MIN,
|
chg->usb_icl_votable = create_votable("USB_ICL", VOTE_MIN,
|
||||||
smblib_usb_icl_vote_callback,
|
smblib_usb_icl_vote_callback,
|
||||||
chg);
|
chg);
|
||||||
|
@ -3860,8 +3844,6 @@ static void smblib_destroy_votables(struct smb_charger *chg)
|
||||||
destroy_votable(chg->usb_suspend_votable);
|
destroy_votable(chg->usb_suspend_votable);
|
||||||
if (chg->dc_suspend_votable)
|
if (chg->dc_suspend_votable)
|
||||||
destroy_votable(chg->dc_suspend_votable);
|
destroy_votable(chg->dc_suspend_votable);
|
||||||
if (chg->fcc_max_votable)
|
|
||||||
destroy_votable(chg->fcc_max_votable);
|
|
||||||
if (chg->usb_icl_votable)
|
if (chg->usb_icl_votable)
|
||||||
destroy_votable(chg->usb_icl_votable);
|
destroy_votable(chg->usb_icl_votable);
|
||||||
if (chg->dc_icl_votable)
|
if (chg->dc_icl_votable)
|
||||||
|
@ -3912,6 +3894,8 @@ int smblib_init(struct smb_charger *chg)
|
||||||
|
|
||||||
switch (chg->mode) {
|
switch (chg->mode) {
|
||||||
case PARALLEL_MASTER:
|
case PARALLEL_MASTER:
|
||||||
|
chg->qnovo_fcc_ua = -EINVAL;
|
||||||
|
chg->qnovo_fv_uv = -EINVAL;
|
||||||
rc = smblib_create_votables(chg);
|
rc = smblib_create_votables(chg);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
smblib_err(chg, "Couldn't create votables rc=%d\n",
|
smblib_err(chg, "Couldn't create votables rc=%d\n",
|
||||||
|
|
|
@ -40,7 +40,6 @@ enum print_reason {
|
||||||
#define CHG_STATE_VOTER "CHG_STATE_VOTER"
|
#define CHG_STATE_VOTER "CHG_STATE_VOTER"
|
||||||
#define TYPEC_SRC_VOTER "TYPEC_SRC_VOTER"
|
#define TYPEC_SRC_VOTER "TYPEC_SRC_VOTER"
|
||||||
#define TAPER_END_VOTER "TAPER_END_VOTER"
|
#define TAPER_END_VOTER "TAPER_END_VOTER"
|
||||||
#define FCC_MAX_RESULT_VOTER "FCC_MAX_RESULT_VOTER"
|
|
||||||
#define THERMAL_DAEMON_VOTER "THERMAL_DAEMON_VOTER"
|
#define THERMAL_DAEMON_VOTER "THERMAL_DAEMON_VOTER"
|
||||||
#define CC_DETACHED_VOTER "CC_DETACHED_VOTER"
|
#define CC_DETACHED_VOTER "CC_DETACHED_VOTER"
|
||||||
#define HVDCP_TIMEOUT_VOTER "HVDCP_TIMEOUT_VOTER"
|
#define HVDCP_TIMEOUT_VOTER "HVDCP_TIMEOUT_VOTER"
|
||||||
|
@ -202,7 +201,6 @@ struct smb_charger {
|
||||||
/* votables */
|
/* votables */
|
||||||
struct votable *usb_suspend_votable;
|
struct votable *usb_suspend_votable;
|
||||||
struct votable *dc_suspend_votable;
|
struct votable *dc_suspend_votable;
|
||||||
struct votable *fcc_max_votable;
|
|
||||||
struct votable *fcc_votable;
|
struct votable *fcc_votable;
|
||||||
struct votable *fv_votable;
|
struct votable *fv_votable;
|
||||||
struct votable *usb_icl_votable;
|
struct votable *usb_icl_votable;
|
||||||
|
@ -260,6 +258,10 @@ struct smb_charger {
|
||||||
bool usb_ever_removed;
|
bool usb_ever_removed;
|
||||||
|
|
||||||
int icl_reduction_ua;
|
int icl_reduction_ua;
|
||||||
|
|
||||||
|
/* qnovo */
|
||||||
|
int qnovo_fcc_ua;
|
||||||
|
int qnovo_fv_uv;
|
||||||
};
|
};
|
||||||
|
|
||||||
int smblib_read(struct smb_charger *chg, u16 addr, u8 *val);
|
int smblib_read(struct smb_charger *chg, u16 addr, u8 *val);
|
||||||
|
|
|
@ -215,6 +215,8 @@ enum power_supply_property {
|
||||||
POWER_SUPPLY_PROP_DP_DM,
|
POWER_SUPPLY_PROP_DP_DM,
|
||||||
POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED,
|
POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED,
|
||||||
POWER_SUPPLY_PROP_INPUT_CURRENT_NOW,
|
POWER_SUPPLY_PROP_INPUT_CURRENT_NOW,
|
||||||
|
POWER_SUPPLY_PROP_CURRENT_QNOVO,
|
||||||
|
POWER_SUPPLY_PROP_VOLTAGE_QNOVO,
|
||||||
POWER_SUPPLY_PROP_RERUN_AICL,
|
POWER_SUPPLY_PROP_RERUN_AICL,
|
||||||
POWER_SUPPLY_PROP_CYCLE_COUNT_ID,
|
POWER_SUPPLY_PROP_CYCLE_COUNT_ID,
|
||||||
POWER_SUPPLY_PROP_SAFETY_TIMER_EXPIRED,
|
POWER_SUPPLY_PROP_SAFETY_TIMER_EXPIRED,
|
||||||
|
|
Loading…
Add table
Reference in a new issue