8611e3eba60cb132888399494567fd9d76112db5
[firefly-linux-kernel-4.4.55.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/workqueue.h>
31
32 #define THERMAL_TRIPS_NONE      -1
33 #define THERMAL_MAX_TRIPS       12
34 #define THERMAL_NAME_LENGTH     20
35
36 /* No upper/lower limit requirement */
37 #define THERMAL_NO_LIMIT        -1UL
38
39 /* Unit conversion macros */
40 #define KELVIN_TO_CELSIUS(t)    (long)(((long)t-2732 >= 0) ?    \
41                                 ((long)t-2732+5)/10 : ((long)t-2732-5)/10)
42 #define CELSIUS_TO_KELVIN(t)    ((t)*10+2732)
43
44 /* Adding event notification support elements */
45 #define THERMAL_GENL_FAMILY_NAME                "thermal_event"
46 #define THERMAL_GENL_VERSION                    0x01
47 #define THERMAL_GENL_MCAST_GROUP_NAME           "thermal_mc_group"
48
49 struct thermal_zone_device;
50 struct thermal_cooling_device;
51
52 enum thermal_device_mode {
53         THERMAL_DEVICE_DISABLED = 0,
54         THERMAL_DEVICE_ENABLED,
55 };
56
57 enum thermal_trip_type {
58         THERMAL_TRIP_ACTIVE = 0,
59         THERMAL_TRIP_PASSIVE,
60         THERMAL_TRIP_HOT,
61         THERMAL_TRIP_CRITICAL,
62 };
63
64 enum thermal_trend {
65         THERMAL_TREND_STABLE, /* temperature is stable */
66         THERMAL_TREND_RAISING, /* temperature is raising */
67         THERMAL_TREND_DROPPING, /* temperature is dropping */
68 };
69
70 /* Events supported by Thermal Netlink */
71 enum events {
72         THERMAL_AUX0,
73         THERMAL_AUX1,
74         THERMAL_CRITICAL,
75         THERMAL_DEV_FAULT,
76 };
77
78 /* attributes of thermal_genl_family */
79 enum {
80         THERMAL_GENL_ATTR_UNSPEC,
81         THERMAL_GENL_ATTR_EVENT,
82         __THERMAL_GENL_ATTR_MAX,
83 };
84 #define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1)
85
86 /* commands supported by the thermal_genl_family */
87 enum {
88         THERMAL_GENL_CMD_UNSPEC,
89         THERMAL_GENL_CMD_EVENT,
90         __THERMAL_GENL_CMD_MAX,
91 };
92 #define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1)
93
94 struct thermal_zone_device_ops {
95         int (*bind) (struct thermal_zone_device *,
96                      struct thermal_cooling_device *);
97         int (*unbind) (struct thermal_zone_device *,
98                        struct thermal_cooling_device *);
99         int (*get_temp) (struct thermal_zone_device *, unsigned long *);
100         int (*get_mode) (struct thermal_zone_device *,
101                          enum thermal_device_mode *);
102         int (*set_mode) (struct thermal_zone_device *,
103                 enum thermal_device_mode);
104         int (*get_trip_type) (struct thermal_zone_device *, int,
105                 enum thermal_trip_type *);
106         int (*get_trip_temp) (struct thermal_zone_device *, int,
107                               unsigned long *);
108         int (*set_trip_temp) (struct thermal_zone_device *, int,
109                               unsigned long);
110         int (*get_trip_hyst) (struct thermal_zone_device *, int,
111                               unsigned long *);
112         int (*set_trip_hyst) (struct thermal_zone_device *, int,
113                               unsigned long);
114         int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
115         int (*get_trend) (struct thermal_zone_device *, int,
116                           enum thermal_trend *);
117         int (*notify) (struct thermal_zone_device *, int,
118                        enum thermal_trip_type);
119 };
120
121 struct thermal_cooling_device_ops {
122         int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
123         int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
124         int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
125 };
126
127 struct thermal_cooling_device {
128         int id;
129         char type[THERMAL_NAME_LENGTH];
130         struct device device;
131         void *devdata;
132         const struct thermal_cooling_device_ops *ops;
133         bool updated; /* true if the cooling device does not need update */
134         struct mutex lock; /* protect thermal_instances list */
135         struct list_head thermal_instances;
136         struct list_head node;
137 };
138
139 struct thermal_attr {
140         struct device_attribute attr;
141         char name[THERMAL_NAME_LENGTH];
142 };
143
144 struct thermal_zone_device {
145         int id;
146         char type[THERMAL_NAME_LENGTH];
147         struct device device;
148         struct thermal_attr *trip_temp_attrs;
149         struct thermal_attr *trip_type_attrs;
150         struct thermal_attr *trip_hyst_attrs;
151         void *devdata;
152         int trips;
153         int passive_delay;
154         int polling_delay;
155         int temperature;
156         int last_temperature;
157         int passive;
158         unsigned int forced_passive;
159         const struct thermal_zone_device_ops *ops;
160         struct list_head thermal_instances;
161         struct idr idr;
162         struct mutex lock; /* protect thermal_instances list */
163         struct list_head node;
164         struct delayed_work poll_queue;
165 };
166
167 struct thermal_genl_event {
168         u32 orig;
169         enum events event;
170 };
171
172 /* Function declarations */
173 struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
174                 void *, const struct thermal_zone_device_ops *, int, int);
175 void thermal_zone_device_unregister(struct thermal_zone_device *);
176
177 int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
178                                      struct thermal_cooling_device *,
179                                      unsigned long, unsigned long);
180 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
181                                        struct thermal_cooling_device *);
182 void thermal_zone_device_update(struct thermal_zone_device *);
183
184 struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
185                 const struct thermal_cooling_device_ops *);
186 void thermal_cooling_device_unregister(struct thermal_cooling_device *);
187
188 #ifdef CONFIG_NET
189 extern int thermal_generate_netlink_event(u32 orig, enum events event);
190 #else
191 static inline int thermal_generate_netlink_event(u32 orig, enum events event)
192 {
193         return 0;
194 }
195 #endif
196
197 #endif /* __THERMAL_H__ */