Commit 9952af43 authored by Ricardo Ribalda's avatar Ricardo Ribalda Committed by Cui GaoSheng
Browse files

regulator: da9211: Use irq handler when ready

stable inclusion
from stable-v5.10.164
commit d4aa749e046435f054e94ebf50cad143d6229fae
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IALM7R
CVE: CVE-2022-48891

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=d4aa749e046435f054e94ebf50cad143d6229fae



--------------------------------

[ Upstream commit 02228f6a ]

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: default avatarRicardo Ribalda <ribalda@chromium.org>
Reviewed-by: default avatarAdam Ward <DLG-Adam.Ward.opensource@dm.renesas.com>
Link: https://lore.kernel.org/r/20221124-da9211-v2-0-1779e3c5d491@chromium.org


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarCui GaoSheng <cuigaosheng1@huawei.com>
parent 683fc19e
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -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,
@@ -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;
}