aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq806x/patches-5.4/0063-4-ip806x-tsense-rework-driver.patch
blob: 67fc8db7a376443296a6787a7d77453a11e5e327 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
--- a/drivers/thermal/qcom/tsens-ipq8064.c
+++ b/drivers/thermal/qcom/tsens-ipq8064.c
@@ -13,10 +13,12 @@
  */
 
 #include <linux/platform_device.h>
+#include <linux/err.h>
 #include <linux/delay.h>
 #include <linux/bitops.h>
 #include <linux/regmap.h>
 #include <linux/thermal.h>
+#include <linux/slab.h>
 #include <linux/nvmem-consumer.h>
 #include <linux/of_platform.h>
 #include <linux/io.h>
@@ -211,9 +213,8 @@ static void tsens_scheduler_fn(struct wo
 	struct tsens_priv *priv = container_of(work, struct tsens_priv,
 					tsens_work);
 	unsigned int threshold, threshold_low, code, reg, sensor, mask;
-	unsigned int sensor_addr;
 	bool upper_th_x, lower_th_x;
-	int adc_code, ret;
+	int ret;
 
 	ret = regmap_read(priv->tm_map, STATUS_CNTL_8064, &reg);
 	if (ret)
@@ -262,9 +263,8 @@ static void tsens_scheduler_fn(struct wo
 		if (upper_th_x || lower_th_x) {
 			/* Notify user space */
 			schedule_work(&priv->sensor[0].notify_work);
-			regmap_read(priv->tm_map, sensor_addr, &adc_code);
 			pr_debug("Trigger (%d degrees) for sensor %d\n",
-				code_to_degC(adc_code, &priv->sensor[0]), 0);
+				code_to_degC(code, &priv->sensor[0]), 0);
 		}
 	}
 	regmap_write(priv->tm_map, STATUS_CNTL_8064, reg & mask);
@@ -404,40 +404,55 @@ err_put_device:
 static int calibrate_ipq8064(struct tsens_priv *priv)
 {
 	int i;
-	char *data, *data_backup;
-
+	int ret = 0;
+	u8 *data, *data_backup;
+	struct device *dev = priv->dev;
 	ssize_t num_read = priv->num_sensors;
 	struct tsens_sensor *s = priv->sensor;
 
-	data = qfprom_read(priv->dev, "calib");
+	data = qfprom_read(dev, "calib");
 	if (IS_ERR(data)) {
-		pr_err("Calibration not found.\n");
-		return PTR_ERR(data);
+		ret = PTR_ERR(data);
+		if (ret != -EPROBE_DEFER)
+			dev_err(dev, "Calibration not found.");
+		goto exit;
 	}
 
-	data_backup = qfprom_read(priv->dev, "calib_backup");
+	data_backup = qfprom_read(dev, "calib_backup");
 	if (IS_ERR(data_backup)) {
-		pr_err("Backup calibration not found.\n");
-		return PTR_ERR(data_backup);
+		ret = PTR_ERR(data_backup);
+		if (ret != -EPROBE_DEFER)
+			dev_err(dev, "Backup Calibration not found.");
+		goto free_data;
 	}
 
 	for (i = 0; i < num_read; i++) {
 		s[i].calib_data = readb_relaxed(data + i);
-		s[i].calib_data_backup = readb_relaxed(data_backup + i);
+		
+		if (!s[i].calib_data) {
+			s[i].calib_data_backup = readb_relaxed(data_backup + i);
+
+			if (!s[i].calib_data_backup) {
+				dev_err(dev, "QFPROM TSENS calibration data not present");
+				ret = -ENODEV;
+				goto free_backup;
+			}
 
-		if (s[i].calib_data_backup)
 			s[i].calib_data = s[i].calib_data_backup;
-		if (!s[i].calib_data) {
-			pr_err("QFPROM TSENS calibration data not present\n");
-			return -ENODEV;
 		}
+
 		s[i].slope = tsens_8064_slope[i];
 		s[i].offset = CAL_MDEGC - (s[i].calib_data * s[i].slope);
 	}
 
 	hw_init(priv);
 
-	return 0;
+free_backup:
+	kfree(data_backup);
+free_data:
+	kfree(data);
+exit:
+	return ret;
 }
 
 static int get_temp_ipq8064(struct tsens_priv *priv, int id, int *temp)