Hi Per, On Wed, 2011-05-25 at 13:48 -0400, Per DalÃn wrote: > Made the improvement for the detection schema suggested by Guenter Roeck. > --- > Check for non-existing registers, registers 0x04, 0x06 and 0xff, which > are supported by other Maxim chips. Reading such registers returns the > previously read value. > > Signed-off-by: Per Dalen <per.dalen@xxxxxxxxxxxx> > --- > > diff --git a/drivers/hwmon/max6642.c b/drivers/hwmon/max6642.c > index 0f9fc40..69c7f9e 100644 > --- a/drivers/hwmon/max6642.c > +++ b/drivers/hwmon/max6642.c > @@ -64,6 +64,14 @@ static const unsigned short normal_i2c[] = { > #define MAX6642_REG_W_REMOTE_HIGH 0x0D > > /* > + * Registers for detection tests, these registers isn't pressent and > + * will only show the last valid register read. > + */ > +#define MAX6642_REG_R_DUMMY_1 0x04 > +#define MAX6642_REG_R_DUMMY_2 0x06 > +#define MAX6642_REG_R_DUMMY_3 0xFF > + > +/* > * Conversions > */ > > @@ -126,14 +134,16 @@ static int max6642_detect(struct i2c_client *client, > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > - u8 reg_config, reg_status, man_id; > + u8 reg_config, reg_status, man_id, dummy_reg1, dummy_reg2; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > /* identification */ > man_id = i2c_smbus_read_byte_data(client, MAX6642_REG_R_MAN_ID); > - if (man_id != 0x4D) > + dummy_reg1 = i2c_smbus_read_byte_data(client, MAX6642_REG_R_DUMMY_1); > + if ((man_id != 0x4D) && > + (man_id != dummy_reg1)) Please drop all the unnecessary () and the unnecessary line break. Also, I think the logic is wrong. It should be if (man_id != 0x4d || man_id != dummy_reg1) > return -ENODEV; > > /* > @@ -142,9 +152,13 @@ static int max6642_detect(struct i2c_client *client, > * zero in the status register. > */ > reg_config = i2c_smbus_read_byte_data(client, MAX6642_REG_R_CONFIG); > + dummy_reg1 = i2c_smbus_read_byte_data(client, MAX6642_REG_R_DUMMY_2); > reg_status = i2c_smbus_read_byte_data(client, MAX6642_REG_R_STATUS); > - if (((reg_config & 0x0f) != 0x00) || > - ((reg_status & 0x2b) != 0x00)) > + dummy_reg2 = i2c_smbus_read_byte_data(client, MAX6642_REG_R_DUMMY_3); > + if ((reg_config & 0x0f) != 0x00 || > + (reg_status & 0x2b) != 0x00 || > + reg_config != dummy_reg1 || > + reg_status != dummy_reg2) Please remove unnecessary line breaks. I think it is better to read all dummy registers right after reading man_id. This way we know for sure that the MAX6642 will return 0x4d when reading those registers, and you can check each of the registers against man_id in the first if statement above. Thanks, Guenter _______________________________________________ lm-sensors mailing list lm-sensors@xxxxxxxxxxxxxx http://lists.lm-sensors.org/mailman/listinfo/lm-sensors