From 44339f688810651ad64b30ac54d42aa34a0c495b Mon Sep 17 00:00:00 2001 From: Arun Murthy Date: Mon, 24 Oct 2011 15:53:36 +0530 Subject: 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 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/35050 Reviewed-by: QABUILD Reviewed-by: Rajagopala VENKATARAVANAPPA X Reviewed-by: Rabin VINCENT --- drivers/power/ab5500_fg.c | 67 +++++++++++++++++++++++++++-------------------- 1 file 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 -- cgit v1.2.3