]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
1a9a9152 RW |
2 | #include <linux/pm_qos.h> |
3 | ||
e91c11b1 RW |
4 | static inline void device_pm_init_common(struct device *dev) |
5 | { | |
bed2b42d RW |
6 | if (!dev->power.early_init) { |
7 | spin_lock_init(&dev->power.lock); | |
37530f2b | 8 | dev->power.qos = NULL; |
bed2b42d RW |
9 | dev->power.early_init = true; |
10 | } | |
e91c11b1 RW |
11 | } |
12 | ||
d30d819d | 13 | #ifdef CONFIG_PM |
5e928f77 | 14 | |
bed2b42d RW |
15 | static inline void pm_runtime_early_init(struct device *dev) |
16 | { | |
17 | dev->power.disable_depth = 1; | |
18 | device_pm_init_common(dev); | |
19 | } | |
20 | ||
5e928f77 | 21 | extern void pm_runtime_init(struct device *dev); |
5de85b9d | 22 | extern void pm_runtime_reinit(struct device *dev); |
5e928f77 RW |
23 | extern void pm_runtime_remove(struct device *dev); |
24 | ||
bed57030 TL |
25 | #define WAKE_IRQ_DEDICATED_ALLOCATED BIT(0) |
26 | #define WAKE_IRQ_DEDICATED_MANAGED BIT(1) | |
27 | #define WAKE_IRQ_DEDICATED_MASK (WAKE_IRQ_DEDICATED_ALLOCATED | \ | |
28 | WAKE_IRQ_DEDICATED_MANAGED) | |
29 | ||
4990d4fe TL |
30 | struct wake_irq { |
31 | struct device *dev; | |
bed57030 | 32 | unsigned int status; |
4990d4fe | 33 | int irq; |
4990d4fe TL |
34 | }; |
35 | ||
36 | extern void dev_pm_arm_wake_irq(struct wake_irq *wirq); | |
37 | extern void dev_pm_disarm_wake_irq(struct wake_irq *wirq); | |
bed57030 TL |
38 | extern void dev_pm_enable_wake_irq_check(struct device *dev, |
39 | bool can_change_status); | |
40 | extern void dev_pm_disable_wake_irq_check(struct device *dev); | |
4990d4fe TL |
41 | |
42 | #ifdef CONFIG_PM_SLEEP | |
43 | ||
44 | extern int device_wakeup_attach_irq(struct device *dev, | |
45 | struct wake_irq *wakeirq); | |
46 | extern void device_wakeup_detach_irq(struct device *dev); | |
47 | extern void device_wakeup_arm_wake_irqs(void); | |
48 | extern void device_wakeup_disarm_wake_irqs(void); | |
49 | ||
50 | #else | |
51 | ||
52 | static inline int | |
53 | device_wakeup_attach_irq(struct device *dev, | |
54 | struct wake_irq *wakeirq) | |
55 | { | |
56 | return 0; | |
57 | } | |
58 | ||
59 | static inline void device_wakeup_detach_irq(struct device *dev) | |
60 | { | |
61 | } | |
62 | ||
63 | static inline void device_wakeup_arm_wake_irqs(void) | |
64 | { | |
65 | } | |
66 | ||
67 | static inline void device_wakeup_disarm_wake_irqs(void) | |
68 | { | |
69 | } | |
70 | ||
71 | #endif /* CONFIG_PM_SLEEP */ | |
72 | ||
d30d819d RW |
73 | /* |
74 | * sysfs.c | |
75 | */ | |
76 | ||
77 | extern int dpm_sysfs_add(struct device *dev); | |
78 | extern void dpm_sysfs_remove(struct device *dev); | |
79 | extern void rpm_sysfs_remove(struct device *dev); | |
80 | extern int wakeup_sysfs_add(struct device *dev); | |
81 | extern void wakeup_sysfs_remove(struct device *dev); | |
82 | extern int pm_qos_sysfs_add_resume_latency(struct device *dev); | |
83 | extern void pm_qos_sysfs_remove_resume_latency(struct device *dev); | |
84 | extern int pm_qos_sysfs_add_flags(struct device *dev); | |
85 | extern void pm_qos_sysfs_remove_flags(struct device *dev); | |
13b2c4a0 MW |
86 | extern int pm_qos_sysfs_add_latency_tolerance(struct device *dev); |
87 | extern void pm_qos_sysfs_remove_latency_tolerance(struct device *dev); | |
d30d819d RW |
88 | |
89 | #else /* CONFIG_PM */ | |
5e928f77 | 90 | |
bed2b42d RW |
91 | static inline void pm_runtime_early_init(struct device *dev) |
92 | { | |
93 | device_pm_init_common(dev); | |
94 | } | |
95 | ||
5e928f77 | 96 | static inline void pm_runtime_init(struct device *dev) {} |
5de85b9d | 97 | static inline void pm_runtime_reinit(struct device *dev) {} |
5e928f77 RW |
98 | static inline void pm_runtime_remove(struct device *dev) {} |
99 | ||
d30d819d RW |
100 | static inline int dpm_sysfs_add(struct device *dev) { return 0; } |
101 | static inline void dpm_sysfs_remove(struct device *dev) {} | |
102 | static inline void rpm_sysfs_remove(struct device *dev) {} | |
103 | static inline int wakeup_sysfs_add(struct device *dev) { return 0; } | |
104 | static inline void wakeup_sysfs_remove(struct device *dev) {} | |
105 | static inline int pm_qos_sysfs_add(struct device *dev) { return 0; } | |
106 | static inline void pm_qos_sysfs_remove(struct device *dev) {} | |
107 | ||
4990d4fe TL |
108 | static inline void dev_pm_arm_wake_irq(struct wake_irq *wirq) |
109 | { | |
110 | } | |
111 | ||
112 | static inline void dev_pm_disarm_wake_irq(struct wake_irq *wirq) | |
113 | { | |
114 | } | |
115 | ||
bed57030 TL |
116 | static inline void dev_pm_enable_wake_irq_check(struct device *dev, |
117 | bool can_change_status) | |
118 | { | |
119 | } | |
120 | ||
121 | static inline void dev_pm_disable_wake_irq_check(struct device *dev) | |
122 | { | |
123 | } | |
124 | ||
d30d819d | 125 | #endif |
3b98aeaf | 126 | |
296699de | 127 | #ifdef CONFIG_PM_SLEEP |
1da177e4 | 128 | |
0e06b4a8 RW |
129 | /* kernel/power/main.c */ |
130 | extern int pm_async_enabled; | |
1da177e4 | 131 | |
0e06b4a8 | 132 | /* drivers/base/power/main.c */ |
1eede070 | 133 | extern struct list_head dpm_list; /* The active device list */ |
1da177e4 | 134 | |
dec13c15 | 135 | static inline struct device *to_device(struct list_head *entry) |
1da177e4 | 136 | { |
cd59abfc | 137 | return container_of(entry, struct device, power.entry); |
1da177e4 LT |
138 | } |
139 | ||
e91c11b1 | 140 | extern void device_pm_sleep_init(struct device *dev); |
3b98aeaf | 141 | extern void device_pm_add(struct device *); |
1da177e4 | 142 | extern void device_pm_remove(struct device *); |
ffa6a705 CH |
143 | extern void device_pm_move_before(struct device *, struct device *); |
144 | extern void device_pm_move_after(struct device *, struct device *); | |
145 | extern void device_pm_move_last(struct device *); | |
aa8e54b5 | 146 | extern void device_pm_check_callbacks(struct device *dev); |
1da177e4 | 147 | |
9ed98953 RW |
148 | static inline bool device_pm_initialized(struct device *dev) |
149 | { | |
150 | return dev->power.in_dpm_list; | |
151 | } | |
152 | ||
5e928f77 RW |
153 | #else /* !CONFIG_PM_SLEEP */ |
154 | ||
e91c11b1 | 155 | static inline void device_pm_sleep_init(struct device *dev) {} |
5e928f77 | 156 | |
37530f2b | 157 | static inline void device_pm_add(struct device *dev) {} |
1a9a9152 | 158 | |
5e928f77 RW |
159 | static inline void device_pm_remove(struct device *dev) |
160 | { | |
161 | pm_runtime_remove(dev); | |
162 | } | |
dec13c15 | 163 | |
ffa6a705 CH |
164 | static inline void device_pm_move_before(struct device *deva, |
165 | struct device *devb) {} | |
166 | static inline void device_pm_move_after(struct device *deva, | |
167 | struct device *devb) {} | |
168 | static inline void device_pm_move_last(struct device *dev) {} | |
775b64d2 | 169 | |
aa8e54b5 TV |
170 | static inline void device_pm_check_callbacks(struct device *dev) {} |
171 | ||
9ed98953 RW |
172 | static inline bool device_pm_initialized(struct device *dev) |
173 | { | |
174 | return device_is_registered(dev); | |
175 | } | |
176 | ||
5e928f77 | 177 | #endif /* !CONFIG_PM_SLEEP */ |
dec13c15 | 178 | |
e91c11b1 RW |
179 | static inline void device_pm_init(struct device *dev) |
180 | { | |
181 | device_pm_init_common(dev); | |
182 | device_pm_sleep_init(dev); | |
183 | pm_runtime_init(dev); | |
184 | } |