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