From d51832bad3f7a8bc62fc32d9b782ae42401125f3 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Fri, 30 Apr 2004 17:37:09 +0000 Subject: [PATCH] Simplify temperature conversions. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2496 7894878c-1315-0410-8ee3-d5d059ff63e0 --- kernel/chips/via686a.c | 43 ++++++++++++++---------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/kernel/chips/via686a.c b/kernel/chips/via686a.c index 5b983470..94082865 100644 --- a/kernel/chips/via686a.c +++ b/kernel/chips/via686a.c @@ -269,21 +269,17 @@ static const u8 viaLUT[] = 239, 240 }; -/* Converting temps to (8-bit) hyst and over registers */ -// No interpolation here. Just check the limits and go. -// The +5 effectively rounds off properly and the +50 is because -// the temps start at -50 +/* Converting temps to (8-bit) hyst and over registers + No interpolation here. + The +50 is because the temps start at -50 */ static inline u8 TEMP_TO_REG(long val) { - return (u8) - SENSORS_LIMIT(viaLUT[((val <= -500) ? 0 : (val >= 1100) ? 160 : - ((val + 5) / 10 + 50))], 0, 255); + return viaLUT[val <= -500 ? 0 : val >= 1100 ? 160 : + (val < 0 ? val - 5 : val + 5) / 10 + 50]; } /* for 8-bit temperature hyst and over registers */ -// The temp values are already *10, so we don't need to do that. -// But we _will_ round these off to the nearest degree with (...*10+5)/10 -#define TEMP_FROM_REG(val) ((tempLUT[(val)]*10+5)/10) +#define TEMP_FROM_REG(val) (tempLUT[(val)]) /* for 10-bit temperature readings */ // You might _think_ this is too long to inline, but's it's really only @@ -295,26 +291,15 @@ static inline long TEMP_FROM_REG10(u16 val) u16 eightBits = val >> 2; u16 twoBits = val & 3; - // handle the extremes first (they won't interpolate well! ;-) - if (val == 0) - return (long) tempLUT[0]; - if (val == 1023) - return (long) tempLUT[255]; - - if (twoBits == 0) + /* no interpolation for these */ + if (twoBits == 0 || eightBits == 255) return (long) tempLUT[eightBits]; - else { - // do some interpolation by multipying the lower and upper - // bounds by 25, 50 or 75, then /100. - temp = ((25 * (4 - twoBits)) * tempLUT[eightBits] - + (25 * twoBits) * tempLUT[eightBits + 1]); - // increase the magnitude by 50 to achieve rounding. - if (temp > 0) - temp += 50; - else - temp -= 50; - return (temp / 100); - } + + /* do some linear interpolation */ + temp = (4 - twoBits) * tempLUT[eightBits] + + twoBits * tempLUT[eightBits + 1]; + /* achieve rounding */ + return (temp < 0 ? temp - 2 : temp + 2) / 4; } #define ALARMS_FROM_REG(val) (val)