Re: Add support for LM75A.

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

 



On Thu, Feb 24, 2011 at 10:45:52AM +0100, Jean Delvare wrote:
> On Tue, 22 Feb 2011 17:15:41 -0500, Lennart Sorensen wrote:
> > On Tue, Feb 22, 2011 at 01:27:13PM -0500, Lennart Sorensen wrote:
> > > I will do that.  I hope to have an updated patch in a couple of hours.
> > 
> > OK, here is an updated one:
> > 
> > Add support for detection of LM75A using the ID register value.
> > 
> > Signed-off-by: Len Sorensen <lsorense@xxxxxxxxxxxxxxxxxxx>
> > 
> > diff --git a/drivers/hwmon/lm75.c b/drivers/hwmon/lm75.c
> > index f36eb80..5900926 100644
> > --- a/drivers/hwmon/lm75.c
> > +++ b/drivers/hwmon/lm75.c
> > @@ -232,6 +232,8 @@ static const struct i2c_device_id lm75_ids[] = {
> >  };
> >  MODULE_DEVICE_TABLE(i2c, lm75_ids);
> >  
> > +#define LM75A_ID 0xA1
> > +
> >  /* Return 0 if detection is successful, -ENODEV otherwise */
> >  static int lm75_detect(struct i2c_client *new_client,
> >  		       struct i2c_board_info *info)
> > @@ -239,6 +241,7 @@ static int lm75_detect(struct i2c_client *new_client,
> >  	struct i2c_adapter *adapter = new_client->adapter;
> >  	int i;
> >  	int cur, conf, hyst, os;
> > +	bool is_lm75a = 0;
> >  
> >  	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
> >  				     I2C_FUNC_SMBUS_WORD_DATA))
> > @@ -250,23 +253,43 @@ 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 National Semiconductor LM75A is different than earlier
> > +	   LM75s.  It has an ID byte of 0xaX (where X is the chip
> > +	   revision, with 1 being the only revision in existance) in
> > +	   register 7, and unused registers return 0xff rather than the
> > +	   last read value. */
> >  
> > -	/* 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) == LM75A_ID) {
> > +		/* LM 75A returns 0xff on unused registers so
> > +		   just to be sure we check for that too. */
> > +		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;
> > +		is_lm75a = 1;
> > +		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)
> > @@ -278,9 +301,14 @@ static int lm75_detect(struct i2c_client *new_client,
> >  		 || i2c_smbus_read_word_data(new_client, i + 2) != hyst
> >  		 || i2c_smbus_read_word_data(new_client, i + 3) != os)
> >  			return -ENODEV;
> > +		if (is_lm75a && i2c_smbus_read_byte_data(new_client, i + 7) != LM75A_ID)
> > +			return -ENODEV;
> >  	}
> >  
> > -	strlcpy(info->type, "lm75", I2C_NAME_SIZE);
> > +	if (is_lm75a)
> > +		strlcpy(info->type, "lm75a", I2C_NAME_SIZE);
> > +	else
> > +		strlcpy(info->type, "lm75", I2C_NAME_SIZE);
> >  
> >  	return 0;
> >  }
> > 
> 
> Applied with minor style fixes, thank you.

I will have to go see what that entails.  I thought I had done a decent
job following the existing style. :)

-- 
Len Sorensen

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors


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

  Powered by Linux