Merge tag 'mfd-next-5.7' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
[platform/kernel/linux-starfive.git] / drivers / thermal / qcom / tsens.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2015, The Linux Foundation. All rights reserved.
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
24 struct tsens_priv;
25
26 enum tsens_ver {
27         VER_0_1 = 0,
28         VER_1_X,
29         VER_2_X,
30 };
31
32 enum tsens_irq_type {
33         LOWER,
34         UPPER,
35 };
36
37 /**
38  * struct tsens_sensor - data for each sensor connected to the tsens device
39  * @priv: tsens device instance that this sensor is connected to
40  * @tzd: pointer to the thermal zone that this sensor is in
41  * @offset: offset of temperature adjustment curve
42  * @hw_id: HW ID can be used in case of platform-specific IDs
43  * @slope: slope of temperature adjustment curve
44  * @status: 8960-specific variable to track 8960 and 8660 status register offset
45  */
46 struct 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  * struct tsens_ops - operations as supported by the tsens device
57  * @init: Function to initialize the tsens device
58  * @calibrate: Function to calibrate the tsens device
59  * @get_temp: Function which returns the temp in millidegC
60  * @enable: Function to enable (clocks/power) tsens device
61  * @disable: Function to disable the tsens device
62  * @suspend: Function to suspend the tsens device
63  * @resume: Function to resume the tsens device
64  * @get_trend: Function to get the thermal/temp trend
65  */
66 struct tsens_ops {
67         /* mandatory callbacks */
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         /* optional callbacks */
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  * reg_field IDs to use as an index into an array
148  * If you change the order of the entries, check the devm_regmap_field_alloc()
149  * calls in init_common()
150  */
151 enum regfield_ids {
152         /* ----- SROT ------ */
153         /* HW_VER */
154         VER_MAJOR,
155         VER_MINOR,
156         VER_STEP,
157         /* CTRL_OFFSET */
158         TSENS_EN,
159         TSENS_SW_RST,
160         SENSOR_EN,
161         CODE_OR_TEMP,
162
163         /* ----- TM ------ */
164         /* TRDY */
165         TRDY,
166         /* INTERRUPT ENABLE */
167         INT_EN, /* v2+ has separate enables for crit, upper and lower irq */
168         /* STATUS */
169         LAST_TEMP_0,    /* Last temperature reading */
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,                /* VALID reading or not */
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, /* LOWER threshold violated */
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,       /* LOWER interrupt status */
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,        /* LOWER interrupt clear */
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, /* LOWER interrupt mask */
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,           /* LOWER threshold values */
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, /* UPPER threshold violated */
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,        /* UPPER interrupt status */
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, /* UPPER interrupt clear */
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,          /* UPPER interrupt mask */
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,            /* UPPER threshold values */
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,      /* CRITICAL threshold violated */
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,           /* MIN threshold violated */
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,           /* MAX threshold violated */
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         /* Keep last */
411         MAX_REGFIELDS
412 };
413
414 /**
415  * struct tsens_features - Features supported by the IP
416  * @ver_major: Major number of IP version
417  * @crit_int: does the IP support critical interrupts?
418  * @adc:      do the sensors only output adc code (instead of temperature)?
419  * @srot_split: does the IP neatly splits the register space into SROT and TM,
420  *              with SROT only being available to secure boot firmware?
421  * @max_sensors: maximum sensors supported by this version of the IP
422  */
423 struct 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  * struct tsens_plat_data - tsens compile-time platform data
433  * @num_sensors: Number of sensors supported by platform
434  * @ops: operations the tsens instance supports
435  * @hw_ids: Subset of sensors ids supported by platform, if not the first n
436  * @feat: features of the IP
437  * @fields: bitfield locations
438  */
439 struct 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  * struct tsens_context - Registers to be saved/restored across a context loss
449  */
450 struct tsens_context {
451         int     threshold;
452         int     control;
453 };
454
455 /**
456  * struct tsens_priv - private data for each instance of the tsens IP
457  * @dev: pointer to struct device
458  * @num_sensors: number of sensors enabled on this device
459  * @tm_map: pointer to TM register address space
460  * @srot_map: pointer to SROT register address space
461  * @tm_offset: deal with old device trees that don't address TM and SROT
462  *             address space separately
463  * @rf: array of regmap_fields used to store value of the field
464  * @ctx: registers to be saved and restored during suspend/resume
465  * @feat: features of the IP
466  * @fields: bitfield locations
467  * @ops: pointer to list of callbacks supported by this device
468  * @debug_root: pointer to debugfs dentry for all tsens
469  * @debug: pointer to debugfs dentry for tsens controller
470  * @sensor: list of sensors attached to this device
471  */
472 struct 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         /* lock for upper/lower threshold interrupts */
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
494 char *qfprom_read(struct device *dev, const char *cname);
495 void compute_intercept_slope(struct tsens_priv *priv, u32 *pt1, u32 *pt2, u32 mode);
496 int init_common(struct tsens_priv *priv);
497 int get_temp_tsens_valid(struct tsens_sensor *s, int *temp);
498 int get_temp_common(struct tsens_sensor *s, int *temp);
499 int tsens_enable_irq(struct tsens_priv *priv);
500 void tsens_disable_irq(struct tsens_priv *priv);
501 int tsens_set_trips(void *_sensor, int low, int high);
502 irqreturn_t tsens_irq_thread(int irq, void *data);
503
504 /* TSENS target */
505 extern const struct tsens_plat_data data_8960;
506
507 /* TSENS v0.1 targets */
508 extern const struct tsens_plat_data data_8916, data_8974;
509
510 /* TSENS v1 targets */
511 extern const struct tsens_plat_data data_tsens_v1, data_8976;
512
513 /* TSENS v2 targets */
514 extern const struct tsens_plat_data data_8996, data_tsens_v2;
515
516 #endif /* __QCOM_TSENS_H__ */