From 8c7737edfb389e128fb950f5519c5c1692b81ad5 Mon Sep 17 00:00:00 2001
From: "choongryeol.lee" <choongryeol.lee@lge.com>
Date: Wed, 10 Sep 2014 23:29:57 -0700
Subject: [PATCH] power: qpnp-charger: fix race condition in charger detection

During probe, several interrupt handlers are called directly
for the initial charger detection. Since a interrupt could
happen while those handlers are processed, some variables
could be changed erroneously.
By disabling interrupt before calling those handlers directly,
remove race condition.

Change-Id: Ic010afe0daa16c2fa5aa6bbf309dc9ff60c0edd5
Signed-off-by: choongryeol.lee <choongryeol.lee@lge.com>
---
 drivers/power/qpnp-charger.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/power/qpnp-charger.c b/drivers/power/qpnp-charger.c
index ebe6380c4d61..b1b02ffc18a0 100644
--- a/drivers/power/qpnp-charger.c
+++ b/drivers/power/qpnp-charger.c
@@ -4488,6 +4488,8 @@ qpnp_chg_request_irqs(struct qpnp_chg_chip *chip)
 
 			qpnp_chg_irq_wake_enable(&chip->usbin_valid);
 			qpnp_chg_irq_wake_enable(&chip->chg_gone);
+			qpnp_chg_disable_irq(chip, &chip->usbin_valid);
+			qpnp_chg_disable_irq(chip, &chip->chg_gone);
 			break;
 		case SMBB_DC_CHGPTH_SUBTYPE:
 			chip->dcin_valid.irq = spmi_get_irq_byname(spmi,
@@ -4507,6 +4509,7 @@ qpnp_chg_request_irqs(struct qpnp_chg_chip *chip)
 			}
 
 			qpnp_chg_irq_wake_enable(&chip->dcin_valid);
+			qpnp_chg_disable_irq(chip, &chip->dcin_valid);
 			break;
 		}
 	}
@@ -5396,7 +5399,14 @@ qpnp_charger_probe(struct spmi_device *spmi)
 
 	qpnp_chg_usb_chg_gone_irq_handler(chip->chg_gone.irq, chip);
 	qpnp_chg_usb_usbin_valid_irq_handler(chip->usbin_valid.irq, chip);
-	qpnp_chg_dc_dcin_valid_irq_handler(chip->dcin_valid.irq, chip);
+	if (chip->dc_chgpth_base)
+		qpnp_chg_dc_dcin_valid_irq_handler(chip->dcin_valid.irq, chip);
+
+	qpnp_chg_enable_irq(chip, &chip->chg_gone);
+	qpnp_chg_enable_irq(chip, &chip->usbin_valid);
+	if (chip->dc_chgpth_base)
+		qpnp_chg_enable_irq(chip, &chip->dcin_valid);
+
 	power_supply_set_present(chip->usb_psy,
 			qpnp_chg_is_usb_chg_plugged_in(chip));
 
-- 
GitLab