summaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/tmp421.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/tmp421.c')
-rw-r--r--drivers/hwmon/tmp421.c14
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,
42enum chips { tmp421, tmp422, tmp423 }; 42enum 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: