Cleaned nested locking of mutex locks and spinlocks.

Signed-off-by: Ramakrishna Pallala <[email protected]>
---
 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

Attachment: 0003-Cleaned-Nested-Locking.patch
Description: 0003-Cleaned-Nested-Locking.patch

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to