From 0a3ae1b2ddd52793e15ad2ea0395a15993b01146 Mon Sep 17 00:00:00 2001
From: Ramakrishna Pallala <ramakrishna.pallala@intel.com>
Date: Thu, 9 Dec 2010 03:29:34 +0530
Subject: [PATCH] Emergency Call Charging Fix

Change-Id: I309d5b0a313a4cbb1ed15dd53975d004c2b7de7b
Signed-off-by: Ramakrishna Pallala <ramakrishna.pallala@intel.com>
---
 drivers/power/intel_mdf_battery.c |   28 +++++++++++++++++-----------
 1 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/drivers/power/intel_mdf_battery.c b/drivers/power/intel_mdf_battery.c
index 093d889..9142cc6 100644
--- a/drivers/power/intel_mdf_battery.c
+++ b/drivers/power/intel_mdf_battery.c
@@ -466,6 +466,7 @@ struct msic_power_module_info {
 	int batt_event;
 	int charging_mode;
 	int emrg_chrg_enbl;	/* Emergency call charge enable */
+	int refresh_charger;	/* Refresh charger parameters */
 
 	/* Worker to monitor status and faluts */
 	struct delayed_work chr_status_monitor;
@@ -993,7 +994,7 @@ static unsigned int chrg_to_vol_lookup(unsigned int chrg)
 		return 0;
 	}
 
-	if (chrg == dischargeCurve[i][1])
+	if ((i == 0) || (chrg == dischargeCurve[i][1]))
 		return dischargeCurve[i][0];
 
 	/* Linear approximation of the charge to voltage */
@@ -1217,8 +1218,14 @@ static ssize_t set_emrg_chrg(struct device *dev,
 		mbi->emrg_chrg_enbl = true;
 	else
 		mbi->emrg_chrg_enbl = false;
+	mbi->refresh_charger = 1;
 	spin_unlock(&mbi->event_lock);
 
+	/* As the emrgency charging state is changed
+	 * execute the worker as early as possible
+	 * if the worker is pending on timer.
+	 */
+	flush_delayed_work(&mbi->connect_handler);
 	return count;
 }
 static ssize_t get_emrg_chrg(struct device *dev,
@@ -1709,20 +1716,18 @@ static void msic_batt_temp_charging(struct work_struct *work)
 	charge_param.vinilmt = mbi->ch_params.vinilmt;
 	charge_param.chrg_type = mbi->ch_params.chrg_type;
 
-	mutex_lock(&mbi->usb_chrg_lock);
-	if (mbi->usb_chrg_props.charger_type  ==
-					POWER_SUPPLY_CHARGE_TYPE_UNKNOWN ||
-		mbi->usb_chrg_props.charger_type ==
-						POWER_SUPPLY_CHARGE_TYPE_NONE) {
+	spin_lock(&mbi->event_lock);
+	if (mbi->refresh_charger) {
 		/*
 		 * If the the charger type is unknown or None
 		 * better start the charging again and compute
 		 * the properties again.
 		 */
+		mbi->refresh_charger = 0;
 		iprev = -1;
 		is_chrg_enbl = false;
 	}
-	mutex_unlock(&mbi->usb_chrg_lock);
+	spin_unlock(&mbi->event_lock);
 
 	ret = mdf_read_adc_regs(MSIC_ADC_TEMP_IDX, mbi);
 	/* mdf_read_adc_regs returns in milli Centigrade */
@@ -1935,13 +1940,13 @@ static int msic_charger_callback(void *arg, int event, struct otg_bc_cap *cap)
 		mbi->ch_params.chrg_type = cap->chrg_type;
 		dev_dbg(msic_dev, "CHRG TYPE:%d %d\n",
 					cap->chrg_type, cap->mA);
-
-		schedule_delayed_work(&mbi->connect_handler, 0);
-
 		spin_lock(&mbi->event_lock);
-		mbi->charging_mode = BATT_CHARGING_MODE_NORMAL;
+		mbi->refresh_charger = 1;
+		if (mbi->charging_mode == BATT_CHARGING_MODE_NONE)
+			mbi->charging_mode = BATT_CHARGING_MODE_NORMAL;
 		spin_unlock(&mbi->event_lock);
 
+		schedule_delayed_work(&mbi->connect_handler, 0);
 		break;
 	case USBCHRG_EVENT_DISCONN:
 	case USBCHRG_EVENT_SUSPEND:
@@ -1950,6 +1955,7 @@ static int msic_charger_callback(void *arg, int event, struct otg_bc_cap *cap)
 		schedule_delayed_work(&mbi->disconn_handler, 0);
 
 		spin_lock(&mbi->event_lock);
+		mbi->refresh_charger = 0;
 		mbi->charging_mode = BATT_CHARGING_MODE_NONE;
 		spin_unlock(&mbi->event_lock);
 		if (!pm_runtime_suspended(&mbi->pdev->dev))
-- 
1.7.2.3

