diff options
Diffstat (limited to 'include/linux/pm_qos.h')
| -rw-r--r-- | include/linux/pm_qos.h | 155 | 
1 files changed, 155 insertions, 0 deletions
diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h new file mode 100644 index 00000000000..83b0ea302a8 --- /dev/null +++ b/include/linux/pm_qos.h @@ -0,0 +1,155 @@ +#ifndef _LINUX_PM_QOS_H +#define _LINUX_PM_QOS_H +/* interface for the pm_qos_power infrastructure of the linux kernel. + * + * Mark Gross <mgross@linux.intel.com> + */ +#include <linux/plist.h> +#include <linux/notifier.h> +#include <linux/miscdevice.h> +#include <linux/device.h> + +#define PM_QOS_RESERVED 0 +#define PM_QOS_CPU_DMA_LATENCY 1 +#define PM_QOS_NETWORK_LATENCY 2 +#define PM_QOS_NETWORK_THROUGHPUT 3 + +#define PM_QOS_NUM_CLASSES 4 +#define PM_QOS_DEFAULT_VALUE -1 + +#define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) +#define PM_QOS_NETWORK_LAT_DEFAULT_VALUE	(2000 * USEC_PER_SEC) +#define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE	0 +#define PM_QOS_DEV_LAT_DEFAULT_VALUE		0 + +struct pm_qos_request { +	struct plist_node node; +	int pm_qos_class; +}; + +struct dev_pm_qos_request { +	struct plist_node node; +	struct device *dev; +}; + +enum pm_qos_type { +	PM_QOS_UNITIALIZED, +	PM_QOS_MAX,		/* return the largest value */ +	PM_QOS_MIN		/* return the smallest value */ +}; + +/* + * Note: The lockless read path depends on the CPU accessing + * target_value atomically.  Atomic access is only guaranteed on all CPU + * types linux supports for 32 bit quantites + */ +struct pm_qos_constraints { +	struct plist_head list; +	s32 target_value;	/* Do not change to 64 bit */ +	s32 default_value; +	enum pm_qos_type type; +	struct blocking_notifier_head *notifiers; +}; + +/* Action requested to pm_qos_update_target */ +enum pm_qos_req_action { +	PM_QOS_ADD_REQ,		/* Add a new request */ +	PM_QOS_UPDATE_REQ,	/* Update an existing request */ +	PM_QOS_REMOVE_REQ	/* Remove an existing request */ +}; + +static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req) +{ +	return req->dev != 0; +} + +#ifdef CONFIG_PM +int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, +			 enum pm_qos_req_action action, int value); +void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class, +			s32 value); +void pm_qos_update_request(struct pm_qos_request *req, +			   s32 new_value); +void pm_qos_remove_request(struct pm_qos_request *req); + +int pm_qos_request(int pm_qos_class); +int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); +int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); +int pm_qos_request_active(struct pm_qos_request *req); +s32 pm_qos_read_value(struct pm_qos_constraints *c); + +s32 dev_pm_qos_read_value(struct device *dev); +int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, +			   s32 value); +int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); +int dev_pm_qos_remove_request(struct dev_pm_qos_request *req); +int dev_pm_qos_add_notifier(struct device *dev, +			    struct notifier_block *notifier); +int dev_pm_qos_remove_notifier(struct device *dev, +			       struct notifier_block *notifier); +int dev_pm_qos_add_global_notifier(struct notifier_block *notifier); +int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier); +void dev_pm_qos_constraints_init(struct device *dev); +void dev_pm_qos_constraints_destroy(struct device *dev); +#else +static inline int pm_qos_update_target(struct pm_qos_constraints *c, +				       struct plist_node *node, +				       enum pm_qos_req_action action, +				       int value) +			{ return 0; } +static inline void pm_qos_add_request(struct pm_qos_request *req, +				      int pm_qos_class, s32 value) +			{ return; } +static inline void pm_qos_update_request(struct pm_qos_request *req, +					 s32 new_value) +			{ return; } +static inline void pm_qos_remove_request(struct pm_qos_request *req) +			{ return; } + +static inline int pm_qos_request(int pm_qos_class) +			{ return 0; } +static inline int pm_qos_add_notifier(int pm_qos_class, +				      struct notifier_block *notifier) +			{ return 0; } +static inline int pm_qos_remove_notifier(int pm_qos_class, +					 struct notifier_block *notifier) +			{ return 0; } +static inline int pm_qos_request_active(struct pm_qos_request *req) +			{ return 0; } +static inline s32 pm_qos_read_value(struct pm_qos_constraints *c) +			{ return 0; } + +static inline s32 dev_pm_qos_read_value(struct device *dev) +			{ return 0; } +static inline int dev_pm_qos_add_request(struct device *dev, +					 struct dev_pm_qos_request *req, +					 s32 value) +			{ return 0; } +static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req, +					    s32 new_value) +			{ return 0; } +static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) +			{ return 0; } +static inline int dev_pm_qos_add_notifier(struct device *dev, +					  struct notifier_block *notifier) +			{ return 0; } +static inline int dev_pm_qos_remove_notifier(struct device *dev, +					     struct notifier_block *notifier) +			{ return 0; } +static inline int dev_pm_qos_add_global_notifier( +					struct notifier_block *notifier) +			{ return 0; } +static inline int dev_pm_qos_remove_global_notifier( +					struct notifier_block *notifier) +			{ return 0; } +static inline void dev_pm_qos_constraints_init(struct device *dev) +{ +	dev->power.power_state = PMSG_ON; +} +static inline void dev_pm_qos_constraints_destroy(struct device *dev) +{ +	dev->power.power_state = PMSG_INVALID; +} +#endif + +#endif  |