summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Murthy <arun.murthy@stericsson.com>2011-10-24 15:53:36 +0530
committerRabin VINCENT <rabin.vincent@stericsson.com>2011-10-28 07:18:05 +0200
commit44339f688810651ad64b30ac54d42aa34a0c495b (patch)
tree60ce6417228143e6c5651abe4ee9928b2b66c5e4
parentc03e09ea5245e207b581a4b44016f0e989e56e33 (diff)
power:ab5500-fg: send UEvent when battery voltage is low/high
Send UEvent when battery voltage is low/high so that android power framework is being notified and actions are taken by android accordingly. This also ensure that the paltform is shutdown cleanly when battery voltage is below lower threshold. ST-Ericsson Linux next: NA ST-Ericsson ID: 365061 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I01e3579ba5860244cd5837c8eb59f71bd9b5d719 Signed-off-by: Arun Murthy <arun.murthy@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/35050 Reviewed-by: QABUILD Reviewed-by: Rajagopala VENKATARAVANAPPA X <rajagopala.v@stericsson.com> Reviewed-by: Rabin VINCENT <rabin.vincent@stericsson.com>
-rw-r--r--drivers/power/ab5500_fg.c67
1 files changed, 38 insertions, 29 deletions
diff --git a/drivers/power/ab5500_fg.c b/drivers/power/ab5500_fg.c
index 62710680d1e..c29d08bad17 100644
--- a/drivers/power/ab5500_fg.c
+++ b/drivers/power/ab5500_fg.c
@@ -218,6 +218,9 @@ static enum power_supply_property ab5500_fg_props[] = {
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
};
+/* Function Prototype */
+static int ab5500_fg_bat_v_trig(int mux);
+
struct ab5500_fg *ab5500_fg_get(void)
{
struct ab5500_fg *di;
@@ -1319,9 +1322,11 @@ static void ab5500_fg_low_bat_work(struct work_struct *work)
*/
queue_delayed_work(di->fg_wq, &di->fg_low_bat_work,
round_jiffies(LOW_BAT_CHECK_INTERVAL));
+ power_supply_changed(&di->fg_psy);
} else {
di->flags.low_bat = false;
dev_warn(di->dev, "Battery voltage OK again\n");
+ power_supply_changed(&di->fg_psy);
}
/* This is needed to dispatch LOW_BAT */
@@ -1541,33 +1546,6 @@ static int ab5500_fg_get_ext_psy_data(struct device *dev, void *data)
return 0;
}
-static int ab5500_fg_bat_v_trig(int mux)
-{
- struct ab5500_fg *di = ab5500_fg_get();
-
- /* check if the battery voltage is below low threshold */
- if (di->vbat < 2700) {
- dev_warn(di->dev, "Battery voltage is below LOW threshold\n");
- di->flags.low_bat_delay = true;
- /*
- * Start a timer to check LOW_BAT again after some time
- * This is done to avoid shutdown on single voltage dips
- */
- queue_delayed_work(di->fg_wq, &di->fg_low_bat_work,
- round_jiffies(LOW_BAT_CHECK_INTERVAL));
- }
- /* check if battery votlage is above OVV */
- else if (di->vbat > 4200) {
- dev_dbg(di->dev, "Battery OVV\n");
- di->flags.bat_ovv = true;
-
- power_supply_changed(&di->fg_psy);
- } else
- return -EINVAL;
-
- return 0;
-}
-
/**
* ab5500_fg_init_hw_registers() - Set up FG related registers
* @di: pointer to the ab5500_fg structure
@@ -1587,8 +1565,8 @@ static int ab5500_fg_init_hw_registers(struct ab5500_fg *di)
auto_ip->mux = MAIN_BAT_V;
auto_ip->freq = MS500;
- auto_ip->min = 2700;
- auto_ip->max = 4200;
+ auto_ip->min = 3560;
+ auto_ip->max = 4500;
auto_ip->auto_adc_callback = ab5500_fg_bat_v_trig;
di->gpadc_auto = auto_ip;
ret = ab5500_gpadc_convert_auto(di->gpadc, di->gpadc_auto);
@@ -1601,6 +1579,37 @@ static int ab5500_fg_init_hw_registers(struct ab5500_fg *di)
return ret;
}
+static int ab5500_fg_bat_v_trig(int mux)
+{
+ struct ab5500_fg *di = ab5500_fg_get();
+
+ di->vbat = ab5500_gpadc_convert(di->gpadc, MAIN_BAT_V);
+
+ /* check if the battery voltage is below low threshold */
+ if (di->vbat < 3560) {
+ dev_warn(di->dev, "Battery voltage is below LOW threshold\n");
+ di->flags.low_bat_delay = true;
+ /*
+ * Start a timer to check LOW_BAT again after some time
+ * This is done to avoid shutdown on single voltage dips
+ */
+ queue_delayed_work(di->fg_wq, &di->fg_low_bat_work,
+ round_jiffies(LOW_BAT_CHECK_INTERVAL));
+ power_supply_changed(&di->fg_psy);
+ }
+ /* check if battery votlage is above OVV */
+ else if (di->vbat > 4500) {
+ dev_warn(di->dev, "Battery OVV\n");
+ di->flags.bat_ovv = true;
+
+ power_supply_changed(&di->fg_psy);
+ } else
+ return -EINVAL;
+ kfree(di->gpadc_auto);
+ ab5500_fg_init_hw_registers(di);
+ return 0;
+}
+
/**
* ab5500_fg_external_power_changed() - callback for power supply changes
* @psy: pointer to the structure power_supply