Skip to content

Commit

Permalink
regulator: da9211: Use irq handler when ready
Browse files Browse the repository at this point in the history
If the system does not come from reset (like when it is kexec()), the
regulator might have an IRQ waiting for us.

If we enable the IRQ handler before its structures are ready, we crash.

This patch fixes:

[    1.141839] Unable to handle kernel read from unreadable memory at virtual address 0000000000000078
[    1.316096] Call trace:
[    1.316101]  blocking_notifier_call_chain+0x20/0xa8
[    1.322757] cpu cpu0: dummy supplies not allowed for exclusive requests
[    1.327823]  regulator_notifier_call_chain+0x1c/0x2c
[    1.327825]  da9211_irq_handler+0x68/0xf8
[    1.327829]  irq_thread+0x11c/0x234
[    1.327833]  kthread+0x13c/0x154

Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
Reviewed-by: Adam Ward <DLG-Adam.Ward.opensource@dm.renesas.com>
Link: https://lore.kernel.org/r/20221124-da9211-v2-0-1779e3c5d491@chromium.org
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
ribalda authored and broonie committed Nov 28, 2022
1 parent b7b275e commit 02228f6
Showing 1 changed file with 6 additions and 5 deletions.
11 changes: 6 additions & 5 deletions drivers/regulator/da9211-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,12 @@ static int da9211_i2c_probe(struct i2c_client *i2c)

chip->chip_irq = i2c->irq;

ret = da9211_regulator_init(chip);
if (ret < 0) {
dev_err(chip->dev, "Failed to initialize regulator: %d\n", ret);
return ret;
}

if (chip->chip_irq != 0) {
ret = devm_request_threaded_irq(chip->dev, chip->chip_irq, NULL,
da9211_irq_handler,
Expand All @@ -512,11 +518,6 @@ static int da9211_i2c_probe(struct i2c_client *i2c)
dev_warn(chip->dev, "No IRQ configured\n");
}

ret = da9211_regulator_init(chip);

if (ret < 0)
dev_err(chip->dev, "Failed to initialize regulator: %d\n", ret);

return ret;
}

Expand Down

0 comments on commit 02228f6

Please sign in to comment.