blob: 86e67e70b509db7a4e5172bee308a425b212d20e [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Rafael J. Wysocki1a9a9152011-09-29 22:29:44 +02002#include <linux/pm_qos.h>
3
Rafael J. Wysockie91c11b2012-08-06 01:44:28 +02004static inline void device_pm_init_common(struct device *dev)
5{
Rafael J. Wysockibed2b422012-08-06 01:45:11 +02006 if (!dev->power.early_init) {
7 spin_lock_init(&dev->power.lock);
Rafael J. Wysocki37530f22013-03-04 14:22:57 +01008 dev->power.qos = NULL;
Rafael J. Wysockibed2b422012-08-06 01:45:11 +02009 dev->power.early_init = true;
10 }
Rafael J. Wysockie91c11b2012-08-06 01:44:28 +020011}
12
Rafael J. Wysockid30d8192014-11-27 22:38:05 +010013#ifdef CONFIG_PM
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020014
Rafael J. Wysockibed2b422012-08-06 01:45:11 +020015static inline void pm_runtime_early_init(struct device *dev)
16{
17 dev->power.disable_depth = 1;
18 device_pm_init_common(dev);
19}
20
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020021extern void pm_runtime_init(struct device *dev);
Ulf Hansson5de85b9d2015-11-18 11:48:39 +010022extern void pm_runtime_reinit(struct device *dev);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020023extern void pm_runtime_remove(struct device *dev);
24
Tony Lindgrenbed57032016-12-05 16:38:16 -080025#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
Tony Lindgren4990d4f2015-05-18 15:40:29 -070030struct wake_irq {
31 struct device *dev;
Tony Lindgrenbed57032016-12-05 16:38:16 -080032 unsigned int status;
Tony Lindgren4990d4f2015-05-18 15:40:29 -070033 int irq;
Tony Lindgrenda997b22018-02-08 08:30:10 -080034 const char *name;
Tony Lindgren4990d4f2015-05-18 15:40:29 -070035};
36
37extern void dev_pm_arm_wake_irq(struct wake_irq *wirq);
38extern void dev_pm_disarm_wake_irq(struct wake_irq *wirq);
Tony Lindgrenbed57032016-12-05 16:38:16 -080039extern void dev_pm_enable_wake_irq_check(struct device *dev,
40 bool can_change_status);
41extern void dev_pm_disable_wake_irq_check(struct device *dev);
Tony Lindgren4990d4f2015-05-18 15:40:29 -070042
43#ifdef CONFIG_PM_SLEEP
44
Rafael J. Wysocki7bf4e592018-01-05 02:18:42 +010045extern void device_wakeup_attach_irq(struct device *dev, struct wake_irq *wakeirq);
Tony Lindgren4990d4f2015-05-18 15:40:29 -070046extern 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
Rafael J. Wysocki7bf4e592018-01-05 02:18:42 +010052static inline void device_wakeup_attach_irq(struct device *dev,
53 struct wake_irq *wakeirq) {}
Tony Lindgren4990d4f2015-05-18 15:40:29 -070054
55static inline void device_wakeup_detach_irq(struct device *dev)
56{
57}
58
59static inline void device_wakeup_arm_wake_irqs(void)
60{
61}
62
63static inline void device_wakeup_disarm_wake_irqs(void)
64{
65}
66
67#endif /* CONFIG_PM_SLEEP */
68
Rafael J. Wysockid30d8192014-11-27 22:38:05 +010069/*
70 * sysfs.c
71 */
72
73extern int dpm_sysfs_add(struct device *dev);
74extern void dpm_sysfs_remove(struct device *dev);
75extern void rpm_sysfs_remove(struct device *dev);
76extern int wakeup_sysfs_add(struct device *dev);
77extern void wakeup_sysfs_remove(struct device *dev);
78extern int pm_qos_sysfs_add_resume_latency(struct device *dev);
79extern void pm_qos_sysfs_remove_resume_latency(struct device *dev);
80extern int pm_qos_sysfs_add_flags(struct device *dev);
81extern void pm_qos_sysfs_remove_flags(struct device *dev);
Mika Westerberg13b2c4a2015-07-27 18:03:56 +030082extern int pm_qos_sysfs_add_latency_tolerance(struct device *dev);
83extern void pm_qos_sysfs_remove_latency_tolerance(struct device *dev);
Rafael J. Wysockid30d8192014-11-27 22:38:05 +010084
85#else /* CONFIG_PM */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020086
Rafael J. Wysockibed2b422012-08-06 01:45:11 +020087static inline void pm_runtime_early_init(struct device *dev)
88{
89 device_pm_init_common(dev);
90}
91
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020092static inline void pm_runtime_init(struct device *dev) {}
Ulf Hansson5de85b9d2015-11-18 11:48:39 +010093static inline void pm_runtime_reinit(struct device *dev) {}
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020094static inline void pm_runtime_remove(struct device *dev) {}
95
Rafael J. Wysockid30d8192014-11-27 22:38:05 +010096static inline int dpm_sysfs_add(struct device *dev) { return 0; }
97static inline void dpm_sysfs_remove(struct device *dev) {}
98static inline void rpm_sysfs_remove(struct device *dev) {}
99static inline int wakeup_sysfs_add(struct device *dev) { return 0; }
100static inline void wakeup_sysfs_remove(struct device *dev) {}
101static inline int pm_qos_sysfs_add(struct device *dev) { return 0; }
102static inline void pm_qos_sysfs_remove(struct device *dev) {}
103
Tony Lindgren4990d4f2015-05-18 15:40:29 -0700104static inline void dev_pm_arm_wake_irq(struct wake_irq *wirq)
105{
106}
107
108static inline void dev_pm_disarm_wake_irq(struct wake_irq *wirq)
109{
110}
111
Tony Lindgrenbed57032016-12-05 16:38:16 -0800112static inline void dev_pm_enable_wake_irq_check(struct device *dev,
113 bool can_change_status)
114{
115}
116
117static inline void dev_pm_disable_wake_irq_check(struct device *dev)
118{
119}
120
Rafael J. Wysockid30d8192014-11-27 22:38:05 +0100121#endif
Alan Stern3b98aea2008-08-07 13:06:12 -0400122
Rafael J. Wysocki296699d2007-07-29 23:27:18 +0200123#ifdef CONFIG_PM_SLEEP
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124
Rafael J. Wysocki0e06b4a2010-01-23 22:25:15 +0100125/* kernel/power/main.c */
126extern int pm_async_enabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127
Rafael J. Wysocki0e06b4a2010-01-23 22:25:15 +0100128/* drivers/base/power/main.c */
Rafael J. Wysocki1eede072008-05-20 23:00:01 +0200129extern struct list_head dpm_list; /* The active device list */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700130
Daniel Drakedec13c12007-11-21 14:55:18 -0800131static inline struct device *to_device(struct list_head *entry)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132{
Alan Sterncd59abf2007-09-21 15:36:56 -0400133 return container_of(entry, struct device, power.entry);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134}
135
Rafael J. Wysockie91c11b2012-08-06 01:44:28 +0200136extern void device_pm_sleep_init(struct device *dev);
Alan Stern3b98aea2008-08-07 13:06:12 -0400137extern void device_pm_add(struct device *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700138extern void device_pm_remove(struct device *);
Cornelia Huckffa6a702009-03-04 12:44:00 +0100139extern void device_pm_move_before(struct device *, struct device *);
140extern void device_pm_move_after(struct device *, struct device *);
141extern void device_pm_move_last(struct device *);
Tomeu Vizosoaa8e54b52016-01-07 16:46:14 +0100142extern void device_pm_check_callbacks(struct device *dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143
Rafael J. Wysocki9ed98952016-10-30 17:32:16 +0100144static inline bool device_pm_initialized(struct device *dev)
145{
146 return dev->power.in_dpm_list;
147}
148
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200149#else /* !CONFIG_PM_SLEEP */
150
Rafael J. Wysockie91c11b2012-08-06 01:44:28 +0200151static inline void device_pm_sleep_init(struct device *dev) {}
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200152
Rafael J. Wysocki37530f22013-03-04 14:22:57 +0100153static inline void device_pm_add(struct device *dev) {}
Rafael J. Wysocki1a9a9152011-09-29 22:29:44 +0200154
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200155static inline void device_pm_remove(struct device *dev)
156{
157 pm_runtime_remove(dev);
158}
Daniel Drakedec13c12007-11-21 14:55:18 -0800159
Cornelia Huckffa6a702009-03-04 12:44:00 +0100160static inline void device_pm_move_before(struct device *deva,
161 struct device *devb) {}
162static inline void device_pm_move_after(struct device *deva,
163 struct device *devb) {}
164static inline void device_pm_move_last(struct device *dev) {}
Rafael J. Wysocki775b64d2008-01-12 20:40:46 +0100165
Tomeu Vizosoaa8e54b52016-01-07 16:46:14 +0100166static inline void device_pm_check_callbacks(struct device *dev) {}
167
Rafael J. Wysocki9ed98952016-10-30 17:32:16 +0100168static inline bool device_pm_initialized(struct device *dev)
169{
170 return device_is_registered(dev);
171}
172
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200173#endif /* !CONFIG_PM_SLEEP */
Daniel Drakedec13c12007-11-21 14:55:18 -0800174
Rafael J. Wysockie91c11b2012-08-06 01:44:28 +0200175static inline void device_pm_init(struct device *dev)
176{
177 device_pm_init_common(dev);
178 device_pm_sleep_init(dev);
179 pm_runtime_init(dev);
180}