Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
C
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395/* SPDX-License-Identifier: GPL-2.0 *//* * thermal.h ($Revision: 0 $) * * Copyright (C) 2008 Intel Corp * Copyright (C) 2008 Zhang Rui <rui.zhang@intel.com> * Copyright (C) 2008 Sujith Thomas <sujith.thomas@intel.com> */
#ifndef __THERMAL_H__#define __THERMAL_H__
#include <linux/of.h>#include <linux/idr.h>#include <linux/device.h>#include <linux/sysfs.h>#include <linux/workqueue.h>#include <uapi/linux/thermal.h>
/* invalid cooling state */#define THERMAL_CSTATE_INVALID -1UL
/* No upper/lower limit requirement */#define THERMAL_NO_LIMIT ((u32)~0)
/* Default weight of a bound cooling device */#define THERMAL_WEIGHT_DEFAULT 0
/* use value, which < 0K, to indicate an invalid/uninitialized temperature */#define THERMAL_TEMP_INVALID -274000
struct thermal_zone_device;struct thermal_cooling_device;struct thermal_instance;struct thermal_debugfs;struct thermal_attr;
enum thermal_trend { THERMAL_TREND_STABLE, /* temperature is stable */ THERMAL_TREND_RAISING, /* temperature is raising */ THERMAL_TREND_DROPPING, /* temperature is dropping */};
/* Thermal notification reason */enum thermal_notify_event { THERMAL_EVENT_UNSPECIFIED, /* Unspecified event */ THERMAL_EVENT_TEMP_SAMPLE, /* New Temperature sample */ THERMAL_TRIP_VIOLATED, /* TRIP Point violation */ THERMAL_TRIP_CHANGED, /* TRIP Point temperature changed */ THERMAL_DEVICE_DOWN, /* Thermal device is down */ THERMAL_DEVICE_UP, /* Thermal device is up after a down event */ THERMAL_DEVICE_POWER_CAPABILITY_CHANGED, /* power capability changed */ THERMAL_TABLE_CHANGED, /* Thermal table(s) changed */ THERMAL_EVENT_KEEP_ALIVE, /* Request for user space handler to respond */ THERMAL_TZ_BIND_CDEV, /* Cooling dev is bind to the thermal zone */ THERMAL_TZ_UNBIND_CDEV, /* Cooling dev is unbind from the thermal zone */ THERMAL_INSTANCE_WEIGHT_CHANGED, /* Thermal instance weight changed */ THERMAL_TZ_RESUME, /* Thermal zone is resuming after system sleep */ THERMAL_TZ_ADD_THRESHOLD, /* Threshold added */ THERMAL_TZ_DEL_THRESHOLD, /* Threshold deleted */ THERMAL_TZ_FLUSH_THRESHOLDS, /* All thresholds deleted */};
/** * struct thermal_trip - representation of a point in temperature domain * @temperature: temperature value in miliCelsius * @hysteresis: relative hysteresis in miliCelsius * @type: trip point type * @priv: pointer to driver data associated with this trip * @flags: flags representing binary properties of the trip */struct thermal_trip { int temperature; int hysteresis; enum thermal_trip_type type; u8 flags; void *priv;};
#define THERMAL_TRIP_FLAG_RW_TEMP BIT(0)#define THERMAL_TRIP_FLAG_RW_HYST BIT(1)
#define THERMAL_TRIP_FLAG_RW (THERMAL_TRIP_FLAG_RW_TEMP | \ THERMAL_TRIP_FLAG_RW_HYST)
#define THERMAL_TRIP_PRIV_TO_INT(_val_) (uintptr_t)(_val_)#define THERMAL_INT_TO_TRIP_PRIV(_val_) (void *)(uintptr_t)(_val_)
struct cooling_spec { unsigned long upper; /* Highest cooling state */ unsigned long lower; /* Lowest cooling state */ unsigned int weight; /* Cooling device weight */};
struct thermal_zone_device_ops { bool (*should_bind) (struct thermal_zone_device *, const struct thermal_trip *, struct thermal_cooling_device *, struct cooling_spec *); int (*get_temp) (struct thermal_zone_device *, int *); int (*set_trips) (struct thermal_zone_device *, int, int); int (*change_mode) (struct thermal_zone_device *, enum thermal_device_mode); int (*set_trip_temp) (struct thermal_zone_device *, const struct thermal_trip *, int); int (*get_crit_temp) (struct thermal_zone_device *, int *); int (*set_emul_temp) (struct thermal_zone_device *, int); int (*get_trend) (struct thermal_zone_device *, const struct thermal_trip *, enum thermal_trend *); void (*hot)(struct thermal_zone_device *); void (*critical)(struct thermal_zone_device *);};
struct thermal_cooling_device_ops { int (*get_max_state) (struct thermal_cooling_device *, unsigned long *); int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *); int (*set_cur_state) (struct thermal_cooling_device *, unsigned long); int (*get_requested_power)(struct thermal_cooling_device *, u32 *); int (*state2power)(struct thermal_cooling_device *, unsigned long, u32 *); int (*power2state)(struct thermal_cooling_device *, u32, unsigned long *);};
struct thermal_cooling_device { int id; const char *type; unsigned long max_state; struct device device; void *devdata; void *stats; const struct thermal_cooling_device_ops *ops; bool updated; /* true if the cooling device does not need update */ struct mutex lock; /* protect thermal_instances list */ struct list_head thermal_instances; struct list_head node;#ifdef CONFIG_THERMAL_OF struct device_node *np; u32 cdev_id;#endif#ifdef CONFIG_THERMAL_DEBUGFS struct thermal_debugfs *debugfs;#endif};
DEFINE_GUARD(cooling_dev, struct thermal_cooling_device *, mutex_lock(&_T->lock), mutex_unlock(&_T->lock))
/* Structure to define Thermal Zone parameters */struct thermal_zone_params { const char *governor_name;
/* * a boolean to indicate if the thermal to hwmon sysfs interface * is required. when no_hwmon == false, a hwmon sysfs interface * will be created. when no_hwmon == true, nothing will be done */ bool no_hwmon;
/* * Sustainable power (heat) that this thermal zone can dissipate in * mW */ u32 sustainable_power;
/* * Proportional parameter of the PID controller when * overshooting (i.e., when temperature is below the target) */ s32 k_po;
/* * Proportional parameter of the PID controller when * undershooting */ s32 k_pu;
/* Integral parameter of the PID controller */ s32 k_i;
/* Derivative parameter of the PID controller */ s32 k_d;
/* threshold below which the error is no longer accumulated */ s32 integral_cutoff;
/* * @slope: slope of a linear temperature adjustment curve. * Used by thermal zone drivers. */ int slope; /* * @offset: offset of a linear temperature adjustment curve. * Used by thermal zone drivers (default 0). */ int offset;};
/* Function declarations */#ifdef CONFIG_THERMAL_OFstruct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data, const struct thermal_zone_device_ops *ops);
void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_device *tz);
struct thermal_cooling_device *thermal_of_cooling_device_register(struct device_node *np, u32 cdev_id, const char *type, void *data, const struct thermal_cooling_device_ops *ops);
struct thermal_cooling_device *devm_thermal_of_cooling_device_register(struct device *dev, u32 cdev_id, const char *type, void *devdata, const struct thermal_cooling_device_ops *ops);
struct thermal_cooling_device *devm_thermal_of_child_cooling_device_register(struct device *dev, struct device_node *np, const char *type, void *devdata, const struct thermal_cooling_device_ops *ops);#else
static inlinestruct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data, const struct thermal_zone_device_ops *ops){ return ERR_PTR(-ENOTSUPP);}
static inline void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_device *tz){}
static inline struct thermal_cooling_device *thermal_of_cooling_device_register(struct device_node *np, u32 cdev_id, const char *type, void *devdata, const struct thermal_cooling_device_ops *ops){ return ERR_PTR(-ENODEV);}
static inline struct thermal_cooling_device *devm_thermal_of_cooling_device_register(struct device *dev, u32 cdev_id, const char *type, void *devdata, const struct thermal_cooling_device_ops *ops){ return ERR_PTR(-ENODEV);}
static inline struct thermal_cooling_device *devm_thermal_of_child_cooling_device_register(struct device *dev, struct device_node *np, const char *type, void *devdata, const struct thermal_cooling_device_ops *ops){ return ERR_PTR(-ENODEV);}#endif
int for_each_thermal_trip(struct thermal_zone_device *tz, int (*cb)(struct thermal_trip *, void *), void *data);int thermal_zone_for_each_trip(struct thermal_zone_device *tz, int (*cb)(struct thermal_trip *, void *), void *data);void thermal_zone_set_trip_temp(struct thermal_zone_device *tz, struct thermal_trip *trip, int temp);
int thermal_zone_get_crit_temp(struct thermal_zone_device *tz, int *temp);
#ifdef CONFIG_THERMALstruct thermal_zone_device *thermal_zone_device_register_with_trips( const char *type, const struct thermal_trip *trips, int num_trips, void *devdata, const struct thermal_zone_device_ops *ops, const struct thermal_zone_params *tzp, unsigned int passive_delay, unsigned int polling_delay);
struct thermal_zone_device *thermal_tripless_zone_device_register( const char *type, void *devdata, const struct thermal_zone_device_ops *ops, const struct thermal_zone_params *tzp);
void thermal_zone_device_unregister(struct thermal_zone_device *tz);
void *thermal_zone_device_priv(struct thermal_zone_device *tzd);const char *thermal_zone_device_type(struct thermal_zone_device *tzd);int thermal_zone_device_id(struct thermal_zone_device *tzd);struct device *thermal_zone_device(struct thermal_zone_device *tzd);
void thermal_zone_device_update(struct thermal_zone_device *, enum thermal_notify_event);
struct thermal_cooling_device *thermal_cooling_device_register(const char *, void *, const struct thermal_cooling_device_ops *);
struct thermal_cooling_device *devm_thermal_cooling_device_register(struct device *dev, const char *type, void *devdata, const struct thermal_cooling_device_ops *ops);
void thermal_cooling_device_update(struct thermal_cooling_device *);void thermal_cooling_device_unregister(struct thermal_cooling_device *);struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name);int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);int thermal_zone_get_slope(struct thermal_zone_device *tz);int thermal_zone_get_offset(struct thermal_zone_device *tz);bool thermal_trip_is_bound_to_cdev(struct thermal_zone_device *tz, const struct thermal_trip *trip, struct thermal_cooling_device *cdev);
int thermal_zone_device_enable(struct thermal_zone_device *tz);int thermal_zone_device_disable(struct thermal_zone_device *tz);void thermal_zone_device_critical(struct thermal_zone_device *tz);
void thermal_pm_prepare(void);void thermal_pm_complete(void);#elsestatic inline struct thermal_zone_device *thermal_zone_device_register_with_trips( const char *type, const struct thermal_trip *trips, int num_trips, void *devdata, const struct thermal_zone_device_ops *ops, const struct thermal_zone_params *tzp, int passive_delay, int polling_delay){ return ERR_PTR(-ENODEV); }
static inline struct thermal_zone_device *thermal_tripless_zone_device_register( const char *type, void *devdata, struct thermal_zone_device_ops *ops, const struct thermal_zone_params *tzp){ return ERR_PTR(-ENODEV); }
static inline void thermal_zone_device_unregister(struct thermal_zone_device *tz){ }
static inline void thermal_zone_device_update(struct thermal_zone_device *tz, enum thermal_notify_event event){ }
static inline struct thermal_cooling_device *thermal_cooling_device_register(const char *type, void *devdata, const struct thermal_cooling_device_ops *ops){ return ERR_PTR(-ENODEV); }
static inline struct thermal_cooling_device *devm_thermal_cooling_device_register(struct device *dev, const char *type, void *devdata, const struct thermal_cooling_device_ops *ops){ return ERR_PTR(-ENODEV); }
static inline void thermal_cooling_device_unregister( struct thermal_cooling_device *cdev){ }static inline struct thermal_zone_device *thermal_zone_get_zone_by_name( const char *name){ return ERR_PTR(-ENODEV); }static inline int thermal_zone_get_temp( struct thermal_zone_device *tz, int *temp){ return -ENODEV; }static inline int thermal_zone_get_slope( struct thermal_zone_device *tz){ return -ENODEV; }static inline int thermal_zone_get_offset( struct thermal_zone_device *tz){ return -ENODEV; }
static inline void *thermal_zone_device_priv(struct thermal_zone_device *tz){ return NULL;}
static inline const char *thermal_zone_device_type(struct thermal_zone_device *tzd){ return NULL;}
static inline int thermal_zone_device_id(struct thermal_zone_device *tzd){ return -ENODEV;}
static inline int thermal_zone_device_enable(struct thermal_zone_device *tz){ return -ENODEV; }
static inline int thermal_zone_device_disable(struct thermal_zone_device *tz){ return -ENODEV; }
static inline void thermal_pm_prepare(void) {}static inline void thermal_pm_complete(void) {}#endif /* CONFIG_THERMAL */
#endif /* __THERMAL_H__ */