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

Commit 7a52abbd authored by Ashay Jaiswal's avatar Ashay Jaiswal Committed by Kavya Nunna
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 70fe4cf2
Loading
Loading
Loading
Loading
+37 −11
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ struct pl_data {
	int			fcc_step_delay_ms;
	/* debugfs directory */
	struct dentry		*dfs_root;
	u32			float_voltage_uv;
};

struct pl_data *the_chip;
@@ -982,6 +983,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)
@@ -1015,6 +1027,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;
}

@@ -1107,17 +1144,6 @@ static void pl_disable_forever_work(struct work_struct *work)
		vote(chip->hvdcp_hw_inov_dis_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)
{