Merge "power: step-chg-jeita: Add support to tune hysteresis for jeita-fcc-step"

This commit is contained in:
qctecmdr 2020-09-13 21:34:19 -07:00 • committed by Gerrit - the friendly Code Review server
commit 0f27a47479
2 changed files with 38 additions and 18 deletions

View file

@ -281,7 +281,7 @@ static int get_step_chg_jeita_setting_from_profile(struct step_chg_info *chip)
u32 max_fv_uv, max_fcc_ma;
const char *batt_type_str;
const __be32 *handle;
int batt_id_ohms = 0, rc;
int batt_id_ohms, rc, hysteresis[2] = {0};
handle = of_get_property(chip->dev->of_node,
"qcom,battery-data", NULL);
@ -350,7 +350,8 @@ static int get_step_chg_jeita_setting_from_profile(struct step_chg_info *chip)
POWER_SUPPLY_PROP_CAPACITY;
chip->step_chg_config->param.iio_prop = STEP_QG_CAPACITY;
chip->step_chg_config->param.prop_name = "SOC";
chip->step_chg_config->param.hysteresis = 0;
chip->step_chg_config->param.rise_hys = 0;
chip->step_chg_config->param.fall_hys = 0;
}
chip->ocv_based_step_chg =
@ -360,7 +361,8 @@ static int get_step_chg_jeita_setting_from_profile(struct step_chg_info *chip)
POWER_SUPPLY_PROP_VOLTAGE_OCV;
chip->step_chg_config->param.iio_prop = STEP_QG_VOLTAGE_OCV;
chip->step_chg_config->param.prop_name = "OCV";
chip->step_chg_config->param.hysteresis = 0;
chip->step_chg_config->param.rise_hys = 0;
chip->step_chg_config->param.fall_hys = 0;
chip->step_chg_config->param.use_bms = true;
}
@ -372,7 +374,8 @@ static int get_step_chg_jeita_setting_from_profile(struct step_chg_info *chip)
POWER_SUPPLY_PROP_VOLTAGE_AVG;
chip->step_chg_config->param.iio_prop = STEP_QG_VOLTAGE_AVG;
chip->step_chg_config->param.prop_name = "VBAT_AVG";
chip->step_chg_config->param.hysteresis = 0;
chip->step_chg_config->param.rise_hys = 0;
chip->step_chg_config->param.fall_hys = 0;
chip->step_chg_config->param.use_bms = true;
}
@ -399,6 +402,15 @@ static int get_step_chg_jeita_setting_from_profile(struct step_chg_info *chip)
chip->sw_jeita_cfg_valid = false;
}
rc = of_property_read_u32_array(profile_node,
"qcom,step-jeita-hysteresis", hysteresis, 2);
if (!rc) {
chip->jeita_fcc_config->param.rise_hys = hysteresis[0];
chip->jeita_fcc_config->param.fall_hys = hysteresis[1];
pr_debug("jeita-fcc-hys: rise_hys=%u, fall_hys=%u\n",
hysteresis[0], hysteresis[1]);
}
rc = read_range_data_from_node(profile_node,
"qcom,jeita-fv-ranges",
chip->jeita_fv_config->fv_cfg,
@ -458,9 +470,8 @@ reschedule:
}
static int get_val(struct range_data *range, int hysteresis, int current_index,
int threshold,
int *new_index, int *val)
static int get_val(struct range_data *range, int rise_hys, int fall_hys,
int current_index, int threshold, int *new_index, int *val)
{
int i;
@ -518,7 +529,8 @@ static int get_val(struct range_data *range, int hysteresis, int current_index,
* of our current index.
*/
if (*new_index == current_index + 1) {
if (threshold < range[*new_index].low_threshold + hysteresis) {
if (threshold <
(range[*new_index].low_threshold + rise_hys)) {
/*
* Stay in the current index, threshold is not higher
* by hysteresis amount
@ -527,7 +539,8 @@ static int get_val(struct range_data *range, int hysteresis, int current_index,
*val = range[current_index].value;
}
} else if (*new_index == current_index - 1) {
if (threshold > range[*new_index].high_threshold - hysteresis) {
if (threshold >
range[*new_index].high_threshold - fall_hys) {
/*
* stay in the current index, threshold is not lower
* by hysteresis amount
@ -557,7 +570,7 @@ static void taper_fcc_step_chg(struct step_chg_info *chip, int index,
vote(chip->fcc_votable, STEP_CHG_VOTER, true, target_fcc);
} else if (current_voltage >
(chip->step_chg_config->fcc_cfg[index - 1].high_threshold +
chip->step_chg_config->param.hysteresis)) {
chip->step_chg_config->param.rise_hys)) {
/*
* Ramp down FCC in pre-configured steps till the current index
* FCC configuration is reached, whenever the step charging
@ -570,7 +583,7 @@ static void taper_fcc_step_chg(struct step_chg_info *chip, int index,
chip->step_chg_config->fcc_cfg[index - 1].value) &&
(current_voltage >
chip->step_chg_config->fcc_cfg[index - 1].low_threshold +
chip->step_chg_config->param.hysteresis)) {
chip->step_chg_config->param.fall_hys)) {
/*
* In case the step charging index switch to the next higher
* index without FCCs saturation for the previous index, ramp
@ -618,7 +631,8 @@ static int handle_step_chg_config(struct step_chg_info *chip)
current_index = chip->step_index;
rc = get_val(chip->step_chg_config->fcc_cfg,
chip->step_chg_config->param.hysteresis,
chip->step_chg_config->param.rise_hys,
chip->step_chg_config->param.fall_hys,
chip->step_index,
pval.intval,
&chip->step_index,
@ -709,7 +723,8 @@ static int handle_jeita(struct step_chg_info *chip)
}
rc = get_val(chip->jeita_fcc_config->fcc_cfg,
chip->jeita_fcc_config->param.hysteresis,
chip->jeita_fcc_config->param.rise_hys,
chip->jeita_fcc_config->param.fall_hys,
chip->jeita_fcc_index,
pval.intval,
&chip->jeita_fcc_index,
@ -726,7 +741,8 @@ static int handle_jeita(struct step_chg_info *chip)
vote(chip->fcc_votable, JEITA_VOTER, fcc_ua ? true : false, fcc_ua);
rc = get_val(chip->jeita_fv_config->fv_cfg,
chip->jeita_fv_config->param.hysteresis,
chip->jeita_fv_config->param.rise_hys,
chip->jeita_fv_config->param.fall_hys,
chip->jeita_fv_index,
pval.intval,
&chip->jeita_fv_index,
@ -921,7 +937,8 @@ int qcom_step_chg_init(struct device *dev, bool step_chg_enable,
chip->step_chg_config->param.psy_prop = POWER_SUPPLY_PROP_VOLTAGE_NOW;
chip->step_chg_config->param.iio_prop = STEP_QG_VOLTAGE_NOW;
chip->step_chg_config->param.prop_name = "VBATT";
chip->step_chg_config->param.hysteresis = 100000;
chip->step_chg_config->param.rise_hys = 100000;
chip->step_chg_config->param.fall_hys = 100000;
chip->jeita_fcc_config = devm_kzalloc(dev,
sizeof(struct jeita_fcc_cfg), GFP_KERNEL);
@ -933,11 +950,13 @@ int qcom_step_chg_init(struct device *dev, bool step_chg_enable,
chip->jeita_fcc_config->param.psy_prop = POWER_SUPPLY_PROP_TEMP;
chip->jeita_fcc_config->param.iio_prop = STEP_QG_TEMP;
chip->jeita_fcc_config->param.prop_name = "BATT_TEMP";
chip->jeita_fcc_config->param.hysteresis = 10;
chip->jeita_fcc_config->param.rise_hys = 10;
chip->jeita_fcc_config->param.fall_hys = 10;
chip->jeita_fv_config->param.psy_prop = POWER_SUPPLY_PROP_TEMP;
chip->jeita_fv_config->param.iio_prop = STEP_QG_TEMP;
chip->jeita_fv_config->param.prop_name = "BATT_TEMP";
chip->jeita_fv_config->param.hysteresis = 10;
chip->jeita_fv_config->param.rise_hys = 10;
chip->jeita_fv_config->param.fall_hys = 10;
INIT_DELAYED_WORK(&chip->status_change_work, status_change_work);
INIT_DELAYED_WORK(&chip->get_config_work, get_config_work);

View file

@ -15,7 +15,8 @@ struct step_chg_jeita_param {
u32 psy_prop;
u32 iio_prop;
char *prop_name;
int hysteresis;
int rise_hys;
int fall_hys;
bool use_bms;
};