Skip to content

Commit fd8318a

Browse files
MrVanrafaeljw
authored andcommitted
PM: sleep: wakeirq: Introduce device-managed variant of dev_pm_set_wake_irq()
Add device-managed variant of dev_pm_set_wake_irq which automatically clear the wake irq on device destruction to simplify error handling and resource management in drivers. Signed-off-by: Peng Fan <peng.fan@nxp.com> Link: https://patch.msgid.link/20250103-wake_irq-v2-1-e3aeff5e9966@nxp.com Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent 56cabb9 commit fd8318a

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

drivers/base/power/wakeirq.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,32 @@ void dev_pm_clear_wake_irq(struct device *dev)
103103
}
104104
EXPORT_SYMBOL_GPL(dev_pm_clear_wake_irq);
105105

106+
static void devm_pm_clear_wake_irq(void *dev)
107+
{
108+
dev_pm_clear_wake_irq(dev);
109+
}
110+
111+
/**
112+
* devm_pm_set_wake_irq - device-managed variant of dev_pm_set_wake_irq
113+
* @dev: Device entry
114+
* @irq: Device IO interrupt
115+
*
116+
*
117+
* Attach a device IO interrupt as a wake IRQ, same with dev_pm_set_wake_irq,
118+
* but the device will be auto clear wake capability on driver detach.
119+
*/
120+
int devm_pm_set_wake_irq(struct device *dev, int irq)
121+
{
122+
int ret;
123+
124+
ret = dev_pm_set_wake_irq(dev, irq);
125+
if (ret)
126+
return ret;
127+
128+
return devm_add_action_or_reset(dev, devm_pm_clear_wake_irq, dev);
129+
}
130+
EXPORT_SYMBOL_GPL(devm_pm_set_wake_irq);
131+
106132
/**
107133
* handle_threaded_wake_irq - Handler for dedicated wake-up interrupts
108134
* @irq: Device specific dedicated wake-up interrupt

include/linux/pm_wakeirq.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ extern int dev_pm_set_wake_irq(struct device *dev, int irq);
1010
extern int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq);
1111
extern int dev_pm_set_dedicated_wake_irq_reverse(struct device *dev, int irq);
1212
extern void dev_pm_clear_wake_irq(struct device *dev);
13+
extern int devm_pm_set_wake_irq(struct device *dev, int irq);
1314

1415
#else /* !CONFIG_PM */
1516

@@ -32,5 +33,10 @@ static inline void dev_pm_clear_wake_irq(struct device *dev)
3233
{
3334
}
3435

36+
static inline int devm_pm_set_wake_irq(struct device *dev, int irq)
37+
{
38+
return 0;
39+
}
40+
3541
#endif /* CONFIG_PM */
3642
#endif /* _LINUX_PM_WAKEIRQ_H */

0 commit comments

Comments
 (0)