mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 13:16:22 +00:00
259714100d
When the dedicated wake IRQ is level trigger, and it uses the device's low-power status as the wakeup source, that means if the device is not in low-power state, the wake IRQ will be triggered if enabled; For this case, need enable the wake IRQ after running the device's ->runtime_suspend() which make it enter low-power state. e.g. Assume the wake IRQ is a low level trigger type, and the wakeup signal comes from the low-power status of the device. The wakeup signal is low level at running time (0), and becomes high level when the device enters low-power state (runtime_suspend (1) is called), a wakeup event at (2) make the device exit low-power state, then the wakeup signal also becomes low level. ------------------ | ^ ^| ---------------- | | -------------- |<---(0)--->|<--(1)--| (3) (2) (4) if enable the wake IRQ before running runtime_suspend during (0), a wake IRQ will arise, it causes resume immediately; it works if enable wake IRQ ( e.g. at (3) or (4)) after running ->runtime_suspend(). This patch introduces a new status WAKE_IRQ_DEDICATED_REVERSE to optionally support enabling wake IRQ after running ->runtime_suspend(). Suggested-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
/*
|
|
* pm_wakeirq.h - Device wakeirq helper functions
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
|
* kind, whether express or implied; without even the implied warranty
|
|
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef _LINUX_PM_WAKEIRQ_H
|
|
#define _LINUX_PM_WAKEIRQ_H
|
|
|
|
#ifdef CONFIG_PM
|
|
|
|
extern int dev_pm_set_wake_irq(struct device *dev, int irq);
|
|
extern int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq);
|
|
extern int dev_pm_set_dedicated_wake_irq_reverse(struct device *dev, int irq);
|
|
extern void dev_pm_clear_wake_irq(struct device *dev);
|
|
extern void dev_pm_enable_wake_irq(struct device *dev);
|
|
extern void dev_pm_disable_wake_irq(struct device *dev);
|
|
|
|
#else /* !CONFIG_PM */
|
|
|
|
static inline int dev_pm_set_wake_irq(struct device *dev, int irq)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int dev_pm_set_dedicated_wake_irq(struct device *dev, int irq)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int dev_pm_set_dedicated_wake_irq_reverse(struct device *dev, int irq)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void dev_pm_clear_wake_irq(struct device *dev)
|
|
{
|
|
}
|
|
|
|
static inline void dev_pm_enable_wake_irq(struct device *dev)
|
|
{
|
|
}
|
|
|
|
static inline void dev_pm_disable_wake_irq(struct device *dev)
|
|
{
|
|
}
|
|
|
|
#endif /* CONFIG_PM */
|
|
#endif /* _LINUX_PM_WAKEIRQ_H */
|