diff options
author | Arun Murthy <arun.murthy@stericsson.com> | 2011-10-24 15:53:36 +0530 |
---|---|---|
committer | Rabin VINCENT <rabin.vincent@stericsson.com> | 2011-10-28 07:18:05 +0200 |
commit | 44339f688810651ad64b30ac54d42aa34a0c495b (patch) | |
tree | 60ce6417228143e6c5651abe4ee9928b2b66c5e4 | |
parent | c03e09ea5245e207b581a4b44016f0e989e56e33 (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.c | 67 |
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 |