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