summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorArun Murthy <arun.murthy@stericsson.com>2011-08-16 11:35:23 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 10:59:56 +0200
commit5ab858840f671a26a2c3ca11f71774ac80eed541 (patch)
tree5e333dfd0b17e3cf94f05e651db4c28cf20be57f /drivers/power
parent185086eac879aecc2604621a092c1795f37acab5 (diff)
power: ab5500-fg: Proper registering of power supply
During boot if the battery voltage exceed the max voltage, then an interrupt is triggered to the GPADC for auto control. This in turn will call the fg registered callback handler. But this happens before the power supply class of fg is registered. Thereby calling power_supply_changed() will lead to BUG since it used the wake lock which has not yet been initializes. Hence register power supply class for fg first followed by initializing the hardware registers, which includes registering for a gpadc auto convert for battery voltage. ST-Ericsson Linux next: NA ST-Ericsson ID: 355236 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: Iaa291c5ebbd8c2ba3fcee579de3605805a306ebd Signed-off-by: Arun Murthy <arun.murthy@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/28777 Reviewed-by: QATEST Reviewed-by: Rabin VINCENT <rabin.vincent@stericsson.com>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/ab5500_fg.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/power/ab5500_fg.c b/drivers/power/ab5500_fg.c
index 95f31cb84cb..bb2bfb9e840 100644
--- a/drivers/power/ab5500_fg.c
+++ b/drivers/power/ab5500_fg.c
@@ -1751,13 +1751,6 @@ static int __devinit ab5500_fg_probe(struct platform_device *pdev)
list_add_tail(&di->node, &ab5500_fg_list);
- /* Initialize OVV, and other registers */
- ret = ab5500_fg_init_hw_registers(di);
- if (ret) {
- dev_err(di->dev, "failed to initialize registers\n");
- goto free_fg_wq;
- }
-
/* Consider battery unknown until we're informed otherwise */
di->flags.batt_unknown = true;
@@ -1768,6 +1761,13 @@ static int __devinit ab5500_fg_probe(struct platform_device *pdev)
goto free_fg_wq;
}
+ /* Initialize OVV, and other registers */
+ ret = ab5500_fg_init_hw_registers(di);
+ if (ret) {
+ dev_err(di->dev, "failed to initialize registers\n");
+ goto pow_unreg;
+ }
+
di->fg_samples = SEC_TO_SAMPLE(di->bat->fg_params->init_timer);
ab5500_fg_coulomb_counter(di, true);
@@ -1793,6 +1793,8 @@ static int __devinit ab5500_fg_probe(struct platform_device *pdev)
dev_info(di->dev, "probe success\n");
return ret;
+pow_unreg:
+ power_supply_unregister(&di->fg_psy);
free_fg_wq:
destroy_workqueue(di->fg_wq);
free_device_info: