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_group"
  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};
  78
  79/* Events supported by Thermal Netlink */
  80enum events {
  81        THERMAL_AUX0,
  82        THERMAL_AUX1,
  83        THERMAL_CRITICAL,
  84        THERMAL_DEV_FAULT,
  85};
  86
  87/* attributes of thermal_genl_family */
  88enum {
  89        THERMAL_GENL_ATTR_UNSPEC,
  90        THERMAL_GENL_ATTR_EVENT,
  91        __THERMAL_GENL_ATTR_MAX,
  92};
  93#define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1)
  94
  95/* commands supported by the thermal_genl_family */
  96enum {
  97        THERMAL_GENL_CMD_UNSPEC,
  98        THERMAL_GENL_CMD_EVENT,
  99        __THERMAL_GENL_CMD_MAX,
 100};
 101#define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1)
 102
 103struct thermal_zone_device_ops {
 104        int (*bind) (struct thermal_zone_device *,
 105                     struct thermal_cooling_device *);
 106        int (*unbind) (struct thermal_zone_device *,
 107                       struct thermal_cooling_device *);
 108        int (*get_temp) (struct thermal_zone_device *, unsigned long *);
 109        int (*get_mode) (struct thermal_zone_device *,
 110                         enum thermal_device_mode *);
 111        int (*set_mode) (struct thermal_zone_device *,
 112                enum thermal_device_mode);
 113        int (*get_trip_type) (struct thermal_zone_device *, int,
 114                enum thermal_trip_type *);
 115        int (*get_trip_temp) (struct thermal_zone_device *, int,
 116                              unsigned long *);
 117        int (*set_trip_temp) (struct thermal_zone_device *, int,
 118                              unsigned long);
 119        int (*get_trip_hyst) (struct thermal_zone_device *, int,
 120                              unsigned long *);
 121        int (*set_trip_hyst) (struct thermal_zone_device *, int,
 122                              unsigned long);
 123        int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
 124        int (*get_trend) (struct thermal_zone_device *, int,
 125                          enum thermal_trend *);
 126        int (*notify) (struct thermal_zone_device *, int,
 127                       enum thermal_trip_type);
 128};
 129
 130struct thermal_cooling_device_ops {
 131        int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
 132        int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
 133        int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
 134};
 135
 136struct thermal_cooling_device {
 137        int id;
 138        char type[THERMAL_NAME_LENGTH];
 139        struct device device;
 140        void *devdata;
 141        const struct thermal_cooling_device_ops *ops;
 142        bool updated; /* true if the cooling device does not need update */
 143        struct mutex lock; /* protect thermal_instances list */
 144        struct list_head thermal_instances;
 145        struct list_head node;
 146};
 147
 148struct thermal_attr {
 149        struct device_attribute attr;
 150        char name[THERMAL_NAME_LENGTH];
 151};
 152
 153struct thermal_zone_device {
 154        int id;
 155        char type[THERMAL_NAME_LENGTH];
 156        struct device device;
 157        struct thermal_attr *trip_temp_attrs;
 158        struct thermal_attr *trip_type_attrs;
 159        struct thermal_attr *trip_hyst_attrs;
 160        void *devdata;
 161        int trips;
 162        int passive_delay;
 163        int polling_delay;
 164        int temperature;
 165        int last_temperature;
 166        int passive;
 167        unsigned int forced_passive;
 168        const struct thermal_zone_device_ops *ops;
 169        const struct thermal_zone_params *tzp;
 170        struct thermal_governor *governor;
 171        struct list_head thermal_instances;
 172        struct idr idr;
 173        struct mutex lock; /* protect thermal_instances list */
 174        struct list_head node;
 175        struct delayed_work poll_queue;
 176};
 177
 178/* Structure that holds thermal governor information */
 179struct thermal_governor {
 180        char name[THERMAL_NAME_LENGTH];
 181        int (*throttle)(struct thermal_zone_device *tz, int trip);
 182        struct list_head        governor_list;
 183        struct module           *owner;
 184};
 185
 186/* Structure that holds binding parameters for a zone */
 187struct thermal_bind_params {
 188        struct thermal_cooling_device *cdev;
 189
 190        /*
 191         * This is a measure of 'how effectively these devices can
 192         * cool 'this' thermal zone. The shall be determined by platform
 193         * characterization. This is on a 'percentage' scale.
 194         * See Documentation/thermal/sysfs-api.txt for more information.
 195         */
 196        int weight;
 197
 198        /*
 199         * This is a bit mask that gives the binding relation between this
 200         * thermal zone and cdev, for a particular trip point.
 201         * See Documentation/thermal/sysfs-api.txt for more information.
 202         */
 203        int trip_mask;
 204        int (*match) (struct thermal_zone_device *tz,
 205                        struct thermal_cooling_device *cdev);
 206};
 207
 208/* Structure to define Thermal Zone parameters */
 209struct thermal_zone_params {
 210        char governor_name[THERMAL_NAME_LENGTH];
 211        int num_tbps;   /* Number of tbp entries */
 212        struct thermal_bind_params *tbp;
 213};
 214
 215struct thermal_genl_event {
 216        u32 orig;
 217        enum events event;
 218};
 219
 220/* Function declarations */
 221struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
 222                void *, const struct thermal_zone_device_ops *,
 223                const struct thermal_zone_params *, int, int);
 224void thermal_zone_device_unregister(struct thermal_zone_device *);
 225
 226int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
 227                                     struct thermal_cooling_device *,
 228                                     unsigned long, unsigned long);
 229int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
 230                                       struct thermal_cooling_device *);
 231void thermal_zone_device_update(struct thermal_zone_device *);
 232
 233struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
 234                const struct thermal_cooling_device_ops *);
 235void thermal_cooling_device_unregister(struct thermal_cooling_device *);
 236
 237int get_tz_trend(struct thermal_zone_device *, int);
 238struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
 239                struct thermal_cooling_device *, int);
 240void thermal_cdev_update(struct thermal_cooling_device *);
 241void notify_thermal_framework(struct thermal_zone_device *, int);
 242
 243int thermal_register_governor(struct thermal_governor *);
 244void thermal_unregister_governor(struct thermal_governor *);
 245
 246#ifdef CONFIG_NET
 247extern int thermal_generate_netlink_event(u32 orig, enum events event);
 248#else
 249static inline int thermal_generate_netlink_event(u32 orig, enum events event)
 250{
 251        return 0;
 252}
 253#endif
 254
 255#endif /* __THERMAL_H__ */
 256
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.