thermal.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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. struct list_head thermal_instances;
  143. struct idr idr;
  144. struct mutex lock; /* protect thermal_instances list */
  145. struct list_head node;
  146. struct delayed_work poll_queue;
  147. };
  148. struct thermal_genl_event {
  149. u32 orig;
  150. enum events event;
  151. };
  152. /* Function declarations */
  153. struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
  154. void *, const struct thermal_zone_device_ops *, int, int);
  155. void thermal_zone_device_unregister(struct thermal_zone_device *);
  156. int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
  157. struct thermal_cooling_device *,
  158. unsigned long, unsigned long);
  159. int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
  160. struct thermal_cooling_device *);
  161. void thermal_zone_device_update(struct thermal_zone_device *);
  162. struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
  163. const struct thermal_cooling_device_ops *);
  164. void thermal_cooling_device_unregister(struct thermal_cooling_device *);
  165. #ifdef CONFIG_NET
  166. extern int thermal_generate_netlink_event(u32 orig, enum events event);
  167. #else
  168. static inline int thermal_generate_netlink_event(u32 orig, enum events event)
  169. {
  170. return 0;
  171. }
  172. #endif
  173. #endif /* __THERMAL_H__ */