thermal: Add notifier call chain for hot/critical events
[cascardo/linux.git] / include / linux / thermal.h
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
25 #ifndef __THERMAL_H__
26 #define __THERMAL_H__
27
28 #include <linux/idr.h>
29 #include <linux/device.h>
30 #include <linux/notifier.h>
31 #include <linux/workqueue.h>
32
33 struct thermal_zone_device;
34 struct thermal_cooling_device;
35
36 enum thermal_device_mode {
37         THERMAL_DEVICE_DISABLED = 0,
38         THERMAL_DEVICE_ENABLED,
39 };
40
41 enum thermal_trip_type {
42         THERMAL_TRIP_ACTIVE = 0,
43         THERMAL_TRIP_PASSIVE,
44         THERMAL_TRIP_HOT,
45         THERMAL_TRIP_CRITICAL,
46 };
47
48 enum cooling_device_state {
49         CDEV_STATE_OFF = 0,
50         CDEV_STATE_ON,
51         CDEV_STATE_DELAY,
52 };
53
54 struct thermal_zone_device_ops {
55         int (*bind) (struct thermal_zone_device *,
56                      struct thermal_cooling_device *);
57         int (*unbind) (struct thermal_zone_device *,
58                        struct thermal_cooling_device *);
59         int (*get_temp) (struct thermal_zone_device *, unsigned long *);
60         int (*get_mode) (struct thermal_zone_device *,
61                          enum thermal_device_mode *);
62         int (*set_mode) (struct thermal_zone_device *,
63                 enum thermal_device_mode);
64         int (*get_trip_type) (struct thermal_zone_device *, int,
65                 enum thermal_trip_type *);
66         int (*get_trip_temp) (struct thermal_zone_device *, int,
67                               unsigned long *);
68         int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
69         int (*notify) (struct thermal_zone_device *, int,
70                        enum thermal_trip_type);
71 };
72
73 struct thermal_cooling_device_ops {
74         int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
75         int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
76         int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
77 };
78
79 #define THERMAL_TRIPS_NONE -1
80 #define THERMAL_MAX_TRIPS 12
81 #define THERMAL_NAME_LENGTH 20
82 struct thermal_cooling_device {
83         int id;
84         char type[THERMAL_NAME_LENGTH];
85         struct device device;
86         void *devdata;
87         const struct thermal_cooling_device_ops *ops;
88         struct list_head node;
89         unsigned long delay_until;
90         enum cooling_device_state cur_state;
91 };
92
93 #define KELVIN_TO_CELSIUS(t)    (long)(((long)t-2732 >= 0) ?    \
94                                 ((long)t-2732+5)/10 : ((long)t-2732-5)/10)
95 #define CELSIUS_TO_KELVIN(t)    ((t)*10+2732)
96
97 struct thermal_zone_device {
98         int id;
99         char type[THERMAL_NAME_LENGTH];
100         struct device device;
101         void *devdata;
102         int trips;
103         int tc1;
104         int tc2;
105         int passive_delay;
106         int polling_delay;
107         int last_temperature;
108         bool passive;
109         unsigned int forced_passive;
110         const struct thermal_zone_device_ops *ops;
111         struct list_head cooling_devices;
112         struct idr idr;
113         struct mutex lock;      /* protect cooling devices list */
114         struct list_head node;
115         struct delayed_work poll_queue;
116         unsigned int fan_on_delay; /* time in seconds to delay fan turn on */
117         int cdevs_in_delay;
118         unsigned int cdevs_aborted_turn_on;
119         unsigned int cdevs_multiple_trips;
120         unsigned int cdevs_turned_on;
121         struct dentry *debugfs_dir;
122 };
123 /* Adding event notification support elements */
124 #define THERMAL_GENL_FAMILY_NAME                "thermal_event"
125 #define THERMAL_GENL_VERSION                    0x01
126 #define THERMAL_GENL_MCAST_GROUP_NAME           "thermal_mc_group"
127
128 enum events {
129         THERMAL_AUX0,
130         THERMAL_AUX1,
131         THERMAL_CRITICAL,
132         THERMAL_DEV_FAULT,
133 };
134
135 struct thermal_genl_event {
136         u32 orig;
137         enum events event;
138 };
139 /* attributes of thermal_genl_family */
140 enum {
141         THERMAL_GENL_ATTR_UNSPEC,
142         THERMAL_GENL_ATTR_EVENT,
143         __THERMAL_GENL_ATTR_MAX,
144 };
145 #define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1)
146
147 /* commands supported by the thermal_genl_family */
148 enum {
149         THERMAL_GENL_CMD_UNSPEC,
150         THERMAL_GENL_CMD_EVENT,
151         __THERMAL_GENL_CMD_MAX,
152 };
153 #define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1)
154
155 struct thermal_zone_device *thermal_zone_device_register(char *, int, void *,
156                 const struct thermal_zone_device_ops *, int tc1, int tc2,
157                 int passive_freq, int polling_freq);
158 void thermal_zone_device_unregister(struct thermal_zone_device *);
159
160 int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
161                                      struct thermal_cooling_device *);
162 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
163                                        struct thermal_cooling_device *);
164 void thermal_zone_device_update(struct thermal_zone_device *);
165 struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
166                 const struct thermal_cooling_device_ops *);
167 void thermal_cooling_device_unregister(struct thermal_cooling_device *);
168
169 #ifdef CONFIG_NET
170 extern int thermal_generate_netlink_event(u32 orig, enum events event);
171 #else
172 static inline int thermal_generate_netlink_event(u32 orig, enum events event)
173 {
174         return 0;
175 }
176 #endif
177
178 extern int register_thermal_notifier(struct notifier_block *);
179 extern int unregister_thermal_notifier(struct notifier_block *);
180
181 #endif /* __THERMAL_H__ */