xref: /openbmc/linux/drivers/thermal/qcom/tsens.c (revision c7e1962a)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2015, The Linux Foundation. All rights reserved.
4  * Copyright (c) 2019, 2020, Linaro Ltd.
5  */
6 
7 #include <linux/debugfs.h>
8 #include <linux/err.h>
9 #include <linux/io.h>
10 #include <linux/module.h>
11 #include <linux/nvmem-consumer.h>
12 #include <linux/of.h>
13 #include <linux/of_address.h>
14 #include <linux/of_platform.h>
15 #include <linux/mfd/syscon.h>
16 #include <linux/platform_device.h>
17 #include <linux/pm.h>
18 #include <linux/regmap.h>
19 #include <linux/slab.h>
20 #include <linux/thermal.h>
21 #include "../thermal_hwmon.h"
22 #include "tsens.h"
23 
24 /**
25  * struct tsens_irq_data - IRQ status and temperature violations
26  * @up_viol:        upper threshold violated
27  * @up_thresh:      upper threshold temperature value
28  * @up_irq_mask:    mask register for upper threshold irqs
29  * @up_irq_clear:   clear register for uppper threshold irqs
30  * @low_viol:       lower threshold violated
31  * @low_thresh:     lower threshold temperature value
32  * @low_irq_mask:   mask register for lower threshold irqs
33  * @low_irq_clear:  clear register for lower threshold irqs
34  * @crit_viol:      critical threshold violated
35  * @crit_thresh:    critical threshold temperature value
36  * @crit_irq_mask:  mask register for critical threshold irqs
37  * @crit_irq_clear: clear register for critical threshold irqs
38  *
39  * Structure containing data about temperature threshold settings and
40  * irq status if they were violated.
41  */
42 struct tsens_irq_data {
43 	u32 up_viol;
44 	int up_thresh;
45 	u32 up_irq_mask;
46 	u32 up_irq_clear;
47 	u32 low_viol;
48 	int low_thresh;
49 	u32 low_irq_mask;
50 	u32 low_irq_clear;
51 	u32 crit_viol;
52 	u32 crit_thresh;
53 	u32 crit_irq_mask;
54 	u32 crit_irq_clear;
55 };
56 
57 char *qfprom_read(struct device *dev, const char *cname)
58 {
59 	struct nvmem_cell *cell;
60 	ssize_t data;
61 	char *ret;
62 
63 	cell = nvmem_cell_get(dev, cname);
64 	if (IS_ERR(cell))
65 		return ERR_CAST(cell);
66 
67 	ret = nvmem_cell_read(cell, &data);
68 	nvmem_cell_put(cell);
69 
70 	return ret;
71 }
72 
73 int tsens_read_calibration(struct tsens_priv *priv, int shift, u32 *p1, u32 *p2, bool backup)
74 {
75 	u32 mode;
76 	u32 base1, base2;
77 	char name[] = "sXX_pY_backup"; /* s10_p1_backup */
78 	int i, ret;
79 
80 	if (priv->num_sensors > MAX_SENSORS)
81 		return -EINVAL;
82 
83 	ret = snprintf(name, sizeof(name), "mode%s", backup ? "_backup" : "");
84 	if (ret < 0)
85 		return ret;
86 
87 	ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &mode);
88 	if (ret == -ENOENT)
89 		dev_warn(priv->dev, "Please migrate to separate nvmem cells for calibration data\n");
90 	if (ret < 0)
91 		return ret;
92 
93 	dev_dbg(priv->dev, "calibration mode is %d\n", mode);
94 
95 	ret = snprintf(name, sizeof(name), "base1%s", backup ? "_backup" : "");
96 	if (ret < 0)
97 		return ret;
98 
99 	ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &base1);
100 	if (ret < 0)
101 		return ret;
102 
103 	ret = snprintf(name, sizeof(name), "base2%s", backup ? "_backup" : "");
104 	if (ret < 0)
105 		return ret;
106 
107 	ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &base2);
108 	if (ret < 0)
109 		return ret;
110 
111 	for (i = 0; i < priv->num_sensors; i++) {
112 		ret = snprintf(name, sizeof(name), "s%d_p1%s", priv->sensor[i].hw_id,
113 			       backup ? "_backup" : "");
114 		if (ret < 0)
115 			return ret;
116 
117 		ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &p1[i]);
118 		if (ret)
119 			return ret;
120 
121 		ret = snprintf(name, sizeof(name), "s%d_p2%s", priv->sensor[i].hw_id,
122 			       backup ? "_backup" : "");
123 		if (ret < 0)
124 			return ret;
125 
126 		ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &p2[i]);
127 		if (ret)
128 			return ret;
129 	}
130 
131 	switch (mode) {
132 	case ONE_PT_CALIB:
133 		for (i = 0; i < priv->num_sensors; i++)
134 			p1[i] = p1[i] + (base1 << shift);
135 		break;
136 	case TWO_PT_CALIB:
137 	case TWO_PT_CALIB_NO_OFFSET:
138 		for (i = 0; i < priv->num_sensors; i++)
139 			p2[i] = (p2[i] + base2) << shift;
140 		fallthrough;
141 	case ONE_PT_CALIB2:
142 	case ONE_PT_CALIB2_NO_OFFSET:
143 		for (i = 0; i < priv->num_sensors; i++)
144 			p1[i] = (p1[i] + base1) << shift;
145 		break;
146 	default:
147 		dev_dbg(priv->dev, "calibrationless mode\n");
148 		for (i = 0; i < priv->num_sensors; i++) {
149 			p1[i] = 500;
150 			p2[i] = 780;
151 		}
152 	}
153 
154 	/* Apply calibration offset workaround except for _NO_OFFSET modes */
155 	switch (mode) {
156 	case TWO_PT_CALIB:
157 		for (i = 0; i < priv->num_sensors; i++)
158 			p2[i] += priv->sensor[i].p2_calib_offset;
159 		fallthrough;
160 	case ONE_PT_CALIB2:
161 		for (i = 0; i < priv->num_sensors; i++)
162 			p1[i] += priv->sensor[i].p1_calib_offset;
163 		break;
164 	}
165 
166 	return mode;
167 }
168 
169 int tsens_calibrate_nvmem(struct tsens_priv *priv, int shift)
170 {
171 	u32 p1[MAX_SENSORS], p2[MAX_SENSORS];
172 	int mode;
173 
174 	mode = tsens_read_calibration(priv, shift, p1, p2, false);
175 	if (mode < 0)
176 		return mode;
177 
178 	compute_intercept_slope(priv, p1, p2, mode);
179 
180 	return 0;
181 }
182 
183 int tsens_calibrate_common(struct tsens_priv *priv)
184 {
185 	return tsens_calibrate_nvmem(priv, 2);
186 }
187 
188 static u32 tsens_read_cell(const struct tsens_single_value *cell, u8 len, u32 *data0, u32 *data1)
189 {
190 	u32 val;
191 	u32 *data = cell->blob ? data1 : data0;
192 
193 	if (cell->shift + len <= 32) {
194 		val = data[cell->idx] >> cell->shift;
195 	} else {
196 		u8 part = 32 - cell->shift;
197 
198 		val = data[cell->idx] >> cell->shift;
199 		val |= data[cell->idx + 1] << part;
200 	}
201 
202 	return val & ((1 << len) - 1);
203 }
204 
205 int tsens_read_calibration_legacy(struct tsens_priv *priv,
206 				  const struct tsens_legacy_calibration_format *format,
207 				  u32 *p1, u32 *p2,
208 				  u32 *cdata0, u32 *cdata1)
209 {
210 	u32 mode, invalid;
211 	u32 base1, base2;
212 	int i;
213 
214 	mode = tsens_read_cell(&format->mode, 2, cdata0, cdata1);
215 	invalid = tsens_read_cell(&format->invalid, 1, cdata0, cdata1);
216 	if (invalid)
217 		mode = NO_PT_CALIB;
218 	dev_dbg(priv->dev, "calibration mode is %d\n", mode);
219 
220 	base1 = tsens_read_cell(&format->base[0], format->base_len, cdata0, cdata1);
221 	base2 = tsens_read_cell(&format->base[1], format->base_len, cdata0, cdata1);
222 
223 	for (i = 0; i < priv->num_sensors; i++) {
224 		p1[i] = tsens_read_cell(&format->sp[i][0], format->sp_len, cdata0, cdata1);
225 		p2[i] = tsens_read_cell(&format->sp[i][1], format->sp_len, cdata0, cdata1);
226 	}
227 
228 	switch (mode) {
229 	case ONE_PT_CALIB:
230 		for (i = 0; i < priv->num_sensors; i++)
231 			p1[i] = p1[i] + (base1 << format->base_shift);
232 		break;
233 	case TWO_PT_CALIB:
234 		for (i = 0; i < priv->num_sensors; i++)
235 			p2[i] = (p2[i] + base2) << format->base_shift;
236 		fallthrough;
237 	case ONE_PT_CALIB2:
238 		for (i = 0; i < priv->num_sensors; i++)
239 			p1[i] = (p1[i] + base1) << format->base_shift;
240 		break;
241 	default:
242 		dev_dbg(priv->dev, "calibrationless mode\n");
243 		for (i = 0; i < priv->num_sensors; i++) {
244 			p1[i] = 500;
245 			p2[i] = 780;
246 		}
247 	}
248 
249 	return mode;
250 }
251 
252 /*
253  * Use this function on devices where slope and offset calculations
254  * depend on calibration data read from qfprom. On others the slope
255  * and offset values are derived from tz->tzp->slope and tz->tzp->offset
256  * resp.
257  */
258 void compute_intercept_slope(struct tsens_priv *priv, u32 *p1,
259 			     u32 *p2, u32 mode)
260 {
261 	int i;
262 	int num, den;
263 
264 	for (i = 0; i < priv->num_sensors; i++) {
265 		dev_dbg(priv->dev,
266 			"%s: sensor%d - data_point1:%#x data_point2:%#x\n",
267 			__func__, i, p1[i], p2 ? p2[i] : 0);
268 
269 		if (!priv->sensor[i].slope)
270 			priv->sensor[i].slope = SLOPE_DEFAULT;
271 		if (mode == TWO_PT_CALIB || mode == TWO_PT_CALIB_NO_OFFSET) {
272 			/*
273 			 * slope (m) = adc_code2 - adc_code1 (y2 - y1)/
274 			 *	temp_120_degc - temp_30_degc (x2 - x1)
275 			 */
276 			num = p2[i] - p1[i];
277 			num *= SLOPE_FACTOR;
278 			den = CAL_DEGC_PT2 - CAL_DEGC_PT1;
279 			priv->sensor[i].slope = num / den;
280 		}
281 
282 		priv->sensor[i].offset = (p1[i] * SLOPE_FACTOR) -
283 				(CAL_DEGC_PT1 *
284 				priv->sensor[i].slope);
285 		dev_dbg(priv->dev, "%s: offset:%d\n", __func__,
286 			priv->sensor[i].offset);
287 	}
288 }
289 
290 static inline u32 degc_to_code(int degc, const struct tsens_sensor *s)
291 {
292 	u64 code = div_u64(((u64)degc * s->slope + s->offset), SLOPE_FACTOR);
293 
294 	pr_debug("%s: raw_code: 0x%llx, degc:%d\n", __func__, code, degc);
295 	return clamp_val(code, THRESHOLD_MIN_ADC_CODE, THRESHOLD_MAX_ADC_CODE);
296 }
297 
298 static inline int code_to_degc(u32 adc_code, const struct tsens_sensor *s)
299 {
300 	int degc, num, den;
301 
302 	num = (adc_code * SLOPE_FACTOR) - s->offset;
303 	den = s->slope;
304 
305 	if (num > 0)
306 		degc = num + (den / 2);
307 	else if (num < 0)
308 		degc = num - (den / 2);
309 	else
310 		degc = num;
311 
312 	degc /= den;
313 
314 	return degc;
315 }
316 
317 /**
318  * tsens_hw_to_mC - Return sign-extended temperature in mCelsius.
319  * @s:     Pointer to sensor struct
320  * @field: Index into regmap_field array pointing to temperature data
321  *
322  * This function handles temperature returned in ADC code or deciCelsius
323  * depending on IP version.
324  *
325  * Return: Temperature in milliCelsius on success, a negative errno will
326  * be returned in error cases
327  */
328 static int tsens_hw_to_mC(const struct tsens_sensor *s, int field)
329 {
330 	struct tsens_priv *priv = s->priv;
331 	u32 resolution;
332 	u32 temp = 0;
333 	int ret;
334 
335 	resolution = priv->fields[LAST_TEMP_0].msb -
336 		priv->fields[LAST_TEMP_0].lsb;
337 
338 	ret = regmap_field_read(priv->rf[field], &temp);
339 	if (ret)
340 		return ret;
341 
342 	/* Convert temperature from ADC code to milliCelsius */
343 	if (priv->feat->adc)
344 		return code_to_degc(temp, s) * 1000;
345 
346 	/* deciCelsius -> milliCelsius along with sign extension */
347 	return sign_extend32(temp, resolution) * 100;
348 }
349 
350 /**
351  * tsens_mC_to_hw - Convert temperature to hardware register value
352  * @s: Pointer to sensor struct
353  * @temp: temperature in milliCelsius to be programmed to hardware
354  *
355  * This function outputs the value to be written to hardware in ADC code
356  * or deciCelsius depending on IP version.
357  *
358  * Return: ADC code or temperature in deciCelsius.
359  */
360 static int tsens_mC_to_hw(const struct tsens_sensor *s, int temp)
361 {
362 	struct tsens_priv *priv = s->priv;
363 
364 	/* milliC to adc code */
365 	if (priv->feat->adc)
366 		return degc_to_code(temp / 1000, s);
367 
368 	/* milliC to deciC */
369 	return temp / 100;
370 }
371 
372 static inline enum tsens_ver tsens_version(struct tsens_priv *priv)
373 {
374 	return priv->feat->ver_major;
375 }
376 
377 static void tsens_set_interrupt_v1(struct tsens_priv *priv, u32 hw_id,
378 				   enum tsens_irq_type irq_type, bool enable)
379 {
380 	u32 index = 0;
381 
382 	switch (irq_type) {
383 	case UPPER:
384 		index = UP_INT_CLEAR_0 + hw_id;
385 		break;
386 	case LOWER:
387 		index = LOW_INT_CLEAR_0 + hw_id;
388 		break;
389 	case CRITICAL:
390 		/* No critical interrupts before v2 */
391 		return;
392 	}
393 	regmap_field_write(priv->rf[index], enable ? 0 : 1);
394 }
395 
396 static void tsens_set_interrupt_v2(struct tsens_priv *priv, u32 hw_id,
397 				   enum tsens_irq_type irq_type, bool enable)
398 {
399 	u32 index_mask = 0, index_clear = 0;
400 
401 	/*
402 	 * To enable the interrupt flag for a sensor:
403 	 *    - clear the mask bit
404 	 * To disable the interrupt flag for a sensor:
405 	 *    - Mask further interrupts for this sensor
406 	 *    - Write 1 followed by 0 to clear the interrupt
407 	 */
408 	switch (irq_type) {
409 	case UPPER:
410 		index_mask  = UP_INT_MASK_0 + hw_id;
411 		index_clear = UP_INT_CLEAR_0 + hw_id;
412 		break;
413 	case LOWER:
414 		index_mask  = LOW_INT_MASK_0 + hw_id;
415 		index_clear = LOW_INT_CLEAR_0 + hw_id;
416 		break;
417 	case CRITICAL:
418 		index_mask  = CRIT_INT_MASK_0 + hw_id;
419 		index_clear = CRIT_INT_CLEAR_0 + hw_id;
420 		break;
421 	}
422 
423 	if (enable) {
424 		regmap_field_write(priv->rf[index_mask], 0);
425 	} else {
426 		regmap_field_write(priv->rf[index_mask],  1);
427 		regmap_field_write(priv->rf[index_clear], 1);
428 		regmap_field_write(priv->rf[index_clear], 0);
429 	}
430 }
431 
432 /**
433  * tsens_set_interrupt - Set state of an interrupt
434  * @priv: Pointer to tsens controller private data
435  * @hw_id: Hardware ID aka. sensor number
436  * @irq_type: irq_type from enum tsens_irq_type
437  * @enable: false = disable, true = enable
438  *
439  * Call IP-specific function to set state of an interrupt
440  *
441  * Return: void
442  */
443 static void tsens_set_interrupt(struct tsens_priv *priv, u32 hw_id,
444 				enum tsens_irq_type irq_type, bool enable)
445 {
446 	dev_dbg(priv->dev, "[%u] %s: %s -> %s\n", hw_id, __func__,
447 		irq_type ? ((irq_type == 1) ? "UP" : "CRITICAL") : "LOW",
448 		enable ? "en" : "dis");
449 	if (tsens_version(priv) > VER_1_X)
450 		tsens_set_interrupt_v2(priv, hw_id, irq_type, enable);
451 	else
452 		tsens_set_interrupt_v1(priv, hw_id, irq_type, enable);
453 }
454 
455 /**
456  * tsens_threshold_violated - Check if a sensor temperature violated a preset threshold
457  * @priv: Pointer to tsens controller private data
458  * @hw_id: Hardware ID aka. sensor number
459  * @d: Pointer to irq state data
460  *
461  * Return: 0 if threshold was not violated, 1 if it was violated and negative
462  * errno in case of errors
463  */
464 static int tsens_threshold_violated(struct tsens_priv *priv, u32 hw_id,
465 				    struct tsens_irq_data *d)
466 {
467 	int ret;
468 
469 	ret = regmap_field_read(priv->rf[UPPER_STATUS_0 + hw_id], &d->up_viol);
470 	if (ret)
471 		return ret;
472 	ret = regmap_field_read(priv->rf[LOWER_STATUS_0 + hw_id], &d->low_viol);
473 	if (ret)
474 		return ret;
475 
476 	if (priv->feat->crit_int) {
477 		ret = regmap_field_read(priv->rf[CRITICAL_STATUS_0 + hw_id],
478 					&d->crit_viol);
479 		if (ret)
480 			return ret;
481 	}
482 
483 	if (d->up_viol || d->low_viol || d->crit_viol)
484 		return 1;
485 
486 	return 0;
487 }
488 
489 static int tsens_read_irq_state(struct tsens_priv *priv, u32 hw_id,
490 				const struct tsens_sensor *s,
491 				struct tsens_irq_data *d)
492 {
493 	int ret;
494 
495 	ret = regmap_field_read(priv->rf[UP_INT_CLEAR_0 + hw_id], &d->up_irq_clear);
496 	if (ret)
497 		return ret;
498 	ret = regmap_field_read(priv->rf[LOW_INT_CLEAR_0 + hw_id], &d->low_irq_clear);
499 	if (ret)
500 		return ret;
501 	if (tsens_version(priv) > VER_1_X) {
502 		ret = regmap_field_read(priv->rf[UP_INT_MASK_0 + hw_id], &d->up_irq_mask);
503 		if (ret)
504 			return ret;
505 		ret = regmap_field_read(priv->rf[LOW_INT_MASK_0 + hw_id], &d->low_irq_mask);
506 		if (ret)
507 			return ret;
508 		ret = regmap_field_read(priv->rf[CRIT_INT_CLEAR_0 + hw_id],
509 					&d->crit_irq_clear);
510 		if (ret)
511 			return ret;
512 		ret = regmap_field_read(priv->rf[CRIT_INT_MASK_0 + hw_id],
513 					&d->crit_irq_mask);
514 		if (ret)
515 			return ret;
516 
517 		d->crit_thresh = tsens_hw_to_mC(s, CRIT_THRESH_0 + hw_id);
518 	} else {
519 		/* No mask register on older TSENS */
520 		d->up_irq_mask = 0;
521 		d->low_irq_mask = 0;
522 		d->crit_irq_clear = 0;
523 		d->crit_irq_mask = 0;
524 		d->crit_thresh = 0;
525 	}
526 
527 	d->up_thresh  = tsens_hw_to_mC(s, UP_THRESH_0 + hw_id);
528 	d->low_thresh = tsens_hw_to_mC(s, LOW_THRESH_0 + hw_id);
529 
530 	dev_dbg(priv->dev, "[%u] %s%s: status(%u|%u|%u) | clr(%u|%u|%u) | mask(%u|%u|%u)\n",
531 		hw_id, __func__,
532 		(d->up_viol || d->low_viol || d->crit_viol) ? "(V)" : "",
533 		d->low_viol, d->up_viol, d->crit_viol,
534 		d->low_irq_clear, d->up_irq_clear, d->crit_irq_clear,
535 		d->low_irq_mask, d->up_irq_mask, d->crit_irq_mask);
536 	dev_dbg(priv->dev, "[%u] %s%s: thresh: (%d:%d:%d)\n", hw_id, __func__,
537 		(d->up_viol || d->low_viol || d->crit_viol) ? "(V)" : "",
538 		d->low_thresh, d->up_thresh, d->crit_thresh);
539 
540 	return 0;
541 }
542 
543 static inline u32 masked_irq(u32 hw_id, u32 mask, enum tsens_ver ver)
544 {
545 	if (ver > VER_1_X)
546 		return mask & (1 << hw_id);
547 
548 	/* v1, v0.1 don't have a irq mask register */
549 	return 0;
550 }
551 
552 /**
553  * tsens_critical_irq_thread() - Threaded handler for critical interrupts
554  * @irq: irq number
555  * @data: tsens controller private data
556  *
557  * Check FSM watchdog bark status and clear if needed.
558  * Check all sensors to find ones that violated their critical threshold limits.
559  * Clear and then re-enable the interrupt.
560  *
561  * The level-triggered interrupt might deassert if the temperature returned to
562  * within the threshold limits by the time the handler got scheduled. We
563  * consider the irq to have been handled in that case.
564  *
565  * Return: IRQ_HANDLED
566  */
567 static irqreturn_t tsens_critical_irq_thread(int irq, void *data)
568 {
569 	struct tsens_priv *priv = data;
570 	struct tsens_irq_data d;
571 	int temp, ret, i;
572 	u32 wdog_status, wdog_count;
573 
574 	if (priv->feat->has_watchdog) {
575 		ret = regmap_field_read(priv->rf[WDOG_BARK_STATUS],
576 					&wdog_status);
577 		if (ret)
578 			return ret;
579 
580 		if (wdog_status) {
581 			/* Clear WDOG interrupt */
582 			regmap_field_write(priv->rf[WDOG_BARK_CLEAR], 1);
583 			regmap_field_write(priv->rf[WDOG_BARK_CLEAR], 0);
584 			ret = regmap_field_read(priv->rf[WDOG_BARK_COUNT],
585 						&wdog_count);
586 			if (ret)
587 				return ret;
588 			if (wdog_count)
589 				dev_dbg(priv->dev, "%s: watchdog count: %d\n",
590 					__func__, wdog_count);
591 
592 			/* Fall through to handle critical interrupts if any */
593 		}
594 	}
595 
596 	for (i = 0; i < priv->num_sensors; i++) {
597 		const struct tsens_sensor *s = &priv->sensor[i];
598 		u32 hw_id = s->hw_id;
599 
600 		if (!s->tzd)
601 			continue;
602 		if (!tsens_threshold_violated(priv, hw_id, &d))
603 			continue;
604 		ret = get_temp_tsens_valid(s, &temp);
605 		if (ret) {
606 			dev_err(priv->dev, "[%u] %s: error reading sensor\n",
607 				hw_id, __func__);
608 			continue;
609 		}
610 
611 		tsens_read_irq_state(priv, hw_id, s, &d);
612 		if (d.crit_viol &&
613 		    !masked_irq(hw_id, d.crit_irq_mask, tsens_version(priv))) {
614 			/* Mask critical interrupts, unused on Linux */
615 			tsens_set_interrupt(priv, hw_id, CRITICAL, false);
616 		}
617 	}
618 
619 	return IRQ_HANDLED;
620 }
621 
622 /**
623  * tsens_irq_thread - Threaded interrupt handler for uplow interrupts
624  * @irq: irq number
625  * @data: tsens controller private data
626  *
627  * Check all sensors to find ones that violated their threshold limits. If the
628  * temperature is still outside the limits, call thermal_zone_device_update() to
629  * update the thresholds, else re-enable the interrupts.
630  *
631  * The level-triggered interrupt might deassert if the temperature returned to
632  * within the threshold limits by the time the handler got scheduled. We
633  * consider the irq to have been handled in that case.
634  *
635  * Return: IRQ_HANDLED
636  */
637 static irqreturn_t tsens_irq_thread(int irq, void *data)
638 {
639 	struct tsens_priv *priv = data;
640 	struct tsens_irq_data d;
641 	int i;
642 
643 	for (i = 0; i < priv->num_sensors; i++) {
644 		const struct tsens_sensor *s = &priv->sensor[i];
645 		u32 hw_id = s->hw_id;
646 
647 		if (!s->tzd)
648 			continue;
649 		if (!tsens_threshold_violated(priv, hw_id, &d))
650 			continue;
651 
652 		thermal_zone_device_update(s->tzd, THERMAL_EVENT_UNSPECIFIED);
653 
654 		if (tsens_version(priv) < VER_0_1) {
655 			/* Constraint: There is only 1 interrupt control register for all
656 			 * 11 temperature sensor. So monitoring more than 1 sensor based
657 			 * on interrupts will yield inconsistent result. To overcome this
658 			 * issue we will monitor only sensor 0 which is the master sensor.
659 			 */
660 			break;
661 		}
662 	}
663 
664 	return IRQ_HANDLED;
665 }
666 
667 /**
668  * tsens_combined_irq_thread() - Threaded interrupt handler for combined interrupts
669  * @irq: irq number
670  * @data: tsens controller private data
671  *
672  * Handle the combined interrupt as if it were 2 separate interrupts, so call the
673  * critical handler first and then the up/low one.
674  *
675  * Return: IRQ_HANDLED
676  */
677 static irqreturn_t tsens_combined_irq_thread(int irq, void *data)
678 {
679 	irqreturn_t ret;
680 
681 	ret = tsens_critical_irq_thread(irq, data);
682 	if (ret != IRQ_HANDLED)
683 		return ret;
684 
685 	return tsens_irq_thread(irq, data);
686 }
687 
688 static int tsens_set_trips(struct thermal_zone_device *tz, int low, int high)
689 {
690 	struct tsens_sensor *s = thermal_zone_device_priv(tz);
691 	struct tsens_priv *priv = s->priv;
692 	struct device *dev = priv->dev;
693 	struct tsens_irq_data d;
694 	unsigned long flags;
695 	int high_val, low_val, cl_high, cl_low;
696 	u32 hw_id = s->hw_id;
697 
698 	if (tsens_version(priv) < VER_0_1) {
699 		/* Pre v0.1 IP had a single register for each type of interrupt
700 		 * and thresholds
701 		 */
702 		hw_id = 0;
703 	}
704 
705 	dev_dbg(dev, "[%u] %s: proposed thresholds: (%d:%d)\n",
706 		hw_id, __func__, low, high);
707 
708 	cl_high = clamp_val(high, priv->feat->trip_min_temp, priv->feat->trip_max_temp);
709 	cl_low  = clamp_val(low, priv->feat->trip_min_temp, priv->feat->trip_max_temp);
710 
711 	high_val = tsens_mC_to_hw(s, cl_high);
712 	low_val  = tsens_mC_to_hw(s, cl_low);
713 
714 	spin_lock_irqsave(&priv->ul_lock, flags);
715 
716 	tsens_read_irq_state(priv, hw_id, s, &d);
717 
718 	/* Write the new thresholds and clear the status */
719 	regmap_field_write(priv->rf[LOW_THRESH_0 + hw_id], low_val);
720 	regmap_field_write(priv->rf[UP_THRESH_0 + hw_id], high_val);
721 	tsens_set_interrupt(priv, hw_id, LOWER, true);
722 	tsens_set_interrupt(priv, hw_id, UPPER, true);
723 
724 	spin_unlock_irqrestore(&priv->ul_lock, flags);
725 
726 	dev_dbg(dev, "[%u] %s: (%d:%d)->(%d:%d)\n",
727 		hw_id, __func__, d.low_thresh, d.up_thresh, cl_low, cl_high);
728 
729 	return 0;
730 }
731 
732 static int tsens_enable_irq(struct tsens_priv *priv)
733 {
734 	int ret;
735 	int val = tsens_version(priv) > VER_1_X ? 7 : 1;
736 
737 	ret = regmap_field_write(priv->rf[INT_EN], val);
738 	if (ret < 0)
739 		dev_err(priv->dev, "%s: failed to enable interrupts\n",
740 			__func__);
741 
742 	return ret;
743 }
744 
745 static void tsens_disable_irq(struct tsens_priv *priv)
746 {
747 	regmap_field_write(priv->rf[INT_EN], 0);
748 }
749 
750 int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp)
751 {
752 	struct tsens_priv *priv = s->priv;
753 	int hw_id = s->hw_id;
754 	u32 temp_idx = LAST_TEMP_0 + hw_id;
755 	u32 valid_idx = VALID_0 + hw_id;
756 	u32 valid;
757 	int ret;
758 
759 	/* VER_0 doesn't have VALID bit */
760 	if (tsens_version(priv) == VER_0)
761 		goto get_temp;
762 
763 	/* Valid bit is 0 for 6 AHB clock cycles.
764 	 * At 19.2MHz, 1 AHB clock is ~60ns.
765 	 * We should enter this loop very, very rarely.
766 	 * Wait 1 us since it's the min of poll_timeout macro.
767 	 * Old value was 400 ns.
768 	 */
769 	ret = regmap_field_read_poll_timeout(priv->rf[valid_idx], valid,
770 					     valid, 1, 20 * USEC_PER_MSEC);
771 	if (ret)
772 		return ret;
773 
774 get_temp:
775 	/* Valid bit is set, OK to read the temperature */
776 	*temp = tsens_hw_to_mC(s, temp_idx);
777 
778 	return 0;
779 }
780 
781 int get_temp_common(const struct tsens_sensor *s, int *temp)
782 {
783 	struct tsens_priv *priv = s->priv;
784 	int hw_id = s->hw_id;
785 	int last_temp = 0, ret, trdy;
786 	unsigned long timeout;
787 
788 	timeout = jiffies + usecs_to_jiffies(TIMEOUT_US);
789 	do {
790 		if (tsens_version(priv) == VER_0) {
791 			ret = regmap_field_read(priv->rf[TRDY], &trdy);
792 			if (ret)
793 				return ret;
794 			if (!trdy)
795 				continue;
796 		}
797 
798 		ret = regmap_field_read(priv->rf[LAST_TEMP_0 + hw_id], &last_temp);
799 		if (ret)
800 			return ret;
801 
802 		*temp = code_to_degc(last_temp, s) * 1000;
803 
804 		return 0;
805 	} while (time_before(jiffies, timeout));
806 
807 	return -ETIMEDOUT;
808 }
809 
810 #ifdef CONFIG_DEBUG_FS
811 static int dbg_sensors_show(struct seq_file *s, void *data)
812 {
813 	struct platform_device *pdev = s->private;
814 	struct tsens_priv *priv = platform_get_drvdata(pdev);
815 	int i;
816 
817 	seq_printf(s, "max: %2d\nnum: %2d\n\n",
818 		   priv->feat->max_sensors, priv->num_sensors);
819 
820 	seq_puts(s, "      id    slope   offset\n--------------------------\n");
821 	for (i = 0;  i < priv->num_sensors; i++) {
822 		seq_printf(s, "%8d %8d %8d\n", priv->sensor[i].hw_id,
823 			   priv->sensor[i].slope, priv->sensor[i].offset);
824 	}
825 
826 	return 0;
827 }
828 
829 static int dbg_version_show(struct seq_file *s, void *data)
830 {
831 	struct platform_device *pdev = s->private;
832 	struct tsens_priv *priv = platform_get_drvdata(pdev);
833 	u32 maj_ver, min_ver, step_ver;
834 	int ret;
835 
836 	if (tsens_version(priv) > VER_0_1) {
837 		ret = regmap_field_read(priv->rf[VER_MAJOR], &maj_ver);
838 		if (ret)
839 			return ret;
840 		ret = regmap_field_read(priv->rf[VER_MINOR], &min_ver);
841 		if (ret)
842 			return ret;
843 		ret = regmap_field_read(priv->rf[VER_STEP], &step_ver);
844 		if (ret)
845 			return ret;
846 		seq_printf(s, "%d.%d.%d\n", maj_ver, min_ver, step_ver);
847 	} else {
848 		seq_printf(s, "0.%d.0\n", priv->feat->ver_major);
849 	}
850 
851 	return 0;
852 }
853 
854 DEFINE_SHOW_ATTRIBUTE(dbg_version);
855 DEFINE_SHOW_ATTRIBUTE(dbg_sensors);
856 
857 static void tsens_debug_init(struct platform_device *pdev)
858 {
859 	struct tsens_priv *priv = platform_get_drvdata(pdev);
860 
861 	priv->debug_root = debugfs_lookup("tsens", NULL);
862 	if (!priv->debug_root)
863 		priv->debug_root = debugfs_create_dir("tsens", NULL);
864 
865 	/* A directory for each instance of the TSENS IP */
866 	priv->debug = debugfs_create_dir(dev_name(&pdev->dev), priv->debug_root);
867 	debugfs_create_file("version", 0444, priv->debug, pdev, &dbg_version_fops);
868 	debugfs_create_file("sensors", 0444, priv->debug, pdev, &dbg_sensors_fops);
869 }
870 #else
871 static inline void tsens_debug_init(struct platform_device *pdev) {}
872 #endif
873 
874 static const struct regmap_config tsens_config = {
875 	.name		= "tm",
876 	.reg_bits	= 32,
877 	.val_bits	= 32,
878 	.reg_stride	= 4,
879 };
880 
881 static const struct regmap_config tsens_srot_config = {
882 	.name		= "srot",
883 	.reg_bits	= 32,
884 	.val_bits	= 32,
885 	.reg_stride	= 4,
886 };
887 
888 int __init init_common(struct tsens_priv *priv)
889 {
890 	void __iomem *tm_base, *srot_base;
891 	struct device *dev = priv->dev;
892 	u32 ver_minor;
893 	struct resource *res;
894 	u32 enabled;
895 	int ret, i, j;
896 	struct platform_device *op = of_find_device_by_node(priv->dev->of_node);
897 
898 	if (!op)
899 		return -EINVAL;
900 
901 	if (op->num_resources > 1) {
902 		/* DT with separate SROT and TM address space */
903 		priv->tm_offset = 0;
904 		res = platform_get_resource(op, IORESOURCE_MEM, 1);
905 		srot_base = devm_ioremap_resource(dev, res);
906 		if (IS_ERR(srot_base)) {
907 			ret = PTR_ERR(srot_base);
908 			goto err_put_device;
909 		}
910 
911 		priv->srot_map = devm_regmap_init_mmio(dev, srot_base,
912 						       &tsens_srot_config);
913 		if (IS_ERR(priv->srot_map)) {
914 			ret = PTR_ERR(priv->srot_map);
915 			goto err_put_device;
916 		}
917 	} else {
918 		/* old DTs where SROT and TM were in a contiguous 2K block */
919 		priv->tm_offset = 0x1000;
920 	}
921 
922 	if (tsens_version(priv) >= VER_0_1) {
923 		res = platform_get_resource(op, IORESOURCE_MEM, 0);
924 		tm_base = devm_ioremap_resource(dev, res);
925 		if (IS_ERR(tm_base)) {
926 			ret = PTR_ERR(tm_base);
927 			goto err_put_device;
928 		}
929 
930 		priv->tm_map = devm_regmap_init_mmio(dev, tm_base, &tsens_config);
931 	} else { /* VER_0 share the same gcc regs using a syscon */
932 		struct device *parent = priv->dev->parent;
933 
934 		if (parent)
935 			priv->tm_map = syscon_node_to_regmap(parent->of_node);
936 	}
937 
938 	if (IS_ERR_OR_NULL(priv->tm_map)) {
939 		if (!priv->tm_map)
940 			ret = -ENODEV;
941 		else
942 			ret = PTR_ERR(priv->tm_map);
943 		goto err_put_device;
944 	}
945 
946 	/* VER_0 have only tm_map */
947 	if (!priv->srot_map)
948 		priv->srot_map = priv->tm_map;
949 
950 	if (tsens_version(priv) > VER_0_1) {
951 		for (i = VER_MAJOR; i <= VER_STEP; i++) {
952 			priv->rf[i] = devm_regmap_field_alloc(dev, priv->srot_map,
953 							      priv->fields[i]);
954 			if (IS_ERR(priv->rf[i])) {
955 				ret = PTR_ERR(priv->rf[i]);
956 				goto err_put_device;
957 			}
958 		}
959 		ret = regmap_field_read(priv->rf[VER_MINOR], &ver_minor);
960 		if (ret)
961 			goto err_put_device;
962 	}
963 
964 	priv->rf[TSENS_EN] = devm_regmap_field_alloc(dev, priv->srot_map,
965 						     priv->fields[TSENS_EN]);
966 	if (IS_ERR(priv->rf[TSENS_EN])) {
967 		ret = PTR_ERR(priv->rf[TSENS_EN]);
968 		goto err_put_device;
969 	}
970 	/* in VER_0 TSENS need to be explicitly enabled */
971 	if (tsens_version(priv) == VER_0)
972 		regmap_field_write(priv->rf[TSENS_EN], 1);
973 
974 	ret = regmap_field_read(priv->rf[TSENS_EN], &enabled);
975 	if (ret)
976 		goto err_put_device;
977 	if (!enabled) {
978 		dev_err(dev, "%s: device not enabled\n", __func__);
979 		ret = -ENODEV;
980 		goto err_put_device;
981 	}
982 
983 	priv->rf[SENSOR_EN] = devm_regmap_field_alloc(dev, priv->srot_map,
984 						      priv->fields[SENSOR_EN]);
985 	if (IS_ERR(priv->rf[SENSOR_EN])) {
986 		ret = PTR_ERR(priv->rf[SENSOR_EN]);
987 		goto err_put_device;
988 	}
989 	priv->rf[INT_EN] = devm_regmap_field_alloc(dev, priv->tm_map,
990 						   priv->fields[INT_EN]);
991 	if (IS_ERR(priv->rf[INT_EN])) {
992 		ret = PTR_ERR(priv->rf[INT_EN]);
993 		goto err_put_device;
994 	}
995 
996 	priv->rf[TSENS_SW_RST] =
997 		devm_regmap_field_alloc(dev, priv->srot_map, priv->fields[TSENS_SW_RST]);
998 	if (IS_ERR(priv->rf[TSENS_SW_RST])) {
999 		ret = PTR_ERR(priv->rf[TSENS_SW_RST]);
1000 		goto err_put_device;
1001 	}
1002 
1003 	priv->rf[TRDY] = devm_regmap_field_alloc(dev, priv->tm_map, priv->fields[TRDY]);
1004 	if (IS_ERR(priv->rf[TRDY])) {
1005 		ret = PTR_ERR(priv->rf[TRDY]);
1006 		goto err_put_device;
1007 	}
1008 
1009 	/* This loop might need changes if enum regfield_ids is reordered */
1010 	for (j = LAST_TEMP_0; j <= UP_THRESH_15; j += 16) {
1011 		for (i = 0; i < priv->feat->max_sensors; i++) {
1012 			int idx = j + i;
1013 
1014 			priv->rf[idx] = devm_regmap_field_alloc(dev,
1015 								priv->tm_map,
1016 								priv->fields[idx]);
1017 			if (IS_ERR(priv->rf[idx])) {
1018 				ret = PTR_ERR(priv->rf[idx]);
1019 				goto err_put_device;
1020 			}
1021 		}
1022 	}
1023 
1024 	if (priv->feat->crit_int || tsens_version(priv) < VER_0_1) {
1025 		/* Loop might need changes if enum regfield_ids is reordered */
1026 		for (j = CRITICAL_STATUS_0; j <= CRIT_THRESH_15; j += 16) {
1027 			for (i = 0; i < priv->feat->max_sensors; i++) {
1028 				int idx = j + i;
1029 
1030 				priv->rf[idx] =
1031 					devm_regmap_field_alloc(dev,
1032 								priv->tm_map,
1033 								priv->fields[idx]);
1034 				if (IS_ERR(priv->rf[idx])) {
1035 					ret = PTR_ERR(priv->rf[idx]);
1036 					goto err_put_device;
1037 				}
1038 			}
1039 		}
1040 	}
1041 
1042 	if (tsens_version(priv) > VER_1_X &&  ver_minor > 2) {
1043 		/* Watchdog is present only on v2.3+ */
1044 		priv->feat->has_watchdog = 1;
1045 		for (i = WDOG_BARK_STATUS; i <= CC_MON_MASK; i++) {
1046 			priv->rf[i] = devm_regmap_field_alloc(dev, priv->tm_map,
1047 							      priv->fields[i]);
1048 			if (IS_ERR(priv->rf[i])) {
1049 				ret = PTR_ERR(priv->rf[i]);
1050 				goto err_put_device;
1051 			}
1052 		}
1053 		/*
1054 		 * Watchdog is already enabled, unmask the bark.
1055 		 * Disable cycle completion monitoring
1056 		 */
1057 		regmap_field_write(priv->rf[WDOG_BARK_MASK], 0);
1058 		regmap_field_write(priv->rf[CC_MON_MASK], 1);
1059 	}
1060 
1061 	spin_lock_init(&priv->ul_lock);
1062 
1063 	/* VER_0 interrupt doesn't need to be enabled */
1064 	if (tsens_version(priv) >= VER_0_1)
1065 		tsens_enable_irq(priv);
1066 
1067 err_put_device:
1068 	put_device(&op->dev);
1069 	return ret;
1070 }
1071 
1072 static int tsens_get_temp(struct thermal_zone_device *tz, int *temp)
1073 {
1074 	struct tsens_sensor *s = thermal_zone_device_priv(tz);
1075 	struct tsens_priv *priv = s->priv;
1076 
1077 	return priv->ops->get_temp(s, temp);
1078 }
1079 
1080 static int  __maybe_unused tsens_suspend(struct device *dev)
1081 {
1082 	struct tsens_priv *priv = dev_get_drvdata(dev);
1083 
1084 	if (priv->ops && priv->ops->suspend)
1085 		return priv->ops->suspend(priv);
1086 
1087 	return 0;
1088 }
1089 
1090 static int __maybe_unused tsens_resume(struct device *dev)
1091 {
1092 	struct tsens_priv *priv = dev_get_drvdata(dev);
1093 
1094 	if (priv->ops && priv->ops->resume)
1095 		return priv->ops->resume(priv);
1096 
1097 	return 0;
1098 }
1099 
1100 static SIMPLE_DEV_PM_OPS(tsens_pm_ops, tsens_suspend, tsens_resume);
1101 
1102 static const struct of_device_id tsens_table[] = {
1103 	{
1104 		.compatible = "qcom,ipq8064-tsens",
1105 		.data = &data_8960,
1106 	}, {
1107 		.compatible = "qcom,ipq8074-tsens",
1108 		.data = &data_ipq8074,
1109 	}, {
1110 		.compatible = "qcom,mdm9607-tsens",
1111 		.data = &data_9607,
1112 	}, {
1113 		.compatible = "qcom,msm8226-tsens",
1114 		.data = &data_8226,
1115 	}, {
1116 		.compatible = "qcom,msm8909-tsens",
1117 		.data = &data_8909,
1118 	}, {
1119 		.compatible = "qcom,msm8916-tsens",
1120 		.data = &data_8916,
1121 	}, {
1122 		.compatible = "qcom,msm8937-tsens",
1123 		.data = &data_8937,
1124 	}, {
1125 		.compatible = "qcom,msm8939-tsens",
1126 		.data = &data_8939,
1127 	}, {
1128 		.compatible = "qcom,msm8956-tsens",
1129 		.data = &data_8956,
1130 	}, {
1131 		.compatible = "qcom,msm8960-tsens",
1132 		.data = &data_8960,
1133 	}, {
1134 		.compatible = "qcom,msm8974-tsens",
1135 		.data = &data_8974,
1136 	}, {
1137 		.compatible = "qcom,msm8976-tsens",
1138 		.data = &data_8976,
1139 	}, {
1140 		.compatible = "qcom,msm8996-tsens",
1141 		.data = &data_8996,
1142 	}, {
1143 		.compatible = "qcom,tsens-v1",
1144 		.data = &data_tsens_v1,
1145 	}, {
1146 		.compatible = "qcom,tsens-v2",
1147 		.data = &data_tsens_v2,
1148 	},
1149 	{}
1150 };
1151 MODULE_DEVICE_TABLE(of, tsens_table);
1152 
1153 static const struct thermal_zone_device_ops tsens_of_ops = {
1154 	.get_temp = tsens_get_temp,
1155 	.set_trips = tsens_set_trips,
1156 };
1157 
1158 static int tsens_register_irq(struct tsens_priv *priv, char *irqname,
1159 			      irq_handler_t thread_fn)
1160 {
1161 	struct platform_device *pdev;
1162 	int ret, irq;
1163 
1164 	pdev = of_find_device_by_node(priv->dev->of_node);
1165 	if (!pdev)
1166 		return -ENODEV;
1167 
1168 	irq = platform_get_irq_byname(pdev, irqname);
1169 	if (irq < 0) {
1170 		ret = irq;
1171 		/* For old DTs with no IRQ defined */
1172 		if (irq == -ENXIO)
1173 			ret = 0;
1174 	} else {
1175 		/* VER_0 interrupt is TRIGGER_RISING, VER_0_1 and up is ONESHOT */
1176 		if (tsens_version(priv) == VER_0)
1177 			ret = devm_request_threaded_irq(&pdev->dev, irq,
1178 							thread_fn, NULL,
1179 							IRQF_TRIGGER_RISING,
1180 							dev_name(&pdev->dev),
1181 							priv);
1182 		else
1183 			ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
1184 							thread_fn, IRQF_ONESHOT,
1185 							dev_name(&pdev->dev),
1186 							priv);
1187 
1188 		if (ret)
1189 			dev_err(&pdev->dev, "%s: failed to get irq\n",
1190 				__func__);
1191 		else
1192 			enable_irq_wake(irq);
1193 	}
1194 
1195 	put_device(&pdev->dev);
1196 	return ret;
1197 }
1198 
1199 static int tsens_register(struct tsens_priv *priv)
1200 {
1201 	int i, ret;
1202 	struct thermal_zone_device *tzd;
1203 
1204 	for (i = 0;  i < priv->num_sensors; i++) {
1205 		priv->sensor[i].priv = priv;
1206 		tzd = devm_thermal_of_zone_register(priv->dev, priv->sensor[i].hw_id,
1207 						    &priv->sensor[i],
1208 						    &tsens_of_ops);
1209 		if (IS_ERR(tzd))
1210 			continue;
1211 		priv->sensor[i].tzd = tzd;
1212 		if (priv->ops->enable)
1213 			priv->ops->enable(priv, i);
1214 
1215 		devm_thermal_add_hwmon_sysfs(priv->dev, tzd);
1216 	}
1217 
1218 	/* VER_0 require to set MIN and MAX THRESH
1219 	 * These 2 regs are set using the:
1220 	 * - CRIT_THRESH_0 for MAX THRESH hardcoded to 120°C
1221 	 * - CRIT_THRESH_1 for MIN THRESH hardcoded to   0°C
1222 	 */
1223 	if (tsens_version(priv) < VER_0_1) {
1224 		regmap_field_write(priv->rf[CRIT_THRESH_0],
1225 				   tsens_mC_to_hw(priv->sensor, 120000));
1226 
1227 		regmap_field_write(priv->rf[CRIT_THRESH_1],
1228 				   tsens_mC_to_hw(priv->sensor, 0));
1229 	}
1230 
1231 	if (priv->feat->combo_int) {
1232 		ret = tsens_register_irq(priv, "combined",
1233 					 tsens_combined_irq_thread);
1234 	} else {
1235 		ret = tsens_register_irq(priv, "uplow", tsens_irq_thread);
1236 		if (ret < 0)
1237 			return ret;
1238 
1239 		if (priv->feat->crit_int)
1240 			ret = tsens_register_irq(priv, "critical",
1241 						 tsens_critical_irq_thread);
1242 	}
1243 
1244 	return ret;
1245 }
1246 
1247 static int tsens_probe(struct platform_device *pdev)
1248 {
1249 	int ret, i;
1250 	struct device *dev;
1251 	struct device_node *np;
1252 	struct tsens_priv *priv;
1253 	const struct tsens_plat_data *data;
1254 	const struct of_device_id *id;
1255 	u32 num_sensors;
1256 
1257 	if (pdev->dev.of_node)
1258 		dev = &pdev->dev;
1259 	else
1260 		dev = pdev->dev.parent;
1261 
1262 	np = dev->of_node;
1263 
1264 	id = of_match_node(tsens_table, np);
1265 	if (id)
1266 		data = id->data;
1267 	else
1268 		data = &data_8960;
1269 
1270 	num_sensors = data->num_sensors;
1271 
1272 	if (np)
1273 		of_property_read_u32(np, "#qcom,sensors", &num_sensors);
1274 
1275 	if (num_sensors <= 0) {
1276 		dev_err(dev, "%s: invalid number of sensors\n", __func__);
1277 		return -EINVAL;
1278 	}
1279 
1280 	priv = devm_kzalloc(dev,
1281 			     struct_size(priv, sensor, num_sensors),
1282 			     GFP_KERNEL);
1283 	if (!priv)
1284 		return -ENOMEM;
1285 
1286 	priv->dev = dev;
1287 	priv->num_sensors = num_sensors;
1288 	priv->ops = data->ops;
1289 	for (i = 0;  i < priv->num_sensors; i++) {
1290 		if (data->hw_ids)
1291 			priv->sensor[i].hw_id = data->hw_ids[i];
1292 		else
1293 			priv->sensor[i].hw_id = i;
1294 	}
1295 	priv->feat = data->feat;
1296 	priv->fields = data->fields;
1297 
1298 	platform_set_drvdata(pdev, priv);
1299 
1300 	if (!priv->ops || !priv->ops->init || !priv->ops->get_temp)
1301 		return -EINVAL;
1302 
1303 	ret = priv->ops->init(priv);
1304 	if (ret < 0) {
1305 		dev_err(dev, "%s: init failed\n", __func__);
1306 		return ret;
1307 	}
1308 
1309 	if (priv->ops->calibrate) {
1310 		ret = priv->ops->calibrate(priv);
1311 		if (ret < 0) {
1312 			if (ret != -EPROBE_DEFER)
1313 				dev_err(dev, "%s: calibration failed\n", __func__);
1314 			return ret;
1315 		}
1316 	}
1317 
1318 	ret = tsens_register(priv);
1319 	if (!ret)
1320 		tsens_debug_init(pdev);
1321 
1322 	return ret;
1323 }
1324 
1325 static int tsens_remove(struct platform_device *pdev)
1326 {
1327 	struct tsens_priv *priv = platform_get_drvdata(pdev);
1328 
1329 	debugfs_remove_recursive(priv->debug_root);
1330 	tsens_disable_irq(priv);
1331 	if (priv->ops->disable)
1332 		priv->ops->disable(priv);
1333 
1334 	return 0;
1335 }
1336 
1337 static struct platform_driver tsens_driver = {
1338 	.probe = tsens_probe,
1339 	.remove = tsens_remove,
1340 	.driver = {
1341 		.name = "qcom-tsens",
1342 		.pm	= &tsens_pm_ops,
1343 		.of_match_table = tsens_table,
1344 	},
1345 };
1346 module_platform_driver(tsens_driver);
1347 
1348 MODULE_LICENSE("GPL v2");
1349 MODULE_DESCRIPTION("QCOM Temperature Sensor driver");
1350 MODULE_ALIAS("platform:qcom-tsens");
1351