linux/include/linux/thermal.h
<<
>>
Prefs
   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/* invalid cooling state */
  37#define THERMAL_CSTATE_INVALID -1UL
  38
  39/* No upper/lower limit requirement */
  40#define THERMAL_NO_LIMIT        THERMAL_CSTATE_INVALID
  41
  42/* Unit conversion macros */
  43#define KELVIN_TO_CELSIUS(t)    (long)(((long)t-2732 >= 0) ?    \
  44                                ((long)t-2732+5)/10 : ((long)t-2732-5)/10)
  45#define CELSIUS_TO_KELVIN(t)    ((t)*10+2732)
  46
  47/* Adding event notification support elements */
  48#define THERMAL_GENL_FAMILY_NAME                "thermal_event"
  49#define THERMAL_GENL_VERSION                    0x01
  50#define THERMAL_GENL_MCAST_GROUP_NAME           "thermal_mc_grp"
  51
  52/* Default Thermal Governor */
  53#if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE)
  54#define DEFAULT_THERMAL_GOVERNOR       "step_wise"
  55#elif defined(CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE)
  56#define DEFAULT_THERMAL_GOVERNOR       "fair_share"
  57#elif defined(CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE)
  58#define DEFAULT_THERMAL_GOVERNOR       "user_space"
  59#endif
  60
  61struct thermal_zone_device;
  62struct thermal_cooling_device;
  63
  64enum thermal_device_mode {
  65        THERMAL_DEVICE_DISABLED = 0,
  66        THERMAL_DEVICE_ENABLED,
  67};
  68
  69enum thermal_trip_type {
  70        THERMAL_TRIP_ACTIVE = 0,
  71        THERMAL_TRIP_PASSIVE,
  72        THERMAL_TRIP_HOT,
  73        THERMAL_TRIP_CRITICAL,
  74};
  75
  76enum thermal_trend {
  77        THERMAL_TREND_STABLE, /* temperature is stable */
  78        THERMAL_TREND_RAISING, /* temperature is raising */
  79        THERMAL_TREND_DROPPING, /* temperature is dropping */
  80        THERMAL_TREND_RAISE_FULL, /* apply highest cooling action */
  81        THERMAL_TREND_DROP_FULL, /* apply lowest cooling action */
  82};
  83
  84/* Events supported by Thermal Netlink */
  85enum events {
  86        THERMAL_AUX0,
  87        THERMAL_AUX1,
  88        THERMAL_CRITICAL,
  89        THERMAL_DEV_FAULT,
  90};
  91
  92/* attributes of thermal_genl_family */
  93enum {
  94        THERMAL_GENL_ATTR_UNSPEC,
  95        THERMAL_GENL_ATTR_EVENT,
  96        __THERMAL_GENL_ATTR_MAX,
  97};
  98#define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1)
  99
 100/* commands supported by the thermal_genl_family */
 101enum {
 102        THERMAL_GENL_CMD_UNSPEC,
 103        THERMAL_GENL_CMD_EVENT,
 104        __THERMAL_GENL_CMD_MAX,
 105};
 106#define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1)
 107
 108struct thermal_zone_device_ops {
 109        int (*bind) (struct thermal_zone_device *,
 110                     struct thermal_cooling_device *);
 111        int (*unbind) (struct thermal_zone_device *,
 112                       struct thermal_cooling_device *);
 113        int (*get_temp) (struct thermal_zone_device *, unsigned long *);
 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,
 121                              unsigned long *);
 122        int (*set_trip_temp) (struct thermal_zone_device *, int,
 123                              unsigned long);
 124        int (*get_trip_hyst) (struct thermal_zone_device *, int,
 125                              unsigned long *);
 126        int (*set_trip_hyst) (struct thermal_zone_device *, int,
 127                              unsigned long);
 128        int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
 129        int (*set_emul_temp) (struct thermal_zone_device *, unsigned long);
 130        int (*get_trend) (struct thermal_zone_device *, int,
 131                          enum thermal_trend *);
 132        int (*notify) (struct thermal_zone_device *, int,
 133                       enum thermal_trip_type);
 134};
 135
 136struct thermal_cooling_device_ops {
 137        int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
 138        int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
 139        int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
 140};
 141
 142struct thermal_cooling_device {
 143        int id;
 144        char type[THERMAL_NAME_LENGTH];
 145        struct device device;
 146        void *devdata;
 147        const struct thermal_cooling_device_ops *ops;
 148        bool updated; /* true if the cooling device does not need update */
 149        struct mutex lock; /* protect thermal_instances list */
 150        struct list_head thermal_instances;
 151        struct list_head node;
 152};
 153
 154struct thermal_attr {
 155        struct device_attribute attr;
 156        char name[THERMAL_NAME_LENGTH];
 157};
 158
 159struct thermal_zone_device {
 160        int id;
 161        char type[THERMAL_NAME_LENGTH];
 162        struct device device;
 163        struct thermal_attr *trip_temp_attrs;
 164        struct thermal_attr *trip_type_attrs;
 165        struct thermal_attr *trip_hyst_attrs;
 166        void *devdata;
 167        int trips;
 168        int passive_delay;
 169        int polling_delay;
 170        int temperature;
 171        int last_temperature;
 172        int emul_temperature;
 173        int passive;
 174        unsigned int forced_passive;
 175        const struct thermal_zone_device_ops *ops;
 176        const struct thermal_zone_params *tzp;
 177        struct thermal_governor *governor;
 178        struct list_head thermal_instances;
 179        struct idr idr;
 180        struct mutex lock; /* protect thermal_instances list */
 181        struct list_head node;
 182        struct delayed_work poll_queue;
 183};
 184
 185/* Structure that holds thermal governor information */
 186struct thermal_governor {
 187        char name[THERMAL_NAME_LENGTH];
 188        int (*throttle)(struct thermal_zone_device *tz, int trip);
 189        struct list_head        governor_list;
 190};
 191
 192/* Structure that holds binding parameters for a zone */
 193struct thermal_bind_params {
 194        struct thermal_cooling_device *cdev;
 195
 196        /*
 197         * This is a measure of 'how effectively these devices can
 198         * cool 'this' thermal zone. The shall be determined by platform
 199         * characterization. This is on a 'percentage' scale.
 200         * See Documentation/thermal/sysfs-api.txt for more information.
 201         */
 202        int weight;
 203
 204        /*
 205         * This is a bit mask that gives the binding relation between this
 206         * thermal zone and cdev, for a particular trip point.
 207         * See Documentation/thermal/sysfs-api.txt for more information.
 208         */
 209        int trip_mask;
 210        int (*match) (struct thermal_zone_device *tz,
 211                        struct thermal_cooling_device *cdev);
 212};
 213
 214/* Structure to define Thermal Zone parameters */
 215struct thermal_zone_params {
 216        char governor_name[THERMAL_NAME_LENGTH];
 217        int num_tbps;   /* Number of tbp entries */
 218        struct thermal_bind_params *tbp;
 219};
 220
 221struct thermal_genl_event {
 222        u32 orig;
 223        enum events event;
 224};
 225
 226/* Function declarations */
 227struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
 228                void *, const struct thermal_zone_device_ops *,
 229                const struct thermal_zone_params *, int, int);
 230void thermal_zone_device_unregister(struct thermal_zone_device *);
 231
 232int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
 233                                     struct thermal_cooling_device *,
 234                                     unsigned long, unsigned long);
 235int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
 236                                       struct thermal_cooling_device *);
 237void thermal_zone_device_update(struct thermal_zone_device *);
 238
 239struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
 240                const struct thermal_cooling_device_ops *);
 241void thermal_cooling_device_unregister(struct thermal_cooling_device *);
 242struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name);
 243int thermal_zone_get_temp(struct thermal_zone_device *tz, unsigned long *temp);
 244
 245int get_tz_trend(struct thermal_zone_device *, int);
 246struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
 247                struct thermal_cooling_device *, int);
 248void thermal_cdev_update(struct thermal_cooling_device *);
 249void thermal_notify_framework(struct thermal_zone_device *, int);
 250
 251#ifdef CONFIG_NET
 252extern int thermal_generate_netlink_event(struct thermal_zone_device *tz,
 253                                                enum events event);
 254#else
 255static inline int thermal_generate_netlink_event(struct thermal_zone_device *tz,
 256                                                enum events event)
 257{
 258        return 0;
 259}
 260#endif
 261
 262#endif /* __THERMAL_H__ */
 263