at v3.2 5.1 kB view raw
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 <mgross@linux.intel.com> 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 25struct pm_qos_request { 26 struct plist_node node; 27 int pm_qos_class; 28}; 29 30struct dev_pm_qos_request { 31 struct plist_node node; 32 struct device *dev; 33}; 34 35enum 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 */ 46struct 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 */ 55enum 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 61static 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 67int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, 68 enum pm_qos_req_action action, int value); 69void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class, 70 s32 value); 71void pm_qos_update_request(struct pm_qos_request *req, 72 s32 new_value); 73void pm_qos_remove_request(struct pm_qos_request *req); 74 75int pm_qos_request(int pm_qos_class); 76int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); 77int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); 78int pm_qos_request_active(struct pm_qos_request *req); 79s32 pm_qos_read_value(struct pm_qos_constraints *c); 80 81s32 dev_pm_qos_read_value(struct device *dev); 82int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, 83 s32 value); 84int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); 85int dev_pm_qos_remove_request(struct dev_pm_qos_request *req); 86int dev_pm_qos_add_notifier(struct device *dev, 87 struct notifier_block *notifier); 88int dev_pm_qos_remove_notifier(struct device *dev, 89 struct notifier_block *notifier); 90int dev_pm_qos_add_global_notifier(struct notifier_block *notifier); 91int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier); 92void dev_pm_qos_constraints_init(struct device *dev); 93void dev_pm_qos_constraints_destroy(struct device *dev); 94#else 95static 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; } 100static inline void pm_qos_add_request(struct pm_qos_request *req, 101 int pm_qos_class, s32 value) 102 { return; } 103static inline void pm_qos_update_request(struct pm_qos_request *req, 104 s32 new_value) 105 { return; } 106static inline void pm_qos_remove_request(struct pm_qos_request *req) 107 { return; } 108 109static inline int pm_qos_request(int pm_qos_class) 110 { return 0; } 111static inline int pm_qos_add_notifier(int pm_qos_class, 112 struct notifier_block *notifier) 113 { return 0; } 114static inline int pm_qos_remove_notifier(int pm_qos_class, 115 struct notifier_block *notifier) 116 { return 0; } 117static inline int pm_qos_request_active(struct pm_qos_request *req) 118 { return 0; } 119static inline s32 pm_qos_read_value(struct pm_qos_constraints *c) 120 { return 0; } 121 122static inline s32 dev_pm_qos_read_value(struct device *dev) 123 { return 0; } 124static inline int dev_pm_qos_add_request(struct device *dev, 125 struct dev_pm_qos_request *req, 126 s32 value) 127 { return 0; } 128static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req, 129 s32 new_value) 130 { return 0; } 131static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) 132 { return 0; } 133static inline int dev_pm_qos_add_notifier(struct device *dev, 134 struct notifier_block *notifier) 135 { return 0; } 136static inline int dev_pm_qos_remove_notifier(struct device *dev, 137 struct notifier_block *notifier) 138 { return 0; } 139static inline int dev_pm_qos_add_global_notifier( 140 struct notifier_block *notifier) 141 { return 0; } 142static inline int dev_pm_qos_remove_global_notifier( 143 struct notifier_block *notifier) 144 { return 0; } 145static inline void dev_pm_qos_constraints_init(struct device *dev) 146{ 147 dev->power.power_state = PMSG_ON; 148} 149static inline void dev_pm_qos_constraints_destroy(struct device *dev) 150{ 151 dev->power.power_state = PMSG_INVALID; 152} 153#endif 154 155#endif