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