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

source code of linux/drivers/thermal/ti-soc-thermal/omap4-thermal-data.c