Fixed the Emergency Call charging issue

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

Attachment: 0001-Emergency-Call-Charging-Fix.patch
Description: 0001-Emergency-Call-Charging-Fix.patch

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

Reply via email to