[patch 2.6.26-rc1] lm75: sensor reading bugfix

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

 



On Sat, 3 May 2008 19:19:16 -0700, David Brownell wrote:
> LM75 sensor reading bugfix: never save error status as valid
> sensor output.  This could be improved, but at least this
> prevents certain rude failure modes.

I agree this needs fixing, especially with the error value cleanup
patches you've sent for the i2c stack lately. While -1 swabs to itself,
other error values may look like real temperatures once swabbed.

> 
> Signed-off-by: David Brownell <dbrownell at users.sourceforge.net>
> ---
> Goes on top of the previously submitted lm75 cleanup patch:
> 
> 	http://marc.info/?l=lm-sensors&m=120880547009929&w=2
> 
>  drivers/hwmon/lm75.c |   20 +++++++++++++++-----
>  1 file changed, 15 insertions(+), 5 deletions(-)
> 
> --- g26.orig/drivers/hwmon/lm75.c	2008-05-03 18:44:59.000000000 -0700
> +++ g26/drivers/hwmon/lm75.c	2008-05-03 19:03:08.000000000 -0700
> @@ -259,10 +259,13 @@ static struct i2c_driver lm75_driver = {
>     the SMBus standard. */
>  static int lm75_read_value(struct i2c_client *client, u8 reg)
>  {
> +	int value;
> +
>  	if (reg == LM75_REG_CONF)
>  		return i2c_smbus_read_byte_data(client, reg);
> -	else
> -		return swab16(i2c_smbus_read_word_data(client, reg));
> +
> +	value = i2c_smbus_read_word_data(client, reg);
> +	return (value < 0) ? value : swab16(value);
>  }
>  
>  static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value)
> @@ -295,9 +298,16 @@ static struct lm75_data *lm75_update_dev
>  		int i;
>  		dev_dbg(&client->dev, "Starting lm75 update\n");
>  
> -		for (i = 0; i < ARRAY_SIZE(data->temp); i++)
> -			data->temp[i] = lm75_read_value(client,
> -							LM75_REG_TEMP[i]);
> +		for (i = 0; i < ARRAY_SIZE(data->temp); i++) {
> +			int status;
> +
> +			status = lm75_read_value(client, LM75_REG_TEMP[i]);
> +			if (status < 0)
> +				dev_dbg(&client->dev, "reg %d, err %d\n",
> +						LM75_REG_TEMP[i], status);
> +			else
> +				data->temp[i] = status;
> +		}
>  		data->last_updated = jiffies;
>  		data->valid = 1;
>  	}

Looks good, tested OK (i.e. no regression in the working case.)

Acked-by: Jean Delvare <khali at linux-fr.org>

-- 
Jean Delvare




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

  Powered by Linux