power: pm8921-charger: ignore overvoltage/undervoltage interrupts
The pmic hardware fsm guarantees that if overvoltage and undervoltage
interrupts are high, the valid interrupts are always low. The software
need not check for overvoltage/undervoltage conditions additionally.
Change the driver to only rely on usb/dc valid interrupts.
CRs-Fixed: 310526
Change-Id: I25a1d9126384c0a235aee369be0e1b972e94a8c9
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
diff --git a/drivers/power/pm8921-charger.c b/drivers/power/pm8921-charger.c
index 109ad4a..3e61ad2 100644
--- a/drivers/power/pm8921-charger.c
+++ b/drivers/power/pm8921-charger.c
@@ -748,25 +748,13 @@
/* Treat OverVoltage/UnderVoltage as source missing */
static int is_usb_chg_plugged_in(struct pm8921_chg_chip *chip)
{
- int pres, ov, uv;
-
- pres = pm_chg_get_rt_status(chip, USBIN_VALID_IRQ);
- ov = pm_chg_get_rt_status(chip, USBIN_OV_IRQ);
- uv = pm_chg_get_rt_status(chip, USBIN_UV_IRQ);
-
- return pres && !ov && !uv;
+ return pm_chg_get_rt_status(chip, USBIN_VALID_IRQ);
}
/* Treat OverVoltage/UnderVoltage as source missing */
static int is_dc_chg_plugged_in(struct pm8921_chg_chip *chip)
{
- int pres, ov, uv;
-
- pres = pm_chg_get_rt_status(chip, DCIN_VALID_IRQ);
- ov = pm_chg_get_rt_status(chip, DCIN_OV_IRQ);
- uv = pm_chg_get_rt_status(chip, DCIN_UV_IRQ);
-
- return pres && !ov && !uv;
+ return pm_chg_get_rt_status(chip, DCIN_VALID_IRQ);
}
static int is_battery_charging(int fsm_state)
@@ -1292,7 +1280,6 @@
static irqreturn_t usbin_ov_irq_handler(int irq, void *data)
{
pr_err("USB OverVoltage\n");
- handle_usb_insertion_removal(data);
return IRQ_HANDLED;
}
@@ -1329,7 +1316,6 @@
static irqreturn_t usbin_uv_irq_handler(int irq, void *data)
{
pr_err("USB UnderVoltage\n");
- handle_usb_insertion_removal(data);
return IRQ_HANDLED;
}
@@ -1544,13 +1530,11 @@
static irqreturn_t dcin_ov_irq_handler(int irq, void *data)
{
- handle_dc_removal_insertion(data);
return IRQ_HANDLED;
}
static irqreturn_t dcin_uv_irq_handler(int irq, void *data)
{
- handle_dc_removal_insertion(data);
return IRQ_HANDLED;
}
@@ -1894,8 +1878,7 @@
struct pm_chg_irq_init_data chg_irq_data[] = {
CHG_IRQ(USBIN_VALID_IRQ, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
usbin_valid_irq_handler),
- CHG_IRQ(USBIN_OV_IRQ, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
- usbin_ov_irq_handler),
+ CHG_IRQ(USBIN_OV_IRQ, IRQF_TRIGGER_RISING, usbin_ov_irq_handler),
CHG_IRQ(BATT_INSERTED_IRQ, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
batt_inserted_irq_handler),
CHG_IRQ(VBATDET_LOW_IRQ, IRQF_TRIGGER_HIGH, vbatdet_low_irq_handler),
@@ -1933,8 +1916,7 @@
dcin_valid_irq_handler),
CHG_IRQ(DCIN_OV_IRQ, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
dcin_ov_irq_handler),
- CHG_IRQ(DCIN_UV_IRQ, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
- dcin_uv_irq_handler),
+ CHG_IRQ(DCIN_UV_IRQ, IRQF_TRIGGER_RISING, dcin_uv_irq_handler),
};
static int __devinit request_irqs(struct pm8921_chg_chip *chip,