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