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