ARM: tegra: thermal: Cleaned up thermal framework
[linux-3.10.git] / arch / arm / mach-tegra / include / mach / thermal.h
1 /*
2  * arch/arm/mach-tegra/thermal.h
3  *
4  * Copyright (C) 2010-2012 NVIDIA Corporation.
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16
17 #ifndef __MACH_THERMAL_H
18 #define __MACH_THERMAL_H
19
20 #include <linux/therm_est.h>
21 #include <linux/thermal.h>
22
23 #ifndef CONFIG_THERMAL
24 #endif
25
26 enum thermal_device_id {
27         THERMAL_DEVICE_ID_NULL = 0x0,
28         THERMAL_DEVICE_ID_NCT_EXT = 0x1,
29         THERMAL_DEVICE_ID_NCT_INT = 0x2,
30         THERMAL_DEVICE_ID_TSENSOR = 0x4,
31         THERMAL_DEVICE_ID_THERM_EST_SKIN = 0x8,
32 };
33
34 #define THERMAL_DEVICE_MAX      (4)
35
36 enum cooling_device_id {
37         CDEV_BTHROT_ID_TJ      = 0x00010000,
38         CDEV_BTHROT_ID_SKIN    = 0x00020000,
39         CDEV_EDPTABLE_ID_EDP   = 0x00030000,
40         CDEV_EDPTABLE_ID_EDP_0 = 0x00030000,
41         CDEV_EDPTABLE_ID_EDP_1 = 0x00030001,
42         CDEV_EDPTABLE_ID_EDP_2 = 0x00030002,
43         CDEV_EDPTABLE_ID_EDP_3 = 0x00030003,
44         CDEV_EDPTABLE_ID_EDP_4 = 0x00030004,
45 };
46
47 struct tegra_thermal_bind {
48         enum thermal_device_id tdev_id;
49         enum cooling_device_id cdev_id;
50         int type;
51         int (*get_trip_temp) (void *, long);
52         int (*get_trip_size) (void);
53         struct passive_params {
54                 long trip_temp;
55                 int tc1;
56                 int tc2;
57                 long passive_delay;
58         } passive;
59 };
60
61 /* All units in millicelsius */
62 struct tegra_thermal_data {
63         enum thermal_device_id throttle_edp_device_id;
64 #ifdef CONFIG_TEGRA_EDP_LIMITS
65         long edp_offset;
66         long hysteresis_edp;
67 #endif
68         long temp_throttle;
69         struct tegra_thermal_bind binds[];
70 };
71
72 struct skin_therm_est_subdevice {
73         enum thermal_device_id id;
74         long coeffs[HIST_LEN];
75 };
76
77 struct tegra_skin_data {
78         enum thermal_device_id skin_device_id;
79         long temp_throttle_skin;
80
81         long skin_temp_offset;
82         long skin_period;
83         int skin_devs_size;
84         struct skin_therm_est_subdevice skin_devs[];
85 };
86
87 struct tegra_thermal_device {
88         char *name;
89         enum thermal_device_id id;
90         void *data;
91         long offset;
92         int (*get_temp) (void *, long *);
93         int (*get_temp_low)(void *, long *);
94         int (*set_limits) (void *, long, long);
95         int (*set_alert)(void *, void (*)(void *), void *);
96         int (*set_shutdown_temp)(void *, long);
97         struct thermal_zone_device *thz;
98         struct list_head node;
99 };
100
101 struct tegra_cooling_device {
102         enum cooling_device_id id;
103 };
104
105 struct throttle_table {
106         unsigned int cpu_freq;
107         int core_cap_level;
108 };
109
110 #define MAX_THROT_TABLE_SIZE    (32)
111
112 struct balanced_throttle {
113         struct tegra_cooling_device tegra_cdev;
114         struct thermal_cooling_device *cdev;
115         struct list_head node;
116         int is_throttling;
117         int throttle_index;
118         int throt_tab_size;
119         struct throttle_table throt_tab[MAX_THROT_TABLE_SIZE];
120 };
121
122 #ifdef CONFIG_TEGRA_THERMAL_THROTTLE
123 int balanced_throttle_register(struct balanced_throttle *bthrot);
124 #else
125 static inline int balanced_throttle_register(struct balanced_throttle *bthrot)
126 { return 0; }
127 #endif
128
129 #ifdef CONFIG_TEGRA_THERMAL
130 int tegra_thermal_init(struct tegra_thermal_data *data,
131                                 struct tegra_skin_data *skin_data,
132                                 struct balanced_throttle *throttle_list,
133                                 int throttle_list_size);
134 int tegra_thermal_device_register(struct tegra_thermal_device *device);
135 int tegra_thermal_exit(void);
136 #else
137 static inline int tegra_thermal_init(struct tegra_thermal_data *data,
138                                         struct tegra_skin_data *skin_data,
139                                         struct balanced_throttle *throttle_list,
140                                         int throttle_list_size)
141 { return 0; }
142 static inline int tegra_thermal_device_register(struct tegra_thermal_device *device)
143 { return 0; }
144 static inline int tegra_thermal_exit(void)
145 { return 0; }
146 #endif
147
148 #endif  /* __MACH_THERMAL_H */