From 5ab858840f671a26a2c3ca11f71774ac80eed541 Mon Sep 17 00:00:00 2001 From: Arun Murthy Date: Tue, 16 Aug 2011 11:35:23 +0530 Subject: 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 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/28777 Reviewed-by: QATEST Reviewed-by: Rabin VINCENT --- drivers/power/ab5500_fg.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'drivers/power') 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: -- cgit v1.2.3