From 5194a3d00fd6a8fae12eda3a8bf2be4d6c7b11ea Mon Sep 17 00:00:00 2001
From: Devin Kim <dojip.kim@lge.com>
Date: Mon, 3 Dec 2012 11:20:25 -0800
Subject: [PATCH] power: charger: need sometime to handle the usb disconnecting
 events

When being completely charged in the offmode charging and pulling out TA
from sleep condition, I gave 1 sec. delay until entering sleep condition again,
in order to prevent the phenomenon that a device doesn't turn off.

We need sometime for an userspace application to handle the usb disconnection
events. There is no effect of power consumption.

Change-Id: I0851cc2b47c3780fd68d3e8965fd0d6f5b7e8312
---
 drivers/power/pm8921-charger.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/power/pm8921-charger.c b/drivers/power/pm8921-charger.c
index 2654bedddf63..f73d90a71dbb 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);
-- 
GitLab