at v6.10 351 lines 12 kB view raw
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_debugfs; 36struct thermal_attr; 37 38enum thermal_trend { 39 THERMAL_TREND_STABLE, /* temperature is stable */ 40 THERMAL_TREND_RAISING, /* temperature is raising */ 41 THERMAL_TREND_DROPPING, /* temperature is dropping */ 42}; 43 44/* Thermal notification reason */ 45enum thermal_notify_event { 46 THERMAL_EVENT_UNSPECIFIED, /* Unspecified event */ 47 THERMAL_EVENT_TEMP_SAMPLE, /* New Temperature sample */ 48 THERMAL_TRIP_VIOLATED, /* TRIP Point violation */ 49 THERMAL_TRIP_CHANGED, /* TRIP Point temperature changed */ 50 THERMAL_DEVICE_DOWN, /* Thermal device is down */ 51 THERMAL_DEVICE_UP, /* Thermal device is up after a down event */ 52 THERMAL_DEVICE_POWER_CAPABILITY_CHANGED, /* power capability changed */ 53 THERMAL_TABLE_CHANGED, /* Thermal table(s) changed */ 54 THERMAL_EVENT_KEEP_ALIVE, /* Request for user space handler to respond */ 55 THERMAL_TZ_BIND_CDEV, /* Cooling dev is bind to the thermal zone */ 56 THERMAL_TZ_UNBIND_CDEV, /* Cooling dev is unbind from the thermal zone */ 57 THERMAL_INSTANCE_WEIGHT_CHANGED, /* Thermal instance weight changed */ 58}; 59 60/** 61 * struct thermal_trip - representation of a point in temperature domain 62 * @temperature: temperature value in miliCelsius 63 * @hysteresis: relative hysteresis in miliCelsius 64 * @type: trip point type 65 * @priv: pointer to driver data associated with this trip 66 * @flags: flags representing binary properties of the trip 67 */ 68struct thermal_trip { 69 int temperature; 70 int hysteresis; 71 enum thermal_trip_type type; 72 u8 flags; 73 void *priv; 74}; 75 76#define THERMAL_TRIP_FLAG_RW_TEMP BIT(0) 77#define THERMAL_TRIP_FLAG_RW_HYST BIT(1) 78 79#define THERMAL_TRIP_FLAG_RW (THERMAL_TRIP_FLAG_RW_TEMP | \ 80 THERMAL_TRIP_FLAG_RW_HYST) 81 82struct thermal_zone_device; 83 84struct thermal_zone_device_ops { 85 int (*bind) (struct thermal_zone_device *, 86 struct thermal_cooling_device *); 87 int (*unbind) (struct thermal_zone_device *, 88 struct thermal_cooling_device *); 89 int (*get_temp) (struct thermal_zone_device *, int *); 90 int (*set_trips) (struct thermal_zone_device *, int, int); 91 int (*change_mode) (struct thermal_zone_device *, 92 enum thermal_device_mode); 93 int (*set_trip_temp) (struct thermal_zone_device *, int, int); 94 int (*get_crit_temp) (struct thermal_zone_device *, int *); 95 int (*set_emul_temp) (struct thermal_zone_device *, int); 96 int (*get_trend) (struct thermal_zone_device *, 97 const struct thermal_trip *, enum thermal_trend *); 98 void (*hot)(struct thermal_zone_device *); 99 void (*critical)(struct thermal_zone_device *); 100}; 101 102struct thermal_cooling_device_ops { 103 int (*get_max_state) (struct thermal_cooling_device *, unsigned long *); 104 int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *); 105 int (*set_cur_state) (struct thermal_cooling_device *, unsigned long); 106 int (*get_requested_power)(struct thermal_cooling_device *, u32 *); 107 int (*state2power)(struct thermal_cooling_device *, unsigned long, u32 *); 108 int (*power2state)(struct thermal_cooling_device *, u32, unsigned long *); 109}; 110 111struct thermal_cooling_device { 112 int id; 113 const char *type; 114 unsigned long max_state; 115 struct device device; 116 struct device_node *np; 117 void *devdata; 118 void *stats; 119 const struct thermal_cooling_device_ops *ops; 120 bool updated; /* true if the cooling device does not need update */ 121 struct mutex lock; /* protect thermal_instances list */ 122 struct list_head thermal_instances; 123 struct list_head node; 124#ifdef CONFIG_THERMAL_DEBUGFS 125 struct thermal_debugfs *debugfs; 126#endif 127}; 128 129/* Structure to define Thermal Zone parameters */ 130struct thermal_zone_params { 131 const char *governor_name; 132 133 /* 134 * a boolean to indicate if the thermal to hwmon sysfs interface 135 * is required. when no_hwmon == false, a hwmon sysfs interface 136 * will be created. when no_hwmon == true, nothing will be done 137 */ 138 bool no_hwmon; 139 140 /* 141 * Sustainable power (heat) that this thermal zone can dissipate in 142 * mW 143 */ 144 u32 sustainable_power; 145 146 /* 147 * Proportional parameter of the PID controller when 148 * overshooting (i.e., when temperature is below the target) 149 */ 150 s32 k_po; 151 152 /* 153 * Proportional parameter of the PID controller when 154 * undershooting 155 */ 156 s32 k_pu; 157 158 /* Integral parameter of the PID controller */ 159 s32 k_i; 160 161 /* Derivative parameter of the PID controller */ 162 s32 k_d; 163 164 /* threshold below which the error is no longer accumulated */ 165 s32 integral_cutoff; 166 167 /* 168 * @slope: slope of a linear temperature adjustment curve. 169 * Used by thermal zone drivers. 170 */ 171 int slope; 172 /* 173 * @offset: offset of a linear temperature adjustment curve. 174 * Used by thermal zone drivers (default 0). 175 */ 176 int offset; 177}; 178 179/* Function declarations */ 180#ifdef CONFIG_THERMAL_OF 181struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data, 182 const struct thermal_zone_device_ops *ops); 183 184void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_device *tz); 185 186#else 187 188static inline 189struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data, 190 const struct thermal_zone_device_ops *ops) 191{ 192 return ERR_PTR(-ENOTSUPP); 193} 194 195static inline void devm_thermal_of_zone_unregister(struct device *dev, 196 struct thermal_zone_device *tz) 197{ 198} 199#endif 200 201int __thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id, 202 struct thermal_trip *trip); 203int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id, 204 struct thermal_trip *trip); 205int for_each_thermal_trip(struct thermal_zone_device *tz, 206 int (*cb)(struct thermal_trip *, void *), 207 void *data); 208int thermal_zone_for_each_trip(struct thermal_zone_device *tz, 209 int (*cb)(struct thermal_trip *, void *), 210 void *data); 211int thermal_zone_get_num_trips(struct thermal_zone_device *tz); 212void thermal_zone_set_trip_temp(struct thermal_zone_device *tz, 213 struct thermal_trip *trip, int temp); 214 215int thermal_zone_get_crit_temp(struct thermal_zone_device *tz, int *temp); 216 217#ifdef CONFIG_THERMAL 218struct thermal_zone_device *thermal_zone_device_register_with_trips( 219 const char *type, 220 const struct thermal_trip *trips, 221 int num_trips, void *devdata, 222 const struct thermal_zone_device_ops *ops, 223 const struct thermal_zone_params *tzp, 224 int passive_delay, int polling_delay); 225 226struct thermal_zone_device *thermal_tripless_zone_device_register( 227 const char *type, 228 void *devdata, 229 const struct thermal_zone_device_ops *ops, 230 const struct thermal_zone_params *tzp); 231 232void thermal_zone_device_unregister(struct thermal_zone_device *tz); 233 234void *thermal_zone_device_priv(struct thermal_zone_device *tzd); 235const char *thermal_zone_device_type(struct thermal_zone_device *tzd); 236int thermal_zone_device_id(struct thermal_zone_device *tzd); 237struct device *thermal_zone_device(struct thermal_zone_device *tzd); 238 239int thermal_bind_cdev_to_trip(struct thermal_zone_device *tz, 240 const struct thermal_trip *trip, 241 struct thermal_cooling_device *cdev, 242 unsigned long upper, unsigned long lower, 243 unsigned int weight); 244int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int, 245 struct thermal_cooling_device *, 246 unsigned long, unsigned long, 247 unsigned int); 248int thermal_unbind_cdev_from_trip(struct thermal_zone_device *tz, 249 const struct thermal_trip *trip, 250 struct thermal_cooling_device *cdev); 251int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int, 252 struct thermal_cooling_device *); 253void thermal_zone_device_update(struct thermal_zone_device *, 254 enum thermal_notify_event); 255 256struct thermal_cooling_device *thermal_cooling_device_register(const char *, 257 void *, const struct thermal_cooling_device_ops *); 258struct thermal_cooling_device * 259thermal_of_cooling_device_register(struct device_node *np, const char *, void *, 260 const struct thermal_cooling_device_ops *); 261struct thermal_cooling_device * 262devm_thermal_of_cooling_device_register(struct device *dev, 263 struct device_node *np, 264 char *type, void *devdata, 265 const struct thermal_cooling_device_ops *ops); 266void thermal_cooling_device_update(struct thermal_cooling_device *); 267void thermal_cooling_device_unregister(struct thermal_cooling_device *); 268struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name); 269int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp); 270int thermal_zone_get_slope(struct thermal_zone_device *tz); 271int thermal_zone_get_offset(struct thermal_zone_device *tz); 272 273int thermal_zone_device_enable(struct thermal_zone_device *tz); 274int thermal_zone_device_disable(struct thermal_zone_device *tz); 275void thermal_zone_device_critical(struct thermal_zone_device *tz); 276#else 277static inline struct thermal_zone_device *thermal_zone_device_register_with_trips( 278 const char *type, 279 const struct thermal_trip *trips, 280 int num_trips, void *devdata, 281 const struct thermal_zone_device_ops *ops, 282 const struct thermal_zone_params *tzp, 283 int passive_delay, int polling_delay) 284{ return ERR_PTR(-ENODEV); } 285 286static inline struct thermal_zone_device *thermal_tripless_zone_device_register( 287 const char *type, 288 void *devdata, 289 struct thermal_zone_device_ops *ops, 290 const struct thermal_zone_params *tzp) 291{ return ERR_PTR(-ENODEV); } 292 293static inline void thermal_zone_device_unregister(struct thermal_zone_device *tz) 294{ } 295 296static inline struct thermal_cooling_device * 297thermal_cooling_device_register(const char *type, void *devdata, 298 const struct thermal_cooling_device_ops *ops) 299{ return ERR_PTR(-ENODEV); } 300static inline struct thermal_cooling_device * 301thermal_of_cooling_device_register(struct device_node *np, 302 const char *type, void *devdata, 303 const struct thermal_cooling_device_ops *ops) 304{ return ERR_PTR(-ENODEV); } 305static inline struct thermal_cooling_device * 306devm_thermal_of_cooling_device_register(struct device *dev, 307 struct device_node *np, 308 char *type, void *devdata, 309 const struct thermal_cooling_device_ops *ops) 310{ 311 return ERR_PTR(-ENODEV); 312} 313static inline void thermal_cooling_device_unregister( 314 struct thermal_cooling_device *cdev) 315{ } 316static inline struct thermal_zone_device *thermal_zone_get_zone_by_name( 317 const char *name) 318{ return ERR_PTR(-ENODEV); } 319static inline int thermal_zone_get_temp( 320 struct thermal_zone_device *tz, int *temp) 321{ return -ENODEV; } 322static inline int thermal_zone_get_slope( 323 struct thermal_zone_device *tz) 324{ return -ENODEV; } 325static inline int thermal_zone_get_offset( 326 struct thermal_zone_device *tz) 327{ return -ENODEV; } 328 329static inline void *thermal_zone_device_priv(struct thermal_zone_device *tz) 330{ 331 return NULL; 332} 333 334static inline const char *thermal_zone_device_type(struct thermal_zone_device *tzd) 335{ 336 return NULL; 337} 338 339static inline int thermal_zone_device_id(struct thermal_zone_device *tzd) 340{ 341 return -ENODEV; 342} 343 344static inline int thermal_zone_device_enable(struct thermal_zone_device *tz) 345{ return -ENODEV; } 346 347static inline int thermal_zone_device_disable(struct thermal_zone_device *tz) 348{ return -ENODEV; } 349#endif /* CONFIG_THERMAL */ 350 351#endif /* __THERMAL_H__ */