Linux Audio

Check our new training course

Loading...
v4.10.11
 
  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/of.h>
 29#include <linux/idr.h>
 30#include <linux/device.h>
 31#include <linux/sysfs.h>
 32#include <linux/workqueue.h>
 33#include <uapi/linux/thermal.h>
 34
 35#define THERMAL_TRIPS_NONE	-1
 36#define THERMAL_MAX_TRIPS	12
 37
 38/* invalid cooling state */
 39#define THERMAL_CSTATE_INVALID -1UL
 40
 41/* No upper/lower limit requirement */
 42#define THERMAL_NO_LIMIT	((u32)~0)
 43
 44/* Default weight of a bound cooling device */
 45#define THERMAL_WEIGHT_DEFAULT 0
 46
 47/* use value, which < 0K, to indicate an invalid/uninitialized temperature */
 48#define THERMAL_TEMP_INVALID	-274000
 49
 50/* Unit conversion macros */
 51#define DECI_KELVIN_TO_CELSIUS(t)	({			\
 52	long _t = (t);						\
 53	((_t-2732 >= 0) ? (_t-2732+5)/10 : (_t-2732-5)/10);	\
 54})
 55#define CELSIUS_TO_DECI_KELVIN(t)	((t)*10+2732)
 56#define DECI_KELVIN_TO_MILLICELSIUS_WITH_OFFSET(t, off) (((t) - (off)) * 100)
 57#define DECI_KELVIN_TO_MILLICELSIUS(t) DECI_KELVIN_TO_MILLICELSIUS_WITH_OFFSET(t, 2732)
 58#define MILLICELSIUS_TO_DECI_KELVIN_WITH_OFFSET(t, off) (((t) / 100) + (off))
 59#define MILLICELSIUS_TO_DECI_KELVIN(t) MILLICELSIUS_TO_DECI_KELVIN_WITH_OFFSET(t, 2732)
 60
 61/* Default Thermal Governor */
 62#if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE)
 63#define DEFAULT_THERMAL_GOVERNOR       "step_wise"
 64#elif defined(CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE)
 65#define DEFAULT_THERMAL_GOVERNOR       "fair_share"
 66#elif defined(CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE)
 67#define DEFAULT_THERMAL_GOVERNOR       "user_space"
 68#elif defined(CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR)
 69#define DEFAULT_THERMAL_GOVERNOR       "power_allocator"
 70#endif
 71
 72struct thermal_zone_device;
 73struct thermal_cooling_device;
 74struct thermal_instance;
 75
 76enum thermal_device_mode {
 77	THERMAL_DEVICE_DISABLED = 0,
 78	THERMAL_DEVICE_ENABLED,
 79};
 80
 81enum thermal_trip_type {
 82	THERMAL_TRIP_ACTIVE = 0,
 83	THERMAL_TRIP_PASSIVE,
 84	THERMAL_TRIP_HOT,
 85	THERMAL_TRIP_CRITICAL,
 86};
 87
 88enum thermal_trend {
 89	THERMAL_TREND_STABLE, /* temperature is stable */
 90	THERMAL_TREND_RAISING, /* temperature is raising */
 91	THERMAL_TREND_DROPPING, /* temperature is dropping */
 92	THERMAL_TREND_RAISE_FULL, /* apply highest cooling action */
 93	THERMAL_TREND_DROP_FULL, /* apply lowest cooling action */
 94};
 95
 96/* Thermal notification reason */
 97enum thermal_notify_event {
 98	THERMAL_EVENT_UNSPECIFIED, /* Unspecified event */
 99	THERMAL_EVENT_TEMP_SAMPLE, /* New Temperature sample */
100	THERMAL_TRIP_VIOLATED, /* TRIP Point violation */
101	THERMAL_TRIP_CHANGED, /* TRIP Point temperature changed */
102	THERMAL_DEVICE_DOWN, /* Thermal device is down */
103	THERMAL_DEVICE_UP, /* Thermal device is up after a down event */
104	THERMAL_DEVICE_POWER_CAPABILITY_CHANGED, /* power capability changed */
 
 
105};
106
107struct thermal_zone_device_ops {
108	int (*bind) (struct thermal_zone_device *,
109		     struct thermal_cooling_device *);
110	int (*unbind) (struct thermal_zone_device *,
111		       struct thermal_cooling_device *);
112	int (*get_temp) (struct thermal_zone_device *, int *);
113	int (*set_trips) (struct thermal_zone_device *, int, int);
114	int (*get_mode) (struct thermal_zone_device *,
115			 enum thermal_device_mode *);
116	int (*set_mode) (struct thermal_zone_device *,
117		enum thermal_device_mode);
118	int (*get_trip_type) (struct thermal_zone_device *, int,
119		enum thermal_trip_type *);
120	int (*get_trip_temp) (struct thermal_zone_device *, int, int *);
121	int (*set_trip_temp) (struct thermal_zone_device *, int, int);
122	int (*get_trip_hyst) (struct thermal_zone_device *, int, int *);
123	int (*set_trip_hyst) (struct thermal_zone_device *, int, int);
124	int (*get_crit_temp) (struct thermal_zone_device *, int *);
125	int (*set_emul_temp) (struct thermal_zone_device *, int);
126	int (*get_trend) (struct thermal_zone_device *, int,
127			  enum thermal_trend *);
128	int (*notify) (struct thermal_zone_device *, int,
129		       enum thermal_trip_type);
 
 
 
 
 
 
 
 
 
 
 
 
130};
131
132struct thermal_cooling_device_ops {
133	int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
134	int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
135	int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
136	int (*get_requested_power)(struct thermal_cooling_device *,
137				   struct thermal_zone_device *, u32 *);
138	int (*state2power)(struct thermal_cooling_device *,
139			   struct thermal_zone_device *, unsigned long, u32 *);
140	int (*power2state)(struct thermal_cooling_device *,
141			   struct thermal_zone_device *, u32, unsigned long *);
142};
143
144struct thermal_cooling_device {
145	int id;
146	char type[THERMAL_NAME_LENGTH];
 
147	struct device device;
148	struct device_node *np;
149	void *devdata;
 
150	const struct thermal_cooling_device_ops *ops;
151	bool updated; /* true if the cooling device does not need update */
152	struct mutex lock; /* protect thermal_instances list */
153	struct list_head thermal_instances;
154	struct list_head node;
155};
156
157struct thermal_attr {
158	struct device_attribute attr;
159	char name[THERMAL_NAME_LENGTH];
160};
161
162/**
163 * struct thermal_zone_device - structure for a thermal zone
164 * @id:		unique id number for each thermal zone
165 * @type:	the thermal zone device type
166 * @device:	&struct device for this thermal zone
167 * @trip_temp_attrs:	attributes for trip points for sysfs: trip temperature
168 * @trip_type_attrs:	attributes for trip points for sysfs: trip type
169 * @trip_hyst_attrs:	attributes for trip points for sysfs: trip hysteresis
 
170 * @devdata:	private pointer for device private data
171 * @trips:	number of trip points the thermal zone supports
 
172 * @trips_disabled;	bitmap for disabled trips
173 * @passive_delay:	number of milliseconds to wait between polls when
174 *			performing passive cooling.
175 * @polling_delay:	number of milliseconds to wait between polls when
176 *			checking whether trip points have been crossed (0 for
177 *			interrupt driven systems)
178 * @temperature:	current temperature.  This is only for core code,
179 *			drivers should use thermal_zone_get_temp() to get the
180 *			current temperature
181 * @last_temperature:	previous temperature read
182 * @emul_temperature:	emulated temperature when using CONFIG_THERMAL_EMULATION
183 * @passive:		1 if you've crossed a passive trip point, 0 otherwise.
184 * @prev_low_trip:	the low current temperature if you've crossed a passive
185			trip point.
186 * @prev_high_trip:	the above current temperature if you've crossed a
187			passive trip point.
188 * @forced_passive:	If > 0, temperature at which to switch on all ACPI
189 *			processor cooling devices.  Currently only used by the
190 *			step-wise governor.
191 * @need_update:	if equals 1, thermal_zone_device_update needs to be invoked.
192 * @ops:	operations this &thermal_zone_device supports
193 * @tzp:	thermal zone parameters
194 * @governor:	pointer to the governor for this thermal zone
195 * @governor_data:	private pointer for governor data
196 * @thermal_instances:	list of &struct thermal_instance of this thermal zone
197 * @idr:	&struct idr to generate unique id for this zone's cooling
198 *		devices
199 * @lock:	lock to protect thermal_instances list
200 * @node:	node in thermal_tz_list (in thermal_core.c)
201 * @poll_queue:	delayed work for polling
202 * @notify_event: Last notification event
203 */
204struct thermal_zone_device {
205	int id;
206	char type[THERMAL_NAME_LENGTH];
207	struct device device;
208	struct attribute_group trips_attribute_group;
209	struct thermal_attr *trip_temp_attrs;
210	struct thermal_attr *trip_type_attrs;
211	struct thermal_attr *trip_hyst_attrs;
 
212	void *devdata;
213	int trips;
 
214	unsigned long trips_disabled;	/* bitmap for disabled trips */
215	int passive_delay;
216	int polling_delay;
217	int temperature;
218	int last_temperature;
219	int emul_temperature;
220	int passive;
221	int prev_low_trip;
222	int prev_high_trip;
223	unsigned int forced_passive;
224	atomic_t need_update;
225	struct thermal_zone_device_ops *ops;
226	struct thermal_zone_params *tzp;
227	struct thermal_governor *governor;
228	void *governor_data;
229	struct list_head thermal_instances;
230	struct idr idr;
231	struct mutex lock;
232	struct list_head node;
233	struct delayed_work poll_queue;
234	enum thermal_notify_event notify_event;
235};
236
237/**
238 * struct thermal_governor - structure that holds thermal governor information
239 * @name:	name of the governor
240 * @bind_to_tz: callback called when binding to a thermal zone.  If it
241 *		returns 0, the governor is bound to the thermal zone,
242 *		otherwise it fails.
243 * @unbind_from_tz:	callback called when a governor is unbound from a
244 *			thermal zone.
245 * @throttle:	callback called for every trip point even if temperature is
246 *		below the trip point temperature
247 * @governor_list:	node in thermal_governor_list (in thermal_core.c)
248 */
249struct thermal_governor {
250	char name[THERMAL_NAME_LENGTH];
251	int (*bind_to_tz)(struct thermal_zone_device *tz);
252	void (*unbind_from_tz)(struct thermal_zone_device *tz);
253	int (*throttle)(struct thermal_zone_device *tz, int trip);
254	struct list_head	governor_list;
255};
256
257/* Structure that holds binding parameters for a zone */
258struct thermal_bind_params {
259	struct thermal_cooling_device *cdev;
260
261	/*
262	 * This is a measure of 'how effectively these devices can
263	 * cool 'this' thermal zone. It shall be determined by
264	 * platform characterization. This value is relative to the
265	 * rest of the weights so a cooling device whose weight is
266	 * double that of another cooling device is twice as
267	 * effective. See Documentation/thermal/sysfs-api.txt for more
268	 * information.
269	 */
270	int weight;
271
272	/*
273	 * This is a bit mask that gives the binding relation between this
274	 * thermal zone and cdev, for a particular trip point.
275	 * See Documentation/thermal/sysfs-api.txt for more information.
276	 */
277	int trip_mask;
278
279	/*
280	 * This is an array of cooling state limits. Must have exactly
281	 * 2 * thermal_zone.number_of_trip_points. It is an array consisting
282	 * of tuples <lower-state upper-state> of state limits. Each trip
283	 * will be associated with one state limit tuple when binding.
284	 * A NULL pointer means <THERMAL_NO_LIMITS THERMAL_NO_LIMITS>
285	 * on all trips.
286	 */
287	unsigned long *binding_limits;
288	int (*match) (struct thermal_zone_device *tz,
289			struct thermal_cooling_device *cdev);
290};
291
292/* Structure to define Thermal Zone parameters */
293struct thermal_zone_params {
294	char governor_name[THERMAL_NAME_LENGTH];
295
296	/*
297	 * a boolean to indicate if the thermal to hwmon sysfs interface
298	 * is required. when no_hwmon == false, a hwmon sysfs interface
299	 * will be created. when no_hwmon == true, nothing will be done
300	 */
301	bool no_hwmon;
302
303	int num_tbps;	/* Number of tbp entries */
304	struct thermal_bind_params *tbp;
305
306	/*
307	 * Sustainable power (heat) that this thermal zone can dissipate in
308	 * mW
309	 */
310	u32 sustainable_power;
311
312	/*
313	 * Proportional parameter of the PID controller when
314	 * overshooting (i.e., when temperature is below the target)
315	 */
316	s32 k_po;
317
318	/*
319	 * Proportional parameter of the PID controller when
320	 * undershooting
321	 */
322	s32 k_pu;
323
324	/* Integral parameter of the PID controller */
325	s32 k_i;
326
327	/* Derivative parameter of the PID controller */
328	s32 k_d;
329
330	/* threshold below which the error is no longer accumulated */
331	s32 integral_cutoff;
332
333	/*
334	 * @slope:	slope of a linear temperature adjustment curve.
335	 * 		Used by thermal zone drivers.
336	 */
337	int slope;
338	/*
339	 * @offset:	offset of a linear temperature adjustment curve.
340	 * 		Used by thermal zone drivers (default 0).
341	 */
342	int offset;
343};
344
345struct thermal_genl_event {
346	u32 orig;
347	enum events event;
348};
349
350/**
351 * struct thermal_zone_of_device_ops - scallbacks for handling DT based zones
352 *
353 * Mandatory:
354 * @get_temp: a pointer to a function that reads the sensor temperature.
355 *
356 * Optional:
357 * @get_trend: a pointer to a function that reads the sensor temperature trend.
358 * @set_trips: a pointer to a function that sets a temperature window. When
359 *	       this window is left the driver must inform the thermal core via
360 *	       thermal_zone_device_update.
361 * @set_emul_temp: a pointer to a function that sets sensor emulated
362 *		   temperature.
363 * @set_trip_temp: a pointer to a function that sets the trip temperature on
364 *		   hardware.
365 */
366struct thermal_zone_of_device_ops {
367	int (*get_temp)(void *, int *);
368	int (*get_trend)(void *, int, enum thermal_trend *);
369	int (*set_trips)(void *, int, int);
370	int (*set_emul_temp)(void *, int);
371	int (*set_trip_temp)(void *, int, int);
372};
373
374/**
375 * struct thermal_trip - representation of a point in temperature domain
376 * @np: pointer to struct device_node that this trip point was created from
377 * @temperature: temperature value in miliCelsius
378 * @hysteresis: relative hysteresis in miliCelsius
379 * @type: trip point type
380 */
381
382struct thermal_trip {
383	struct device_node *np;
384	int temperature;
385	int hysteresis;
386	enum thermal_trip_type type;
387};
388
389/* Function declarations */
390#ifdef CONFIG_THERMAL_OF
391struct thermal_zone_device *
392thermal_zone_of_sensor_register(struct device *dev, int id, void *data,
393				const struct thermal_zone_of_device_ops *ops);
394void thermal_zone_of_sensor_unregister(struct device *dev,
395				       struct thermal_zone_device *tz);
396struct thermal_zone_device *devm_thermal_zone_of_sensor_register(
397		struct device *dev, int id, void *data,
398		const struct thermal_zone_of_device_ops *ops);
399void devm_thermal_zone_of_sensor_unregister(struct device *dev,
400					    struct thermal_zone_device *tz);
401#else
402static inline struct thermal_zone_device *
403thermal_zone_of_sensor_register(struct device *dev, int id, void *data,
404				const struct thermal_zone_of_device_ops *ops)
405{
406	return ERR_PTR(-ENODEV);
407}
408
409static inline
410void thermal_zone_of_sensor_unregister(struct device *dev,
411				       struct thermal_zone_device *tz)
412{
 
413}
414
415static inline struct thermal_zone_device *devm_thermal_zone_of_sensor_register(
416		struct device *dev, int id, void *data,
417		const struct thermal_zone_of_device_ops *ops)
418{
419	return ERR_PTR(-ENODEV);
420}
421
422static inline
423void devm_thermal_zone_of_sensor_unregister(struct device *dev,
424					    struct thermal_zone_device *tz)
425{
426}
427
428#endif
429
430#if IS_ENABLED(CONFIG_THERMAL)
431static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
432{
433	return cdev->ops->get_requested_power && cdev->ops->state2power &&
434		cdev->ops->power2state;
435}
436
437int power_actor_get_max_power(struct thermal_cooling_device *,
438			      struct thermal_zone_device *tz, u32 *max_power);
439int power_actor_get_min_power(struct thermal_cooling_device *,
440			      struct thermal_zone_device *tz, u32 *min_power);
441int power_actor_set_power(struct thermal_cooling_device *,
442			  struct thermal_instance *, u32);
443struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
444		void *, struct thermal_zone_device_ops *,
445		struct thermal_zone_params *, int, int);
 
446void thermal_zone_device_unregister(struct thermal_zone_device *);
447
 
 
 
 
 
448int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
449				     struct thermal_cooling_device *,
450				     unsigned long, unsigned long,
451				     unsigned int);
452int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
453				       struct thermal_cooling_device *);
454void thermal_zone_device_update(struct thermal_zone_device *,
455				enum thermal_notify_event);
456void thermal_zone_set_trips(struct thermal_zone_device *);
457
458struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
459		const struct thermal_cooling_device_ops *);
460struct thermal_cooling_device *
461thermal_of_cooling_device_register(struct device_node *np, char *, void *,
462				   const struct thermal_cooling_device_ops *);
 
 
 
 
 
463void thermal_cooling_device_unregister(struct thermal_cooling_device *);
464struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name);
465int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
466int thermal_zone_get_slope(struct thermal_zone_device *tz);
467int thermal_zone_get_offset(struct thermal_zone_device *tz);
468
469int get_tz_trend(struct thermal_zone_device *, int);
470struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
471		struct thermal_cooling_device *, int);
472void thermal_cdev_update(struct thermal_cooling_device *);
473void thermal_notify_framework(struct thermal_zone_device *, int);
474#else
475static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
476{ return false; }
477static inline int power_actor_get_max_power(struct thermal_cooling_device *cdev,
478			      struct thermal_zone_device *tz, u32 *max_power)
479{ return 0; }
480static inline int power_actor_get_min_power(struct thermal_cooling_device *cdev,
481					    struct thermal_zone_device *tz,
482					    u32 *min_power)
483{ return -ENODEV; }
484static inline int power_actor_set_power(struct thermal_cooling_device *cdev,
485			  struct thermal_instance *tz, u32 power)
486{ return 0; }
487static inline struct thermal_zone_device *thermal_zone_device_register(
488	const char *type, int trips, int mask, void *devdata,
489	struct thermal_zone_device_ops *ops,
490	const struct thermal_zone_params *tzp,
491	int passive_delay, int polling_delay)
492{ return ERR_PTR(-ENODEV); }
493static inline void thermal_zone_device_unregister(
494	struct thermal_zone_device *tz)
495{ }
496static inline int thermal_zone_bind_cooling_device(
497	struct thermal_zone_device *tz, int trip,
498	struct thermal_cooling_device *cdev,
499	unsigned long upper, unsigned long lower,
500	unsigned int weight)
501{ return -ENODEV; }
502static inline int thermal_zone_unbind_cooling_device(
503	struct thermal_zone_device *tz, int trip,
504	struct thermal_cooling_device *cdev)
505{ return -ENODEV; }
506static inline void thermal_zone_device_update(struct thermal_zone_device *tz,
507					      enum thermal_notify_event event)
508{ }
509static inline void thermal_zone_set_trips(struct thermal_zone_device *tz)
510{ }
511static inline struct thermal_cooling_device *
512thermal_cooling_device_register(char *type, void *devdata,
513	const struct thermal_cooling_device_ops *ops)
514{ return ERR_PTR(-ENODEV); }
515static inline struct thermal_cooling_device *
516thermal_of_cooling_device_register(struct device_node *np,
517	char *type, void *devdata, const struct thermal_cooling_device_ops *ops)
 
518{ return ERR_PTR(-ENODEV); }
 
 
 
 
 
 
 
 
519static inline void thermal_cooling_device_unregister(
520	struct thermal_cooling_device *cdev)
521{ }
522static inline struct thermal_zone_device *thermal_zone_get_zone_by_name(
523		const char *name)
524{ return ERR_PTR(-ENODEV); }
525static inline int thermal_zone_get_temp(
526		struct thermal_zone_device *tz, int *temp)
527{ return -ENODEV; }
528static inline int thermal_zone_get_slope(
529		struct thermal_zone_device *tz)
530{ return -ENODEV; }
531static inline int thermal_zone_get_offset(
532		struct thermal_zone_device *tz)
533{ return -ENODEV; }
534static inline int get_tz_trend(struct thermal_zone_device *tz, int trip)
 
535{ return -ENODEV; }
536static inline struct thermal_instance *
537get_thermal_instance(struct thermal_zone_device *tz,
538	struct thermal_cooling_device *cdev, int trip)
539{ return ERR_PTR(-ENODEV); }
540static inline void thermal_cdev_update(struct thermal_cooling_device *cdev)
541{ }
542static inline void thermal_notify_framework(struct thermal_zone_device *tz,
543	int trip)
544{ }
545#endif /* CONFIG_THERMAL */
546
547#if defined(CONFIG_NET) && IS_ENABLED(CONFIG_THERMAL)
548extern int thermal_generate_netlink_event(struct thermal_zone_device *tz,
549						enum events event);
550#else
551static inline int thermal_generate_netlink_event(struct thermal_zone_device *tz,
552						enum events event)
553{
554	return 0;
555}
556#endif
557
558#endif /* __THERMAL_H__ */
v6.2
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 *  thermal.h  ($Revision: 0 $)
  4 *
  5 *  Copyright (C) 2008  Intel Corp
  6 *  Copyright (C) 2008  Zhang Rui <rui.zhang@intel.com>
  7 *  Copyright (C) 2008  Sujith Thomas <sujith.thomas@intel.com>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  8 */
  9
 10#ifndef __THERMAL_H__
 11#define __THERMAL_H__
 12
 13#include <linux/of.h>
 14#include <linux/idr.h>
 15#include <linux/device.h>
 16#include <linux/sysfs.h>
 17#include <linux/workqueue.h>
 18#include <uapi/linux/thermal.h>
 19
 
 
 
 20/* invalid cooling state */
 21#define THERMAL_CSTATE_INVALID -1UL
 22
 23/* No upper/lower limit requirement */
 24#define THERMAL_NO_LIMIT	((u32)~0)
 25
 26/* Default weight of a bound cooling device */
 27#define THERMAL_WEIGHT_DEFAULT 0
 28
 29/* use value, which < 0K, to indicate an invalid/uninitialized temperature */
 30#define THERMAL_TEMP_INVALID	-274000
 31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 32struct thermal_zone_device;
 33struct thermal_cooling_device;
 34struct thermal_instance;
 35struct thermal_attr;
 
 
 
 
 
 
 
 
 
 
 
 36
 37enum thermal_trend {
 38	THERMAL_TREND_STABLE, /* temperature is stable */
 39	THERMAL_TREND_RAISING, /* temperature is raising */
 40	THERMAL_TREND_DROPPING, /* temperature is dropping */
 
 
 41};
 42
 43/* Thermal notification reason */
 44enum thermal_notify_event {
 45	THERMAL_EVENT_UNSPECIFIED, /* Unspecified event */
 46	THERMAL_EVENT_TEMP_SAMPLE, /* New Temperature sample */
 47	THERMAL_TRIP_VIOLATED, /* TRIP Point violation */
 48	THERMAL_TRIP_CHANGED, /* TRIP Point temperature changed */
 49	THERMAL_DEVICE_DOWN, /* Thermal device is down */
 50	THERMAL_DEVICE_UP, /* Thermal device is up after a down event */
 51	THERMAL_DEVICE_POWER_CAPABILITY_CHANGED, /* power capability changed */
 52	THERMAL_TABLE_CHANGED, /* Thermal table(s) changed */
 53	THERMAL_EVENT_KEEP_ALIVE, /* Request for user space handler to respond */
 54};
 55
 56struct thermal_zone_device_ops {
 57	int (*bind) (struct thermal_zone_device *,
 58		     struct thermal_cooling_device *);
 59	int (*unbind) (struct thermal_zone_device *,
 60		       struct thermal_cooling_device *);
 61	int (*get_temp) (struct thermal_zone_device *, int *);
 62	int (*set_trips) (struct thermal_zone_device *, int, int);
 63	int (*change_mode) (struct thermal_zone_device *,
 
 
 64		enum thermal_device_mode);
 65	int (*get_trip_type) (struct thermal_zone_device *, int,
 66		enum thermal_trip_type *);
 67	int (*get_trip_temp) (struct thermal_zone_device *, int, int *);
 68	int (*set_trip_temp) (struct thermal_zone_device *, int, int);
 69	int (*get_trip_hyst) (struct thermal_zone_device *, int, int *);
 70	int (*set_trip_hyst) (struct thermal_zone_device *, int, int);
 71	int (*get_crit_temp) (struct thermal_zone_device *, int *);
 72	int (*set_emul_temp) (struct thermal_zone_device *, int);
 73	int (*get_trend) (struct thermal_zone_device *, int,
 74			  enum thermal_trend *);
 75	void (*hot)(struct thermal_zone_device *);
 76	void (*critical)(struct thermal_zone_device *);
 77};
 78
 79/**
 80 * struct thermal_trip - representation of a point in temperature domain
 81 * @temperature: temperature value in miliCelsius
 82 * @hysteresis: relative hysteresis in miliCelsius
 83 * @type: trip point type
 84 */
 85struct thermal_trip {
 86	int temperature;
 87	int hysteresis;
 88	enum thermal_trip_type type;
 89};
 90
 91struct thermal_cooling_device_ops {
 92	int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
 93	int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
 94	int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
 95	int (*get_requested_power)(struct thermal_cooling_device *, u32 *);
 96	int (*state2power)(struct thermal_cooling_device *, unsigned long, u32 *);
 97	int (*power2state)(struct thermal_cooling_device *, u32, unsigned long *);
 
 
 
 98};
 99
100struct thermal_cooling_device {
101	int id;
102	char *type;
103	unsigned long max_state;
104	struct device device;
105	struct device_node *np;
106	void *devdata;
107	void *stats;
108	const struct thermal_cooling_device_ops *ops;
109	bool updated; /* true if the cooling device does not need update */
110	struct mutex lock; /* protect thermal_instances list */
111	struct list_head thermal_instances;
112	struct list_head node;
113};
114
 
 
 
 
 
115/**
116 * struct thermal_zone_device - structure for a thermal zone
117 * @id:		unique id number for each thermal zone
118 * @type:	the thermal zone device type
119 * @device:	&struct device for this thermal zone
120 * @trip_temp_attrs:	attributes for trip points for sysfs: trip temperature
121 * @trip_type_attrs:	attributes for trip points for sysfs: trip type
122 * @trip_hyst_attrs:	attributes for trip points for sysfs: trip hysteresis
123 * @mode:		current mode of this thermal zone
124 * @devdata:	private pointer for device private data
125 * @trips:	an array of struct thermal_trip
126 * @num_trips:	number of trip points the thermal zone supports
127 * @trips_disabled;	bitmap for disabled trips
128 * @passive_delay_jiffies: number of jiffies to wait between polls when
129 *			performing passive cooling.
130 * @polling_delay_jiffies: number of jiffies to wait between polls when
131 *			checking whether trip points have been crossed (0 for
132 *			interrupt driven systems)
133 * @temperature:	current temperature.  This is only for core code,
134 *			drivers should use thermal_zone_get_temp() to get the
135 *			current temperature
136 * @last_temperature:	previous temperature read
137 * @emul_temperature:	emulated temperature when using CONFIG_THERMAL_EMULATION
138 * @passive:		1 if you've crossed a passive trip point, 0 otherwise.
139 * @prev_low_trip:	the low current temperature if you've crossed a passive
140			trip point.
141 * @prev_high_trip:	the above current temperature if you've crossed a
142			passive trip point.
 
 
 
143 * @need_update:	if equals 1, thermal_zone_device_update needs to be invoked.
144 * @ops:	operations this &thermal_zone_device supports
145 * @tzp:	thermal zone parameters
146 * @governor:	pointer to the governor for this thermal zone
147 * @governor_data:	private pointer for governor data
148 * @thermal_instances:	list of &struct thermal_instance of this thermal zone
149 * @ida:	&struct ida to generate unique id for this zone's cooling
150 *		devices
151 * @lock:	lock to protect thermal_instances list
152 * @node:	node in thermal_tz_list (in thermal_core.c)
153 * @poll_queue:	delayed work for polling
154 * @notify_event: Last notification event
155 */
156struct thermal_zone_device {
157	int id;
158	char type[THERMAL_NAME_LENGTH];
159	struct device device;
160	struct attribute_group trips_attribute_group;
161	struct thermal_attr *trip_temp_attrs;
162	struct thermal_attr *trip_type_attrs;
163	struct thermal_attr *trip_hyst_attrs;
164	enum thermal_device_mode mode;
165	void *devdata;
166	struct thermal_trip *trips;
167	int num_trips;
168	unsigned long trips_disabled;	/* bitmap for disabled trips */
169	unsigned long passive_delay_jiffies;
170	unsigned long polling_delay_jiffies;
171	int temperature;
172	int last_temperature;
173	int emul_temperature;
174	int passive;
175	int prev_low_trip;
176	int prev_high_trip;
 
177	atomic_t need_update;
178	struct thermal_zone_device_ops *ops;
179	struct thermal_zone_params *tzp;
180	struct thermal_governor *governor;
181	void *governor_data;
182	struct list_head thermal_instances;
183	struct ida ida;
184	struct mutex lock;
185	struct list_head node;
186	struct delayed_work poll_queue;
187	enum thermal_notify_event notify_event;
188};
189
190/**
191 * struct thermal_governor - structure that holds thermal governor information
192 * @name:	name of the governor
193 * @bind_to_tz: callback called when binding to a thermal zone.  If it
194 *		returns 0, the governor is bound to the thermal zone,
195 *		otherwise it fails.
196 * @unbind_from_tz:	callback called when a governor is unbound from a
197 *			thermal zone.
198 * @throttle:	callback called for every trip point even if temperature is
199 *		below the trip point temperature
200 * @governor_list:	node in thermal_governor_list (in thermal_core.c)
201 */
202struct thermal_governor {
203	char name[THERMAL_NAME_LENGTH];
204	int (*bind_to_tz)(struct thermal_zone_device *tz);
205	void (*unbind_from_tz)(struct thermal_zone_device *tz);
206	int (*throttle)(struct thermal_zone_device *tz, int trip);
207	struct list_head	governor_list;
208};
209
210/* Structure that holds binding parameters for a zone */
211struct thermal_bind_params {
212	struct thermal_cooling_device *cdev;
213
214	/*
215	 * This is a measure of 'how effectively these devices can
216	 * cool 'this' thermal zone. It shall be determined by
217	 * platform characterization. This value is relative to the
218	 * rest of the weights so a cooling device whose weight is
219	 * double that of another cooling device is twice as
220	 * effective. See Documentation/driver-api/thermal/sysfs-api.rst for more
221	 * information.
222	 */
223	int weight;
224
225	/*
226	 * This is a bit mask that gives the binding relation between this
227	 * thermal zone and cdev, for a particular trip point.
228	 * See Documentation/driver-api/thermal/sysfs-api.rst for more information.
229	 */
230	int trip_mask;
231
232	/*
233	 * This is an array of cooling state limits. Must have exactly
234	 * 2 * thermal_zone.number_of_trip_points. It is an array consisting
235	 * of tuples <lower-state upper-state> of state limits. Each trip
236	 * will be associated with one state limit tuple when binding.
237	 * A NULL pointer means <THERMAL_NO_LIMITS THERMAL_NO_LIMITS>
238	 * on all trips.
239	 */
240	unsigned long *binding_limits;
241	int (*match) (struct thermal_zone_device *tz,
242			struct thermal_cooling_device *cdev);
243};
244
245/* Structure to define Thermal Zone parameters */
246struct thermal_zone_params {
247	char governor_name[THERMAL_NAME_LENGTH];
248
249	/*
250	 * a boolean to indicate if the thermal to hwmon sysfs interface
251	 * is required. when no_hwmon == false, a hwmon sysfs interface
252	 * will be created. when no_hwmon == true, nothing will be done
253	 */
254	bool no_hwmon;
255
256	int num_tbps;	/* Number of tbp entries */
257	struct thermal_bind_params *tbp;
258
259	/*
260	 * Sustainable power (heat) that this thermal zone can dissipate in
261	 * mW
262	 */
263	u32 sustainable_power;
264
265	/*
266	 * Proportional parameter of the PID controller when
267	 * overshooting (i.e., when temperature is below the target)
268	 */
269	s32 k_po;
270
271	/*
272	 * Proportional parameter of the PID controller when
273	 * undershooting
274	 */
275	s32 k_pu;
276
277	/* Integral parameter of the PID controller */
278	s32 k_i;
279
280	/* Derivative parameter of the PID controller */
281	s32 k_d;
282
283	/* threshold below which the error is no longer accumulated */
284	s32 integral_cutoff;
285
286	/*
287	 * @slope:	slope of a linear temperature adjustment curve.
288	 * 		Used by thermal zone drivers.
289	 */
290	int slope;
291	/*
292	 * @offset:	offset of a linear temperature adjustment curve.
293	 * 		Used by thermal zone drivers (default 0).
294	 */
295	int offset;
296};
297
298/* Function declarations */
299#ifdef CONFIG_THERMAL_OF
300struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data,
301						     const struct thermal_zone_device_ops *ops);
302
303struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data,
304							  const struct thermal_zone_device_ops *ops);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305
306void thermal_of_zone_unregister(struct thermal_zone_device *tz);
 
 
 
 
 
 
307
308void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_device *tz);
309
310void thermal_of_zone_unregister(struct thermal_zone_device *tz);
 
 
 
311
 
 
 
 
 
 
 
 
 
 
 
 
312#else
313static inline
314struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data,
315						     const struct thermal_zone_device_ops *ops)
316{
317	return ERR_PTR(-ENOTSUPP);
318}
319
320static inline
321struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data,
322							  const struct thermal_zone_device_ops *ops)
323{
324	return ERR_PTR(-ENOTSUPP);
325}
326
327static inline void thermal_of_zone_unregister(struct thermal_zone_device *tz)
 
 
328{
 
329}
330
331static inline void devm_thermal_of_zone_unregister(struct device *dev,
332						   struct thermal_zone_device *tz)
 
333{
334}
 
335#endif
336
337#ifdef CONFIG_THERMAL
 
 
 
 
 
 
 
 
 
 
 
 
338struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
339		void *, struct thermal_zone_device_ops *,
340		struct thermal_zone_params *, int, int);
341
342void thermal_zone_device_unregister(struct thermal_zone_device *);
343
344struct thermal_zone_device *
345thermal_zone_device_register_with_trips(const char *, struct thermal_trip *, int, int,
346					void *, struct thermal_zone_device_ops *,
347					struct thermal_zone_params *, int, int);
348
349int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
350				     struct thermal_cooling_device *,
351				     unsigned long, unsigned long,
352				     unsigned int);
353int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
354				       struct thermal_cooling_device *);
355void thermal_zone_device_update(struct thermal_zone_device *,
356				enum thermal_notify_event);
 
357
358struct thermal_cooling_device *thermal_cooling_device_register(const char *,
359		void *, const struct thermal_cooling_device_ops *);
360struct thermal_cooling_device *
361thermal_of_cooling_device_register(struct device_node *np, const char *, void *,
362				   const struct thermal_cooling_device_ops *);
363struct thermal_cooling_device *
364devm_thermal_of_cooling_device_register(struct device *dev,
365				struct device_node *np,
366				char *type, void *devdata,
367				const struct thermal_cooling_device_ops *ops);
368void thermal_cooling_device_unregister(struct thermal_cooling_device *);
369struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name);
370int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
371int thermal_zone_get_slope(struct thermal_zone_device *tz);
372int thermal_zone_get_offset(struct thermal_zone_device *tz);
373
374int thermal_zone_device_enable(struct thermal_zone_device *tz);
375int thermal_zone_device_disable(struct thermal_zone_device *tz);
376void thermal_zone_device_critical(struct thermal_zone_device *tz);
 
 
377#else
 
 
 
 
 
 
 
 
 
 
 
 
378static inline struct thermal_zone_device *thermal_zone_device_register(
379	const char *type, int trips, int mask, void *devdata,
380	struct thermal_zone_device_ops *ops,
381	struct thermal_zone_params *tzp,
382	int passive_delay, int polling_delay)
383{ return ERR_PTR(-ENODEV); }
384static inline void thermal_zone_device_unregister(
385	struct thermal_zone_device *tz)
386{ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
387static inline struct thermal_cooling_device *
388thermal_cooling_device_register(const char *type, void *devdata,
389	const struct thermal_cooling_device_ops *ops)
390{ return ERR_PTR(-ENODEV); }
391static inline struct thermal_cooling_device *
392thermal_of_cooling_device_register(struct device_node *np,
393	const char *type, void *devdata,
394	const struct thermal_cooling_device_ops *ops)
395{ return ERR_PTR(-ENODEV); }
396static inline struct thermal_cooling_device *
397devm_thermal_of_cooling_device_register(struct device *dev,
398				struct device_node *np,
399				char *type, void *devdata,
400				const struct thermal_cooling_device_ops *ops)
401{
402	return ERR_PTR(-ENODEV);
403}
404static inline void thermal_cooling_device_unregister(
405	struct thermal_cooling_device *cdev)
406{ }
407static inline struct thermal_zone_device *thermal_zone_get_zone_by_name(
408		const char *name)
409{ return ERR_PTR(-ENODEV); }
410static inline int thermal_zone_get_temp(
411		struct thermal_zone_device *tz, int *temp)
412{ return -ENODEV; }
413static inline int thermal_zone_get_slope(
414		struct thermal_zone_device *tz)
415{ return -ENODEV; }
416static inline int thermal_zone_get_offset(
417		struct thermal_zone_device *tz)
418{ return -ENODEV; }
419
420static inline int thermal_zone_device_enable(struct thermal_zone_device *tz)
421{ return -ENODEV; }
 
 
 
 
 
 
 
 
 
 
422
423static inline int thermal_zone_device_disable(struct thermal_zone_device *tz)
424{ return -ENODEV; }
425#endif /* CONFIG_THERMAL */
 
 
 
 
 
 
 
426
427#endif /* __THERMAL_H__ */