From 0c85e50516768029c22cb709ff2b5a80bdc31c51 Mon Sep 17 00:00:00 2001
From: Ramakrishna Pallala <ramakrishna.pallala@intel.com>
Date: Thu, 9 Dec 2010 03:42:32 +0530
Subject: [PATCH] Cleaned Nested Locking

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

diff --git a/drivers/power/intel_mdf_battery.c b/drivers/power/intel_mdf_battery.c
index a1e88f0..ad66b84 100644
--- a/drivers/power/intel_mdf_battery.c
+++ b/drivers/power/intel_mdf_battery.c
@@ -1475,10 +1475,10 @@ static int msic_batt_stop_charging(struct msic_power_module_info *mbi)
  * capabilities connected to the platform.
  */
 static int msic_batt_do_charging(struct msic_power_module_info *mbi,
-						struct charge_params *params)
+				struct charge_params *params, int is_maint_mode)
 {
 	int retval;
-	static u8 data[8] = {
+	static u8 data[] = {
 		WDTWRITE_UNLOCK_VALUE, 0,
 		WDTWRITE_UNLOCK_VALUE, 0,
 		WDTWRITE_UNLOCK_VALUE, 0,
@@ -1507,12 +1507,10 @@ static int msic_batt_do_charging(struct msic_power_module_info *mbi,
 	dev_dbg(msic_dev, "Charger Enabled\n");
 
 	mutex_lock(&mbi->batt_lock);
-	spin_lock(&mbi->event_lock);
-	if (mbi->charging_mode == BATT_CHARGING_MODE_MAINTAINENCE)
+	if (is_maint_mode)
 		mbi->batt_props.status = POWER_SUPPLY_STATUS_FULL;
 	else
 		mbi->batt_props.status = POWER_SUPPLY_STATUS_CHARGING;
-	spin_unlock(&mbi->event_lock);
 	mbi->batt_props.health = POWER_SUPPLY_HEALTH_GOOD;
 	mutex_unlock(&mbi->batt_lock);
 
@@ -1713,7 +1711,7 @@ static void calculate_charge_cycles(struct msic_power_module_info *mbi,
 */
 static void msic_batt_temp_charging(struct work_struct *work)
 {
-	int ret, i, charge_now, is_maint_chrg = false;
+	int ret, i, charge_now, is_maint_chrg = false, is_lowchrg_enbl;
 	static int iprev = -1, is_chrg_enbl;
 	short int cv = 0, cc = 0, vinlimit = 0, cvref;
 	int adc_temp, adc_vol;
@@ -1786,13 +1784,17 @@ static void msic_batt_temp_charging(struct work_struct *work)
 		cvref = sfi_table->temp_mon_range[i].maint_chrg_vol_ul;
 		is_maint_chrg = true;
 	}
+	spin_unlock(&mbi->event_lock);
+
 	ret = check_charge_full(mbi, cvref);
 	if (ret) {
 		is_chrg_enbl = false;
-		if (mbi->charging_mode != BATT_CHARGING_MODE_MAINTAINENCE) {
+		if (!is_maint_chrg) {
 			dev_dbg(msic_dev, "Going to Maintenence CHRG Mode\n");
+
+			spin_lock(&mbi->event_lock);
 			mbi->charging_mode = BATT_CHARGING_MODE_MAINTAINENCE;
-			is_maint_chrg = true;
+			spin_unlock(&mbi->event_lock);
 
 			mutex_lock(&mbi->batt_lock);
 			charge_now = msic_read_coloumb_ctr();
@@ -1800,9 +1802,11 @@ static void msic_batt_temp_charging(struct work_struct *work)
 						cc_to_coloumbs(charge_now);
 			mbi->batt_props.status = POWER_SUPPLY_STATUS_FULL;
 			mutex_unlock(&mbi->batt_lock);
+
+			is_maint_chrg = true;
+			power_supply_set_battery_charged(&mbi->batt);
 		}
 	}
-	spin_unlock(&mbi->event_lock);
 
 	/*
 	 * If we are in same Temparature range check for check for the
@@ -1859,19 +1863,20 @@ static void msic_batt_temp_charging(struct work_struct *work)
 	 * allow the charging as set in charge current register
 	 */
 	spin_lock(&mbi->event_lock);
-	if (!mbi->emrg_chrg_enbl && (i == sfi_table->temp_mon_ranges)) {
+	if (!mbi->emrg_chrg_enbl && (adc_temp < 0)) {
 		dev_dbg(msic_dev, "Emeregency Charging Enabled\n");
-		ipc_read_modify_chr_param_reg(mbi, MSIC_BATT_CHR_SPCHARGER_ADDR,
-					CHR_SPCHRGER_LOWCHR_ENABLE, BIT_SET);
+		is_lowchrg_enbl = BIT_SET;
 	} else {
 		dev_dbg(msic_dev, "Emeregency Charging Not Enabled\n");
-		ipc_read_modify_chr_param_reg(mbi, MSIC_BATT_CHR_SPCHARGER_ADDR,
-					CHR_SPCHRGER_LOWCHR_ENABLE, BIT_RESET);
+		is_lowchrg_enbl = BIT_RESET;
 	}
 	spin_unlock(&mbi->event_lock);
 
+	ipc_read_modify_chr_param_reg(mbi, MSIC_BATT_CHR_SPCHARGER_ADDR,
+				CHR_SPCHRGER_LOWCHR_ENABLE, is_lowchrg_enbl);
+
 	/* enable charging here */
-	ret = msic_batt_do_charging(mbi, &charge_param);
+	ret = msic_batt_do_charging(mbi, &charge_param, is_maint_chrg);
 	if (ret) {
 		dev_warn(msic_dev, "msic_batt_do_charging failed\n");
 		goto lbl_sched_work;
@@ -1886,7 +1891,6 @@ lbl_sched_work:
 	schedule_delayed_work(&mbi->connect_handler, TEMP_CHARGE_DELAY_JIFFIES);
 }
 
-
 static void msic_batt_disconn(struct work_struct *work)
 {
 	int ret;
@@ -1988,7 +1992,7 @@ static int msic_charger_callback(void *arg, int event, struct otg_bc_cap *cap)
 static void msic_status_monitor(struct work_struct *work)
 {
 	uint8_t data;
-	int retval, val, volt, temp;
+	int retval, val, volt, temp, chr_mode, chr_event;
 	struct msic_power_module_info *mbi = container_of(work,
 			struct msic_power_module_info, chr_status_monitor.work);
 
@@ -2013,6 +2017,11 @@ static void msic_status_monitor(struct work_struct *work)
 		mbi->usb_chrg_props.charger_health = POWER_SUPPLY_HEALTH_GOOD;
 	mutex_unlock(&mbi->usb_chrg_lock);
 
+	spin_lock(&mbi->event_lock);
+	chr_mode = mbi->charging_mode;
+	chr_event = mbi->batt_event;
+	spin_unlock(&mbi->event_lock);
+
 	/* Compute Battery health */
 	mutex_lock(&mbi->batt_lock);
 	if (mbi->batt_props.health == POWER_SUPPLY_HEALTH_OVERHEAT) {
@@ -2033,16 +2042,14 @@ static void msic_status_monitor(struct work_struct *work)
 		}
 	}
 
-	spin_lock(&mbi->event_lock);
-	if (mbi->charging_mode == BATT_CHARGING_MODE_MAINTAINENCE)
+	if (chr_mode == BATT_CHARGING_MODE_MAINTAINENCE)
 		mbi->batt_props.status = POWER_SUPPLY_STATUS_FULL;
-	else if (mbi->charging_mode == BATT_CHARGING_MODE_NORMAL)
+	else if (chr_mode == BATT_CHARGING_MODE_NORMAL)
 		mbi->batt_props.status = POWER_SUPPLY_STATUS_CHARGING;
-	else if (mbi->batt_event == USBCHRG_EVENT_SUSPEND)
+	else if (chr_event == USBCHRG_EVENT_SUSPEND)
 		mbi->batt_props.status = POWER_SUPPLY_STATUS_NOT_CHARGING;
 	else
 		mbi->batt_props.status = POWER_SUPPLY_STATUS_DISCHARGING;
-	spin_unlock(&mbi->event_lock);
 
 	if (mbi->batt_props.health == POWER_SUPPLY_HEALTH_DEAD) {
 		volt = mdf_read_adc_regs(MSIC_ADC_VOL_IDX, mbi);
-- 
1.7.2.3

