diff options
Diffstat (limited to 'drivers/hwmon/tmp421.c')
-rw-r--r-- | drivers/hwmon/tmp421.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/hwmon/tmp421.c b/drivers/hwmon/tmp421.c index 7bab7a9bedc6..9438c1bd5d59 100644 --- a/drivers/hwmon/tmp421.c +++ b/drivers/hwmon/tmp421.c | |||
@@ -42,6 +42,7 @@ static const unsigned short normal_i2c[] = { 0x2a, 0x4c, 0x4d, 0x4e, 0x4f, | |||
42 | enum chips { tmp421, tmp422, tmp423 }; | 42 | enum chips { tmp421, tmp422, tmp423 }; |
43 | 43 | ||
44 | /* The TMP421 registers */ | 44 | /* The TMP421 registers */ |
45 | #define TMP421_STATUS_REG 0x08 | ||
45 | #define TMP421_CONFIG_REG_1 0x09 | 46 | #define TMP421_CONFIG_REG_1 0x09 |
46 | #define TMP421_CONVERSION_RATE_REG 0x0B | 47 | #define TMP421_CONVERSION_RATE_REG 0x0B |
47 | #define TMP421_MANUFACTURER_ID_REG 0xFE | 48 | #define TMP421_MANUFACTURER_ID_REG 0xFE |
@@ -235,6 +236,7 @@ static int tmp421_detect(struct i2c_client *client, | |||
235 | enum chips kind; | 236 | enum chips kind; |
236 | struct i2c_adapter *adapter = client->adapter; | 237 | struct i2c_adapter *adapter = client->adapter; |
237 | const char *names[] = { "TMP421", "TMP422", "TMP423" }; | 238 | const char *names[] = { "TMP421", "TMP422", "TMP423" }; |
239 | int addr = client->addr; | ||
238 | u8 reg; | 240 | u8 reg; |
239 | 241 | ||
240 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | 242 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) |
@@ -244,15 +246,27 @@ static int tmp421_detect(struct i2c_client *client, | |||
244 | if (reg != TMP421_MANUFACTURER_ID) | 246 | if (reg != TMP421_MANUFACTURER_ID) |
245 | return -ENODEV; | 247 | return -ENODEV; |
246 | 248 | ||
249 | reg = i2c_smbus_read_byte_data(client, TMP421_CONVERSION_RATE_REG); | ||
250 | if (reg & 0xf8) | ||
251 | return -ENODEV; | ||
252 | |||
253 | reg = i2c_smbus_read_byte_data(client, TMP421_STATUS_REG); | ||
254 | if (reg & 0x7f) | ||
255 | return -ENODEV; | ||
256 | |||
247 | reg = i2c_smbus_read_byte_data(client, TMP421_DEVICE_ID_REG); | 257 | reg = i2c_smbus_read_byte_data(client, TMP421_DEVICE_ID_REG); |
248 | switch (reg) { | 258 | switch (reg) { |
249 | case TMP421_DEVICE_ID: | 259 | case TMP421_DEVICE_ID: |
250 | kind = tmp421; | 260 | kind = tmp421; |
251 | break; | 261 | break; |
252 | case TMP422_DEVICE_ID: | 262 | case TMP422_DEVICE_ID: |
263 | if (addr == 0x2a) | ||
264 | return -ENODEV; | ||
253 | kind = tmp422; | 265 | kind = tmp422; |
254 | break; | 266 | break; |
255 | case TMP423_DEVICE_ID: | 267 | case TMP423_DEVICE_ID: |
268 | if (addr != 0x4c && addr != 0x4d) | ||
269 | return -ENODEV; | ||
256 | kind = tmp423; | 270 | kind = tmp423; |
257 | break; | 271 | break; |
258 | default: | 272 | default: |