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

Commit 59e95460 authored by Ashay Jaiswal's avatar Ashay Jaiswal Committed by Gerrit - the friendly Code Review server
Browse files

power: battery: handle charging termination at lower float voltage



In scenarios when charging terminates at lower vfloat(charger
configured to float voltage lower than battery profiles default vfloat),
charging doesn't resume when charger is configured back to higher vfloat.
Fix this by disabling and re-enabling charging CMD bit to restart charging.

Change-Id: I4d20e4dca94705d2773ec91d6eeb5c0d192f6763
Signed-off-by: default avatarAshay Jaiswal <ashayj@codeaurora.org>
parent 5542ee99
Loading
Loading
Loading
Loading
+37 −11
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ struct pl_data {
	bool			cp_disabled;
	int			taper_entry_fv;
	int			main_fcc_max;
	u32			float_voltage_uv;
};

struct pl_data *the_chip;
@@ -938,6 +939,17 @@ static void fcc_stepper_work(struct work_struct *work)
	vote(chip->pl_awake_votable, FCC_STEPPER_VOTER, false, 0);
}

static bool is_batt_available(struct pl_data *chip)
{
	if (!chip->batt_psy)
		chip->batt_psy = power_supply_get_by_name("battery");

	if (!chip->batt_psy)
		return false;

	return true;
}

#define PARALLEL_FLOAT_VOLTAGE_DELTA_UV 50000
static int pl_fv_vote_callback(struct votable *votable, void *data,
			int fv_uv, const char *client)
@@ -971,6 +983,31 @@ static int pl_fv_vote_callback(struct votable *votable, void *data,
		}
	}

	/*
	 * check for termination at reduced float voltage and re-trigger
	 * charging if new float voltage is above last FV.
	 */
	if ((chip->float_voltage_uv < fv_uv) && is_batt_available(chip)) {
		rc = power_supply_get_property(chip->batt_psy,
				POWER_SUPPLY_PROP_STATUS, &pval);
		if (rc < 0) {
			pr_err("Couldn't get battery status rc=%d\n", rc);
		} else {
			if (pval.intval == POWER_SUPPLY_STATUS_FULL) {
				pr_debug("re-triggering charging\n");
				pval.intval = 1;
				rc = power_supply_set_property(chip->batt_psy,
					POWER_SUPPLY_PROP_FORCE_RECHARGE,
					&pval);
				if (rc < 0)
					pr_err("Couldn't set force recharge rc=%d\n",
							rc);
			}
		}
	}

	chip->float_voltage_uv = fv_uv;

	return 0;
}

@@ -1068,17 +1105,6 @@ static void pl_awake_work(struct work_struct *work)
	vote(chip->pl_awake_votable, PL_VOTER, false, 0);
}

static bool is_batt_available(struct pl_data *chip)
{
	if (!chip->batt_psy)
		chip->batt_psy = power_supply_get_by_name("battery");

	if (!chip->batt_psy)
		return false;

	return true;
}

static int pl_disable_vote_callback(struct votable *votable,
		void *data, int pl_disable, const char *client)
{