xref: /OK3568_Linux_fs/kernel/drivers/base/power/power.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #include <linux/pm_qos.h>
3*4882a593Smuzhiyun 
device_pm_init_common(struct device * dev)4*4882a593Smuzhiyun static inline void device_pm_init_common(struct device *dev)
5*4882a593Smuzhiyun {
6*4882a593Smuzhiyun 	if (!dev->power.early_init) {
7*4882a593Smuzhiyun 		spin_lock_init(&dev->power.lock);
8*4882a593Smuzhiyun 		dev->power.qos = NULL;
9*4882a593Smuzhiyun 		dev->power.early_init = true;
10*4882a593Smuzhiyun 	}
11*4882a593Smuzhiyun }
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #ifdef CONFIG_PM
14*4882a593Smuzhiyun 
pm_runtime_early_init(struct device * dev)15*4882a593Smuzhiyun static inline void pm_runtime_early_init(struct device *dev)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun 	dev->power.disable_depth = 1;
18*4882a593Smuzhiyun 	device_pm_init_common(dev);
19*4882a593Smuzhiyun }
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun extern void pm_runtime_init(struct device *dev);
22*4882a593Smuzhiyun extern void pm_runtime_reinit(struct device *dev);
23*4882a593Smuzhiyun extern void pm_runtime_remove(struct device *dev);
24*4882a593Smuzhiyun extern u64 pm_runtime_active_time(struct device *dev);
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define WAKE_IRQ_DEDICATED_ALLOCATED	BIT(0)
27*4882a593Smuzhiyun #define WAKE_IRQ_DEDICATED_MANAGED	BIT(1)
28*4882a593Smuzhiyun #define WAKE_IRQ_DEDICATED_MASK		(WAKE_IRQ_DEDICATED_ALLOCATED | \
29*4882a593Smuzhiyun 					 WAKE_IRQ_DEDICATED_MANAGED)
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun struct wake_irq {
32*4882a593Smuzhiyun 	struct device *dev;
33*4882a593Smuzhiyun 	unsigned int status;
34*4882a593Smuzhiyun 	int irq;
35*4882a593Smuzhiyun 	const char *name;
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun extern void dev_pm_arm_wake_irq(struct wake_irq *wirq);
39*4882a593Smuzhiyun extern void dev_pm_disarm_wake_irq(struct wake_irq *wirq);
40*4882a593Smuzhiyun extern void dev_pm_enable_wake_irq_check(struct device *dev,
41*4882a593Smuzhiyun 					 bool can_change_status);
42*4882a593Smuzhiyun extern void dev_pm_disable_wake_irq_check(struct device *dev);
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun extern void device_wakeup_attach_irq(struct device *dev, struct wake_irq *wakeirq);
47*4882a593Smuzhiyun extern void device_wakeup_detach_irq(struct device *dev);
48*4882a593Smuzhiyun extern void device_wakeup_arm_wake_irqs(void);
49*4882a593Smuzhiyun extern void device_wakeup_disarm_wake_irqs(void);
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #else
52*4882a593Smuzhiyun 
device_wakeup_attach_irq(struct device * dev,struct wake_irq * wakeirq)53*4882a593Smuzhiyun static inline void device_wakeup_attach_irq(struct device *dev,
54*4882a593Smuzhiyun 					    struct wake_irq *wakeirq) {}
55*4882a593Smuzhiyun 
device_wakeup_detach_irq(struct device * dev)56*4882a593Smuzhiyun static inline void device_wakeup_detach_irq(struct device *dev)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #endif /* CONFIG_PM_SLEEP */
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /*
63*4882a593Smuzhiyun  * sysfs.c
64*4882a593Smuzhiyun  */
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun extern int dpm_sysfs_add(struct device *dev);
67*4882a593Smuzhiyun extern void dpm_sysfs_remove(struct device *dev);
68*4882a593Smuzhiyun extern void rpm_sysfs_remove(struct device *dev);
69*4882a593Smuzhiyun extern int wakeup_sysfs_add(struct device *dev);
70*4882a593Smuzhiyun extern void wakeup_sysfs_remove(struct device *dev);
71*4882a593Smuzhiyun extern int pm_qos_sysfs_add_resume_latency(struct device *dev);
72*4882a593Smuzhiyun extern void pm_qos_sysfs_remove_resume_latency(struct device *dev);
73*4882a593Smuzhiyun extern int pm_qos_sysfs_add_flags(struct device *dev);
74*4882a593Smuzhiyun extern void pm_qos_sysfs_remove_flags(struct device *dev);
75*4882a593Smuzhiyun extern int pm_qos_sysfs_add_latency_tolerance(struct device *dev);
76*4882a593Smuzhiyun extern void pm_qos_sysfs_remove_latency_tolerance(struct device *dev);
77*4882a593Smuzhiyun extern int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #else /* CONFIG_PM */
80*4882a593Smuzhiyun 
pm_runtime_early_init(struct device * dev)81*4882a593Smuzhiyun static inline void pm_runtime_early_init(struct device *dev)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun 	device_pm_init_common(dev);
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun 
pm_runtime_init(struct device * dev)86*4882a593Smuzhiyun static inline void pm_runtime_init(struct device *dev) {}
pm_runtime_reinit(struct device * dev)87*4882a593Smuzhiyun static inline void pm_runtime_reinit(struct device *dev) {}
pm_runtime_remove(struct device * dev)88*4882a593Smuzhiyun static inline void pm_runtime_remove(struct device *dev) {}
89*4882a593Smuzhiyun 
dpm_sysfs_add(struct device * dev)90*4882a593Smuzhiyun static inline int dpm_sysfs_add(struct device *dev) { return 0; }
dpm_sysfs_remove(struct device * dev)91*4882a593Smuzhiyun static inline void dpm_sysfs_remove(struct device *dev) {}
dpm_sysfs_change_owner(struct device * dev,kuid_t kuid,kgid_t kgid)92*4882a593Smuzhiyun static inline int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid,
93*4882a593Smuzhiyun 					 kgid_t kgid) { return 0; }
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #endif
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun /* kernel/power/main.c */
100*4882a593Smuzhiyun extern int pm_async_enabled;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /* drivers/base/power/main.c */
103*4882a593Smuzhiyun extern struct list_head dpm_list;	/* The active device list */
104*4882a593Smuzhiyun 
to_device(struct list_head * entry)105*4882a593Smuzhiyun static inline struct device *to_device(struct list_head *entry)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun 	return container_of(entry, struct device, power.entry);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun extern void device_pm_sleep_init(struct device *dev);
111*4882a593Smuzhiyun extern void device_pm_add(struct device *);
112*4882a593Smuzhiyun extern void device_pm_remove(struct device *);
113*4882a593Smuzhiyun extern void device_pm_move_before(struct device *, struct device *);
114*4882a593Smuzhiyun extern void device_pm_move_after(struct device *, struct device *);
115*4882a593Smuzhiyun extern void device_pm_move_last(struct device *);
116*4882a593Smuzhiyun extern void device_pm_check_callbacks(struct device *dev);
117*4882a593Smuzhiyun 
device_pm_initialized(struct device * dev)118*4882a593Smuzhiyun static inline bool device_pm_initialized(struct device *dev)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun 	return dev->power.in_dpm_list;
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* drivers/base/power/wakeup_stats.c */
124*4882a593Smuzhiyun extern int wakeup_source_sysfs_add(struct device *parent,
125*4882a593Smuzhiyun 				   struct wakeup_source *ws);
126*4882a593Smuzhiyun extern void wakeup_source_sysfs_remove(struct wakeup_source *ws);
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun extern int pm_wakeup_source_sysfs_add(struct device *parent);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #else /* !CONFIG_PM_SLEEP */
131*4882a593Smuzhiyun 
device_pm_sleep_init(struct device * dev)132*4882a593Smuzhiyun static inline void device_pm_sleep_init(struct device *dev) {}
133*4882a593Smuzhiyun 
device_pm_add(struct device * dev)134*4882a593Smuzhiyun static inline void device_pm_add(struct device *dev) {}
135*4882a593Smuzhiyun 
device_pm_remove(struct device * dev)136*4882a593Smuzhiyun static inline void device_pm_remove(struct device *dev)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun 	pm_runtime_remove(dev);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun 
device_pm_move_before(struct device * deva,struct device * devb)141*4882a593Smuzhiyun static inline void device_pm_move_before(struct device *deva,
142*4882a593Smuzhiyun 					 struct device *devb) {}
device_pm_move_after(struct device * deva,struct device * devb)143*4882a593Smuzhiyun static inline void device_pm_move_after(struct device *deva,
144*4882a593Smuzhiyun 					struct device *devb) {}
device_pm_move_last(struct device * dev)145*4882a593Smuzhiyun static inline void device_pm_move_last(struct device *dev) {}
146*4882a593Smuzhiyun 
device_pm_check_callbacks(struct device * dev)147*4882a593Smuzhiyun static inline void device_pm_check_callbacks(struct device *dev) {}
148*4882a593Smuzhiyun 
device_pm_initialized(struct device * dev)149*4882a593Smuzhiyun static inline bool device_pm_initialized(struct device *dev)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun 	return device_is_registered(dev);
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun 
pm_wakeup_source_sysfs_add(struct device * parent)154*4882a593Smuzhiyun static inline int pm_wakeup_source_sysfs_add(struct device *parent)
155*4882a593Smuzhiyun {
156*4882a593Smuzhiyun 	return 0;
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun #endif /* !CONFIG_PM_SLEEP */
160*4882a593Smuzhiyun 
device_pm_init(struct device * dev)161*4882a593Smuzhiyun static inline void device_pm_init(struct device *dev)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun 	device_pm_init_common(dev);
164*4882a593Smuzhiyun 	device_pm_sleep_init(dev);
165*4882a593Smuzhiyun 	pm_runtime_init(dev);
166*4882a593Smuzhiyun }
167