Changed according to the suggestions from Guenter Roeck: * Check the manufacturer ID directly. Fastens the test if it's not a Maxim chip. * Read the other non-existing registers after the manufacturer ID. --- 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..565b507 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,7 +134,7 @@ 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_reg; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) return -ENODEV; @@ -136,6 +144,19 @@ static int max6642_detect(struct i2c_client *client, if (man_id != 0x4D) return -ENODEV; + /* sanity check */ + dummy_reg = i2c_smbus_read_byte_data(client, MAX6642_REG_R_DUMMY_1); + if (dummy_reg != 0x4D) + return -ENODEV; + + dummy_reg = i2c_smbus_read_byte_data(client, MAX6642_REG_R_DUMMY_2); + if (dummy_reg != 0x4D) + return -ENODEV; + + dummy_reg = i2c_smbus_read_byte_data(client, MAX6642_REG_R_DUMMY_3); + if (dummy_reg != 0x4D) + return -ENODEV; + /* * We read the config and status register, the 4 lower bits in the * config register should be zero and bit 5, 3, 1 and 0 should be _______________________________________________ lm-sensors mailing list lm-sensors@xxxxxxxxxxxxxx http://lists.lm-sensors.org/mailman/listinfo/lm-sensors