Skip to content

Commit

Permalink
hwmon: (lm85) Fix function RANGE_TO_REG()
Browse files Browse the repository at this point in the history
Function RANGE_TO_REG() is broken. For a requested range of 2000 (2
degrees C), it will return an index value of 15, i.e. 80.0 degrees C,
instead of the expected index value of 0. All other values are handled
properly, just 2000 isn't.

The bug was introduced back in November 2004 by this patch:
http://git.kernel.org/?p=linux/kernel/git/tglx/history.git;a=commit;h=1c28d80f1992240373099d863e4996cdd5d646d0

While this can be fixed easily with the current code, I'd rather
rewrite the whole function in a way which is more obviously correct.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Justin Thiessen <jthiessen@penguincomputing.com>
Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>
  • Loading branch information
Jean Delvare authored and Mark M. Hoffman committed Jun 19, 2008
1 parent 5dd3457 commit d38b149
Showing 1 changed file with 11 additions and 14 deletions.
25 changes: 11 additions & 14 deletions drivers/hwmon/lm85.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,23 +192,20 @@ static int RANGE_TO_REG( int range )
{
int i;

if ( range < lm85_range_map[0] ) {
return 0 ;
} else if ( range > lm85_range_map[15] ) {
if (range >= lm85_range_map[15])
return 15 ;
} else { /* find closest match */
for ( i = 14 ; i >= 0 ; --i ) {
if ( range > lm85_range_map[i] ) { /* range bracketed */
if ((lm85_range_map[i+1] - range) <
(range - lm85_range_map[i])) {
i++;
break;
}
break;
}

/* Find the closest match */
for (i = 14; i >= 0; --i) {
if (range >= lm85_range_map[i]) {
if ((lm85_range_map[i + 1] - range) <
(range - lm85_range_map[i]))
return i + 1;
return i;
}
}
return( i & 0x0f );

return 0;
}
#define RANGE_FROM_REG(val) (lm85_range_map[(val)&0x0f])

Expand Down

0 comments on commit d38b149

Please sign in to comment.