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: Wu Fenglin <fenglinw@codeaurora.org>
diff --git a/drivers/power/qpnp-charger.c b/drivers/power/qpnp-charger.c
index 4439881..7689265 100644
--- a/drivers/power/qpnp-charger.c
+++ b/drivers/power/qpnp-charger.c
@@ -318,6 +318,7 @@
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;
@@ -1779,43 +1780,61 @@
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;
qpnp_chg_irq_wake_disable(&chip->chg_fastchg);
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);
-
- pr_debug("FAST_CHG IRQ triggered\n");
- chip->chg_done = false;
- if (chip->bat_if_base) {
- pr_debug("psy changed batt_psy\n");
- power_supply_changed(&chip->batt_psy);
+ 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("psy changed usb_psy\n");
- power_supply_changed(chip->usb_psy);
+static irqreturn_t
+qpnp_chg_chgr_chg_fastchg_irq_handler(int irq, void *_chip)
+{
+ struct qpnp_chg_chip *chip = _chip;
+ bool fastchg_on = false;
- if (chip->dc_chgpth_base) {
- pr_debug("psy changed dc_psy\n");
- power_supply_changed(&chip->dc_psy);
- }
+ fastchg_on = qpnp_chg_is_fastchg_on(chip);
- if (chip->resuming_charging) {
- chip->resuming_charging = false;
- qpnp_chg_set_appropriate_vbatdet(chip);
- }
+ pr_debug("FAST_CHG IRQ triggered, fastchg_on: %d\n", fastchg_on);
- if (!chip->charging_disabled) {
- schedule_delayed_work(&chip->eoc_work,
- msecs_to_jiffies(EOC_CHECK_PERIOD_MS));
- pm_stay_awake(chip->dev);
+ 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);
+ }
+
+ pr_debug("psy changed usb_psy\n");
+ power_supply_changed(chip->usb_psy);
+
+ if (chip->dc_chgpth_base) {
+ pr_debug("psy changed dc_psy\n");
+ 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);
+ }
+
+ if (!chip->charging_disabled) {
+ schedule_delayed_work(&chip->eoc_work,
+ msecs_to_jiffies(EOC_CHECK_PERIOD_MS));
+ pm_stay_awake(chip->dev);
+ }
+ }
}
qpnp_chg_enable_irq(&chip->chg_vbatdet_lo);
@@ -3977,7 +3996,8 @@
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",