efc5be2ecf
Rework tsens driver. Since in the new kernel 5.4 init common do more than it should, inizialize the kernel memory directly in the driver and drop use of this function. Rework all the patch with the new variable names. Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
108 lines
2.9 KiB
Diff
108 lines
2.9 KiB
Diff
--- 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, ®);
|
|
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)
|