hwmon: (ntc_thermistor) Use library interpolation
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>
This commit is contained in:
parent
02c9dce4df
commit
bd56c1e960
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user