thermal.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * thermal.h ($Revision: 0 $)
  3. *
  4. * Copyright (C) 2008 Intel Corp
  5. * Copyright (C) 2008 Zhang Rui <rui.zhang@intel.com>
  6. * Copyright (C) 2008 Sujith Thomas <sujith.thomas@intel.com>
  7. *
  8. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; version 2 of the License.
  12. *
  13. * This program is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  21. *
  22. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  23. */
  24. #ifndef __THERMAL_H__
  25. #define __THERMAL_H__
  26. #include <linux/idr.h>
  27. #include <linux/device.h>
  28. #include <linux/workqueue.h>
  29. #define THERMAL_TRIPS_NONE -1
  30. #define THERMAL_MAX_TRIPS 12
  31. #define THERMAL_NAME_LENGTH 20
  32. /* No upper/lower limit requirement */
  33. #define THERMAL_NO_LIMIT -1UL
  34. /* Unit conversion macros */
  35. #define KELVIN_TO_CELSIUS(t) (long)(((long)t-2732 >= 0) ? \
  36. ((long)t-2732+5)/10 : ((long)t-2732-5)/10)
  37. #define CELSIUS_TO_KELVIN(t) ((t)*10+2732)
  38. /* Adding event notification support elements */
  39. #define THERMAL_GENL_FAMILY_NAME "thermal_event"
  40. #define THERMAL_GENL_VERSION 0x01
  41. #define THERMAL_GENL_MCAST_GROUP_NAME "thermal_mc_group"
  42. struct thermal_zone_device;
  43. struct thermal_cooling_device;
  44. enum thermal_device_mode {
  45. THERMAL_DEVICE_DISABLED = 0,
  46. THERMAL_DEVICE_ENABLED,
  47. };
  48. enum thermal_trip_type {
  49. THERMAL_TRIP_ACTIVE = 0,
  50. THERMAL_TRIP_PASSIVE,
  51. THERMAL_TRIP_HOT,
  52. THERMAL_TRIP_CRITICAL,
  53. };
  54. enum thermal_trend {
  55. THERMAL_TREND_STABLE, /* temperature is stable */
  56. THERMAL_TREND_RAISING, /* temperature is raising */
  57. THERMAL_TREND_DROPPING, /* temperature is dropping */
  58. };
  59. /* Events supported by Thermal Netlink */
  60. enum events {
  61. THERMAL_AUX0,
  62. THERMAL_AUX1,
  63. THERMAL_CRITICAL,
  64. THERMAL_DEV_FAULT,
  65. };
  66. /* attributes of thermal_genl_family */
  67. enum {
  68. THERMAL_GENL_ATTR_UNSPEC,
  69. THERMAL_GENL_ATTR_EVENT,
  70. __THERMAL_GENL_ATTR_MAX,
  71. };
  72. #define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1)
  73. /* commands supported by the thermal_genl_family */
  74. enum {
  75. THERMAL_GENL_CMD_UNSPEC,
  76. THERMAL_GENL_CMD_EVENT,
  77. __THERMAL_GENL_CMD_MAX,
  78. };
  79. #define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1)
  80. struct thermal_zone_device_ops {
  81. int (*bind) (struct thermal_zone_device *,
  82. struct thermal_cooling_device *);
  83. int (*unbind) (struct thermal_zone_device *,
  84. struct thermal_cooling_device *);
  85. int (*get_temp) (struct thermal_zone_device *, unsigned long *);
  86. int (*get_mode) (struct thermal_zone_device *,
  87. enum thermal_device_mode *);
  88. int (*set_mode) (struct thermal_zone_device *,
  89. enum thermal_device_mode);
  90. int (*get_trip_type) (struct thermal_zone_device *, int,
  91. enum thermal_trip_type *);
  92. int (*get_trip_temp) (struct thermal_zone_device *, int,
  93. unsigned long *);
  94. int (*set_trip_temp) (struct thermal_zone_device *, int,
  95. unsigned long);
  96. int (*get_trip_hyst) (struct thermal_zone_device *, int,
  97. unsigned long *);
  98. int (*set_trip_hyst) (struct thermal_zone_device *, int,
  99. unsigned long);
  100. int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
  101. int (*get_trend) (struct thermal_zone_device *, int,
  102. enum thermal_trend *);
  103. int (*notify) (struct thermal_zone_device *, int,
  104. enum thermal_trip_type);
  105. };
  106. struct thermal_cooling_device_ops {
  107. int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
  108. int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
  109. int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
  110. };
  111. struct thermal_cooling_device {
  112. int id;
  113. char type[THERMAL_NAME_LENGTH];
  114. struct device device;
  115. void *devdata;
  116. const struct thermal_cooling_device_ops *ops;
  117. bool updated; /* true if the cooling device does not need update */
  118. struct mutex lock; /* protect thermal_instances list */
  119. struct list_head thermal_instances;
  120. struct list_head node;
  121. };
  122. struct thermal_attr {
  123. struct device_attribute attr;
  124. char name[THERMAL_NAME_LENGTH];
  125. };
  126. struct thermal_zone_device {
  127. int id;
  128. char type[THERMAL_NAME_LENGTH];
  129. struct device device;
  130. struct thermal_attr *trip_temp_attrs;
  131. struct thermal_attr *trip_type_attrs;
  132. struct thermal_attr *trip_hyst_attrs;
  133. void *devdata;
  134. int trips;
  135. int passive_delay;
  136. int polling_delay;
  137. int temperature;
  138. int last_temperature;
  139. int passive;
  140. unsigned int forced_passive;
  141. const struct thermal_zone_device_ops *ops;
  142. const struct thermal_zone_params *tzp;
  143. struct list_head thermal_instances;
  144. struct idr idr;
  145. struct mutex lock; /* protect thermal_instances list */
  146. struct list_head node;
  147. struct delayed_work poll_queue;
  148. };
  149. /* Structure that holds binding parameters for a zone */
  150. struct thermal_bind_params {
  151. struct thermal_cooling_device *cdev;
  152. /*
  153. * This is a measure of 'how effectively these devices can
  154. * cool 'this' thermal zone. The shall be determined by platform
  155. * characterization. This is on a 'percentage' scale.
  156. * See Documentation/thermal/sysfs-api.txt for more information.
  157. */
  158. int weight;
  159. /*
  160. * This is a bit mask that gives the binding relation between this
  161. * thermal zone and cdev, for a particular trip point.
  162. * See Documentation/thermal/sysfs-api.txt for more information.
  163. */
  164. int trip_mask;
  165. int (*match) (struct thermal_zone_device *tz,
  166. struct thermal_cooling_device *cdev);
  167. };
  168. /* Structure to define Thermal Zone parameters */
  169. struct thermal_zone_params {
  170. int num_tbps; /* Number of tbp entries */
  171. struct thermal_bind_params *tbp;
  172. };
  173. struct thermal_genl_event {
  174. u32 orig;
  175. enum events event;
  176. };
  177. /* Function declarations */
  178. struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
  179. void *, const struct thermal_zone_device_ops *, int, int);
  180. void thermal_zone_device_unregister(struct thermal_zone_device *);
  181. int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
  182. struct thermal_cooling_device *,
  183. unsigned long, unsigned long);
  184. int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
  185. struct thermal_cooling_device *);
  186. void thermal_zone_device_update(struct thermal_zone_device *);
  187. struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
  188. const struct thermal_cooling_device_ops *);
  189. void thermal_cooling_device_unregister(struct thermal_cooling_device *);
  190. int get_tz_trend(struct thermal_zone_device *, int);
  191. struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
  192. struct thermal_cooling_device *, int);
  193. #ifdef CONFIG_NET
  194. extern int thermal_generate_netlink_event(u32 orig, enum events event);
  195. #else
  196. static inline int thermal_generate_netlink_event(u32 orig, enum events event)
  197. {
  198. return 0;
  199. }
  200. #endif
  201. #endif /* __THERMAL_H__ */