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 "ti-thermal.h"
20 #include "ti-bandgap.h"
21 #include "omap4xxx-bandgap.h"
22 
23 /*
24  * OMAP4430 has one instance of thermal sensor for MPU
25  * need to describe the individual bit fields
26  */
27 static struct temp_sensor_registers
28 omap4430_mpu_temp_sensor_registers = {
29 	.temp_sensor_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET,
30 	.bgap_tempsoff_mask = OMAP4430_BGAP_TEMPSOFF_MASK,
31 	.bgap_soc_mask = OMAP4430_BGAP_TEMP_SENSOR_SOC_MASK,
32 	.bgap_eocz_mask = OMAP4430_BGAP_TEMP_SENSOR_EOCZ_MASK,
33 	.bgap_dtemp_mask = OMAP4430_BGAP_TEMP_SENSOR_DTEMP_MASK,
34 
35 	.bgap_mode_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET,
36 	.mode_ctrl_mask = OMAP4430_SINGLE_MODE_MASK,
37 
38 	.bgap_efuse = OMAP4430_FUSE_OPP_BGAP,
39 };
40 
41 /* Thresholds and limits for OMAP4430 MPU temperature sensor */
42 static struct temp_sensor_data omap4430_mpu_temp_sensor_data = {
43 	.min_freq = OMAP4430_MIN_FREQ,
44 	.max_freq = OMAP4430_MAX_FREQ,
45 	.max_temp = OMAP4430_MAX_TEMP,
46 	.min_temp = OMAP4430_MIN_TEMP,
47 	.hyst_val = OMAP4430_HYST_VAL,
48 };
49 
50 /*
51  * Temperature values in milli degree celsius
52  * ADC code values from 530 to 923
53  */
54 static const int
55 omap4430_adc_to_temp[OMAP4430_ADC_END_VALUE - OMAP4430_ADC_START_VALUE + 1] = {
56 	-38000, -35000, -34000, -32000, -30000, -28000, -26000, -24000, -22000,
57 	-20000, -18000, -17000, -15000, -13000, -12000, -10000, -8000, -6000,
58 	-5000, -3000, -1000, 0, 2000, 3000, 5000, 6000, 8000, 10000, 12000,
59 	13000, 15000, 17000, 19000, 21000, 23000, 25000, 27000, 28000, 30000,
60 	32000, 33000, 35000, 37000, 38000, 40000, 42000, 43000, 45000, 47000,
61 	48000, 50000, 52000, 53000, 55000, 57000, 58000, 60000, 62000, 64000,
62 	66000, 68000, 70000, 71000, 73000, 75000, 77000, 78000, 80000, 82000,
63 	83000, 85000, 87000, 88000, 90000, 92000, 93000, 95000, 97000, 98000,
64 	100000, 102000, 103000, 105000, 107000, 109000, 111000, 113000, 115000,
65 	117000, 118000, 120000, 122000, 123000,
66 };
67 
68 /* OMAP4430 data */
69 const struct ti_bandgap_data omap4430_data = {
70 	.features = TI_BANDGAP_FEATURE_MODE_CONFIG |
71 			TI_BANDGAP_FEATURE_CLK_CTRL |
72 			TI_BANDGAP_FEATURE_POWER_SWITCH,
73 	.fclock_name = "bandgap_fclk",
74 	.div_ck_name = "bandgap_fclk",
75 	.conv_table = omap4430_adc_to_temp,
76 	.adc_start_val = OMAP4430_ADC_START_VALUE,
77 	.adc_end_val = OMAP4430_ADC_END_VALUE,
78 	.expose_sensor = ti_thermal_expose_sensor,
79 	.remove_sensor = ti_thermal_remove_sensor,
80 	.sensors = {
81 		{
82 		.registers = &omap4430_mpu_temp_sensor_registers,
83 		.ts_data = &omap4430_mpu_temp_sensor_data,
84 		.domain = "cpu",
85 		.slope = OMAP_GRADIENT_SLOPE_4430,
86 		.constant = OMAP_GRADIENT_CONST_4430,
87 		.slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4430,
88 		.constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4430,
89 		.register_cooling = ti_thermal_register_cpu_cooling,
90 		.unregister_cooling = ti_thermal_unregister_cpu_cooling,
91 		},
92 	},
93 	.sensor_count = 1,
94 };
95 /*
96  * OMAP4460 has one instance of thermal sensor for MPU
97  * need to describe the individual bit fields
98  */
99 static struct temp_sensor_registers
100 omap4460_mpu_temp_sensor_registers = {
101 	.temp_sensor_ctrl = OMAP4460_TEMP_SENSOR_CTRL_OFFSET,
102 	.bgap_tempsoff_mask = OMAP4460_BGAP_TEMPSOFF_MASK,
103 	.bgap_soc_mask = OMAP4460_BGAP_TEMP_SENSOR_SOC_MASK,
104 	.bgap_eocz_mask = OMAP4460_BGAP_TEMP_SENSOR_EOCZ_MASK,
105 	.bgap_dtemp_mask = OMAP4460_BGAP_TEMP_SENSOR_DTEMP_MASK,
106 
107 	.bgap_mask_ctrl = OMAP4460_BGAP_CTRL_OFFSET,
108 	.mask_hot_mask = OMAP4460_MASK_HOT_MASK,
109 	.mask_cold_mask = OMAP4460_MASK_COLD_MASK,
110 
111 	.bgap_mode_ctrl = OMAP4460_BGAP_CTRL_OFFSET,
112 	.mode_ctrl_mask = OMAP4460_SINGLE_MODE_MASK,
113 
114 	.bgap_counter = OMAP4460_BGAP_COUNTER_OFFSET,
115 	.counter_mask = OMAP4460_COUNTER_MASK,
116 
117 	.bgap_threshold = OMAP4460_BGAP_THRESHOLD_OFFSET,
118 	.threshold_thot_mask = OMAP4460_T_HOT_MASK,
119 	.threshold_tcold_mask = OMAP4460_T_COLD_MASK,
120 
121 	.tshut_threshold = OMAP4460_BGAP_TSHUT_OFFSET,
122 	.tshut_hot_mask = OMAP4460_TSHUT_HOT_MASK,
123 	.tshut_cold_mask = OMAP4460_TSHUT_COLD_MASK,
124 
125 	.bgap_status = OMAP4460_BGAP_STATUS_OFFSET,
126 	.status_clean_stop_mask = OMAP4460_CLEAN_STOP_MASK,
127 	.status_bgap_alert_mask = OMAP4460_BGAP_ALERT_MASK,
128 	.status_hot_mask = OMAP4460_HOT_FLAG_MASK,
129 	.status_cold_mask = OMAP4460_COLD_FLAG_MASK,
130 
131 	.bgap_efuse = OMAP4460_FUSE_OPP_BGAP,
132 };
133 
134 /* Thresholds and limits for OMAP4460 MPU temperature sensor */
135 static struct temp_sensor_data omap4460_mpu_temp_sensor_data = {
136 	.tshut_hot = OMAP4460_TSHUT_HOT,
137 	.tshut_cold = OMAP4460_TSHUT_COLD,
138 	.t_hot = OMAP4460_T_HOT,
139 	.t_cold = OMAP4460_T_COLD,
140 	.min_freq = OMAP4460_MIN_FREQ,
141 	.max_freq = OMAP4460_MAX_FREQ,
142 	.max_temp = OMAP4460_MAX_TEMP,
143 	.min_temp = OMAP4460_MIN_TEMP,
144 	.hyst_val = OMAP4460_HYST_VAL,
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  */
153 static const int
154 omap4460_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 */
204 const struct ti_bandgap_data omap4460_data = {
205 	.features = TI_BANDGAP_FEATURE_TSHUT |
206 			TI_BANDGAP_FEATURE_TSHUT_CONFIG |
207 			TI_BANDGAP_FEATURE_TALERT |
208 			TI_BANDGAP_FEATURE_MODE_CONFIG |
209 			TI_BANDGAP_FEATURE_POWER_SWITCH |
210 			TI_BANDGAP_FEATURE_CLK_CTRL |
211 			TI_BANDGAP_FEATURE_COUNTER,
212 	.fclock_name = "bandgap_ts_fclk",
213 	.div_ck_name = "div_ts_ck",
214 	.conv_table = omap4460_adc_to_temp,
215 	.adc_start_val = OMAP4460_ADC_START_VALUE,
216 	.adc_end_val = OMAP4460_ADC_END_VALUE,
217 	.expose_sensor = ti_thermal_expose_sensor,
218 	.remove_sensor = ti_thermal_remove_sensor,
219 	.report_temperature = ti_thermal_report_sensor_temperature,
220 	.sensors = {
221 		{
222 		.registers = &omap4460_mpu_temp_sensor_registers,
223 		.ts_data = &omap4460_mpu_temp_sensor_data,
224 		.domain = "cpu",
225 		.slope = OMAP_GRADIENT_SLOPE_4460,
226 		.constant = OMAP_GRADIENT_CONST_4460,
227 		.slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4460,
228 		.constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4460,
229 		.register_cooling = ti_thermal_register_cpu_cooling,
230 		.unregister_cooling = ti_thermal_unregister_cpu_cooling,
231 		},
232 	},
233 	.sensor_count = 1,
234 };
235 
236 /* OMAP4470 data */
237 const struct ti_bandgap_data omap4470_data = {
238 	.features = TI_BANDGAP_FEATURE_TSHUT |
239 			TI_BANDGAP_FEATURE_TSHUT_CONFIG |
240 			TI_BANDGAP_FEATURE_TALERT |
241 			TI_BANDGAP_FEATURE_MODE_CONFIG |
242 			TI_BANDGAP_FEATURE_POWER_SWITCH |
243 			TI_BANDGAP_FEATURE_CLK_CTRL |
244 			TI_BANDGAP_FEATURE_COUNTER,
245 	.fclock_name = "bandgap_ts_fclk",
246 	.div_ck_name = "div_ts_ck",
247 	.conv_table = omap4460_adc_to_temp,
248 	.adc_start_val = OMAP4460_ADC_START_VALUE,
249 	.adc_end_val = OMAP4460_ADC_END_VALUE,
250 	.expose_sensor = ti_thermal_expose_sensor,
251 	.remove_sensor = ti_thermal_remove_sensor,
252 	.report_temperature = ti_thermal_report_sensor_temperature,
253 	.sensors = {
254 		{
255 		.registers = &omap4460_mpu_temp_sensor_registers,
256 		.ts_data = &omap4460_mpu_temp_sensor_data,
257 		.domain = "cpu",
258 		.slope = OMAP_GRADIENT_SLOPE_4470,
259 		.constant = OMAP_GRADIENT_CONST_4470,
260 		.slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4470,
261 		.constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4470,
262 		.register_cooling = ti_thermal_register_cpu_cooling,
263 		.unregister_cooling = ti_thermal_unregister_cpu_cooling,
264 		},
265 	},
266 	.sensor_count = 1,
267 };
268