Loading drivers/power/supply/qcom/fg-alg.c +66 −2 Original line number Diff line number Diff line Loading @@ -164,13 +164,13 @@ void cycle_count_update(struct cycle_counter *counter, int batt_soc, } /** * get_cycle_count - * get_bucket_cycle_count - * @counter: Cycle counter object * * Returns the cycle counter for a SOC bucket. * */ int get_cycle_count(struct cycle_counter *counter) static int get_bucket_cycle_count(struct cycle_counter *counter) { int count; Loading @@ -186,6 +186,70 @@ int get_cycle_count(struct cycle_counter *counter) return count; } /** * get_cycle_count - * @counter: Cycle counter object * @count: Average cycle count returned to the caller * * Get average cycle count for all buckets * */ int get_cycle_count(struct cycle_counter *counter, int *count) { int i, rc, temp = 0; for (i = 1; i <= BUCKET_COUNT; i++) { counter->id = i; rc = get_bucket_cycle_count(counter); if (rc < 0) { pr_err("Couldn't get cycle count rc=%d\n", rc); return rc; } temp += rc; } /* * Normalize the counter across each bucket so that we can get * the overall charge cycle count. */ *count = temp / BUCKET_COUNT; return 0; } /** * get_cycle_counts - * @counter: Cycle counter object * @buf: Bucket cycle counts formatted in a string returned to the caller * * Get cycle count for all buckets in a string format * */ int get_cycle_counts(struct cycle_counter *counter, const char **buf) { int i, rc, len = 0; for (i = 1; i <= BUCKET_COUNT; i++) { counter->id = i; rc = get_bucket_cycle_count(counter); if (rc < 0) { pr_err("Couldn't get cycle count rc=%d\n", rc); return rc; } if (sizeof(counter->str_buf) - len < 8) { pr_err("Invalid length %d\n", len); return -EINVAL; } len += snprintf(counter->str_buf + len, 8, "%d ", rc); } counter->str_buf[len] = '\0'; *buf = counter->str_buf; return 0; } /** * cycle_count_init - * @counter: Cycle counter object Loading drivers/power/supply/qcom/fg-alg.h +3 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ struct cycle_counter { void *data; char str_buf[BUCKET_COUNT * 8]; bool started[BUCKET_COUNT]; u16 count[BUCKET_COUNT]; u8 last_soc[BUCKET_COUNT]; Loading Loading @@ -60,7 +61,8 @@ int restore_cycle_count(struct cycle_counter *counter); void clear_cycle_count(struct cycle_counter *counter); void cycle_count_update(struct cycle_counter *counter, int batt_soc, int charge_status, bool charge_done, bool input_present); int get_cycle_count(struct cycle_counter *counter); int get_cycle_count(struct cycle_counter *counter, int *count); int get_cycle_counts(struct cycle_counter *counter, const char **buf); int cycle_count_init(struct cycle_counter *counter); void cap_learning_abort(struct cap_learning *cl); void cap_learning_update(struct cap_learning *cl, int batt_temp, Loading drivers/power/supply/qcom/qpnp-fg-gen4.c +6 −27 Original line number Diff line number Diff line Loading @@ -148,7 +148,6 @@ struct fg_gen4_chip { struct ttf ttf; struct delayed_work ttf_work; char batt_profile[PROFILE_LEN]; char counter_buf[BUCKET_COUNT * 8]; bool ki_coeff_dischg_en; bool slope_limit_en; }; Loading Loading @@ -2037,31 +2036,6 @@ static int fg_get_time_to_empty(struct fg_dev *fg, int *val) return 0; } static const char *fg_gen4_get_cycle_counts(struct fg_gen4_chip *chip) { int i, rc, len = 0; char *buf; buf = chip->counter_buf; for (i = 1; i <= BUCKET_COUNT; i++) { chip->counter->id = i; rc = get_cycle_count(chip->counter); if (rc < 0) { pr_err("Couldn't get cycle count rc=%d\n", rc); return NULL; } if (sizeof(chip->counter_buf) - len < 8) { pr_err("Invalid length %d\n", len); return NULL; } len += snprintf(buf+len, 8, "%d ", rc); } buf[len] = '\0'; return buf; } static void sram_dump_work(struct work_struct *work) { Loading Loading @@ -2240,8 +2214,13 @@ static int fg_psy_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_CHARGE_COUNTER_SHADOW: rc = fg_gen4_get_charge_counter_shadow(chip, &pval->intval); break; case POWER_SUPPLY_PROP_CYCLE_COUNT: rc = get_cycle_count(chip->counter, &pval->intval); break; case POWER_SUPPLY_PROP_CYCLE_COUNTS: pval->strval = fg_gen4_get_cycle_counts(chip); rc = get_cycle_counts(chip->counter, &pval->strval); if (rc < 0) pval->strval = NULL; break; case POWER_SUPPLY_PROP_SOC_REPORTING_READY: pval->intval = fg->soc_reporting_ready; Loading drivers/power/supply/qcom/qpnp-smb5.c +4 −0 Original line number Diff line number Diff line Loading @@ -1032,6 +1032,7 @@ static enum power_supply_property smb5_batt_props[] = { POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX, POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, POWER_SUPPLY_PROP_CHARGE_COUNTER, POWER_SUPPLY_PROP_CYCLE_COUNT, POWER_SUPPLY_PROP_RECHARGE_SOC, }; Loading Loading @@ -1133,6 +1134,9 @@ static int smb5_batt_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_CHARGE_COUNTER: rc = smblib_get_prop_batt_charge_counter(chg, val); break; case POWER_SUPPLY_PROP_CYCLE_COUNT: rc = smblib_get_prop_batt_cycle_count(chg, val); break; case POWER_SUPPLY_PROP_RECHARGE_SOC: val->intval = chg->auto_recharge_soc; break; Loading drivers/power/supply/qcom/smb5-lib.c +13 −0 Original line number Diff line number Diff line Loading @@ -1453,6 +1453,19 @@ int smblib_get_prop_batt_charge_counter(struct smb_charger *chg, return rc; } int smblib_get_prop_batt_cycle_count(struct smb_charger *chg, union power_supply_propval *val) { int rc; if (!chg->bms_psy) return -EINVAL; rc = power_supply_get_property(chg->bms_psy, POWER_SUPPLY_PROP_CYCLE_COUNT, val); return rc; } /*********************** * BATTERY PSY SETTERS * ***********************/ Loading Loading
drivers/power/supply/qcom/fg-alg.c +66 −2 Original line number Diff line number Diff line Loading @@ -164,13 +164,13 @@ void cycle_count_update(struct cycle_counter *counter, int batt_soc, } /** * get_cycle_count - * get_bucket_cycle_count - * @counter: Cycle counter object * * Returns the cycle counter for a SOC bucket. * */ int get_cycle_count(struct cycle_counter *counter) static int get_bucket_cycle_count(struct cycle_counter *counter) { int count; Loading @@ -186,6 +186,70 @@ int get_cycle_count(struct cycle_counter *counter) return count; } /** * get_cycle_count - * @counter: Cycle counter object * @count: Average cycle count returned to the caller * * Get average cycle count for all buckets * */ int get_cycle_count(struct cycle_counter *counter, int *count) { int i, rc, temp = 0; for (i = 1; i <= BUCKET_COUNT; i++) { counter->id = i; rc = get_bucket_cycle_count(counter); if (rc < 0) { pr_err("Couldn't get cycle count rc=%d\n", rc); return rc; } temp += rc; } /* * Normalize the counter across each bucket so that we can get * the overall charge cycle count. */ *count = temp / BUCKET_COUNT; return 0; } /** * get_cycle_counts - * @counter: Cycle counter object * @buf: Bucket cycle counts formatted in a string returned to the caller * * Get cycle count for all buckets in a string format * */ int get_cycle_counts(struct cycle_counter *counter, const char **buf) { int i, rc, len = 0; for (i = 1; i <= BUCKET_COUNT; i++) { counter->id = i; rc = get_bucket_cycle_count(counter); if (rc < 0) { pr_err("Couldn't get cycle count rc=%d\n", rc); return rc; } if (sizeof(counter->str_buf) - len < 8) { pr_err("Invalid length %d\n", len); return -EINVAL; } len += snprintf(counter->str_buf + len, 8, "%d ", rc); } counter->str_buf[len] = '\0'; *buf = counter->str_buf; return 0; } /** * cycle_count_init - * @counter: Cycle counter object Loading
drivers/power/supply/qcom/fg-alg.h +3 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ struct cycle_counter { void *data; char str_buf[BUCKET_COUNT * 8]; bool started[BUCKET_COUNT]; u16 count[BUCKET_COUNT]; u8 last_soc[BUCKET_COUNT]; Loading Loading @@ -60,7 +61,8 @@ int restore_cycle_count(struct cycle_counter *counter); void clear_cycle_count(struct cycle_counter *counter); void cycle_count_update(struct cycle_counter *counter, int batt_soc, int charge_status, bool charge_done, bool input_present); int get_cycle_count(struct cycle_counter *counter); int get_cycle_count(struct cycle_counter *counter, int *count); int get_cycle_counts(struct cycle_counter *counter, const char **buf); int cycle_count_init(struct cycle_counter *counter); void cap_learning_abort(struct cap_learning *cl); void cap_learning_update(struct cap_learning *cl, int batt_temp, Loading
drivers/power/supply/qcom/qpnp-fg-gen4.c +6 −27 Original line number Diff line number Diff line Loading @@ -148,7 +148,6 @@ struct fg_gen4_chip { struct ttf ttf; struct delayed_work ttf_work; char batt_profile[PROFILE_LEN]; char counter_buf[BUCKET_COUNT * 8]; bool ki_coeff_dischg_en; bool slope_limit_en; }; Loading Loading @@ -2037,31 +2036,6 @@ static int fg_get_time_to_empty(struct fg_dev *fg, int *val) return 0; } static const char *fg_gen4_get_cycle_counts(struct fg_gen4_chip *chip) { int i, rc, len = 0; char *buf; buf = chip->counter_buf; for (i = 1; i <= BUCKET_COUNT; i++) { chip->counter->id = i; rc = get_cycle_count(chip->counter); if (rc < 0) { pr_err("Couldn't get cycle count rc=%d\n", rc); return NULL; } if (sizeof(chip->counter_buf) - len < 8) { pr_err("Invalid length %d\n", len); return NULL; } len += snprintf(buf+len, 8, "%d ", rc); } buf[len] = '\0'; return buf; } static void sram_dump_work(struct work_struct *work) { Loading Loading @@ -2240,8 +2214,13 @@ static int fg_psy_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_CHARGE_COUNTER_SHADOW: rc = fg_gen4_get_charge_counter_shadow(chip, &pval->intval); break; case POWER_SUPPLY_PROP_CYCLE_COUNT: rc = get_cycle_count(chip->counter, &pval->intval); break; case POWER_SUPPLY_PROP_CYCLE_COUNTS: pval->strval = fg_gen4_get_cycle_counts(chip); rc = get_cycle_counts(chip->counter, &pval->strval); if (rc < 0) pval->strval = NULL; break; case POWER_SUPPLY_PROP_SOC_REPORTING_READY: pval->intval = fg->soc_reporting_ready; Loading
drivers/power/supply/qcom/qpnp-smb5.c +4 −0 Original line number Diff line number Diff line Loading @@ -1032,6 +1032,7 @@ static enum power_supply_property smb5_batt_props[] = { POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX, POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, POWER_SUPPLY_PROP_CHARGE_COUNTER, POWER_SUPPLY_PROP_CYCLE_COUNT, POWER_SUPPLY_PROP_RECHARGE_SOC, }; Loading Loading @@ -1133,6 +1134,9 @@ static int smb5_batt_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_CHARGE_COUNTER: rc = smblib_get_prop_batt_charge_counter(chg, val); break; case POWER_SUPPLY_PROP_CYCLE_COUNT: rc = smblib_get_prop_batt_cycle_count(chg, val); break; case POWER_SUPPLY_PROP_RECHARGE_SOC: val->intval = chg->auto_recharge_soc; break; Loading
drivers/power/supply/qcom/smb5-lib.c +13 −0 Original line number Diff line number Diff line Loading @@ -1453,6 +1453,19 @@ int smblib_get_prop_batt_charge_counter(struct smb_charger *chg, return rc; } int smblib_get_prop_batt_cycle_count(struct smb_charger *chg, union power_supply_propval *val) { int rc; if (!chg->bms_psy) return -EINVAL; rc = power_supply_get_property(chg->bms_psy, POWER_SUPPLY_PROP_CYCLE_COUNT, val); return rc; } /*********************** * BATTERY PSY SETTERS * ***********************/ Loading