Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #include <linux/pm_qos.h> 3 : : 4 : 8740 : static inline void device_pm_init_common(struct device *dev) 5 : : { 6 : 8740 : if (!dev->power.early_init) { 7 : 8740 : spin_lock_init(&dev->power.lock); 8 : 8740 : dev->power.qos = NULL; 9 : 8740 : 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_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 : 7364 : static inline struct device *to_device(struct list_head *entry) 103 : : { 104 [ - - + - ]: 7364 : 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 : 0 : static inline bool device_pm_initialized(struct device *dev) 116 : : { 117 [ # # # # ]: 0 : return dev->power.in_dpm_list; 118 : : } 119 : : 120 : : /* drivers/base/power/wakeup_stats.c */ 121 : : extern int wakeup_source_sysfs_add(struct device *parent, 122 : : struct wakeup_source *ws); 123 : : extern void wakeup_source_sysfs_remove(struct wakeup_source *ws); 124 : : 125 : : extern int pm_wakeup_source_sysfs_add(struct device *parent); 126 : : 127 : : #else /* !CONFIG_PM_SLEEP */ 128 : : 129 : : static inline void device_pm_sleep_init(struct device *dev) {} 130 : : 131 : : static inline void device_pm_add(struct device *dev) {} 132 : : 133 : : static inline void device_pm_remove(struct device *dev) 134 : : { 135 : : pm_runtime_remove(dev); 136 : : } 137 : : 138 : : static inline void device_pm_move_before(struct device *deva, 139 : : struct device *devb) {} 140 : : static inline void device_pm_move_after(struct device *deva, 141 : : struct device *devb) {} 142 : : static inline void device_pm_move_last(struct device *dev) {} 143 : : 144 : : static inline void device_pm_check_callbacks(struct device *dev) {} 145 : : 146 : : static inline bool device_pm_initialized(struct device *dev) 147 : : { 148 : : return device_is_registered(dev); 149 : : } 150 : : 151 : : static inline int pm_wakeup_source_sysfs_add(struct device *parent) 152 : : { 153 : : return 0; 154 : : } 155 : : 156 : : #endif /* !CONFIG_PM_SLEEP */ 157 : : 158 : 8740 : static inline void device_pm_init(struct device *dev) 159 : : { 160 [ + - ]: 8740 : device_pm_init_common(dev); 161 : 8740 : device_pm_sleep_init(dev); 162 : 8740 : pm_runtime_init(dev); 163 : 8740 : }