summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLiam Breck <liam@networkimprov.net>2017-01-18 09:26:50 -0800
committerBen Hutchings <ben@decadent.org.uk>2017-06-05 21:16:56 +0100
commitebe8733e605cfbac3efa7c68e9fa3c13190ca628 (patch)
treebf158fcddd255d071860d0b91eee4144cf77eaaa /drivers
parentcddddea5a5ddae7cd61b54de55f91b3668c10eca (diff)
downloadlinux-stable-ebe8733e605cfbac3efa7c68e9fa3c13190ca628.tar.gz
linux-stable-ebe8733e605cfbac3efa7c68e9fa3c13190ca628.tar.bz2
linux-stable-ebe8733e605cfbac3efa7c68e9fa3c13190ca628.zip
power: supply: bq24190_charger: Install irq_handler_thread() at end of probe()
commit d62acc5ef0621463446091ebd7a345e06e9ab80c upstream. The device specific data is not fully initialized on request_threaded_irq(). This may cause a crash when the IRQ handler tries to reference them. Fix the issue by installing IRQ handler at the end of the probe. Fixes: d7bf353fd0aa3 ("bq24190_charger: Add support for TI BQ24190 Battery Charger") Signed-off-by: Liam Breck <kernel@networkimprov.net> Acked-by: Mark Greer <mgreer@animalcreek.com> Acked-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Sebastian Reichel <sre@kernel.org> [bwh: Backported to 3.16: adjust filename, context] Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/power/bq24190_charger.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/drivers/power/bq24190_charger.c b/drivers/power/bq24190_charger.c
index 661afd10d85a..1984b7bef1fa 100644
--- a/drivers/power/bq24190_charger.c
+++ b/drivers/power/bq24190_charger.c
@@ -1398,22 +1398,13 @@ static int bq24190_probe(struct i2c_client *client,
return -EINVAL;
}
- ret = devm_request_threaded_irq(dev, bdi->irq, NULL,
- bq24190_irq_handler_thread,
- IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
- "bq24190-charger", bdi);
- if (ret < 0) {
- dev_err(dev, "Can't set up irq handler\n");
- goto out1;
- }
-
pm_runtime_enable(dev);
pm_runtime_resume(dev);
ret = bq24190_hw_init(bdi);
if (ret < 0) {
dev_err(dev, "Hardware init failed\n");
- goto out2;
+ goto out1;
}
bq24190_charger_init(&bdi->charger);
@@ -1421,7 +1412,7 @@ static int bq24190_probe(struct i2c_client *client,
ret = power_supply_register(dev, &bdi->charger);
if (ret) {
dev_err(dev, "Can't register charger\n");
- goto out2;
+ goto out1;
}
bq24190_battery_init(&bdi->battery);
@@ -1429,24 +1420,34 @@ static int bq24190_probe(struct i2c_client *client,
ret = power_supply_register(dev, &bdi->battery);
if (ret) {
dev_err(dev, "Can't register battery\n");
- goto out3;
+ goto out2;
}
ret = bq24190_sysfs_create_group(bdi);
if (ret) {
dev_err(dev, "Can't create sysfs entries\n");
+ goto out3;
+ }
+
+ ret = devm_request_threaded_irq(dev, bdi->irq, NULL,
+ bq24190_irq_handler_thread,
+ IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+ "bq24190-charger", bdi);
+ if (ret < 0) {
+ dev_err(dev, "Can't set up irq handler\n");
goto out4;
}
return 0;
out4:
- power_supply_unregister(&bdi->battery);
+ bq24190_sysfs_remove_group(bdi);
out3:
- power_supply_unregister(&bdi->charger);
+ power_supply_unregister(&bdi->battery);
out2:
- pm_runtime_disable(dev);
+ power_supply_unregister(&bdi->charger);
out1:
+ pm_runtime_disable(dev);
if (bdi->gpio_int)
gpio_free(bdi->gpio_int);