diff options
author | Liam Breck <liam@networkimprov.net> | 2017-01-18 09:26:50 -0800 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2017-06-05 21:16:56 +0100 |
commit | ebe8733e605cfbac3efa7c68e9fa3c13190ca628 (patch) | |
tree | bf158fcddd255d071860d0b91eee4144cf77eaaa /drivers | |
parent | cddddea5a5ddae7cd61b54de55f91b3668c10eca (diff) | |
download | linux-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.c | 31 |
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); |