hwmon: (ntc_thermistor) Use library interpolation
authorLinus Walleij <linus.walleij@linaro.org>
Sun, 4 Jul 2021 22:20:14 +0000 (00:20 +0200)
committerGuenter Roeck <linux@roeck-us.net>
Tue, 17 Aug 2021 21:54:25 +0000 (14:54 -0700)
The kernel has a helper function for linear interpolation so
use it. It incidentally makes the code easier to read as well.

Tested on the ST-Ericsson HREFv60plus hardware reference design
with two thermistors forming a thermal zone.

Cc: Peter Rosin <peda@axentia.se>
Cc: Chris Lesiak <chris.lesiak@licor.com>
Cc: linux-iio@vger.kernel.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20210704222014.12058-1-linus.walleij@linaro.org
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/ntc_thermistor.c

index 18fd6f12ca1624cc78b0a075e2f11470a31ed55a..cf26c44f2b880f0b1b6e46bbcc14cc708276d36d 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/err.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
+#include <linux/fixp-arith.h>
 
 #include <linux/platform_data/ntc_thermistor.h>
 
@@ -549,15 +550,16 @@ static int get_temp_mc(struct ntc_data *data, unsigned int ohm)
        int temp;
 
        lookup_comp(data, ohm, &low, &high);
-       if (low == high) {
-               /* Unable to use linear approximation */
-               temp = data->comp[low].temp_c * 1000;
-       } else {
-               temp = data->comp[low].temp_c * 1000 +
-                       ((data->comp[high].temp_c - data->comp[low].temp_c) *
-                        1000 * ((int)ohm - (int)data->comp[low].ohm)) /
-                       ((int)data->comp[high].ohm - (int)data->comp[low].ohm);
-       }
+       /*
+        * First multiplying the table temperatures with 1000 to get to
+        * millicentigrades (which is what we want) and then interpolating
+        * will give the best precision.
+        */
+       temp = fixp_linear_interpolate(data->comp[low].ohm,
+                                      data->comp[low].temp_c * 1000,
+                                      data->comp[high].ohm,
+                                      data->comp[high].temp_c * 1000,
+                                      ohm);
        return temp;
 }