1 #ifndef _LINUX_PM_QOS_H 2 #define _LINUX_PM_QOS_H 3 /* interface for the pm_qos_power infrastructure of the linux kernel. 4 * 5 * Mark Gross <[email protected]> 6 */ 7 #include <linux/plist.h> 8 #include <linux/notifier.h> 9 #include <linux/miscdevice.h> 10 #include <linux/device.h> 11 12 #define PM_QOS_RESERVED 0 13 #define PM_QOS_CPU_DMA_LATENCY 1 14 #define PM_QOS_NETWORK_LATENCY 2 15 #define PM_QOS_NETWORK_THROUGHPUT 3 16 17 #define PM_QOS_NUM_CLASSES 4 18 #define PM_QOS_DEFAULT_VALUE -1 19 20 #define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) 21 #define PM_QOS_NETWORK_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) 22 #define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE 0 23 #define PM_QOS_DEV_LAT_DEFAULT_VALUE 0 24 25 struct pm_qos_request { 26 struct plist_node node; 27 int pm_qos_class; 28 }; 29 30 struct dev_pm_qos_request { 31 struct plist_node node; 32 struct device *dev; 33 }; 34 35 enum pm_qos_type { 36 PM_QOS_UNITIALIZED, 37 PM_QOS_MAX, /* return the largest value */ 38 PM_QOS_MIN /* return the smallest value */ 39 }; 40 41 /* 42 * Note: The lockless read path depends on the CPU accessing 43 * target_value atomically. Atomic access is only guaranteed on all CPU 44 * types linux supports for 32 bit quantites 45 */ 46 struct pm_qos_constraints { 47 struct plist_head list; 48 s32 target_value; /* Do not change to 64 bit */ 49 s32 default_value; 50 enum pm_qos_type type; 51 struct blocking_notifier_head *notifiers; 52 }; 53 54 /* Action requested to pm_qos_update_target */ 55 enum pm_qos_req_action { 56 PM_QOS_ADD_REQ, /* Add a new request */ 57 PM_QOS_UPDATE_REQ, /* Update an existing request */ 58 PM_QOS_REMOVE_REQ /* Remove an existing request */ 59 }; 60 61 static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req) 62 { 63 return req->dev != 0; 64 } 65 66 #ifdef CONFIG_PM 67 int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, 68 enum pm_qos_req_action action, int value); 69 void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class, 70 s32 value); 71 void pm_qos_update_request(struct pm_qos_request *req, 72 s32 new_value); 73 void pm_qos_remove_request(struct pm_qos_request *req); 74 75 int pm_qos_request(int pm_qos_class); 76 int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); 77 int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); 78 int pm_qos_request_active(struct pm_qos_request *req); 79 s32 pm_qos_read_value(struct pm_qos_constraints *c); 80 81 s32 dev_pm_qos_read_value(struct device *dev); 82 int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, 83 s32 value); 84 int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); 85 int dev_pm_qos_remove_request(struct dev_pm_qos_request *req); 86 int dev_pm_qos_add_notifier(struct device *dev, 87 struct notifier_block *notifier); 88 int dev_pm_qos_remove_notifier(struct device *dev, 89 struct notifier_block *notifier); 90 int dev_pm_qos_add_global_notifier(struct notifier_block *notifier); 91 int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier); 92 void dev_pm_qos_constraints_init(struct device *dev); 93 void dev_pm_qos_constraints_destroy(struct device *dev); 94 #else 95 static inline int pm_qos_update_target(struct pm_qos_constraints *c, 96 struct plist_node *node, 97 enum pm_qos_req_action action, 98 int value) 99 { return 0; } 100 static inline void pm_qos_add_request(struct pm_qos_request *req, 101 int pm_qos_class, s32 value) 102 { return; } 103 static inline void pm_qos_update_request(struct pm_qos_request *req, 104 s32 new_value) 105 { return; } 106 static inline void pm_qos_remove_request(struct pm_qos_request *req) 107 { return; } 108 109 static inline int pm_qos_request(int pm_qos_class) 110 { return 0; } 111 static inline int pm_qos_add_notifier(int pm_qos_class, 112 struct notifier_block *notifier) 113 { return 0; } 114 static inline int pm_qos_remove_notifier(int pm_qos_class, 115 struct notifier_block *notifier) 116 { return 0; } 117 static inline int pm_qos_request_active(struct pm_qos_request *req) 118 { return 0; } 119 static inline s32 pm_qos_read_value(struct pm_qos_constraints *c) 120 { return 0; } 121 122 static inline s32 dev_pm_qos_read_value(struct device *dev) 123 { return 0; } 124 static inline int dev_pm_qos_add_request(struct device *dev, 125 struct dev_pm_qos_request *req, 126 s32 value) 127 { return 0; } 128 static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req, 129 s32 new_value) 130 { return 0; } 131 static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) 132 { return 0; } 133 static inline int dev_pm_qos_add_notifier(struct device *dev, 134 struct notifier_block *notifier) 135 { return 0; } 136 static inline int dev_pm_qos_remove_notifier(struct device *dev, 137 struct notifier_block *notifier) 138 { return 0; } 139 static inline int dev_pm_qos_add_global_notifier( 140 struct notifier_block *notifier) 141 { return 0; } 142 static inline int dev_pm_qos_remove_global_notifier( 143 struct notifier_block *notifier) 144 { return 0; } 145 static inline void dev_pm_qos_constraints_init(struct device *dev) 146 { 147 dev->power.power_state = PMSG_ON; 148 } 149 static inline void dev_pm_qos_constraints_destroy(struct device *dev) 150 { 151 dev->power.power_state = PMSG_INVALID; 152 } 153 #endif 154 155 #endif 156