mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
mfd: da9150: Balance IRQ wake on teardown
DA9150 enables IRQ wake after registering its regmap IRQ chip, but does not
disable it on a later probe failure or driver removal. This leaves the wake
depth elevated after the handler is removed, and repeated bind attempts can
accumulate the imbalance.
Remember whether enabling IRQ wake succeeded and balance only a successful
call. Remove MFD children first so their nested IRQ users are gone, then
disable wake before removing the regmap IRQ chip. Preserve the existing
non-fatal behavior when IRQ wake cannot be enabled.
This issue was identified during our ongoing static-analysis research
while reviewing kernel code.
Fixes: b8fce55c09 ("mfd: Add support for DA9150 combined charger & fuel-gauge device")
Assisted-by: LLM
Co-developed-by: Ijae Kim <ae878000@gmail.com>
Signed-off-by: Ijae Kim <ae878000@gmail.com>
Signed-off-by: Myeonghun Pak <mhun512@gmail.com>
Link: https://patch.msgid.link/20260923021936.957065-1-mhun512@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>
This commit is contained in:
parent
c115afabf0
commit
ef464f82f3
|
|
@ -450,7 +450,7 @@ static int da9150_probe(struct i2c_client *client)
|
|||
|
||||
da9150->irq_base = regmap_irq_chip_get_base(da9150->regmap_irq_data);
|
||||
|
||||
enable_irq_wake(da9150->irq);
|
||||
da9150->irq_wake_enabled = !enable_irq_wake(da9150->irq);
|
||||
|
||||
ret = mfd_add_devices(da9150->dev, -1, da9150_devs,
|
||||
ARRAY_SIZE(da9150_devs), NULL,
|
||||
|
|
@ -463,6 +463,8 @@ static int da9150_probe(struct i2c_client *client)
|
|||
return 0;
|
||||
|
||||
mfd_fail:
|
||||
if (da9150->irq_wake_enabled)
|
||||
disable_irq_wake(da9150->irq);
|
||||
regmap_del_irq_chip(da9150->irq, da9150->regmap_irq_data);
|
||||
regmap_irq_fail:
|
||||
i2c_unregister_device(da9150->core_qif);
|
||||
|
|
@ -474,8 +476,10 @@ static void da9150_remove(struct i2c_client *client)
|
|||
{
|
||||
struct da9150 *da9150 = i2c_get_clientdata(client);
|
||||
|
||||
regmap_del_irq_chip(da9150->irq, da9150->regmap_irq_data);
|
||||
mfd_remove_devices(da9150->dev);
|
||||
if (da9150->irq_wake_enabled)
|
||||
disable_irq_wake(da9150->irq);
|
||||
regmap_del_irq_chip(da9150->irq, da9150->regmap_irq_data);
|
||||
i2c_unregister_device(da9150->core_qif);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@ struct da9150 {
|
|||
struct regmap_irq_chip_data *regmap_irq_data;
|
||||
int irq;
|
||||
int irq_base;
|
||||
bool irq_wake_enabled;
|
||||
};
|
||||
|
||||
/* Device I/O - Query Interface for FG and standard register access */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user