aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power
diff options
context:
space:
mode:
authorPaul Parsons <lost.distance@yahoo.com>2012-09-20 17:26:05 -0400
committerAnton Vorontsov <anton.vorontsov@linaro.org>2012-09-20 17:27:34 -0400
commitec60ea5cd6c9f4b249de1580b8ebfa430055008c (patch)
treeb481a1f8207bc7dda61ce2ec1b60e34f37032ad6 /drivers/power
parent2815b786c3bb86fff97f1f6e2f0874903ff2339b (diff)
pda_power: Fix ac_draw usage before it being set
When I reboot my iPAQ hx4700 in its cradle, the battery will not begin to charge even though the AC supply is connected. Charging will start only after the PDA power driver is tickled by some other power event, such as reseating the iPAQ in its cradle or connecting the USB cable. The problem lies in pda_power_probe(), where ac_draw is used by the call to update_charger() before being set by the call to regulator_get(). Moving the regulator_get() call to before the update_charger() call fixes the problem. Signed-off-by: Paul Parsons <lost.distance@yahoo.com> Cc: Philipp Zabel <philipp.zabel@gmail.com> Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/pda_power.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c
index 7312f2651647..75536ebdb132 100644
--- a/drivers/power/pda_power.c
+++ b/drivers/power/pda_power.c
@@ -281,6 +281,14 @@ static int pda_power_probe(struct platform_device *pdev)
281 goto init_failed; 281 goto init_failed;
282 } 282 }
283 283
284 ac_draw = regulator_get(dev, "ac_draw");
285 if (IS_ERR(ac_draw)) {
286 dev_dbg(dev, "couldn't get ac_draw regulator\n");
287 ac_draw = NULL;
288 ret = PTR_ERR(ac_draw);
289 goto ac_draw_failed;
290 }
291
284 update_status(); 292 update_status();
285 update_charger(); 293 update_charger();
286 294
@@ -309,13 +317,6 @@ static int pda_power_probe(struct platform_device *pdev)
309 pda_psy_usb.num_supplicants = pdata->num_supplicants; 317 pda_psy_usb.num_supplicants = pdata->num_supplicants;
310 } 318 }
311 319
312 ac_draw = regulator_get(dev, "ac_draw");
313 if (IS_ERR(ac_draw)) {
314 dev_dbg(dev, "couldn't get ac_draw regulator\n");
315 ac_draw = NULL;
316 ret = PTR_ERR(ac_draw);
317 }
318
319#ifdef CONFIG_USB_OTG_UTILS 320#ifdef CONFIG_USB_OTG_UTILS
320 transceiver = usb_get_phy(USB_PHY_TYPE_USB2); 321 transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
321 if (!IS_ERR_OR_NULL(transceiver)) { 322 if (!IS_ERR_OR_NULL(transceiver)) {
@@ -415,6 +416,7 @@ ac_supply_failed:
415 regulator_put(ac_draw); 416 regulator_put(ac_draw);
416 ac_draw = NULL; 417 ac_draw = NULL;
417 } 418 }
419ac_draw_failed:
418 if (pdata->exit) 420 if (pdata->exit)
419 pdata->exit(dev); 421 pdata->exit(dev);
420init_failed: 422init_failed: