thermal: imx: fix calculation

Fix calculation. do_div can not handle negative values.
Use div_s64_rem to handle the calculation.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
This commit is contained in:
Peng Fan 2017-04-18 20:41:53 +08:00 committed by Stefano Babic
parent 4fac417168
commit 80512547ba

View file

@ -16,6 +16,7 @@
#include <dm.h> #include <dm.h>
#include <errno.h> #include <errno.h>
#include <malloc.h> #include <malloc.h>
#include <linux/math64.h>
#include <thermal.h> #include <thermal.h>
#include <imx_thermal.h> #include <imx_thermal.h>
@ -55,8 +56,9 @@ static int read_cpu_temperature(struct udevice *dev)
struct thermal_data *priv = dev_get_priv(dev); struct thermal_data *priv = dev_get_priv(dev);
u32 fuse = priv->fuse; u32 fuse = priv->fuse;
int t1, n1; int t1, n1;
u64 c1, c2; s64 c1, c2;
u64 temp64; s64 temp64;
s32 rem;
/* /*
* Sensor data layout: * Sensor data layout:
@ -88,7 +90,7 @@ static int read_cpu_temperature(struct udevice *dev)
*/ */
temp64 = FACTOR0; temp64 = FACTOR0;
temp64 *= 1000000; temp64 *= 1000000;
do_div(temp64, FACTOR1 * n1 - FACTOR2); temp64 = div_s64_rem(temp64, FACTOR1 * n1 - FACTOR2, &rem);
c1 = temp64; c1 = temp64;
c2 = n1 * c1 + 1000000 * t1; c2 = n1 * c1 + 1000000 * t1;
@ -123,7 +125,7 @@ static int read_cpu_temperature(struct udevice *dev)
writel(TEMPSENSE0_FINISHED, &anatop->tempsense0_clr); writel(TEMPSENSE0_FINISHED, &anatop->tempsense0_clr);
/* Tmeas = (c2 - Nmeas * c1 + OFFSET) / 1000000 */ /* Tmeas = (c2 - Nmeas * c1 + OFFSET) / 1000000 */
temperature = lldiv(c2 - n_meas * c1 + OFFSET, 1000000); temperature = div_s64_rem(c2 - n_meas * c1 + OFFSET, 1000000, &rem);
/* power down anatop thermal sensor */ /* power down anatop thermal sensor */
writel(TEMPSENSE0_POWER_DOWN, &anatop->tempsense0_set); writel(TEMPSENSE0_POWER_DOWN, &anatop->tempsense0_set);