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