diff options
| author | Per Dalén <per.dalen@appeartv.com> | 2011-05-26 09:08:53 -0400 |
|---|---|---|
| committer | Guenter Roeck <guenter.roeck@ericsson.com> | 2011-06-04 13:34:28 -0400 |
| commit | 942c1a927bf296fd64fd49f04c5a8f66bb14446b (patch) | |
| tree | 58020f9137fd23755a918eca1ad0621109123a80 | |
| parent | bb9973e4e73f43bd86698483d0c3f7a362ff94ce (diff) | |
hwmon: (max6642): Better chip detection schema
Improve detection of MAX6642 by reading non existing registers (0x04, 0x06
and 0xff). Reading those registers returns the previously read value.
Signed-off-by: Per Dalen <per.dalen@appeartv.com>
[guenter.roeck@ericsson.com: added second set of register reads]
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
| -rw-r--r-- | drivers/hwmon/max6642.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/hwmon/max6642.c b/drivers/hwmon/max6642.c index 0f30e1bb366f..e855d3b0bd1f 100644 --- a/drivers/hwmon/max6642.c +++ b/drivers/hwmon/max6642.c | |||
| @@ -136,15 +136,29 @@ static int max6642_detect(struct i2c_client *client, | |||
| 136 | if (man_id != 0x4D) | 136 | if (man_id != 0x4D) |
| 137 | return -ENODEV; | 137 | return -ENODEV; |
| 138 | 138 | ||
| 139 | /* sanity check */ | ||
| 140 | if (i2c_smbus_read_byte_data(client, 0x04) != 0x4D | ||
| 141 | || i2c_smbus_read_byte_data(client, 0x06) != 0x4D | ||
| 142 | || i2c_smbus_read_byte_data(client, 0xff) != 0x4D) | ||
| 143 | return -ENODEV; | ||
| 144 | |||
| 139 | /* | 145 | /* |
| 140 | * We read the config and status register, the 4 lower bits in the | 146 | * We read the config and status register, the 4 lower bits in the |
| 141 | * config register should be zero and bit 5, 3, 1 and 0 should be | 147 | * config register should be zero and bit 5, 3, 1 and 0 should be |
| 142 | * zero in the status register. | 148 | * zero in the status register. |
| 143 | */ | 149 | */ |
| 144 | reg_config = i2c_smbus_read_byte_data(client, MAX6642_REG_R_CONFIG); | 150 | reg_config = i2c_smbus_read_byte_data(client, MAX6642_REG_R_CONFIG); |
| 151 | if ((reg_config & 0x0f) != 0x00) | ||
| 152 | return -ENODEV; | ||
| 153 | |||
| 154 | /* in between, another round of sanity checks */ | ||
| 155 | if (i2c_smbus_read_byte_data(client, 0x04) != reg_config | ||
| 156 | || i2c_smbus_read_byte_data(client, 0x06) != reg_config | ||
| 157 | || i2c_smbus_read_byte_data(client, 0xff) != reg_config) | ||
| 158 | return -ENODEV; | ||
| 159 | |||
| 145 | reg_status = i2c_smbus_read_byte_data(client, MAX6642_REG_R_STATUS); | 160 | reg_status = i2c_smbus_read_byte_data(client, MAX6642_REG_R_STATUS); |
| 146 | if (((reg_config & 0x0f) != 0x00) || | 161 | if ((reg_status & 0x2b) != 0x00) |
| 147 | ((reg_status & 0x2b) != 0x00)) | ||
| 148 | return -ENODEV; | 162 | return -ENODEV; |
| 149 | 163 | ||
| 150 | strlcpy(info->type, "max6642", I2C_NAME_SIZE); | 164 | strlcpy(info->type, "max6642", I2C_NAME_SIZE); |
