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