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