Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5601bfb4 authored by Guru Das Srinagesh's avatar Guru Das Srinagesh
Browse files

power: qpnp-fg-gen4: Set default values for {dis}charging Ki coefficients



Set default values for the low, medium, and high gain Ki coefficients
for both charging and discharging states.

Change-Id: I30b164045187ea1f995522523fcadb31b0c04873
Signed-off-by: default avatarGuru Das Srinagesh <gurus@codeaurora.org>
parent 88828baa
Loading
Loading
Loading
Loading
+58 −34
Original line number Diff line number Diff line
@@ -1471,38 +1471,13 @@ static int fg_gen4_adjust_ki_coeff_full_soc(struct fg_gen4_chip *chip,
	return 0;
}

#define KI_COEFF_LOW_DISCHG_DEFAULT	428
#define KI_COEFF_MED_DISCHG_DEFAULT	245
#define KI_COEFF_HI_DISCHG_DEFAULT	123
static int fg_gen4_adjust_ki_coeff_dischg(struct fg_dev *fg)
static int fg_gen4_set_ki_coeff_dischg(struct fg_dev *fg, int ki_coeff_low,
		int ki_coeff_med, int ki_coeff_hi)
{
	struct fg_gen4_chip *chip = container_of(fg, struct fg_gen4_chip, fg);
	int rc, i, msoc;
	int ki_coeff_low = KI_COEFF_LOW_DISCHG_DEFAULT;
	int ki_coeff_med = KI_COEFF_MED_DISCHG_DEFAULT;
	int ki_coeff_hi = KI_COEFF_HI_DISCHG_DEFAULT;
	int rc;
	u8 val;

	if (!chip->ki_coeff_dischg_en)
		return 0;

	rc = fg_gen4_get_prop_capacity(fg, &msoc);
	if (rc < 0) {
		pr_err("Error in getting capacity, rc=%d\n", rc);
		return rc;
	}

	if (fg->charge_status == POWER_SUPPLY_STATUS_DISCHARGING) {
		for (i = KI_COEFF_SOC_LEVELS - 1; i >= 0; i--) {
			if (msoc < chip->dt.ki_coeff_soc[i]) {
				ki_coeff_low = chip->dt.ki_coeff_low_dischg[i];
				ki_coeff_med = chip->dt.ki_coeff_med_dischg[i];
				ki_coeff_hi = chip->dt.ki_coeff_hi_dischg[i];
			}
		}
	}

	if (ki_coeff_low > 0) {
	if (ki_coeff_low >= 0) {
		fg_encode(fg->sp, FG_SRAM_KI_COEFF_LOW_DISCHG, ki_coeff_low,
			&val);
		rc = fg_sram_write(fg,
@@ -1517,7 +1492,7 @@ static int fg_gen4_adjust_ki_coeff_dischg(struct fg_dev *fg)
		fg_dbg(fg, FG_STATUS, "Wrote ki_coeff_low %d\n", ki_coeff_low);
	}

	if (ki_coeff_med > 0) {
	if (ki_coeff_med >= 0) {
		fg_encode(fg->sp, FG_SRAM_KI_COEFF_MED_DISCHG, ki_coeff_med,
			&val);
		rc = fg_sram_write(fg,
@@ -1532,7 +1507,7 @@ static int fg_gen4_adjust_ki_coeff_dischg(struct fg_dev *fg)
		fg_dbg(fg, FG_STATUS, "Wrote ki_coeff_med %d\n", ki_coeff_med);
	}

	if (ki_coeff_hi > 0) {
	if (ki_coeff_hi >= 0) {
		fg_encode(fg->sp, FG_SRAM_KI_COEFF_HI_DISCHG, ki_coeff_hi,
			&val);
		rc = fg_sram_write(fg,
@@ -1550,6 +1525,44 @@ static int fg_gen4_adjust_ki_coeff_dischg(struct fg_dev *fg)
	return 0;
}

#define KI_COEFF_LOW_DISCHG_DEFAULT	122
#define KI_COEFF_MED_DISCHG_DEFAULT	62
#define KI_COEFF_HI_DISCHG_DEFAULT	0
static int fg_gen4_adjust_ki_coeff_dischg(struct fg_dev *fg)
{
	struct fg_gen4_chip *chip = container_of(fg, struct fg_gen4_chip, fg);
	int rc, i, msoc;
	int ki_coeff_low = KI_COEFF_LOW_DISCHG_DEFAULT;
	int ki_coeff_med = KI_COEFF_MED_DISCHG_DEFAULT;
	int ki_coeff_hi = KI_COEFF_HI_DISCHG_DEFAULT;

	if (!chip->ki_coeff_dischg_en)
		return 0;

	rc = fg_gen4_get_prop_capacity(fg, &msoc);
	if (rc < 0) {
		pr_err("Error in getting capacity, rc=%d\n", rc);
		return rc;
	}

	if (fg->charge_status == POWER_SUPPLY_STATUS_DISCHARGING) {
		for (i = KI_COEFF_SOC_LEVELS - 1; i >= 0; i--) {
			if (msoc < chip->dt.ki_coeff_soc[i]) {
				ki_coeff_low = chip->dt.ki_coeff_low_dischg[i];
				ki_coeff_med = chip->dt.ki_coeff_med_dischg[i];
				ki_coeff_hi = chip->dt.ki_coeff_hi_dischg[i];
			}
		}
	}

	rc = fg_gen4_set_ki_coeff_dischg(fg,
			ki_coeff_low, ki_coeff_med, ki_coeff_hi);
	if (rc < 0)
		return rc;

	return 0;
}

static int fg_gen4_slope_limit_config(struct fg_gen4_chip *chip, int batt_temp)
{
	struct fg_dev *fg = &chip->fg;
@@ -5087,6 +5100,11 @@ static int fg_gen4_init_ki_coeffts(struct fg_gen4_chip *chip)
		}
	}

	rc = fg_gen4_set_ki_coeff_dischg(fg, KI_COEFF_LOW_DISCHG_DEFAULT,
		KI_COEFF_MED_DISCHG_DEFAULT, KI_COEFF_HI_DISCHG_DEFAULT);
	if (rc < 0)
		return rc;

	return 0;
}

@@ -5313,15 +5331,15 @@ static int fg_parse_ki_coefficients(struct fg_dev *fg)
		}
	}

	chip->dt.ki_coeff_low_chg = -EINVAL;
	chip->dt.ki_coeff_low_chg = 183;
	of_property_read_u32(node, "qcom,ki-coeff-low-chg",
		&chip->dt.ki_coeff_low_chg);

	chip->dt.ki_coeff_med_chg = -EINVAL;
	chip->dt.ki_coeff_med_chg = 62;
	of_property_read_u32(node, "qcom,ki-coeff-med-chg",
		&chip->dt.ki_coeff_med_chg);

	chip->dt.ki_coeff_hi_chg = -EINVAL;
	chip->dt.ki_coeff_hi_chg = 0;
	of_property_read_u32(node, "qcom,ki-coeff-hi-chg",
		&chip->dt.ki_coeff_hi_chg);

@@ -5345,6 +5363,12 @@ static int fg_parse_ki_coefficients(struct fg_dev *fg)
	of_property_read_u32(node, "qcom,ki-coeff-cutoff",
		&chip->dt.ki_coeff_cutoff_gain);

	for (i = 0; i < KI_COEFF_SOC_LEVELS; i++) {
		chip->dt.ki_coeff_low_dischg[i] = KI_COEFF_LOW_DISCHG_DEFAULT;
		chip->dt.ki_coeff_med_dischg[i] = KI_COEFF_MED_DISCHG_DEFAULT;
		chip->dt.ki_coeff_hi_dischg[i] = KI_COEFF_HI_DISCHG_DEFAULT;
	}

	if (!of_find_property(node, "qcom,ki-coeff-soc-dischg", NULL) ||
		(!of_find_property(node, "qcom,ki-coeff-low-dischg", NULL) &&
		!of_find_property(node, "qcom,ki-coeff-med-dischg", NULL) &&