[lm-sensors] Add support for LM75A.

Jean Delvare khali at linux-fr.org
Sat Feb 19 11:51:59 CET 2011


Hi Lennart,

Please send hwmon patches to the lm-sensors list, as specified in
MAINTAINERS.

On Fri, 18 Feb 2011 14:30:00 -0500, Lennart Sorensen wrote:
> The LM75A can not be detected with the same logic as previous LM75
> designs.  Previous designs would return the last value read when an
> unused register was read.  The LM75 returns 0xff when an usesed register
> is read and it also has a new identity register.
> 
> This patch adds the new detection logic for the LM75A, allowing the lm75
> driver to correctly detect the presence of an LM75A as well as older
> LM75 designs.

Do you actually need to _detect_ an LM75A device? The only reason why
the lm75 driver originally detected the LM75 was because it was very
popular as a hardware monitoring chip on PC mainboards. This was in
years 1998-2001, the LM75 is no longer used for this purpose on modern
PC mainboards. So I would be very surprised if an LM75A was used on PC
mainboards.

For embedded systems, or graphics cards, the preferred way is to
explicitly instantiate the I2C device. Can't just you do this?

> 
> Signed-off-by: Len Sorensen <lsorense at csclub.uwaterloo.ca>
> 
> diff --git a/drivers/hwmon/lm75.c b/drivers/hwmon/lm75.c
> index f36eb80..6d04cf6 100644
> --- a/drivers/hwmon/lm75.c
> +++ b/drivers/hwmon/lm75.c
> @@ -250,23 +250,40 @@ static int lm75_detect(struct i2c_client *new_client,
>  	   addresses 0x04-0x07 returning the last read value.
>  	   The cycling+unused addresses combination is not tested,
>  	   since it would significantly slow the detection down and would
> -	   hardly add any value. */
> +	   hardly add any value.
> +
> +	   The LM75A is different.  It has an id byte of 0xaX (where
> +	   X is the chip revision) in register 7, and unused registers
> +	   return 0xff rather than the last read value. */

Maybe this holds for the National Semiconductor LM75A, but not for the
Philips/NXP variant, at least according to the datasheet (no device ID
register.)

>  
> -	/* Unused addresses */
>  	cur = i2c_smbus_read_word_data(new_client, 0);
>  	conf = i2c_smbus_read_byte_data(new_client, 1);
> -	hyst = i2c_smbus_read_word_data(new_client, 2);
> -	if (i2c_smbus_read_word_data(new_client, 4) != hyst
> -	 || i2c_smbus_read_word_data(new_client, 5) != hyst
> -	 || i2c_smbus_read_word_data(new_client, 6) != hyst
> -	 || i2c_smbus_read_word_data(new_client, 7) != hyst)
> -		return -ENODEV;
> -	os = i2c_smbus_read_word_data(new_client, 3);
> -	if (i2c_smbus_read_word_data(new_client, 4) != os
> -	 || i2c_smbus_read_word_data(new_client, 5) != os
> -	 || i2c_smbus_read_word_data(new_client, 6) != os
> -	 || i2c_smbus_read_word_data(new_client, 7) != os)
> -		return -ENODEV;
> +
> +	/* First check for LM75A */
> +	if ((i2c_smbus_read_byte_data(new_client, 7) & 0xf0) == 0xa0) {
> +		/* LM 75A returns 0xff on unused registers so
> +		   just to be sure we check for that too. */

This is definitely a good idea. 4 bits for the device ID is weak, other
devices could match. In fact I think we should check all 8 bits for
value 0xa1, as this is what is documented in the datasheet.

> +		if (i2c_smbus_read_byte_data(new_client, 4) != 0xff
> +		 || i2c_smbus_read_byte_data(new_client, 5) != 0xff
> +		 || i2c_smbus_read_byte_data(new_client, 6) != 0xff)
> +			return -ENODEV;
> +		hyst = i2c_smbus_read_word_data(new_client, 2);
> +		os = i2c_smbus_read_word_data(new_client, 3);
> +	} else { /* Traditional style LM75 detection */
> +		/* Unused addresses */
> +		hyst = i2c_smbus_read_word_data(new_client, 2);
> +		if (i2c_smbus_read_word_data(new_client, 4) != hyst
> +		 || i2c_smbus_read_word_data(new_client, 5) != hyst
> +		 || i2c_smbus_read_word_data(new_client, 6) != hyst
> +		 || i2c_smbus_read_word_data(new_client, 7) != hyst)
> +			return -ENODEV;
> +		os = i2c_smbus_read_word_data(new_client, 3);
> +		if (i2c_smbus_read_word_data(new_client, 4) != os
> +		 || i2c_smbus_read_word_data(new_client, 5) != os
> +		 || i2c_smbus_read_word_data(new_client, 6) != os
> +		 || i2c_smbus_read_word_data(new_client, 7) != os)
> +			return -ENODEV;
> +	}
>  
>  	/* Unused bits */
>  	if (conf & 0xe0)
> 

Your patch is incomplete, it should set the name to "lm75a" for the
LM75A. Also, later in the detection routine, address cycling is tested
of offsets 1, 2 and 3, it would make sense to do the same for offset 7
(device ID) for the LM75A.

-- 
Jean Delvare




More information about the lm-sensors mailing list