1
2
3
4
5
6#ifndef __QCOM_TSENS_H__
7#define __QCOM_TSENS_H__
8
9#define ONE_PT_CALIB 0x1
10#define ONE_PT_CALIB2 0x2
11#define TWO_PT_CALIB 0x3
12#define CAL_DEGC_PT1 30
13#define CAL_DEGC_PT2 120
14#define SLOPE_FACTOR 1000
15#define SLOPE_DEFAULT 3200
16#define THRESHOLD_MAX_ADC_CODE 0x3ff
17#define THRESHOLD_MIN_ADC_CODE 0x0
18
19#include <linux/interrupt.h>
20#include <linux/thermal.h>
21#include <linux/regmap.h>
22#include <linux/slab.h>
23
24struct tsens_priv;
25
26enum tsens_ver {
27 VER_0_1 = 0,
28 VER_1_X,
29 VER_2_X,
30};
31
32enum tsens_irq_type {
33 LOWER,
34 UPPER,
35};
36
37
38
39
40
41
42
43
44
45
46struct tsens_sensor {
47 struct tsens_priv *priv;
48 struct thermal_zone_device *tzd;
49 int offset;
50 unsigned int hw_id;
51 int slope;
52 u32 status;
53};
54
55
56
57
58
59
60
61
62
63
64
65
66struct tsens_ops {
67
68 int (*init)(struct tsens_priv *priv);
69 int (*calibrate)(struct tsens_priv *priv);
70 int (*get_temp)(struct tsens_sensor *s, int *temp);
71
72 int (*enable)(struct tsens_priv *priv, int i);
73 void (*disable)(struct tsens_priv *priv);
74 int (*suspend)(struct tsens_priv *priv);
75 int (*resume)(struct tsens_priv *priv);
76 int (*get_trend)(struct tsens_sensor *s, enum thermal_trend *trend);
77};
78
79#define REG_FIELD_FOR_EACH_SENSOR11(_name, _offset, _startbit, _stopbit) \
80 [_name##_##0] = REG_FIELD(_offset, _startbit, _stopbit), \
81 [_name##_##1] = REG_FIELD(_offset + 4, _startbit, _stopbit), \
82 [_name##_##2] = REG_FIELD(_offset + 8, _startbit, _stopbit), \
83 [_name##_##3] = REG_FIELD(_offset + 12, _startbit, _stopbit), \
84 [_name##_##4] = REG_FIELD(_offset + 16, _startbit, _stopbit), \
85 [_name##_##5] = REG_FIELD(_offset + 20, _startbit, _stopbit), \
86 [_name##_##6] = REG_FIELD(_offset + 24, _startbit, _stopbit), \
87 [_name##_##7] = REG_FIELD(_offset + 28, _startbit, _stopbit), \
88 [_name##_##8] = REG_FIELD(_offset + 32, _startbit, _stopbit), \
89 [_name##_##9] = REG_FIELD(_offset + 36, _startbit, _stopbit), \
90 [_name##_##10] = REG_FIELD(_offset + 40, _startbit, _stopbit)
91
92#define REG_FIELD_FOR_EACH_SENSOR16(_name, _offset, _startbit, _stopbit) \
93 [_name##_##0] = REG_FIELD(_offset, _startbit, _stopbit), \
94 [_name##_##1] = REG_FIELD(_offset + 4, _startbit, _stopbit), \
95 [_name##_##2] = REG_FIELD(_offset + 8, _startbit, _stopbit), \
96 [_name##_##3] = REG_FIELD(_offset + 12, _startbit, _stopbit), \
97 [_name##_##4] = REG_FIELD(_offset + 16, _startbit, _stopbit), \
98 [_name##_##5] = REG_FIELD(_offset + 20, _startbit, _stopbit), \
99 [_name##_##6] = REG_FIELD(_offset + 24, _startbit, _stopbit), \
100 [_name##_##7] = REG_FIELD(_offset + 28, _startbit, _stopbit), \
101 [_name##_##8] = REG_FIELD(_offset + 32, _startbit, _stopbit), \
102 [_name##_##9] = REG_FIELD(_offset + 36, _startbit, _stopbit), \
103 [_name##_##10] = REG_FIELD(_offset + 40, _startbit, _stopbit), \
104 [_name##_##11] = REG_FIELD(_offset + 44, _startbit, _stopbit), \
105 [_name##_##12] = REG_FIELD(_offset + 48, _startbit, _stopbit), \
106 [_name##_##13] = REG_FIELD(_offset + 52, _startbit, _stopbit), \
107 [_name##_##14] = REG_FIELD(_offset + 56, _startbit, _stopbit), \
108 [_name##_##15] = REG_FIELD(_offset + 60, _startbit, _stopbit)
109
110#define REG_FIELD_SPLIT_BITS_0_15(_name, _offset) \
111 [_name##_##0] = REG_FIELD(_offset, 0, 0), \
112 [_name##_##1] = REG_FIELD(_offset, 1, 1), \
113 [_name##_##2] = REG_FIELD(_offset, 2, 2), \
114 [_name##_##3] = REG_FIELD(_offset, 3, 3), \
115 [_name##_##4] = REG_FIELD(_offset, 4, 4), \
116 [_name##_##5] = REG_FIELD(_offset, 5, 5), \
117 [_name##_##6] = REG_FIELD(_offset, 6, 6), \
118 [_name##_##7] = REG_FIELD(_offset, 7, 7), \
119 [_name##_##8] = REG_FIELD(_offset, 8, 8), \
120 [_name##_##9] = REG_FIELD(_offset, 9, 9), \
121 [_name##_##10] = REG_FIELD(_offset, 10, 10), \
122 [_name##_##11] = REG_FIELD(_offset, 11, 11), \
123 [_name##_##12] = REG_FIELD(_offset, 12, 12), \
124 [_name##_##13] = REG_FIELD(_offset, 13, 13), \
125 [_name##_##14] = REG_FIELD(_offset, 14, 14), \
126 [_name##_##15] = REG_FIELD(_offset, 15, 15)
127
128#define REG_FIELD_SPLIT_BITS_16_31(_name, _offset) \
129 [_name##_##0] = REG_FIELD(_offset, 16, 16), \
130 [_name##_##1] = REG_FIELD(_offset, 17, 17), \
131 [_name##_##2] = REG_FIELD(_offset, 18, 18), \
132 [_name##_##3] = REG_FIELD(_offset, 19, 19), \
133 [_name##_##4] = REG_FIELD(_offset, 20, 20), \
134 [_name##_##5] = REG_FIELD(_offset, 21, 21), \
135 [_name##_##6] = REG_FIELD(_offset, 22, 22), \
136 [_name##_##7] = REG_FIELD(_offset, 23, 23), \
137 [_name##_##8] = REG_FIELD(_offset, 24, 24), \
138 [_name##_##9] = REG_FIELD(_offset, 25, 25), \
139 [_name##_##10] = REG_FIELD(_offset, 26, 26), \
140 [_name##_##11] = REG_FIELD(_offset, 27, 27), \
141 [_name##_##12] = REG_FIELD(_offset, 28, 28), \
142 [_name##_##13] = REG_FIELD(_offset, 29, 29), \
143 [_name##_##14] = REG_FIELD(_offset, 30, 30), \
144 [_name##_##15] = REG_FIELD(_offset, 31, 31)
145
146
147
148
149
150
151enum regfield_ids {
152
153
154 VER_MAJOR,
155 VER_MINOR,
156 VER_STEP,
157
158 TSENS_EN,
159 TSENS_SW_RST,
160 SENSOR_EN,
161 CODE_OR_TEMP,
162
163
164
165 TRDY,
166
167 INT_EN,
168
169 LAST_TEMP_0,
170 LAST_TEMP_1,
171 LAST_TEMP_2,
172 LAST_TEMP_3,
173 LAST_TEMP_4,
174 LAST_TEMP_5,
175 LAST_TEMP_6,
176 LAST_TEMP_7,
177 LAST_TEMP_8,
178 LAST_TEMP_9,
179 LAST_TEMP_10,
180 LAST_TEMP_11,
181 LAST_TEMP_12,
182 LAST_TEMP_13,
183 LAST_TEMP_14,
184 LAST_TEMP_15,
185 VALID_0,
186 VALID_1,
187 VALID_2,
188 VALID_3,
189 VALID_4,
190 VALID_5,
191 VALID_6,
192 VALID_7,
193 VALID_8,
194 VALID_9,
195 VALID_10,
196 VALID_11,
197 VALID_12,
198 VALID_13,
199 VALID_14,
200 VALID_15,
201 LOWER_STATUS_0,
202 LOWER_STATUS_1,
203 LOWER_STATUS_2,
204 LOWER_STATUS_3,
205 LOWER_STATUS_4,
206 LOWER_STATUS_5,
207 LOWER_STATUS_6,
208 LOWER_STATUS_7,
209 LOWER_STATUS_8,
210 LOWER_STATUS_9,
211 LOWER_STATUS_10,
212 LOWER_STATUS_11,
213 LOWER_STATUS_12,
214 LOWER_STATUS_13,
215 LOWER_STATUS_14,
216 LOWER_STATUS_15,
217 LOW_INT_STATUS_0,
218 LOW_INT_STATUS_1,
219 LOW_INT_STATUS_2,
220 LOW_INT_STATUS_3,
221 LOW_INT_STATUS_4,
222 LOW_INT_STATUS_5,
223 LOW_INT_STATUS_6,
224 LOW_INT_STATUS_7,
225 LOW_INT_STATUS_8,
226 LOW_INT_STATUS_9,
227 LOW_INT_STATUS_10,
228 LOW_INT_STATUS_11,
229 LOW_INT_STATUS_12,
230 LOW_INT_STATUS_13,
231 LOW_INT_STATUS_14,
232 LOW_INT_STATUS_15,
233 LOW_INT_CLEAR_0,
234 LOW_INT_CLEAR_1,
235 LOW_INT_CLEAR_2,
236 LOW_INT_CLEAR_3,
237 LOW_INT_CLEAR_4,
238 LOW_INT_CLEAR_5,
239 LOW_INT_CLEAR_6,
240 LOW_INT_CLEAR_7,
241 LOW_INT_CLEAR_8,
242 LOW_INT_CLEAR_9,
243 LOW_INT_CLEAR_10,
244 LOW_INT_CLEAR_11,
245 LOW_INT_CLEAR_12,
246 LOW_INT_CLEAR_13,
247 LOW_INT_CLEAR_14,
248 LOW_INT_CLEAR_15,
249 LOW_INT_MASK_0,
250 LOW_INT_MASK_1,
251 LOW_INT_MASK_2,
252 LOW_INT_MASK_3,
253 LOW_INT_MASK_4,
254 LOW_INT_MASK_5,
255 LOW_INT_MASK_6,
256 LOW_INT_MASK_7,
257 LOW_INT_MASK_8,
258 LOW_INT_MASK_9,
259 LOW_INT_MASK_10,
260 LOW_INT_MASK_11,
261 LOW_INT_MASK_12,
262 LOW_INT_MASK_13,
263 LOW_INT_MASK_14,
264 LOW_INT_MASK_15,
265 LOW_THRESH_0,
266 LOW_THRESH_1,
267 LOW_THRESH_2,
268 LOW_THRESH_3,
269 LOW_THRESH_4,
270 LOW_THRESH_5,
271 LOW_THRESH_6,
272 LOW_THRESH_7,
273 LOW_THRESH_8,
274 LOW_THRESH_9,
275 LOW_THRESH_10,
276 LOW_THRESH_11,
277 LOW_THRESH_12,
278 LOW_THRESH_13,
279 LOW_THRESH_14,
280 LOW_THRESH_15,
281 UPPER_STATUS_0,
282 UPPER_STATUS_1,
283 UPPER_STATUS_2,
284 UPPER_STATUS_3,
285 UPPER_STATUS_4,
286 UPPER_STATUS_5,
287 UPPER_STATUS_6,
288 UPPER_STATUS_7,
289 UPPER_STATUS_8,
290 UPPER_STATUS_9,
291 UPPER_STATUS_10,
292 UPPER_STATUS_11,
293 UPPER_STATUS_12,
294 UPPER_STATUS_13,
295 UPPER_STATUS_14,
296 UPPER_STATUS_15,
297 UP_INT_STATUS_0,
298 UP_INT_STATUS_1,
299 UP_INT_STATUS_2,
300 UP_INT_STATUS_3,
301 UP_INT_STATUS_4,
302 UP_INT_STATUS_5,
303 UP_INT_STATUS_6,
304 UP_INT_STATUS_7,
305 UP_INT_STATUS_8,
306 UP_INT_STATUS_9,
307 UP_INT_STATUS_10,
308 UP_INT_STATUS_11,
309 UP_INT_STATUS_12,
310 UP_INT_STATUS_13,
311 UP_INT_STATUS_14,
312 UP_INT_STATUS_15,
313 UP_INT_CLEAR_0,
314 UP_INT_CLEAR_1,
315 UP_INT_CLEAR_2,
316 UP_INT_CLEAR_3,
317 UP_INT_CLEAR_4,
318 UP_INT_CLEAR_5,
319 UP_INT_CLEAR_6,
320 UP_INT_CLEAR_7,
321 UP_INT_CLEAR_8,
322 UP_INT_CLEAR_9,
323 UP_INT_CLEAR_10,
324 UP_INT_CLEAR_11,
325 UP_INT_CLEAR_12,
326 UP_INT_CLEAR_13,
327 UP_INT_CLEAR_14,
328 UP_INT_CLEAR_15,
329 UP_INT_MASK_0,
330 UP_INT_MASK_1,
331 UP_INT_MASK_2,
332 UP_INT_MASK_3,
333 UP_INT_MASK_4,
334 UP_INT_MASK_5,
335 UP_INT_MASK_6,
336 UP_INT_MASK_7,
337 UP_INT_MASK_8,
338 UP_INT_MASK_9,
339 UP_INT_MASK_10,
340 UP_INT_MASK_11,
341 UP_INT_MASK_12,
342 UP_INT_MASK_13,
343 UP_INT_MASK_14,
344 UP_INT_MASK_15,
345 UP_THRESH_0,
346 UP_THRESH_1,
347 UP_THRESH_2,
348 UP_THRESH_3,
349 UP_THRESH_4,
350 UP_THRESH_5,
351 UP_THRESH_6,
352 UP_THRESH_7,
353 UP_THRESH_8,
354 UP_THRESH_9,
355 UP_THRESH_10,
356 UP_THRESH_11,
357 UP_THRESH_12,
358 UP_THRESH_13,
359 UP_THRESH_14,
360 UP_THRESH_15,
361 CRITICAL_STATUS_0,
362 CRITICAL_STATUS_1,
363 CRITICAL_STATUS_2,
364 CRITICAL_STATUS_3,
365 CRITICAL_STATUS_4,
366 CRITICAL_STATUS_5,
367 CRITICAL_STATUS_6,
368 CRITICAL_STATUS_7,
369 CRITICAL_STATUS_8,
370 CRITICAL_STATUS_9,
371 CRITICAL_STATUS_10,
372 CRITICAL_STATUS_11,
373 CRITICAL_STATUS_12,
374 CRITICAL_STATUS_13,
375 CRITICAL_STATUS_14,
376 CRITICAL_STATUS_15,
377 MIN_STATUS_0,
378 MIN_STATUS_1,
379 MIN_STATUS_2,
380 MIN_STATUS_3,
381 MIN_STATUS_4,
382 MIN_STATUS_5,
383 MIN_STATUS_6,
384 MIN_STATUS_7,
385 MIN_STATUS_8,
386 MIN_STATUS_9,
387 MIN_STATUS_10,
388 MIN_STATUS_11,
389 MIN_STATUS_12,
390 MIN_STATUS_13,
391 MIN_STATUS_14,
392 MIN_STATUS_15,
393 MAX_STATUS_0,
394 MAX_STATUS_1,
395 MAX_STATUS_2,
396 MAX_STATUS_3,
397 MAX_STATUS_4,
398 MAX_STATUS_5,
399 MAX_STATUS_6,
400 MAX_STATUS_7,
401 MAX_STATUS_8,
402 MAX_STATUS_9,
403 MAX_STATUS_10,
404 MAX_STATUS_11,
405 MAX_STATUS_12,
406 MAX_STATUS_13,
407 MAX_STATUS_14,
408 MAX_STATUS_15,
409
410
411 MAX_REGFIELDS
412};
413
414
415
416
417
418
419
420
421
422
423struct tsens_features {
424 unsigned int ver_major;
425 unsigned int crit_int:1;
426 unsigned int adc:1;
427 unsigned int srot_split:1;
428 unsigned int max_sensors;
429};
430
431
432
433
434
435
436
437
438
439struct tsens_plat_data {
440 const u32 num_sensors;
441 const struct tsens_ops *ops;
442 unsigned int *hw_ids;
443 const struct tsens_features *feat;
444 const struct reg_field *fields;
445};
446
447
448
449
450struct tsens_context {
451 int threshold;
452 int control;
453};
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472struct tsens_priv {
473 struct device *dev;
474 u32 num_sensors;
475 struct regmap *tm_map;
476 struct regmap *srot_map;
477 u32 tm_offset;
478
479
480 spinlock_t ul_lock;
481
482 struct regmap_field *rf[MAX_REGFIELDS];
483 struct tsens_context ctx;
484 const struct tsens_features *feat;
485 const struct reg_field *fields;
486 const struct tsens_ops *ops;
487
488 struct dentry *debug_root;
489 struct dentry *debug;
490
491 struct tsens_sensor sensor[0];
492};
493
494char *qfprom_read(struct device *dev, const char *cname);
495void compute_intercept_slope(struct tsens_priv *priv, u32 *pt1, u32 *pt2, u32 mode);
496int init_common(struct tsens_priv *priv);
497int get_temp_tsens_valid(struct tsens_sensor *s, int *temp);
498int get_temp_common(struct tsens_sensor *s, int *temp);
499int tsens_enable_irq(struct tsens_priv *priv);
500void tsens_disable_irq(struct tsens_priv *priv);
501int tsens_set_trips(void *_sensor, int low, int high);
502irqreturn_t tsens_irq_thread(int irq, void *data);
503
504
505extern const struct tsens_plat_data data_8960;
506
507
508extern const struct tsens_plat_data data_8916, data_8974;
509
510
511extern const struct tsens_plat_data data_tsens_v1, data_8976;
512
513
514extern const struct tsens_plat_data data_8996, data_tsens_v2;
515
516#endif
517