[PATCH 01/10] hwmon: (lm85) Fix function RANGE_TO_REG()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Jean,


> 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 at linux-fr.org>
> Cc: Justin Thiessen <jthiessen at penguincomputing.com>
> ---
> Note: this is the same patch as I already sent on April 3rd.
> 
>  drivers/hwmon/lm85.c |   25 +++++++++++--------------
>  1 file changed, 11 insertions(+), 14 deletions(-)
> 
> --- linux-2.6.25-rc8.orig/drivers/hwmon/lm85.c	2008-04-02 22:20:01.000000000 +0200
> +++ linux-2.6.25-rc8/drivers/hwmon/lm85.c	2008-04-02 23:10:16.000000000 +0200
> @@ -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])
>  

This works but is less efficient compared to the original code for range 
values < 2000. Is there a reason not to check for < 2000 before looping?

...juerg




[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux