Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 63e1acc8 authored by Liam Breck's avatar Liam Breck Committed by Greg Kroah-Hartman
Browse files

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: d7bf353f ("bq24190_charger: Add support for TI BQ24190 Battery Charger")
Signed-off-by: default avatarLiam Breck <kernel@networkimprov.net>
Acked-by: default avatarMark Greer <mgreer@animalcreek.com>
Acked-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarSebastian Reichel <sre@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 20e448f2
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -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);