| From d62acc5ef0621463446091ebd7a345e06e9ab80c Mon Sep 17 00:00:00 2001 |
| From: Liam Breck <liam@networkimprov.net> |
| Date: Wed, 18 Jan 2017 09:26:50 -0800 |
| Subject: [PATCH] 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> |
| |
| diff --git a/drivers/power/supply/bq24190_charger.c b/drivers/power/supply/bq24190_charger.c |
| index 9efb5e668658..63ea948dc8fc 100644 |
| --- a/drivers/power/supply/bq24190_charger.c |
| +++ b/drivers/power/supply/bq24190_charger.c |
| @@ -1392,22 +1392,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; |
| } |
| |
| charger_cfg.drv_data = bdi; |
| @@ -1418,7 +1409,7 @@ static int bq24190_probe(struct i2c_client *client, |
| if (IS_ERR(bdi->charger)) { |
| dev_err(dev, "Can't register charger\n"); |
| ret = PTR_ERR(bdi->charger); |
| - goto out2; |
| + goto out1; |
| } |
| |
| battery_cfg.drv_data = bdi; |
| @@ -1427,24 +1418,34 @@ static int bq24190_probe(struct i2c_client *client, |
| if (IS_ERR(bdi->battery)) { |
| dev_err(dev, "Can't register battery\n"); |
| ret = PTR_ERR(bdi->battery); |
| - 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); |
| |
| -- |
| 2.12.0 |
| |