diff options
Diffstat (limited to 'include/linux/pm.h')
| -rw-r--r-- | include/linux/pm.h | 101 | 
1 files changed, 75 insertions, 26 deletions
| diff --git a/include/linux/pm.h b/include/linux/pm.h index 1d8209c09686..f7d2be686359 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -8,6 +8,7 @@  #ifndef _LINUX_PM_H  #define _LINUX_PM_H +#include <linux/export.h>  #include <linux/list.h>  #include <linux/workqueue.h>  #include <linux/spinlock.h> @@ -300,55 +301,101 @@ struct dev_pm_ops {  	int (*runtime_idle)(struct device *dev);  }; +#define SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +	.suspend = pm_sleep_ptr(suspend_fn), \ +	.resume = pm_sleep_ptr(resume_fn), \ +	.freeze = pm_sleep_ptr(suspend_fn), \ +	.thaw = pm_sleep_ptr(resume_fn), \ +	.poweroff = pm_sleep_ptr(suspend_fn), \ +	.restore = pm_sleep_ptr(resume_fn), + +#define LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +	.suspend_late = pm_sleep_ptr(suspend_fn), \ +	.resume_early = pm_sleep_ptr(resume_fn), \ +	.freeze_late = pm_sleep_ptr(suspend_fn), \ +	.thaw_early = pm_sleep_ptr(resume_fn), \ +	.poweroff_late = pm_sleep_ptr(suspend_fn), \ +	.restore_early = pm_sleep_ptr(resume_fn), + +#define NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +	.suspend_noirq = pm_sleep_ptr(suspend_fn), \ +	.resume_noirq = pm_sleep_ptr(resume_fn), \ +	.freeze_noirq = pm_sleep_ptr(suspend_fn), \ +	.thaw_noirq = pm_sleep_ptr(resume_fn), \ +	.poweroff_noirq = pm_sleep_ptr(suspend_fn), \ +	.restore_noirq = pm_sleep_ptr(resume_fn), + +#define RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \ +	.runtime_suspend = suspend_fn, \ +	.runtime_resume = resume_fn, \ +	.runtime_idle = idle_fn, +  #ifdef CONFIG_PM_SLEEP  #define SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ -	.suspend = suspend_fn, \ -	.resume = resume_fn, \ -	.freeze = suspend_fn, \ -	.thaw = resume_fn, \ -	.poweroff = suspend_fn, \ -	.restore = resume_fn, +	SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn)  #else  #define SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn)  #endif  #ifdef CONFIG_PM_SLEEP  #define SET_LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ -	.suspend_late = suspend_fn, \ -	.resume_early = resume_fn, \ -	.freeze_late = suspend_fn, \ -	.thaw_early = resume_fn, \ -	.poweroff_late = suspend_fn, \ -	.restore_early = resume_fn, +	LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn)  #else  #define SET_LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn)  #endif  #ifdef CONFIG_PM_SLEEP  #define SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ -	.suspend_noirq = suspend_fn, \ -	.resume_noirq = resume_fn, \ -	.freeze_noirq = suspend_fn, \ -	.thaw_noirq = resume_fn, \ -	.poweroff_noirq = suspend_fn, \ -	.restore_noirq = resume_fn, +	NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn)  #else  #define SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn)  #endif  #ifdef CONFIG_PM  #define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \ -	.runtime_suspend = suspend_fn, \ -	.runtime_resume = resume_fn, \ -	.runtime_idle = idle_fn, +	RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn)  #else  #define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn)  #endif +#define _DEFINE_DEV_PM_OPS(name, \ +			   suspend_fn, resume_fn, \ +			   runtime_suspend_fn, runtime_resume_fn, idle_fn) \ +const struct dev_pm_ops name = { \ +	SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ +	RUNTIME_PM_OPS(runtime_suspend_fn, runtime_resume_fn, idle_fn) \ +} + +#ifdef CONFIG_PM +#define _EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, runtime_suspend_fn, \ +			   runtime_resume_fn, idle_fn, sec) \ +	_DEFINE_DEV_PM_OPS(name, suspend_fn, resume_fn, runtime_suspend_fn, \ +			   runtime_resume_fn, idle_fn); \ +	_EXPORT_SYMBOL(name, sec) +#else +#define _EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, runtime_suspend_fn, \ +			   runtime_resume_fn, idle_fn, sec) \ +static __maybe_unused _DEFINE_DEV_PM_OPS(__static_##name, suspend_fn, \ +					 resume_fn, runtime_suspend_fn, \ +					 runtime_resume_fn, idle_fn) +#endif +  /*   * Use this if you want to use the same suspend and resume callbacks for suspend   * to RAM and hibernation. + * + * If the underlying dev_pm_ops struct symbol has to be exported, use + * EXPORT_SIMPLE_DEV_PM_OPS() or EXPORT_GPL_SIMPLE_DEV_PM_OPS() instead.   */ +#define DEFINE_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ +	_DEFINE_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL) + +#define EXPORT_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ +	_EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL, "") +#define EXPORT_GPL_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ +	_EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL, "_gpl") + +/* Deprecated. Use DEFINE_SIMPLE_DEV_PM_OPS() instead. */  #define SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \  const struct dev_pm_ops __maybe_unused name = { \  	SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ @@ -366,6 +413,9 @@ const struct dev_pm_ops __maybe_unused name = { \   * suspend and "early" resume callback pointers, .suspend_late() and   * .resume_early(), to the same routines as .runtime_suspend() and   * .runtime_resume(), respectively (and analogously for hibernation). + * + * Deprecated. You most likely don't want this macro. Use + * DEFINE_RUNTIME_DEV_PM_OPS() instead.   */  #define UNIVERSAL_DEV_PM_OPS(name, suspend_fn, resume_fn, idle_fn) \  const struct dev_pm_ops __maybe_unused name = { \ @@ -373,11 +423,8 @@ const struct dev_pm_ops __maybe_unused name = { \  	SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \  } -#ifdef CONFIG_PM -#define pm_ptr(_ptr) (_ptr) -#else -#define pm_ptr(_ptr) NULL -#endif +#define pm_ptr(_ptr) PTR_IF(IS_ENABLED(CONFIG_PM), (_ptr)) +#define pm_sleep_ptr(_ptr) PTR_IF(IS_ENABLED(CONFIG_PM_SLEEP), (_ptr))  /*   * PM_EVENT_ messages @@ -499,6 +546,7 @@ const struct dev_pm_ops __maybe_unused name = { \   */  enum rpm_status { +	RPM_INVALID = -1,  	RPM_ACTIVE = 0,  	RPM_RESUMING,  	RPM_SUSPENDED, @@ -612,6 +660,7 @@ struct dev_pm_info {  	unsigned int		links_count;  	enum rpm_request	request;  	enum rpm_status		runtime_status; +	enum rpm_status		last_status;  	int			runtime_error;  	int			autosuspend_delay;  	u64			last_busy; |