Root/drivers/staging/omap-thermal/omap5-thermal.c

1/*
2 * OMAP5 thermal driver.
3 *
4 * Copyright (C) 2011-2012 Texas Instruments Inc.
5 * Contact:
6 * Eduardo Valentin <eduardo.valentin@ti.com>
7 *
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 */
18
19#include "omap-bandgap.h"
20#include "omap-thermal.h"
21
22/*
23 * omap5430 has one instance of thermal sensor for MPU
24 * need to describe the individual bit fields
25 */
26static struct temp_sensor_registers
27omap5430_mpu_temp_sensor_registers = {
28    .temp_sensor_ctrl = OMAP5430_TEMP_SENSOR_MPU_OFFSET,
29    .bgap_tempsoff_mask = OMAP5430_BGAP_TEMPSOFF_MASK,
30    .bgap_soc_mask = OMAP5430_BGAP_TEMP_SENSOR_SOC_MASK,
31    .bgap_eocz_mask = OMAP5430_BGAP_TEMP_SENSOR_EOCZ_MASK,
32    .bgap_dtemp_mask = OMAP5430_BGAP_TEMP_SENSOR_DTEMP_MASK,
33
34    .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET,
35    .mask_hot_mask = OMAP5430_MASK_HOT_MPU_MASK,
36    .mask_cold_mask = OMAP5430_MASK_COLD_MPU_MASK,
37
38    .bgap_mode_ctrl = OMAP5430_BGAP_COUNTER_MPU_OFFSET,
39    .mode_ctrl_mask = OMAP5430_REPEAT_MODE_MASK,
40
41    .bgap_counter = OMAP5430_BGAP_COUNTER_MPU_OFFSET,
42    .counter_mask = OMAP5430_COUNTER_MASK,
43
44    .bgap_threshold = OMAP5430_BGAP_THRESHOLD_MPU_OFFSET,
45    .threshold_thot_mask = OMAP5430_T_HOT_MASK,
46    .threshold_tcold_mask = OMAP5430_T_COLD_MASK,
47
48    .tshut_threshold = OMAP5430_BGAP_TSHUT_MPU_OFFSET,
49    .tshut_hot_mask = OMAP5430_TSHUT_HOT_MASK,
50    .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK,
51
52    .bgap_status = OMAP5430_BGAP_STATUS_OFFSET,
53    .status_clean_stop_mask = 0x0,
54    .status_bgap_alert_mask = OMAP5430_BGAP_ALERT_MASK,
55    .status_hot_mask = OMAP5430_HOT_MPU_FLAG_MASK,
56    .status_cold_mask = OMAP5430_COLD_MPU_FLAG_MASK,
57
58    .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_MPU,
59};
60
61/*
62 * omap5430 has one instance of thermal sensor for GPU
63 * need to describe the individual bit fields
64 */
65static struct temp_sensor_registers
66omap5430_gpu_temp_sensor_registers = {
67    .temp_sensor_ctrl = OMAP5430_TEMP_SENSOR_GPU_OFFSET,
68    .bgap_tempsoff_mask = OMAP5430_BGAP_TEMPSOFF_MASK,
69    .bgap_soc_mask = OMAP5430_BGAP_TEMP_SENSOR_SOC_MASK,
70    .bgap_eocz_mask = OMAP5430_BGAP_TEMP_SENSOR_EOCZ_MASK,
71    .bgap_dtemp_mask = OMAP5430_BGAP_TEMP_SENSOR_DTEMP_MASK,
72
73    .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET,
74    .mask_hot_mask = OMAP5430_MASK_HOT_MM_MASK,
75    .mask_cold_mask = OMAP5430_MASK_COLD_MM_MASK,
76
77    .bgap_mode_ctrl = OMAP5430_BGAP_COUNTER_GPU_OFFSET,
78    .mode_ctrl_mask = OMAP5430_REPEAT_MODE_MASK,
79
80    .bgap_counter = OMAP5430_BGAP_COUNTER_GPU_OFFSET,
81    .counter_mask = OMAP5430_COUNTER_MASK,
82
83    .bgap_threshold = OMAP5430_BGAP_THRESHOLD_GPU_OFFSET,
84    .threshold_thot_mask = OMAP5430_T_HOT_MASK,
85    .threshold_tcold_mask = OMAP5430_T_COLD_MASK,
86
87    .tshut_threshold = OMAP5430_BGAP_TSHUT_GPU_OFFSET,
88    .tshut_hot_mask = OMAP5430_TSHUT_HOT_MASK,
89    .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK,
90
91    .bgap_status = OMAP5430_BGAP_STATUS_OFFSET,
92    .status_clean_stop_mask = 0x0,
93    .status_bgap_alert_mask = OMAP5430_BGAP_ALERT_MASK,
94    .status_hot_mask = OMAP5430_HOT_MM_FLAG_MASK,
95    .status_cold_mask = OMAP5430_COLD_MM_FLAG_MASK,
96
97    .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_GPU,
98};
99
100/*
101 * omap5430 has one instance of thermal sensor for CORE
102 * need to describe the individual bit fields
103 */
104static struct temp_sensor_registers
105omap5430_core_temp_sensor_registers = {
106    .temp_sensor_ctrl = OMAP5430_TEMP_SENSOR_CORE_OFFSET,
107    .bgap_tempsoff_mask = OMAP5430_BGAP_TEMPSOFF_MASK,
108    .bgap_soc_mask = OMAP5430_BGAP_TEMP_SENSOR_SOC_MASK,
109    .bgap_eocz_mask = OMAP5430_BGAP_TEMP_SENSOR_EOCZ_MASK,
110    .bgap_dtemp_mask = OMAP5430_BGAP_TEMP_SENSOR_DTEMP_MASK,
111
112    .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET,
113    .mask_hot_mask = OMAP5430_MASK_HOT_CORE_MASK,
114    .mask_cold_mask = OMAP5430_MASK_COLD_CORE_MASK,
115
116    .bgap_mode_ctrl = OMAP5430_BGAP_COUNTER_CORE_OFFSET,
117    .mode_ctrl_mask = OMAP5430_REPEAT_MODE_MASK,
118
119    .bgap_counter = OMAP5430_BGAP_COUNTER_CORE_OFFSET,
120    .counter_mask = OMAP5430_COUNTER_MASK,
121
122    .bgap_threshold = OMAP5430_BGAP_THRESHOLD_CORE_OFFSET,
123    .threshold_thot_mask = OMAP5430_T_HOT_MASK,
124    .threshold_tcold_mask = OMAP5430_T_COLD_MASK,
125
126    .tshut_threshold = OMAP5430_BGAP_TSHUT_CORE_OFFSET,
127    .tshut_hot_mask = OMAP5430_TSHUT_HOT_MASK,
128    .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK,
129
130    .bgap_status = OMAP5430_BGAP_STATUS_OFFSET,
131    .status_clean_stop_mask = 0x0,
132    .status_bgap_alert_mask = OMAP5430_BGAP_ALERT_MASK,
133    .status_hot_mask = OMAP5430_HOT_CORE_FLAG_MASK,
134    .status_cold_mask = OMAP5430_COLD_CORE_FLAG_MASK,
135
136    .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_CORE,
137};
138
139/* Thresholds and limits for OMAP5430 MPU temperature sensor */
140static struct temp_sensor_data omap5430_mpu_temp_sensor_data = {
141    .tshut_hot = OMAP5430_MPU_TSHUT_HOT,
142    .tshut_cold = OMAP5430_MPU_TSHUT_COLD,
143    .t_hot = OMAP5430_MPU_T_HOT,
144    .t_cold = OMAP5430_MPU_T_COLD,
145    .min_freq = OMAP5430_MPU_MIN_FREQ,
146    .max_freq = OMAP5430_MPU_MAX_FREQ,
147    .max_temp = OMAP5430_MPU_MAX_TEMP,
148    .min_temp = OMAP5430_MPU_MIN_TEMP,
149    .hyst_val = OMAP5430_MPU_HYST_VAL,
150    .adc_start_val = OMAP5430_ADC_START_VALUE,
151    .adc_end_val = OMAP5430_ADC_END_VALUE,
152    .update_int1 = 1000,
153    .update_int2 = 2000,
154};
155
156/* Thresholds and limits for OMAP5430 GPU temperature sensor */
157static struct temp_sensor_data omap5430_gpu_temp_sensor_data = {
158    .tshut_hot = OMAP5430_GPU_TSHUT_HOT,
159    .tshut_cold = OMAP5430_GPU_TSHUT_COLD,
160    .t_hot = OMAP5430_GPU_T_HOT,
161    .t_cold = OMAP5430_GPU_T_COLD,
162    .min_freq = OMAP5430_GPU_MIN_FREQ,
163    .max_freq = OMAP5430_GPU_MAX_FREQ,
164    .max_temp = OMAP5430_GPU_MAX_TEMP,
165    .min_temp = OMAP5430_GPU_MIN_TEMP,
166    .hyst_val = OMAP5430_GPU_HYST_VAL,
167    .adc_start_val = OMAP5430_ADC_START_VALUE,
168    .adc_end_val = OMAP5430_ADC_END_VALUE,
169    .update_int1 = 1000,
170    .update_int2 = 2000,
171};
172
173/* Thresholds and limits for OMAP5430 CORE temperature sensor */
174static struct temp_sensor_data omap5430_core_temp_sensor_data = {
175    .tshut_hot = OMAP5430_CORE_TSHUT_HOT,
176    .tshut_cold = OMAP5430_CORE_TSHUT_COLD,
177    .t_hot = OMAP5430_CORE_T_HOT,
178    .t_cold = OMAP5430_CORE_T_COLD,
179    .min_freq = OMAP5430_CORE_MIN_FREQ,
180    .max_freq = OMAP5430_CORE_MAX_FREQ,
181    .max_temp = OMAP5430_CORE_MAX_TEMP,
182    .min_temp = OMAP5430_CORE_MIN_TEMP,
183    .hyst_val = OMAP5430_CORE_HYST_VAL,
184    .adc_start_val = OMAP5430_ADC_START_VALUE,
185    .adc_end_val = OMAP5430_ADC_END_VALUE,
186    .update_int1 = 1000,
187    .update_int2 = 2000,
188};
189
190static const int
191omap5430_adc_to_temp[OMAP5430_ADC_END_VALUE - OMAP5430_ADC_START_VALUE + 1] = {
192    -40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600,
193    -38200, -37800, -37300, -36800,
194    -36400, -36000, -35600, -35200, -34800, -34300, -33800, -33400, -33000,
195    -32600,
196    -32200, -31800, -31300, -30800, -30400, -30000, -29600, -29200, -28700,
197    -28200, -27800, -27400, -27000, -26600, -26200, -25700, -25200, -24800,
198    -24400, -24000, -23600, -23200, -22700, -22200, -21800, -21400, -21000,
199    -20600, -20200, -19700, -19200, -9300, -18400, -18000, -17600, -17200,
200    -16700, -16200, -15800, -15400, -15000, -14600, -14200, -13700, -13200,
201    -12800, -12400, -12000, -11600, -11200, -10700, -10200, -9800, -9400,
202    -9000,
203    -8600, -8200, -7700, -7200, -6800, -6400, -6000, -5600, -5200, -4800,
204    -4300,
205    -3800, -3400, -3000, -2600, -2200, -1800, -1300, -800, -400, 0, 400,
206    800,
207    1200, 1600, 2100, 2600, 3000, 3400, 3800, 4200, 4600, 5100, 5600, 6000,
208    6400, 6800, 7200, 7600, 8000, 8500, 9000, 9400, 9800, 10200, 10800,
209    11100,
210    11400, 11900, 12400, 12800, 13200, 13600, 14000, 14400, 14800, 15300,
211    15800,
212    16200, 16600, 17000, 17400, 17800, 18200, 18700, 19200, 19600, 20000,
213    20400,
214    20800, 21200, 21600, 22100, 22600, 23000, 23400, 23800, 24200, 24600,
215    25000,
216    25400, 25900, 26400, 26800, 27200, 27600, 28000, 28400, 28800, 29300,
217    29800,
218    30200, 30600, 31000, 31400, 31800, 32200, 32600, 33100, 33600, 34000,
219    34400,
220    34800, 35200, 35600, 36000, 36400, 36800, 37300, 37800, 38200, 38600,
221    39000,
222    39400, 39800, 40200, 40600, 41100, 41600, 42000, 42400, 42800, 43200,
223    43600,
224    44000, 44400, 44800, 45300, 45800, 46200, 46600, 47000, 47400, 47800,
225    48200,
226    48600, 49000, 49500, 50000, 50400, 50800, 51200, 51600, 52000, 52400,
227    52800,
228    53200, 53700, 54200, 54600, 55000, 55400, 55800, 56200, 56600, 57000,
229    57400,
230    57800, 58200, 58700, 59200, 59600, 60000, 60400, 60800, 61200, 61600,
231    62000,
232    62400, 62800, 63300, 63800, 64200, 64600, 65000, 65400, 65800, 66200,
233    66600,
234    67000, 67400, 67800, 68200, 68700, 69200, 69600, 70000, 70400, 70800,
235    71200,
236    71600, 72000, 72400, 72800, 73200, 73600, 74100, 74600, 75000, 75400,
237    75800,
238    76200, 76600, 77000, 77400, 77800, 78200, 78600, 79000, 79400, 79800,
239    80300,
240    80800, 81200, 81600, 82000, 82400, 82800, 83200, 83600, 84000, 84400,
241    84800,
242    85200, 85600, 86000, 86400, 86800, 87300, 87800, 88200, 88600, 89000,
243    89400,
244    89800, 90200, 90600, 91000, 91400, 91800, 92200, 92600, 93000, 93400,
245    93800,
246    94200, 94600, 95000, 95500, 96000, 96400, 96800, 97200, 97600, 98000,
247    98400,
248    98800, 99200, 99600, 100000, 100400, 100800, 101200, 101600, 102000,
249    102400,
250    102800, 103200, 103600, 104000, 104400, 104800, 105200, 105600, 106100,
251    106600, 107000, 107400, 107800, 108200, 108600, 109000, 109400, 109800,
252    110200, 110600, 111000, 111400, 111800, 112200, 112600, 113000, 113400,
253    113800, 114200, 114600, 115000, 115400, 115800, 116200, 116600, 117000,
254    117400, 117800, 118200, 118600, 119000, 119400, 119800, 120200, 120600,
255    121000, 121400, 121800, 122200, 122600, 123000, 123400, 123800, 124200,
256    124600, 124900, 125000, 125000, 125000, 125000,
257};
258
259const struct omap_bandgap_data omap5430_data = {
260    .features = OMAP_BANDGAP_FEATURE_TSHUT_CONFIG |
261            OMAP_BANDGAP_FEATURE_TALERT |
262            OMAP_BANDGAP_FEATURE_MODE_CONFIG |
263            OMAP_BANDGAP_FEATURE_COUNTER,
264    .fclock_name = "ts_clk_div_ck",
265    .div_ck_name = "ts_clk_div_ck",
266    .conv_table = omap5430_adc_to_temp,
267    .expose_sensor = omap_thermal_expose_sensor,
268    .remove_sensor = omap_thermal_remove_sensor,
269    .sensors = {
270        {
271            .registers = &omap5430_mpu_temp_sensor_registers,
272            .ts_data = &omap5430_mpu_temp_sensor_data,
273            .domain = "cpu",
274            .register_cooling = omap_thermal_register_cpu_cooling,
275            .unregister_cooling = omap_thermal_unregister_cpu_cooling,
276            .slope = OMAP_GRADIENT_SLOPE_5430_CPU,
277            .constant = OMAP_GRADIENT_CONST_5430_CPU,
278            .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_5430_CPU,
279            .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_5430_CPU,
280        },
281        {
282            .registers = &omap5430_gpu_temp_sensor_registers,
283            .ts_data = &omap5430_gpu_temp_sensor_data,
284            .domain = "gpu",
285            .slope = OMAP_GRADIENT_SLOPE_5430_GPU,
286            .constant = OMAP_GRADIENT_CONST_5430_GPU,
287            .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_5430_GPU,
288            .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_5430_GPU,
289        },
290        {
291            .registers = &omap5430_core_temp_sensor_registers,
292            .ts_data = &omap5430_core_temp_sensor_data,
293            .domain = "core",
294        },
295    },
296    .sensor_count = 3,
297};
298

Archive Download this file



interactive