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

Commit e077f5c1 authored by Wu Fenglin's avatar Wu Fenglin
Browse files

power: qpnp-charger: request fastchg falling irq



When device is in charging mode, if enable the revert boost regulator
for flash led, smbb will tranfer from fast_chg state to bst_on state,
the charging will stop. But usbin_valid && coarse_det are still valid,
and the battery_status not change to discharging.

Register a fastchg falling irq to update charging status and make the
charging icon consistent with charging status in this situation.

Change-Id: I0ce903f221d7550759b2601864c6a13a6036c494
Signed-off-by: default avatarWu Fenglin <fenglinw@codeaurora.org>
parent 84dce0d6
Loading
Loading
Loading
Loading
+46 −26
Original line number Diff line number Diff line
@@ -316,6 +316,7 @@ struct qpnp_chg_chip {
	bool				ibat_calibration_enabled;
	bool				aicl_settled;
	bool				use_external_rsense;
	bool				fastchg_on;
	unsigned int			bpd_detection;
	unsigned int			max_bat_chg_current;
	unsigned int			warm_bat_chg_ma;
@@ -1626,19 +1627,32 @@ qpnp_chg_chgr_chg_trklchg_irq_handler(int irq, void *_chip)
	return IRQ_HANDLED;
}

static irqreturn_t
qpnp_chg_chgr_chg_fastchg_irq_handler(int irq, void *_chip)
static int qpnp_chg_is_fastchg_on(struct qpnp_chg_chip *chip)
{
	struct qpnp_chg_chip *chip = _chip;
	u8 chgr_sts;
	int rc;

	rc = qpnp_chg_read(chip, &chgr_sts, INT_RT_STS(chip->chgr_base), 1);
	if (rc)
		pr_err("failed to read interrupt sts %d\n", rc);
	if (rc) {
		pr_err("failed to read interrupt status %d\n", rc);
		return rc;
	}
	pr_debug("chgr_sts 0x%x\n", chgr_sts);
	return (chgr_sts & FAST_CHG_ON_IRQ) ? 1 : 0;
}

	pr_debug("FAST_CHG IRQ triggered\n");
	chip->chg_done = false;
static irqreturn_t
qpnp_chg_chgr_chg_fastchg_irq_handler(int irq, void *_chip)
{
	struct qpnp_chg_chip *chip = _chip;
	bool fastchg_on = false;

	fastchg_on = qpnp_chg_is_fastchg_on(chip);

	pr_debug("FAST_CHG IRQ triggered, fastchg_on: %d\n", fastchg_on);

	if (chip->fastchg_on ^ fastchg_on) {
		chip->fastchg_on = fastchg_on;
		if (chip->bat_if_base) {
			pr_debug("psy changed batt_psy\n");
			power_supply_changed(&chip->batt_psy);
@@ -1652,6 +1666,9 @@ qpnp_chg_chgr_chg_fastchg_irq_handler(int irq, void *_chip)
			power_supply_changed(&chip->dc_psy);
		}

		if (fastchg_on) {
			chip->chg_done = false;

			if (chip->resuming_charging) {
				chip->resuming_charging = false;
				qpnp_chg_set_appropriate_vbatdet(chip);
@@ -1662,6 +1679,8 @@ qpnp_chg_chgr_chg_fastchg_irq_handler(int irq, void *_chip)
					msecs_to_jiffies(EOC_CHECK_PERIOD_MS));
				pm_stay_awake(chip->dev);
			}
		}
	}

	qpnp_chg_enable_irq(&chip->chg_vbatdet_lo);

@@ -3715,7 +3734,8 @@ qpnp_chg_request_irqs(struct qpnp_chg_chip *chip)

			rc |= devm_request_irq(chip->dev, chip->chg_fastchg.irq,
					qpnp_chg_chgr_chg_fastchg_irq_handler,
					IRQF_TRIGGER_RISING,
					IRQF_TRIGGER_RISING |
					IRQF_TRIGGER_FALLING,
					"fast-chg-on", chip);
			if (rc < 0) {
				pr_err("Can't request %d fast-chg-on: %d\n",