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

Commit 831b93a6 authored by Xiaozhe Shi's avatar Xiaozhe Shi Committed by Stephen Boyd
Browse files

power: qpnp-bms: Always setup vbat monitoring



Previously, the BMS driver skips adc-tm vbat monitor setup if it
detects that there is no battery. This is incorrect since a battery
could be inserted later. Not setting up the monitor parameters can
lead to issues later when the battery is actually inserted.

Fix this by always setting up the adc-tm vbat monitor parameters
and simply disabling the channel if there is no battery inserted.

Change-Id: I6980d2b67641fe48644970179fa5a04ddbdc479e
Signed-off-by: default avatarXiaozhe Shi <xiaozhes@codeaurora.org>
parent 49379869
Loading
Loading
Loading
Loading
+17 −12
Original line number Diff line number Diff line
@@ -2327,6 +2327,8 @@ static int recalculate_soc(struct qpnp_bms_chip *chip)

	bms_stay_awake(&chip->soc_wake_source);
	mutex_lock(&chip->vbat_monitor_mutex);
	if (chip->vbat_monitor_params.state_request !=
			ADC_TM_HIGH_LOW_THR_DISABLE)
		qpnp_adc_tm_channel_measure(&chip->vbat_monitor_params);
	mutex_unlock(&chip->vbat_monitor_mutex);
	if (chip->use_voltage_soc) {
@@ -2524,9 +2526,10 @@ static int reset_vbat_monitoring(struct qpnp_bms_chip *chip)
	int rc;

	chip->vbat_monitor_params.state_request = ADC_TM_HIGH_LOW_THR_DISABLE;
	rc = qpnp_adc_tm_channel_measure(&chip->vbat_monitor_params);

	rc = qpnp_adc_tm_disable_chan_meas(&chip->vbat_monitor_params);
	if (rc) {
		pr_err("tm measure failed: %d\n", rc);
		pr_err("tm disable failed: %d\n", rc);
		return rc;
	}
	if (wake_lock_active(&chip->low_voltage_wake_lock)) {
@@ -2550,11 +2553,6 @@ static int setup_vbat_monitoring(struct qpnp_bms_chip *chip)
		return -EPROBE_DEFER;
	}

	if (!is_battery_present(chip)) {
		pr_debug("no battery inserted, do not setup vbat monitoring\n");
		return 0;
	}

	chip->vbat_monitor_params.low_thr = chip->low_voltage_threshold;
	chip->vbat_monitor_params.high_thr = chip->max_voltage_uv
							- VBATT_ERROR_MARGIN;
@@ -2566,11 +2564,18 @@ static int setup_vbat_monitoring(struct qpnp_bms_chip *chip)
	pr_debug("set low thr to %d and high to %d\n",
			chip->vbat_monitor_params.low_thr,
			chip->vbat_monitor_params.high_thr);

	if (!is_battery_present(chip)) {
		pr_debug("no battery inserted, do not enable vbat monitoring\n");
		chip->vbat_monitor_params.state_request =
			ADC_TM_HIGH_LOW_THR_DISABLE;
	} else {
		rc = qpnp_adc_tm_channel_measure(&chip->vbat_monitor_params);
		if (rc) {
			pr_err("tm setup failed: %d\n", rc);
			return rc;
		}
	}
	pr_debug("setup complete\n");
	return 0;
}