diff options
author | Arun Murthy <arun.murthy@stericsson.com> | 2011-08-16 11:35:23 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 10:59:56 +0200 |
commit | 5ab858840f671a26a2c3ca11f71774ac80eed541 (patch) | |
tree | 5e333dfd0b17e3cf94f05e651db4c28cf20be57f /drivers/power | |
parent | 185086eac879aecc2604621a092c1795f37acab5 (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.c | 16 |
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: |