xref: /linux/drivers/base/power/power.h (revision a1c613ae4c322ddd58d5a8539dbfba2a0380a8c0)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21a9a9152SRafael J. Wysocki #include <linux/pm_qos.h>
31a9a9152SRafael J. Wysocki 
device_pm_init_common(struct device * dev)4e91c11b1SRafael J. Wysocki static inline void device_pm_init_common(struct device *dev)
5e91c11b1SRafael J. Wysocki {
6bed2b42dSRafael J. Wysocki 	if (!dev->power.early_init) {
7e91c11b1SRafael J. Wysocki 		spin_lock_init(&dev->power.lock);
837530f2bSRafael J. Wysocki 		dev->power.qos = NULL;
9bed2b42dSRafael J. Wysocki 		dev->power.early_init = true;
10bed2b42dSRafael J. Wysocki 	}
11e91c11b1SRafael J. Wysocki }
12e91c11b1SRafael J. Wysocki 
13d30d819dSRafael J. Wysocki #ifdef CONFIG_PM
145e928f77SRafael J. Wysocki 
pm_runtime_early_init(struct device * dev)15bed2b42dSRafael J. Wysocki static inline void pm_runtime_early_init(struct device *dev)
16bed2b42dSRafael J. Wysocki {
17bed2b42dSRafael J. Wysocki 	dev->power.disable_depth = 1;
18bed2b42dSRafael J. Wysocki 	device_pm_init_common(dev);
19bed2b42dSRafael J. Wysocki }
20bed2b42dSRafael J. Wysocki 
215e928f77SRafael J. Wysocki extern void pm_runtime_init(struct device *dev);
225de85b9dSUlf Hansson extern void pm_runtime_reinit(struct device *dev);
235e928f77SRafael J. Wysocki extern void pm_runtime_remove(struct device *dev);
24fdc56c07SUlf Hansson extern u64 pm_runtime_active_time(struct device *dev);
255e928f77SRafael J. Wysocki 
26bed57030STony Lindgren #define WAKE_IRQ_DEDICATED_ALLOCATED	BIT(0)
27bed57030STony Lindgren #define WAKE_IRQ_DEDICATED_MANAGED	BIT(1)
2825971410SChunfeng Yun #define WAKE_IRQ_DEDICATED_REVERSE	BIT(2)
29bed57030STony Lindgren #define WAKE_IRQ_DEDICATED_MASK		(WAKE_IRQ_DEDICATED_ALLOCATED | \
3025971410SChunfeng Yun 					 WAKE_IRQ_DEDICATED_MANAGED | \
3125971410SChunfeng Yun 					 WAKE_IRQ_DEDICATED_REVERSE)
32*8527beb1SJohan Hovold #define WAKE_IRQ_DEDICATED_ENABLED	BIT(3)
33bed57030STony Lindgren 
344990d4feSTony Lindgren struct wake_irq {
354990d4feSTony Lindgren 	struct device *dev;
36bed57030STony Lindgren 	unsigned int status;
374990d4feSTony Lindgren 	int irq;
38da997b22STony Lindgren 	const char *name;
394990d4feSTony Lindgren };
404990d4feSTony Lindgren 
414990d4feSTony Lindgren extern void dev_pm_arm_wake_irq(struct wake_irq *wirq);
424990d4feSTony Lindgren extern void dev_pm_disarm_wake_irq(struct wake_irq *wirq);
43bed57030STony Lindgren extern void dev_pm_enable_wake_irq_check(struct device *dev,
44bed57030STony Lindgren 					 bool can_change_status);
4525971410SChunfeng Yun extern void dev_pm_disable_wake_irq_check(struct device *dev, bool cond_disable);
4625971410SChunfeng Yun extern void dev_pm_enable_wake_irq_complete(struct device *dev);
474990d4feSTony Lindgren 
484990d4feSTony Lindgren #ifdef CONFIG_PM_SLEEP
494990d4feSTony Lindgren 
507bf4e594SRafael J. Wysocki extern void device_wakeup_attach_irq(struct device *dev, struct wake_irq *wakeirq);
514990d4feSTony Lindgren extern void device_wakeup_detach_irq(struct device *dev);
524990d4feSTony Lindgren extern void device_wakeup_arm_wake_irqs(void);
534990d4feSTony Lindgren extern void device_wakeup_disarm_wake_irqs(void);
544990d4feSTony Lindgren 
554990d4feSTony Lindgren #else
564990d4feSTony Lindgren 
device_wakeup_attach_irq(struct device * dev,struct wake_irq * wakeirq)577bf4e594SRafael J. Wysocki static inline void device_wakeup_attach_irq(struct device *dev,
587bf4e594SRafael J. Wysocki 					    struct wake_irq *wakeirq) {}
594990d4feSTony Lindgren 
device_wakeup_detach_irq(struct device * dev)604990d4feSTony Lindgren static inline void device_wakeup_detach_irq(struct device *dev)
614990d4feSTony Lindgren {
624990d4feSTony Lindgren }
634990d4feSTony Lindgren 
644990d4feSTony Lindgren #endif /* CONFIG_PM_SLEEP */
654990d4feSTony Lindgren 
66d30d819dSRafael J. Wysocki /*
67d30d819dSRafael J. Wysocki  * sysfs.c
68d30d819dSRafael J. Wysocki  */
69d30d819dSRafael J. Wysocki 
70d30d819dSRafael J. Wysocki extern int dpm_sysfs_add(struct device *dev);
71d30d819dSRafael J. Wysocki extern void dpm_sysfs_remove(struct device *dev);
72d30d819dSRafael J. Wysocki extern void rpm_sysfs_remove(struct device *dev);
73d30d819dSRafael J. Wysocki extern int wakeup_sysfs_add(struct device *dev);
74d30d819dSRafael J. Wysocki extern void wakeup_sysfs_remove(struct device *dev);
75d30d819dSRafael J. Wysocki extern int pm_qos_sysfs_add_resume_latency(struct device *dev);
76d30d819dSRafael J. Wysocki extern void pm_qos_sysfs_remove_resume_latency(struct device *dev);
77d30d819dSRafael J. Wysocki extern int pm_qos_sysfs_add_flags(struct device *dev);
78d30d819dSRafael J. Wysocki extern void pm_qos_sysfs_remove_flags(struct device *dev);
7913b2c4a0SMika Westerberg extern int pm_qos_sysfs_add_latency_tolerance(struct device *dev);
8013b2c4a0SMika Westerberg extern void pm_qos_sysfs_remove_latency_tolerance(struct device *dev);
813b52fc5dSChristian Brauner extern int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid);
82d30d819dSRafael J. Wysocki 
83d30d819dSRafael J. Wysocki #else /* CONFIG_PM */
845e928f77SRafael J. Wysocki 
pm_runtime_early_init(struct device * dev)85bed2b42dSRafael J. Wysocki static inline void pm_runtime_early_init(struct device *dev)
86bed2b42dSRafael J. Wysocki {
87bed2b42dSRafael J. Wysocki 	device_pm_init_common(dev);
88bed2b42dSRafael J. Wysocki }
89bed2b42dSRafael J. Wysocki 
pm_runtime_init(struct device * dev)905e928f77SRafael J. Wysocki static inline void pm_runtime_init(struct device *dev) {}
pm_runtime_reinit(struct device * dev)915de85b9dSUlf Hansson static inline void pm_runtime_reinit(struct device *dev) {}
pm_runtime_remove(struct device * dev)925e928f77SRafael J. Wysocki static inline void pm_runtime_remove(struct device *dev) {}
935e928f77SRafael J. Wysocki 
dpm_sysfs_add(struct device * dev)94d30d819dSRafael J. Wysocki static inline int dpm_sysfs_add(struct device *dev) { return 0; }
dpm_sysfs_remove(struct device * dev)95d30d819dSRafael J. Wysocki static inline void dpm_sysfs_remove(struct device *dev) {}
dpm_sysfs_change_owner(struct device * dev,kuid_t kuid,kgid_t kgid)963b52fc5dSChristian Brauner static inline int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid,
973b52fc5dSChristian Brauner 					 kgid_t kgid) { return 0; }
98d30d819dSRafael J. Wysocki 
99d30d819dSRafael J. Wysocki #endif
1003b98aeafSAlan Stern 
101296699deSRafael J. Wysocki #ifdef CONFIG_PM_SLEEP
1021da177e4SLinus Torvalds 
1030e06b4a8SRafael J. Wysocki /* kernel/power/main.c */
1040e06b4a8SRafael J. Wysocki extern int pm_async_enabled;
1051da177e4SLinus Torvalds 
1060e06b4a8SRafael J. Wysocki /* drivers/base/power/main.c */
1071eede070SRafael J. Wysocki extern struct list_head dpm_list;	/* The active device list */
1081da177e4SLinus Torvalds 
to_device(struct list_head * entry)1091da177e4SLinus Torvalds static inline struct device *to_device(struct list_head *entry)
1101da177e4SLinus Torvalds {
111cd59abfcSAlan Stern 	return container_of(entry, struct device, power.entry);
1121da177e4SLinus Torvalds }
1131da177e4SLinus Torvalds 
114e91c11b1SRafael J. Wysocki extern void device_pm_sleep_init(struct device *dev);
1153b98aeafSAlan Stern extern void device_pm_add(struct device *);
1161da177e4SLinus Torvalds extern void device_pm_remove(struct device *);
117ffa6a705SCornelia Huck extern void device_pm_move_before(struct device *, struct device *);
118ffa6a705SCornelia Huck extern void device_pm_move_after(struct device *, struct device *);
119ffa6a705SCornelia Huck extern void device_pm_move_last(struct device *);
120aa8e54b5STomeu Vizoso extern void device_pm_check_callbacks(struct device *dev);
1211da177e4SLinus Torvalds 
device_pm_initialized(struct device * dev)1229ed98953SRafael J. Wysocki static inline bool device_pm_initialized(struct device *dev)
1239ed98953SRafael J. Wysocki {
1249ed98953SRafael J. Wysocki 	return dev->power.in_dpm_list;
1259ed98953SRafael J. Wysocki }
1269ed98953SRafael J. Wysocki 
127ea0d11c9SUlf Hansson /* drivers/base/power/wakeup_stats.c */
128ea0d11c9SUlf Hansson extern int wakeup_source_sysfs_add(struct device *parent,
129ea0d11c9SUlf Hansson 				   struct wakeup_source *ws);
130ea0d11c9SUlf Hansson extern void wakeup_source_sysfs_remove(struct wakeup_source *ws);
131ea0d11c9SUlf Hansson 
132ea0d11c9SUlf Hansson extern int pm_wakeup_source_sysfs_add(struct device *parent);
133ea0d11c9SUlf Hansson 
1345e928f77SRafael J. Wysocki #else /* !CONFIG_PM_SLEEP */
1355e928f77SRafael J. Wysocki 
device_pm_sleep_init(struct device * dev)136e91c11b1SRafael J. Wysocki static inline void device_pm_sleep_init(struct device *dev) {}
1375e928f77SRafael J. Wysocki 
device_pm_add(struct device * dev)13837530f2bSRafael J. Wysocki static inline void device_pm_add(struct device *dev) {}
1391a9a9152SRafael J. Wysocki 
device_pm_remove(struct device * dev)1405e928f77SRafael J. Wysocki static inline void device_pm_remove(struct device *dev)
1415e928f77SRafael J. Wysocki {
1425e928f77SRafael J. Wysocki 	pm_runtime_remove(dev);
1435e928f77SRafael J. Wysocki }
144dec13c15SDaniel Drake 
device_pm_move_before(struct device * deva,struct device * devb)145ffa6a705SCornelia Huck static inline void device_pm_move_before(struct device *deva,
146ffa6a705SCornelia Huck 					 struct device *devb) {}
device_pm_move_after(struct device * deva,struct device * devb)147ffa6a705SCornelia Huck static inline void device_pm_move_after(struct device *deva,
148ffa6a705SCornelia Huck 					struct device *devb) {}
device_pm_move_last(struct device * dev)149ffa6a705SCornelia Huck static inline void device_pm_move_last(struct device *dev) {}
150775b64d2SRafael J. Wysocki 
device_pm_check_callbacks(struct device * dev)151aa8e54b5STomeu Vizoso static inline void device_pm_check_callbacks(struct device *dev) {}
152aa8e54b5STomeu Vizoso 
device_pm_initialized(struct device * dev)1539ed98953SRafael J. Wysocki static inline bool device_pm_initialized(struct device *dev)
1549ed98953SRafael J. Wysocki {
1559ed98953SRafael J. Wysocki 	return device_is_registered(dev);
1569ed98953SRafael J. Wysocki }
1579ed98953SRafael J. Wysocki 
pm_wakeup_source_sysfs_add(struct device * parent)158ea0d11c9SUlf Hansson static inline int pm_wakeup_source_sysfs_add(struct device *parent)
159ea0d11c9SUlf Hansson {
160ea0d11c9SUlf Hansson 	return 0;
161ea0d11c9SUlf Hansson }
162ea0d11c9SUlf Hansson 
1635e928f77SRafael J. Wysocki #endif /* !CONFIG_PM_SLEEP */
164dec13c15SDaniel Drake 
device_pm_init(struct device * dev)165e91c11b1SRafael J. Wysocki static inline void device_pm_init(struct device *dev)
166e91c11b1SRafael J. Wysocki {
167e91c11b1SRafael J. Wysocki 	device_pm_init_common(dev);
168e91c11b1SRafael J. Wysocki 	device_pm_sleep_init(dev);
169e91c11b1SRafael J. Wysocki 	pm_runtime_init(dev);
170e91c11b1SRafael J. Wysocki }
171