diff options
Diffstat (limited to 'include/linux/thermal.h')
| -rw-r--r-- | include/linux/thermal.h | 144 | 
1 files changed, 108 insertions, 36 deletions
diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 91b34812cd8..f0bd7f90a90 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -29,6 +29,32 @@  #include <linux/device.h>  #include <linux/workqueue.h> +#define THERMAL_TRIPS_NONE	-1 +#define THERMAL_MAX_TRIPS	12 +#define THERMAL_NAME_LENGTH	20 + +/* No upper/lower limit requirement */ +#define THERMAL_NO_LIMIT	-1UL + +/* Unit conversion macros */ +#define KELVIN_TO_CELSIUS(t)	(long)(((long)t-2732 >= 0) ?	\ +				((long)t-2732+5)/10 : ((long)t-2732-5)/10) +#define CELSIUS_TO_KELVIN(t)	((t)*10+2732) + +/* Adding event notification support elements */ +#define THERMAL_GENL_FAMILY_NAME                "thermal_event" +#define THERMAL_GENL_VERSION                    0x01 +#define THERMAL_GENL_MCAST_GROUP_NAME           "thermal_mc_group" + +/* Default Thermal Governor */ +#if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE) +#define DEFAULT_THERMAL_GOVERNOR       "step_wise" +#elif defined(CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE) +#define DEFAULT_THERMAL_GOVERNOR       "fair_share" +#elif defined(CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE) +#define DEFAULT_THERMAL_GOVERNOR       "user_space" +#endif +  struct thermal_zone_device;  struct thermal_cooling_device; @@ -48,7 +74,33 @@ enum thermal_trend {  	THERMAL_TREND_STABLE, /* temperature is stable */  	THERMAL_TREND_RAISING, /* temperature is raising */  	THERMAL_TREND_DROPPING, /* temperature is dropping */ +	THERMAL_TREND_RAISE_FULL, /* apply highest cooling action */ +	THERMAL_TREND_DROP_FULL, /* apply lowest cooling action */ +}; + +/* Events supported by Thermal Netlink */ +enum events { +	THERMAL_AUX0, +	THERMAL_AUX1, +	THERMAL_CRITICAL, +	THERMAL_DEV_FAULT, +}; + +/* attributes of thermal_genl_family */ +enum { +	THERMAL_GENL_ATTR_UNSPEC, +	THERMAL_GENL_ATTR_EVENT, +	__THERMAL_GENL_ATTR_MAX,  }; +#define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1) + +/* commands supported by the thermal_genl_family */ +enum { +	THERMAL_GENL_CMD_UNSPEC, +	THERMAL_GENL_CMD_EVENT, +	__THERMAL_GENL_CMD_MAX, +}; +#define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1)  struct thermal_zone_device_ops {  	int (*bind) (struct thermal_zone_device *, @@ -71,6 +123,7 @@ struct thermal_zone_device_ops {  	int (*set_trip_hyst) (struct thermal_zone_device *, int,  			      unsigned long);  	int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *); +	int (*set_emul_temp) (struct thermal_zone_device *, unsigned long);  	int (*get_trend) (struct thermal_zone_device *, int,  			  enum thermal_trend *);  	int (*notify) (struct thermal_zone_device *, int, @@ -83,11 +136,6 @@ struct thermal_cooling_device_ops {  	int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);  }; -#define THERMAL_NO_LIMIT -1UL /* no upper/lower limit requirement */ - -#define THERMAL_TRIPS_NONE -1 -#define THERMAL_MAX_TRIPS 12 -#define THERMAL_NAME_LENGTH 20  struct thermal_cooling_device {  	int id;  	char type[THERMAL_NAME_LENGTH]; @@ -100,10 +148,6 @@ struct thermal_cooling_device {  	struct list_head node;  }; -#define KELVIN_TO_CELSIUS(t)	(long)(((long)t-2732 >= 0) ?	\ -				((long)t-2732+5)/10 : ((long)t-2732-5)/10) -#define CELSIUS_TO_KELVIN(t)	((t)*10+2732) -  struct thermal_attr {  	struct device_attribute attr;  	char name[THERMAL_NAME_LENGTH]; @@ -122,49 +166,65 @@ struct thermal_zone_device {  	int polling_delay;  	int temperature;  	int last_temperature; +	int emul_temperature;  	int passive;  	unsigned int forced_passive;  	const struct thermal_zone_device_ops *ops; +	const struct thermal_zone_params *tzp; +	struct thermal_governor *governor;  	struct list_head thermal_instances;  	struct idr idr;  	struct mutex lock; /* protect thermal_instances list */  	struct list_head node;  	struct delayed_work poll_queue;  }; -/* Adding event notification support elements */ -#define THERMAL_GENL_FAMILY_NAME                "thermal_event" -#define THERMAL_GENL_VERSION                    0x01 -#define THERMAL_GENL_MCAST_GROUP_NAME           "thermal_mc_group" -enum events { -	THERMAL_AUX0, -	THERMAL_AUX1, -	THERMAL_CRITICAL, -	THERMAL_DEV_FAULT, +/* Structure that holds thermal governor information */ +struct thermal_governor { +	char name[THERMAL_NAME_LENGTH]; +	int (*throttle)(struct thermal_zone_device *tz, int trip); +	struct list_head	governor_list; +	struct module		*owner;  }; -struct thermal_genl_event { -	u32 orig; -	enum events event; +/* Structure that holds binding parameters for a zone */ +struct thermal_bind_params { +	struct thermal_cooling_device *cdev; + +	/* +	 * This is a measure of 'how effectively these devices can +	 * cool 'this' thermal zone. The shall be determined by platform +	 * characterization. This is on a 'percentage' scale. +	 * See Documentation/thermal/sysfs-api.txt for more information. +	 */ +	int weight; + +	/* +	 * This is a bit mask that gives the binding relation between this +	 * thermal zone and cdev, for a particular trip point. +	 * See Documentation/thermal/sysfs-api.txt for more information. +	 */ +	int trip_mask; +	int (*match) (struct thermal_zone_device *tz, +			struct thermal_cooling_device *cdev);  }; -/* attributes of thermal_genl_family */ -enum { -	THERMAL_GENL_ATTR_UNSPEC, -	THERMAL_GENL_ATTR_EVENT, -	__THERMAL_GENL_ATTR_MAX, + +/* Structure to define Thermal Zone parameters */ +struct thermal_zone_params { +	char governor_name[THERMAL_NAME_LENGTH]; +	int num_tbps;	/* Number of tbp entries */ +	struct thermal_bind_params *tbp;  }; -#define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1) -/* commands supported by the thermal_genl_family */ -enum { -	THERMAL_GENL_CMD_UNSPEC, -	THERMAL_GENL_CMD_EVENT, -	__THERMAL_GENL_CMD_MAX, +struct thermal_genl_event { +	u32 orig; +	enum events event;  }; -#define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1) +/* Function declarations */  struct thermal_zone_device *thermal_zone_device_register(const char *, int, int, -		void *, const struct thermal_zone_device_ops *, int, int); +		void *, const struct thermal_zone_device_ops *, +		const struct thermal_zone_params *, int, int);  void thermal_zone_device_unregister(struct thermal_zone_device *);  int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int, @@ -173,14 +233,26 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,  int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,  				       struct thermal_cooling_device *);  void thermal_zone_device_update(struct thermal_zone_device *); +  struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,  		const struct thermal_cooling_device_ops *);  void thermal_cooling_device_unregister(struct thermal_cooling_device *); +int get_tz_trend(struct thermal_zone_device *, int); +struct thermal_instance *get_thermal_instance(struct thermal_zone_device *, +		struct thermal_cooling_device *, int); +void thermal_cdev_update(struct thermal_cooling_device *); +void notify_thermal_framework(struct thermal_zone_device *, int); + +int thermal_register_governor(struct thermal_governor *); +void thermal_unregister_governor(struct thermal_governor *); +  #ifdef CONFIG_NET -extern int thermal_generate_netlink_event(u32 orig, enum events event); +extern int thermal_generate_netlink_event(struct thermal_zone_device *tz, +						enum events event);  #else -static inline int thermal_generate_netlink_event(u32 orig, enum events event) +static int thermal_generate_netlink_event(struct thermal_zone_device *tz, +						enum events event)  {  	return 0;  }  |