diff --git a/drivers/power/pm8921-charger.c b/drivers/power/pm8921-charger.c index 2654bedddf63eb8a9794ab054b3d40625865b2b0..f73d90a71dbb62182ad531830c6ff9daec6f06a5 100644 --- a/drivers/power/pm8921-charger.c +++ b/drivers/power/pm8921-charger.c @@ -85,6 +85,8 @@ #define EOC_CHECK_PERIOD_MS 10000 /* check for USB unplug every 200 msecs */ #define UNPLUG_CHECK_WAIT_PERIOD_MS 200 +/* wait for 1s to complete the chg gone handling */ +#define CHG_GONE_WAIT_TIMEOUT 1000 enum chg_fsm_state { FSM_STATE_OFF_0 = 0, @@ -277,6 +279,7 @@ struct pm8921_chg_chip { struct delayed_work unplug_usbcheck_work; struct delayed_work vin_collapse_check_work; struct wake_lock eoc_wake_lock; + struct wake_lock chg_gone_wake_lock; enum pm8921_chg_cold_thr cold_thr; enum pm8921_chg_hot_thr hot_thr; int rconn_mohm; @@ -2974,6 +2977,9 @@ static irqreturn_t chg_gone_irq_handler(int irq, void *data) struct pm8921_chg_chip *chip = data; int chg_gone, usb_chg_plugged_in; + wake_lock_timeout(&chip->chg_gone_wake_lock, + msecs_to_jiffies(CHG_GONE_WAIT_TIMEOUT)); + usb_chg_plugged_in = is_usb_chg_plugged_in(chip); chg_gone = pm_chg_get_rt_status(chip, CHG_GONE_IRQ); @@ -4567,6 +4573,9 @@ static int __devinit pm8921_charger_probe(struct platform_device *pdev) the_chip = chip; wake_lock_init(&chip->eoc_wake_lock, WAKE_LOCK_SUSPEND, "pm8921_eoc"); + wake_lock_init(&chip->chg_gone_wake_lock, + WAKE_LOCK_SUSPEND, "pm8921_chg_gone"); + INIT_DELAYED_WORK(&chip->eoc_work, eoc_worker); INIT_DELAYED_WORK(&chip->vin_collapse_check_work, vin_collapse_check_worker); @@ -4649,6 +4658,7 @@ static int __devexit pm8921_charger_remove(struct platform_device *pdev) { struct pm8921_chg_chip *chip = platform_get_drvdata(pdev); + wake_lock_destroy(&chip->chg_gone_wake_lock); device_remove_file(&pdev->dev, &dev_attr_charge); free_irqs(chip); platform_set_drvdata(pdev, NULL);