1124208Sdes/* SPDX-License-Identifier: GPL-2.0 */
2124208Sdes#include <linux/pm_qos.h>
3124208Sdes
4124208Sdesstatic inline void device_pm_init_common(struct device *dev)
5124208Sdes{
6124208Sdes	if (!dev->power.early_init) {
7124208Sdes		spin_lock_init(&dev->power.lock);
8124208Sdes		dev->power.qos = NULL;
9124208Sdes		dev->power.early_init = true;
10124208Sdes	}
11124208Sdes}
12124208Sdes
13124208Sdes#ifdef CONFIG_PM
14124208Sdes
15124208Sdesstatic inline void pm_runtime_early_init(struct device *dev)
16124208Sdes{
17124208Sdes	dev->power.disable_depth = 1;
18124208Sdes	device_pm_init_common(dev);
19124208Sdes}
20124208Sdes
21124208Sdesextern void pm_runtime_init(struct device *dev);
22124208Sdesextern void pm_runtime_reinit(struct device *dev);
23124208Sdesextern void pm_runtime_remove(struct device *dev);
24124208Sdesextern u64 pm_runtime_active_time(struct device *dev);
2598937Sdes
2698937Sdes#define WAKE_IRQ_DEDICATED_ALLOCATED	BIT(0)
2798937Sdes#define WAKE_IRQ_DEDICATED_MANAGED	BIT(1)
28149749Sdes#define WAKE_IRQ_DEDICATED_REVERSE	BIT(2)
2998937Sdes#define WAKE_IRQ_DEDICATED_MASK		(WAKE_IRQ_DEDICATED_ALLOCATED | \
3098937Sdes					 WAKE_IRQ_DEDICATED_MANAGED | \
3198937Sdes					 WAKE_IRQ_DEDICATED_REVERSE)
3298937Sdes#define WAKE_IRQ_DEDICATED_ENABLED	BIT(3)
3398937Sdes
3498937Sdesstruct wake_irq {
3598937Sdes	struct device *dev;
3698937Sdes	unsigned int status;
3798937Sdes	int irq;
3898937Sdes	const char *name;
3998937Sdes};
4098937Sdes
4198937Sdesextern void dev_pm_arm_wake_irq(struct wake_irq *wirq);
4298937Sdesextern void dev_pm_disarm_wake_irq(struct wake_irq *wirq);
4398937Sdesextern void dev_pm_enable_wake_irq_check(struct device *dev,
4498937Sdes					 bool can_change_status);
4598937Sdesextern void dev_pm_disable_wake_irq_check(struct device *dev, bool cond_disable);
4698937Sdesextern void dev_pm_enable_wake_irq_complete(struct device *dev);
4798937Sdes
4898937Sdes#ifdef CONFIG_PM_SLEEP
4998937Sdes
5098937Sdesextern void device_wakeup_attach_irq(struct device *dev, struct wake_irq *wakeirq);
5198937Sdesextern void device_wakeup_detach_irq(struct device *dev);
5298937Sdesextern void device_wakeup_arm_wake_irqs(void);
5398937Sdesextern void device_wakeup_disarm_wake_irqs(void);
5498937Sdes
5598937Sdes#else
5698937Sdes
57149749Sdesstatic inline void device_wakeup_attach_irq(struct device *dev,
58149749Sdes					    struct wake_irq *wakeirq) {}
59149749Sdes
60149749Sdesstatic inline void device_wakeup_detach_irq(struct device *dev)
61149749Sdes{
6298937Sdes}
6398937Sdes
6498937Sdes#endif /* CONFIG_PM_SLEEP */
65149749Sdes
66149749Sdes/*
67149749Sdes * sysfs.c
68149749Sdes */
69149749Sdes
70149749Sdesextern int dpm_sysfs_add(struct device *dev);
71149749Sdesextern void dpm_sysfs_remove(struct device *dev);
72149749Sdesextern void rpm_sysfs_remove(struct device *dev);
73149749Sdesextern int wakeup_sysfs_add(struct device *dev);
74149749Sdesextern void wakeup_sysfs_remove(struct device *dev);
7598937Sdesextern int pm_qos_sysfs_add_resume_latency(struct device *dev);
7698937Sdesextern void pm_qos_sysfs_remove_resume_latency(struct device *dev);
7798937Sdesextern int pm_qos_sysfs_add_flags(struct device *dev);
7898937Sdesextern void pm_qos_sysfs_remove_flags(struct device *dev);
7998937Sdesextern int pm_qos_sysfs_add_latency_tolerance(struct device *dev);
8098937Sdesextern void pm_qos_sysfs_remove_latency_tolerance(struct device *dev);
8198937Sdesextern int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid);
8298937Sdes
8398937Sdes#else /* CONFIG_PM */
8498937Sdes
8598937Sdesstatic inline void pm_runtime_early_init(struct device *dev)
8698937Sdes{
8798937Sdes	device_pm_init_common(dev);
8898937Sdes}
8998937Sdes
9098937Sdesstatic inline void pm_runtime_init(struct device *dev) {}
9198937Sdesstatic inline void pm_runtime_reinit(struct device *dev) {}
9298937Sdesstatic inline void pm_runtime_remove(struct device *dev) {}
9398937Sdes
9498937Sdesstatic inline int dpm_sysfs_add(struct device *dev) { return 0; }
9598937Sdesstatic inline void dpm_sysfs_remove(struct device *dev) {}
9698937Sdesstatic inline int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid,
9798937Sdes					 kgid_t kgid) { return 0; }
9898937Sdes
9998937Sdes#endif
10098937Sdes
101126274Sdes#ifdef CONFIG_PM_SLEEP
10298937Sdes
10398937Sdes/* kernel/power/main.c */
10498937Sdesextern int pm_async_enabled;
10598937Sdes
10698937Sdes/* drivers/base/power/main.c */
10798937Sdesextern struct list_head dpm_list;	/* The active device list */
10898937Sdes
10998937Sdesstatic inline struct device *to_device(struct list_head *entry)
11098937Sdes{
11198937Sdes	return container_of(entry, struct device, power.entry);
11298937Sdes}
11398937Sdes
11498937Sdesextern void device_pm_sleep_init(struct device *dev);
11598937Sdesextern void device_pm_add(struct device *);
11698937Sdesextern void device_pm_remove(struct device *);
11798937Sdesextern void device_pm_move_before(struct device *, struct device *);
11898937Sdesextern void device_pm_move_after(struct device *, struct device *);
11998937Sdesextern void device_pm_move_last(struct device *);
12098937Sdesextern void device_pm_check_callbacks(struct device *dev);
12198937Sdes
12298937Sdesstatic inline bool device_pm_initialized(struct device *dev)
12398937Sdes{
12498937Sdes	return dev->power.in_dpm_list;
12598937Sdes}
12698937Sdes
12798937Sdes/* drivers/base/power/wakeup_stats.c */
12898937Sdesextern int wakeup_source_sysfs_add(struct device *parent,
12998937Sdes				   struct wakeup_source *ws);
13098937Sdesextern void wakeup_source_sysfs_remove(struct wakeup_source *ws);
13198937Sdes
13298937Sdesextern int pm_wakeup_source_sysfs_add(struct device *parent);
13398937Sdes
13498937Sdes#else /* !CONFIG_PM_SLEEP */
13598937Sdes
13698937Sdesstatic inline void device_pm_sleep_init(struct device *dev) {}
13798937Sdes
13898937Sdesstatic inline void device_pm_add(struct device *dev) {}
13998937Sdes
14098937Sdesstatic inline void device_pm_remove(struct device *dev)
14198937Sdes{
14298937Sdes	pm_runtime_remove(dev);
143106121Sdes}
14498937Sdes
14598937Sdesstatic inline void device_pm_move_before(struct device *deva,
146126274Sdes					 struct device *devb) {}
147126274Sdesstatic inline void device_pm_move_after(struct device *deva,
148126274Sdes					struct device *devb) {}
149126274Sdesstatic inline void device_pm_move_last(struct device *dev) {}
15098937Sdes
15198937Sdesstatic inline void device_pm_check_callbacks(struct device *dev) {}
15298937Sdes
15398937Sdesstatic inline bool device_pm_initialized(struct device *dev)
15498937Sdes{
15598937Sdes	return device_is_registered(dev);
15698937Sdes}
15798937Sdes
15898937Sdesstatic inline int pm_wakeup_source_sysfs_add(struct device *parent)
15998937Sdes{
16098937Sdes	return 0;
16198937Sdes}
16298937Sdes
16398937Sdes#endif /* !CONFIG_PM_SLEEP */
16498937Sdes
16598937Sdesstatic inline void device_pm_init(struct device *dev)
16698937Sdes{
16798937Sdes	device_pm_init_common(dev);
16898937Sdes	device_pm_sleep_init(dev);
169106121Sdes	pm_runtime_init(dev);
17098937Sdes}
17198937Sdes