| /* |
| * 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> |
| * |
| * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; version 2 of the License. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program; if not, write to the Free Software Foundation, Inc., |
| * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
| * |
| * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| */ |
| |
| #ifndef __THERMAL_H__ |
| #define __THERMAL_H__ |
| |
| #include <linux/idr.h> |
| #include <linux/device.h> |
| #include <linux/workqueue.h> |
| |
| struct thermal_zone_device; |
| struct thermal_cooling_device; |
| |
| enum thermal_device_mode { |
| THERMAL_DEVICE_DISABLED = 0, |
| THERMAL_DEVICE_ENABLED, |
| }; |
| |
| enum thermal_trip_type { |
| THERMAL_TRIP_ACTIVE = 0, |
| THERMAL_TRIP_PASSIVE, |
| THERMAL_TRIP_HOT, |
| THERMAL_TRIP_CRITICAL, |
| }; |
| |
| struct thermal_zone_device_ops { |
| int (*bind) (struct thermal_zone_device *, |
| struct thermal_cooling_device *); |
| int (*unbind) (struct thermal_zone_device *, |
| struct thermal_cooling_device *); |
| int (*get_temp) (struct thermal_zone_device *, unsigned long *); |
| int (*get_mode) (struct thermal_zone_device *, |
| enum thermal_device_mode *); |
| int (*set_mode) (struct thermal_zone_device *, |
| enum thermal_device_mode); |
| int (*get_trip_type) (struct thermal_zone_device *, int, |
| enum thermal_trip_type *); |
| int (*get_trip_temp) (struct thermal_zone_device *, int, |
| unsigned long *); |
| int (*set_trip_temp) (struct thermal_zone_device *, int, |
| unsigned long); |
| int (*get_trip_hyst) (struct thermal_zone_device *, int, |
| unsigned long *); |
| int (*set_trip_hyst) (struct thermal_zone_device *, int, |
| unsigned long); |
| int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *); |
| int (*notify) (struct thermal_zone_device *, int, |
| enum thermal_trip_type); |
| }; |
| |
| 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); |
| }; |
| |
| #define THERMAL_TRIPS_NONE -1 |
| #define THERMAL_MAX_TRIPS 12 |
| #define THERMAL_NAME_LENGTH 20 |
| struct thermal_cooling_device { |
| int id; |
| char type[THERMAL_NAME_LENGTH]; |
| struct device device; |
| void *devdata; |
| const struct thermal_cooling_device_ops *ops; |
| struct list_head node; |
| }; |
| |
| #define KELVIN_TO_CELSIUS(t) (long)(((long)t-2732 >= 0) ? \ |
| ((long)t-2732+5)/10 : ((long)t-2732-5)/10) |
| #define CELSIUS_TO_KELVIN(t) ((t)*10+2732) |
| |
| struct thermal_attr { |
| struct device_attribute attr; |
| char name[THERMAL_NAME_LENGTH]; |
| }; |
| |
| struct thermal_zone_device { |
| int id; |
| char type[THERMAL_NAME_LENGTH]; |
| struct device device; |
| struct thermal_attr *trip_temp_attrs; |
| struct thermal_attr *trip_type_attrs; |
| struct thermal_attr *trip_hyst_attrs; |
| void *devdata; |
| int trips; |
| int tc1; |
| int tc2; |
| int passive_delay; |
| int polling_delay; |
| int last_temperature; |
| bool passive; |
| unsigned int forced_passive; |
| const struct thermal_zone_device_ops *ops; |
| struct list_head cooling_devices; |
| struct idr idr; |
| struct mutex lock; /* protect cooling devices list */ |
| struct list_head node; |
| struct delayed_work poll_queue; |
| }; |
| /* Adding event notification support elements */ |
| #define THERMAL_GENL_FAMILY_NAME "thermal_event" |
| #define THERMAL_GENL_VERSION 0x01 |
| #define THERMAL_GENL_MCAST_GROUP_NAME "thermal_mc_group" |
| |
| enum events { |
| THERMAL_AUX0, |
| THERMAL_AUX1, |
| THERMAL_CRITICAL, |
| THERMAL_DEV_FAULT, |
| }; |
| |
| struct thermal_genl_event { |
| u32 orig; |
| enum events event; |
| }; |
| /* attributes of thermal_genl_family */ |
| enum { |
| THERMAL_GENL_ATTR_UNSPEC, |
| THERMAL_GENL_ATTR_EVENT, |
| __THERMAL_GENL_ATTR_MAX, |
| }; |
| #define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1) |
| |
| /* commands supported by the thermal_genl_family */ |
| enum { |
| THERMAL_GENL_CMD_UNSPEC, |
| THERMAL_GENL_CMD_EVENT, |
| __THERMAL_GENL_CMD_MAX, |
| }; |
| #define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1) |
| |
| struct thermal_zone_device *thermal_zone_device_register(const char *, int, int, |
| void *, const struct thermal_zone_device_ops *, int tc1, |
| int tc2, int passive_freq, int polling_freq); |
| void thermal_zone_device_unregister(struct thermal_zone_device *); |
| |
| int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int, |
| struct thermal_cooling_device *); |
| int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int, |
| struct thermal_cooling_device *); |
| void thermal_zone_device_update(struct thermal_zone_device *); |
| struct thermal_cooling_device *thermal_cooling_device_register(char *, void *, |
| const struct thermal_cooling_device_ops *); |
| void thermal_cooling_device_unregister(struct thermal_cooling_device *); |
| |
| #ifdef CONFIG_NET |
| extern int thermal_generate_netlink_event(u32 orig, enum events event); |
| #else |
| static inline int thermal_generate_netlink_event(u32 orig, enum events event) |
| { |
| return 0; |
| } |
| #endif |
| |
| #endif /* __THERMAL_H__ */ |