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