1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef __THERMAL_H__
26#define __THERMAL_H__
27
28#include <linux/of.h>
29#include <linux/idr.h>
30#include <linux/device.h>
31#include <linux/workqueue.h>
32#include <uapi/linux/thermal.h>
33
34#define THERMAL_TRIPS_NONE -1
35#define THERMAL_MAX_TRIPS 12
36
37
38#define THERMAL_CSTATE_INVALID -1UL
39
40
41#define THERMAL_NO_LIMIT ((u32)~0)
42
43
44#define THERMAL_WEIGHT_DEFAULT 0
45
46
47#define THERMAL_TEMP_INVALID -274000
48
49
50#define DECI_KELVIN_TO_CELSIUS(t) ({ \
51 long _t = (t); \
52 ((_t-2732 >= 0) ? (_t-2732+5)/10 : (_t-2732-5)/10); \
53})
54#define CELSIUS_TO_DECI_KELVIN(t) ((t)*10+2732)
55#define DECI_KELVIN_TO_MILLICELSIUS_WITH_OFFSET(t, off) (((t) - (off)) * 100)
56#define DECI_KELVIN_TO_MILLICELSIUS(t) DECI_KELVIN_TO_MILLICELSIUS_WITH_OFFSET(t, 2732)
57#define MILLICELSIUS_TO_DECI_KELVIN_WITH_OFFSET(t, off) (((t) / 100) + (off))
58#define MILLICELSIUS_TO_DECI_KELVIN(t) MILLICELSIUS_TO_DECI_KELVIN_WITH_OFFSET(t, 2732)
59
60
61#if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE)
62#define DEFAULT_THERMAL_GOVERNOR "step_wise"
63#elif defined(CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE)
64#define DEFAULT_THERMAL_GOVERNOR "fair_share"
65#elif defined(CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE)
66#define DEFAULT_THERMAL_GOVERNOR "user_space"
67#elif defined(CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR)
68#define DEFAULT_THERMAL_GOVERNOR "power_allocator"
69#endif
70
71struct thermal_zone_device;
72struct thermal_cooling_device;
73struct thermal_instance;
74
75enum thermal_device_mode {
76 THERMAL_DEVICE_DISABLED = 0,
77 THERMAL_DEVICE_ENABLED,
78};
79
80enum thermal_trip_type {
81 THERMAL_TRIP_ACTIVE = 0,
82 THERMAL_TRIP_PASSIVE,
83 THERMAL_TRIP_HOT,
84 THERMAL_TRIP_CRITICAL,
85};
86
87enum thermal_trend {
88 THERMAL_TREND_STABLE,
89 THERMAL_TREND_RAISING,
90 THERMAL_TREND_DROPPING,
91 THERMAL_TREND_RAISE_FULL,
92 THERMAL_TREND_DROP_FULL,
93};
94
95struct thermal_zone_device_ops {
96 int (*bind) (struct thermal_zone_device *,
97 struct thermal_cooling_device *);
98 int (*unbind) (struct thermal_zone_device *,
99 struct thermal_cooling_device *);
100 int (*get_temp) (struct thermal_zone_device *, int *);
101 int (*get_mode) (struct thermal_zone_device *,
102 enum thermal_device_mode *);
103 int (*set_mode) (struct thermal_zone_device *,
104 enum thermal_device_mode);
105 int (*get_trip_type) (struct thermal_zone_device *, int,
106 enum thermal_trip_type *);
107 int (*get_trip_temp) (struct thermal_zone_device *, int, int *);
108 int (*set_trip_temp) (struct thermal_zone_device *, int, int);
109 int (*get_trip_hyst) (struct thermal_zone_device *, int, int *);
110 int (*set_trip_hyst) (struct thermal_zone_device *, int, int);
111 int (*get_crit_temp) (struct thermal_zone_device *, int *);
112 int (*set_emul_temp) (struct thermal_zone_device *, int);
113 int (*get_trend) (struct thermal_zone_device *, int,
114 enum thermal_trend *);
115 int (*notify) (struct thermal_zone_device *, int,
116 enum thermal_trip_type);
117};
118
119struct thermal_cooling_device_ops {
120 int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
121 int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
122 int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
123 int (*get_requested_power)(struct thermal_cooling_device *,
124 struct thermal_zone_device *, u32 *);
125 int (*state2power)(struct thermal_cooling_device *,
126 struct thermal_zone_device *, unsigned long, u32 *);
127 int (*power2state)(struct thermal_cooling_device *,
128 struct thermal_zone_device *, u32, unsigned long *);
129};
130
131struct thermal_cooling_device {
132 int id;
133 char type[THERMAL_NAME_LENGTH];
134 struct device device;
135 struct device_node *np;
136 void *devdata;
137 const struct thermal_cooling_device_ops *ops;
138 bool updated;
139 struct mutex lock;
140 struct list_head thermal_instances;
141 struct list_head node;
142};
143
144struct thermal_attr {
145 struct device_attribute attr;
146 char name[THERMAL_NAME_LENGTH];
147};
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185struct thermal_zone_device {
186 int id;
187 char type[THERMAL_NAME_LENGTH];
188 struct device device;
189 struct thermal_attr *trip_temp_attrs;
190 struct thermal_attr *trip_type_attrs;
191 struct thermal_attr *trip_hyst_attrs;
192 void *devdata;
193 int trips;
194 int passive_delay;
195 int polling_delay;
196 int temperature;
197 int last_temperature;
198 int emul_temperature;
199 int passive;
200 unsigned int forced_passive;
201 atomic_t need_update;
202 struct thermal_zone_device_ops *ops;
203 struct thermal_zone_params *tzp;
204 struct thermal_governor *governor;
205 void *governor_data;
206 struct list_head thermal_instances;
207 struct idr idr;
208 struct mutex lock;
209 struct list_head node;
210 struct delayed_work poll_queue;
211};
212
213
214
215
216
217
218
219
220
221
222
223
224
225struct thermal_governor {
226 char name[THERMAL_NAME_LENGTH];
227 int (*bind_to_tz)(struct thermal_zone_device *tz);
228 void (*unbind_from_tz)(struct thermal_zone_device *tz);
229 int (*throttle)(struct thermal_zone_device *tz, int trip);
230 struct list_head governor_list;
231};
232
233
234struct thermal_bind_params {
235 struct thermal_cooling_device *cdev;
236
237
238
239
240
241
242
243
244
245
246 int weight;
247
248
249
250
251
252
253 int trip_mask;
254
255
256
257
258
259
260
261
262
263 unsigned long *binding_limits;
264 int (*match) (struct thermal_zone_device *tz,
265 struct thermal_cooling_device *cdev);
266};
267
268
269struct thermal_zone_params {
270 char governor_name[THERMAL_NAME_LENGTH];
271
272
273
274
275
276
277 bool no_hwmon;
278
279 int num_tbps;
280 struct thermal_bind_params *tbp;
281
282
283
284
285
286 u32 sustainable_power;
287
288
289
290
291
292 s32 k_po;
293
294
295
296
297
298 s32 k_pu;
299
300
301 s32 k_i;
302
303
304 s32 k_d;
305
306
307 s32 integral_cutoff;
308
309
310
311
312
313 int slope;
314
315
316
317
318 int offset;
319};
320
321struct thermal_genl_event {
322 u32 orig;
323 enum events event;
324};
325
326
327
328
329
330
331
332
333
334
335
336
337struct thermal_zone_of_device_ops {
338 int (*get_temp)(void *, int *);
339 int (*get_trend)(void *, long *);
340 int (*set_emul_temp)(void *, int);
341};
342
343
344
345
346
347
348
349
350
351struct thermal_trip {
352 struct device_node *np;
353 unsigned long int temperature;
354 unsigned long int hysteresis;
355 enum thermal_trip_type type;
356};
357
358
359#ifdef CONFIG_THERMAL_OF
360struct thermal_zone_device *
361thermal_zone_of_sensor_register(struct device *dev, int id, void *data,
362 const struct thermal_zone_of_device_ops *ops);
363void thermal_zone_of_sensor_unregister(struct device *dev,
364 struct thermal_zone_device *tz);
365#else
366static inline struct thermal_zone_device *
367thermal_zone_of_sensor_register(struct device *dev, int id, void *data,
368 const struct thermal_zone_of_device_ops *ops)
369{
370 return ERR_PTR(-ENODEV);
371}
372
373static inline
374void thermal_zone_of_sensor_unregister(struct device *dev,
375 struct thermal_zone_device *tz)
376{
377}
378
379#endif
380
381#if IS_ENABLED(CONFIG_THERMAL)
382static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
383{
384 return cdev->ops->get_requested_power && cdev->ops->state2power &&
385 cdev->ops->power2state;
386}
387
388int power_actor_get_max_power(struct thermal_cooling_device *,
389 struct thermal_zone_device *tz, u32 *max_power);
390int power_actor_get_min_power(struct thermal_cooling_device *,
391 struct thermal_zone_device *tz, u32 *min_power);
392int power_actor_set_power(struct thermal_cooling_device *,
393 struct thermal_instance *, u32);
394struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
395 void *, struct thermal_zone_device_ops *,
396 struct thermal_zone_params *, int, int);
397void thermal_zone_device_unregister(struct thermal_zone_device *);
398
399int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
400 struct thermal_cooling_device *,
401 unsigned long, unsigned long,
402 unsigned int);
403int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
404 struct thermal_cooling_device *);
405void thermal_zone_device_update(struct thermal_zone_device *);
406
407struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
408 const struct thermal_cooling_device_ops *);
409struct thermal_cooling_device *
410thermal_of_cooling_device_register(struct device_node *np, char *, void *,
411 const struct thermal_cooling_device_ops *);
412void thermal_cooling_device_unregister(struct thermal_cooling_device *);
413struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name);
414int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
415
416int get_tz_trend(struct thermal_zone_device *, int);
417struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
418 struct thermal_cooling_device *, int);
419void thermal_cdev_update(struct thermal_cooling_device *);
420void thermal_notify_framework(struct thermal_zone_device *, int);
421#else
422static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
423{ return false; }
424static inline int power_actor_get_max_power(struct thermal_cooling_device *cdev,
425 struct thermal_zone_device *tz, u32 *max_power)
426{ return 0; }
427static inline int power_actor_get_min_power(struct thermal_cooling_device *cdev,
428 struct thermal_zone_device *tz,
429 u32 *min_power)
430{ return -ENODEV; }
431static inline int power_actor_set_power(struct thermal_cooling_device *cdev,
432 struct thermal_instance *tz, u32 power)
433{ return 0; }
434static inline struct thermal_zone_device *thermal_zone_device_register(
435 const char *type, int trips, int mask, void *devdata,
436 struct thermal_zone_device_ops *ops,
437 const struct thermal_zone_params *tzp,
438 int passive_delay, int polling_delay)
439{ return ERR_PTR(-ENODEV); }
440static inline void thermal_zone_device_unregister(
441 struct thermal_zone_device *tz)
442{ }
443static inline int thermal_zone_bind_cooling_device(
444 struct thermal_zone_device *tz, int trip,
445 struct thermal_cooling_device *cdev,
446 unsigned long upper, unsigned long lower,
447 unsigned int weight)
448{ return -ENODEV; }
449static inline int thermal_zone_unbind_cooling_device(
450 struct thermal_zone_device *tz, int trip,
451 struct thermal_cooling_device *cdev)
452{ return -ENODEV; }
453static inline void thermal_zone_device_update(struct thermal_zone_device *tz)
454{ }
455static inline struct thermal_cooling_device *
456thermal_cooling_device_register(char *type, void *devdata,
457 const struct thermal_cooling_device_ops *ops)
458{ return ERR_PTR(-ENODEV); }
459static inline struct thermal_cooling_device *
460thermal_of_cooling_device_register(struct device_node *np,
461 char *type, void *devdata, const struct thermal_cooling_device_ops *ops)
462{ return ERR_PTR(-ENODEV); }
463static inline void thermal_cooling_device_unregister(
464 struct thermal_cooling_device *cdev)
465{ }
466static inline struct thermal_zone_device *thermal_zone_get_zone_by_name(
467 const char *name)
468{ return ERR_PTR(-ENODEV); }
469static inline int thermal_zone_get_temp(
470 struct thermal_zone_device *tz, int *temp)
471{ return -ENODEV; }
472static inline int get_tz_trend(struct thermal_zone_device *tz, int trip)
473{ return -ENODEV; }
474static inline struct thermal_instance *
475get_thermal_instance(struct thermal_zone_device *tz,
476 struct thermal_cooling_device *cdev, int trip)
477{ return ERR_PTR(-ENODEV); }
478static inline void thermal_cdev_update(struct thermal_cooling_device *cdev)
479{ }
480static inline void thermal_notify_framework(struct thermal_zone_device *tz,
481 int trip)
482{ }
483#endif
484
485#if defined(CONFIG_NET) && IS_ENABLED(CONFIG_THERMAL)
486extern int thermal_generate_netlink_event(struct thermal_zone_device *tz,
487 enum events event);
488#else
489static inline int thermal_generate_netlink_event(struct thermal_zone_device *tz,
490 enum events event)
491{
492 return 0;
493}
494#endif
495
496#endif
497