* [PATCH v2] mfd: da9150: Balance IRQ wake on teardown
@ 2026-09-23 2:19 Myeonghun Pak
2026-09-24 14:16 ` (subset) " Lee Jones
0 siblings, 1 reply; 2+ messages in thread
From: Myeonghun Pak @ 2026-09-23 2:19 UTC (permalink / raw)
To: Lee Jones; +Cc: Support Opensource, linux-kernel, mfd, Ijae Kim
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: b8fce55c09d3 ("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>
---
Changes in v2:
- Record enable_irq_wake() success in one assignment. (Lee Jones)
- Keep the irq_wake_enabled checks. disable_irq_wake() after a failed
enable warns about an unbalanced wake disable.
drivers/mfd/da9150-core.c | 8 ++++++--
include/linux/mfd/da9150/core.h | 1 +
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/mfd/da9150-core.c b/drivers/mfd/da9150-core.c
index 5c59cc869fb3e2a6ac5aaea7426f38241cb92cb1..19325d72a27e7e12aa8acb121b5bc115305b4231 100644
--- a/drivers/mfd/da9150-core.c
+++ b/drivers/mfd/da9150-core.c
@@ -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);
}
diff --git a/include/linux/mfd/da9150/core.h b/include/linux/mfd/da9150/core.h
index d116d5f3ef561288756477e7170400b47d65e180..369698036d1aa5d1722f6459946f38abfc8cf350 100644
--- a/include/linux/mfd/da9150/core.h
+++ b/include/linux/mfd/da9150/core.h
@@ -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 */
--
2.47.1
base-commit: df2908090cda368b01ff43709f51890076c56157
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: (subset) [PATCH v2] mfd: da9150: Balance IRQ wake on teardown
2026-09-23 2:19 [PATCH v2] mfd: da9150: Balance IRQ wake on teardown Myeonghun Pak
@ 2026-09-24 14:16 ` Lee Jones
0 siblings, 0 replies; 2+ messages in thread
From: Lee Jones @ 2026-09-24 14:16 UTC (permalink / raw)
To: Lee Jones, Myeonghun Pak; +Cc: Support Opensource, linux-kernel, mfd, Ijae Kim
On Tue, 22 Sep 2026 22:19:36 -0400, Myeonghun Pak wrote:
> 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.
>
> [...]
Applied, thanks!
[1/1] mfd: da9150: Balance IRQ wake on teardown
commit: ef464f82f3aecad4071af71074b2ceb77ffbb609
--
Lee Jones [李琼斯]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-09-24 14:16 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-23 2:19 [PATCH v2] mfd: da9150: Balance IRQ wake on teardown Myeonghun Pak
2026-09-24 14:16 ` (subset) " Lee Jones
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®