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

1/*
2 * OMAP4 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-thermal.h"
20#include "omap-bandgap.h"
21
22/*
23 * OMAP4430 has one instance of thermal sensor for MPU
24 * need to describe the individual bit fields
25 */
26static struct temp_sensor_registers
27omap4430_mpu_temp_sensor_registers = {
28    .temp_sensor_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET,
29    .bgap_tempsoff_mask = OMAP4430_BGAP_TEMPSOFF_MASK,
30    .bgap_soc_mask = OMAP4430_BGAP_TEMP_SENSOR_SOC_MASK,
31    .bgap_eocz_mask = OMAP4430_BGAP_TEMP_SENSOR_EOCZ_MASK,
32    .bgap_dtemp_mask = OMAP4430_BGAP_TEMP_SENSOR_DTEMP_MASK,
33
34    .bgap_mode_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET,
35    .mode_ctrl_mask = OMAP4430_SINGLE_MODE_MASK,
36
37    .bgap_efuse = OMAP4430_FUSE_OPP_BGAP,
38};
39
40/* Thresholds and limits for OMAP4430 MPU temperature sensor */
41static struct temp_sensor_data omap4430_mpu_temp_sensor_data = {
42    .min_freq = OMAP4430_MIN_FREQ,
43    .max_freq = OMAP4430_MAX_FREQ,
44    .max_temp = OMAP4430_MAX_TEMP,
45    .min_temp = OMAP4430_MIN_TEMP,
46    .hyst_val = OMAP4430_HYST_VAL,
47    .adc_start_val = OMAP4430_ADC_START_VALUE,
48    .adc_end_val = OMAP4430_ADC_END_VALUE,
49};
50
51/*
52 * Temperature values in milli degree celsius
53 * ADC code values from 530 to 923
54 */
55static const int
56omap4430_adc_to_temp[OMAP4430_ADC_END_VALUE - OMAP4430_ADC_START_VALUE + 1] = {
57    -38000, -35000, -34000, -32000, -30000, -28000, -26000, -24000, -22000,
58    -20000, -18000, -17000, -15000, -13000, -12000, -10000, -8000, -6000,
59    -5000, -3000, -1000, 0, 2000, 3000, 5000, 6000, 8000, 10000, 12000,
60    13000, 15000, 17000, 19000, 21000, 23000, 25000, 27000, 28000, 30000,
61    32000, 33000, 35000, 37000, 38000, 40000, 42000, 43000, 45000, 47000,
62    48000, 50000, 52000, 53000, 55000, 57000, 58000, 60000, 62000, 64000,
63    66000, 68000, 70000, 71000, 73000, 75000, 77000, 78000, 80000, 82000,
64    83000, 85000, 87000, 88000, 90000, 92000, 93000, 95000, 97000, 98000,
65    100000, 102000, 103000, 105000, 107000, 109000, 111000, 113000, 115000,
66    117000, 118000, 120000, 122000, 123000,
67};
68
69/* OMAP4430 data */
70const struct omap_bandgap_data omap4430_data = {
71    .features = OMAP_BANDGAP_FEATURE_MODE_CONFIG |
72            OMAP_BANDGAP_FEATURE_POWER_SWITCH,
73    .fclock_name = "bandgap_fclk",
74    .div_ck_name = "bandgap_fclk",
75    .conv_table = omap4430_adc_to_temp,
76    .expose_sensor = omap_thermal_expose_sensor,
77    .remove_sensor = omap_thermal_remove_sensor,
78    .sensors = {
79        {
80            .registers = &omap4430_mpu_temp_sensor_registers,
81            .ts_data = &omap4430_mpu_temp_sensor_data,
82            .domain = "cpu",
83            .slope = 0,
84            .constant = 20000,
85            .slope_pcb = 0,
86            .constant_pcb = 20000,
87            .register_cooling = omap_thermal_register_cpu_cooling,
88            .unregister_cooling = omap_thermal_unregister_cpu_cooling,
89        },
90    },
91    .sensor_count = 1,
92};
93/*
94 * OMAP4460 has one instance of thermal sensor for MPU
95 * need to describe the individual bit fields
96 */
97static struct temp_sensor_registers
98omap4460_mpu_temp_sensor_registers = {
99    .temp_sensor_ctrl = OMAP4460_TEMP_SENSOR_CTRL_OFFSET,
100    .bgap_tempsoff_mask = OMAP4460_BGAP_TEMPSOFF_MASK,
101    .bgap_soc_mask = OMAP4460_BGAP_TEMP_SENSOR_SOC_MASK,
102    .bgap_eocz_mask = OMAP4460_BGAP_TEMP_SENSOR_EOCZ_MASK,
103    .bgap_dtemp_mask = OMAP4460_BGAP_TEMP_SENSOR_DTEMP_MASK,
104
105    .bgap_mask_ctrl = OMAP4460_BGAP_CTRL_OFFSET,
106    .mask_hot_mask = OMAP4460_MASK_HOT_MASK,
107    .mask_cold_mask = OMAP4460_MASK_COLD_MASK,
108
109    .bgap_mode_ctrl = OMAP4460_BGAP_CTRL_OFFSET,
110    .mode_ctrl_mask = OMAP4460_SINGLE_MODE_MASK,
111
112    .bgap_counter = OMAP4460_BGAP_COUNTER_OFFSET,
113    .counter_mask = OMAP4460_COUNTER_MASK,
114
115    .bgap_threshold = OMAP4460_BGAP_THRESHOLD_OFFSET,
116    .threshold_thot_mask = OMAP4460_T_HOT_MASK,
117    .threshold_tcold_mask = OMAP4460_T_COLD_MASK,
118
119    .tshut_threshold = OMAP4460_BGAP_TSHUT_OFFSET,
120    .tshut_hot_mask = OMAP4460_TSHUT_HOT_MASK,
121    .tshut_cold_mask = OMAP4460_TSHUT_COLD_MASK,
122
123    .bgap_status = OMAP4460_BGAP_STATUS_OFFSET,
124    .status_clean_stop_mask = OMAP4460_CLEAN_STOP_MASK,
125    .status_bgap_alert_mask = OMAP4460_BGAP_ALERT_MASK,
126    .status_hot_mask = OMAP4460_HOT_FLAG_MASK,
127    .status_cold_mask = OMAP4460_COLD_FLAG_MASK,
128
129    .bgap_efuse = OMAP4460_FUSE_OPP_BGAP,
130};
131
132/* Thresholds and limits for OMAP4460 MPU temperature sensor */
133static struct temp_sensor_data omap4460_mpu_temp_sensor_data = {
134    .tshut_hot = OMAP4460_TSHUT_HOT,
135    .tshut_cold = OMAP4460_TSHUT_COLD,
136    .t_hot = OMAP4460_T_HOT,
137    .t_cold = OMAP4460_T_COLD,
138    .min_freq = OMAP4460_MIN_FREQ,
139    .max_freq = OMAP4460_MAX_FREQ,
140    .max_temp = OMAP4460_MAX_TEMP,
141    .min_temp = OMAP4460_MIN_TEMP,
142    .hyst_val = OMAP4460_HYST_VAL,
143    .adc_start_val = OMAP4460_ADC_START_VALUE,
144    .adc_end_val = OMAP4460_ADC_END_VALUE,
145    .update_int1 = 1000,
146    .update_int2 = 2000,
147};
148
149/*
150 * Temperature values in milli degree celsius
151 * ADC code values from 530 to 923
152 */
153static const int
154omap4460_adc_to_temp[OMAP4460_ADC_END_VALUE - OMAP4460_ADC_START_VALUE + 1] = {
155    -40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600, -38200,
156    -37800, -37300, -36800, -36400, -36000, -35600, -35200, -34800,
157    -34300, -33800, -33400, -33000, -32600, -32200, -31800, -31300,
158    -30800, -30400, -30000, -29600, -29200, -28700, -28200, -27800,
159    -27400, -27000, -26600, -26200, -25700, -25200, -24800, -24400,
160    -24000, -23600, -23200, -22700, -22200, -21800, -21400, -21000,
161    -20600, -20200, -19700, -19200, -18800, -18400, -18000, -17600,
162    -17200, -16700, -16200, -15800, -15400, -15000, -14600, -14200,
163    -13700, -13200, -12800, -12400, -12000, -11600, -11200, -10700,
164    -10200, -9800, -9400, -9000, -8600, -8200, -7700, -7200, -6800,
165    -6400, -6000, -5600, -5200, -4800, -4300, -3800, -3400, -3000,
166    -2600, -2200, -1800, -1300, -800, -400, 0, 400, 800, 1200, 1600,
167    2100, 2600, 3000, 3400, 3800, 4200, 4600, 5100, 5600, 6000, 6400,
168    6800, 7200, 7600, 8000, 8500, 9000, 9400, 9800, 10200, 10600, 11000,
169    11400, 11900, 12400, 12800, 13200, 13600, 14000, 14400, 14800,
170    15300, 15800, 16200, 16600, 17000, 17400, 17800, 18200, 18700,
171    19200, 19600, 20000, 20400, 20800, 21200, 21600, 22100, 22600,
172    23000, 23400, 23800, 24200, 24600, 25000, 25400, 25900, 26400,
173    26800, 27200, 27600, 28000, 28400, 28800, 29300, 29800, 30200,
174    30600, 31000, 31400, 31800, 32200, 32600, 33100, 33600, 34000,
175    34400, 34800, 35200, 35600, 36000, 36400, 36800, 37300, 37800,
176    38200, 38600, 39000, 39400, 39800, 40200, 40600, 41100, 41600,
177    42000, 42400, 42800, 43200, 43600, 44000, 44400, 44800, 45300,
178    45800, 46200, 46600, 47000, 47400, 47800, 48200, 48600, 49000,
179    49500, 50000, 50400, 50800, 51200, 51600, 52000, 52400, 52800,
180    53200, 53700, 54200, 54600, 55000, 55400, 55800, 56200, 56600,
181    57000, 57400, 57800, 58200, 58700, 59200, 59600, 60000, 60400,
182    60800, 61200, 61600, 62000, 62400, 62800, 63300, 63800, 64200,
183    64600, 65000, 65400, 65800, 66200, 66600, 67000, 67400, 67800,
184    68200, 68700, 69200, 69600, 70000, 70400, 70800, 71200, 71600,
185    72000, 72400, 72800, 73200, 73600, 74100, 74600, 75000, 75400,
186    75800, 76200, 76600, 77000, 77400, 77800, 78200, 78600, 79000,
187    79400, 79800, 80300, 80800, 81200, 81600, 82000, 82400, 82800,
188    83200, 83600, 84000, 84400, 84800, 85200, 85600, 86000, 86400,
189    86800, 87300, 87800, 88200, 88600, 89000, 89400, 89800, 90200,
190    90600, 91000, 91400, 91800, 92200, 92600, 93000, 93400, 93800,
191    94200, 94600, 95000, 95500, 96000, 96400, 96800, 97200, 97600,
192    98000, 98400, 98800, 99200, 99600, 100000, 100400, 100800, 101200,
193    101600, 102000, 102400, 102800, 103200, 103600, 104000, 104400,
194    104800, 105200, 105600, 106100, 106600, 107000, 107400, 107800,
195    108200, 108600, 109000, 109400, 109800, 110200, 110600, 111000,
196    111400, 111800, 112200, 112600, 113000, 113400, 113800, 114200,
197    114600, 115000, 115400, 115800, 116200, 116600, 117000, 117400,
198    117800, 118200, 118600, 119000, 119400, 119800, 120200, 120600,
199    121000, 121400, 121800, 122200, 122600, 123000, 123400, 123800, 124200,
200    124600, 124900, 125000, 125000, 125000, 125000
201};
202
203/* OMAP4460 data */
204const struct omap_bandgap_data omap4460_data = {
205    .features = OMAP_BANDGAP_FEATURE_TSHUT |
206            OMAP_BANDGAP_FEATURE_TSHUT_CONFIG |
207            OMAP_BANDGAP_FEATURE_TALERT |
208            OMAP_BANDGAP_FEATURE_MODE_CONFIG |
209            OMAP_BANDGAP_FEATURE_POWER_SWITCH |
210            OMAP_BANDGAP_FEATURE_COUNTER,
211    .fclock_name = "bandgap_ts_fclk",
212    .div_ck_name = "div_ts_ck",
213    .conv_table = omap4460_adc_to_temp,
214    .expose_sensor = omap_thermal_expose_sensor,
215    .remove_sensor = omap_thermal_remove_sensor,
216    .sensors = {
217        {
218            .registers = &omap4460_mpu_temp_sensor_registers,
219            .ts_data = &omap4460_mpu_temp_sensor_data,
220            .domain = "cpu",
221            .slope = OMAP_GRADIENT_SLOPE_4460,
222            .constant = OMAP_GRADIENT_CONST_4460,
223            .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4460,
224            .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4460,
225            .register_cooling = omap_thermal_register_cpu_cooling,
226            .unregister_cooling = omap_thermal_unregister_cpu_cooling,
227        },
228    },
229    .sensor_count = 1,
230};
231
232/* OMAP4470 data */
233const struct omap_bandgap_data omap4470_data = {
234    .features = OMAP_BANDGAP_FEATURE_TSHUT |
235            OMAP_BANDGAP_FEATURE_TSHUT_CONFIG |
236            OMAP_BANDGAP_FEATURE_TALERT |
237            OMAP_BANDGAP_FEATURE_MODE_CONFIG |
238            OMAP_BANDGAP_FEATURE_POWER_SWITCH |
239            OMAP_BANDGAP_FEATURE_COUNTER,
240    .fclock_name = "bandgap_ts_fclk",
241    .div_ck_name = "div_ts_ck",
242    .conv_table = omap4460_adc_to_temp,
243    .expose_sensor = omap_thermal_expose_sensor,
244    .remove_sensor = omap_thermal_remove_sensor,
245    .sensors = {
246        {
247            .registers = &omap4460_mpu_temp_sensor_registers,
248            .ts_data = &omap4460_mpu_temp_sensor_data,
249            .domain = "cpu",
250            .slope = OMAP_GRADIENT_SLOPE_4470,
251            .constant = OMAP_GRADIENT_CONST_4470,
252            .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4470,
253            .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4470,
254            .register_cooling = omap_thermal_register_cpu_cooling,
255            .unregister_cooling = omap_thermal_unregister_cpu_cooling,
256        },
257    },
258    .sensor_count = 1,
259};
260

Archive Download this file



interactive