hwmon: (lm73) Make detection less problematic
authorJean Delvare <khali@linux-fr.org>
Fri, 4 Nov 2011 11:00:46 +0000 (12:00 +0100)
committerJean Delvare <khali@endymion.delvare>
Fri, 4 Nov 2011 11:00:46 +0000 (12:00 +0100)
Word reads can cause trouble with some I2C devices, so do as much
detection as we can using only byte reads, and only use a word read in
the end to confirm the positive match. Also properly handle read
errors.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Robert Casanova <robertcasanova@nanometrics.ca>
drivers/hwmon/lm73.c

index 29b9030d42c3111ecfdc49cc2a9cbf8aa4257cd6..24be17608fbbcc1a8f1f0636ebb7c2d7a53a3fb6 100644 (file)
@@ -150,17 +150,31 @@ static int lm73_detect(struct i2c_client *new_client,
                        struct i2c_board_info *info)
 {
        struct i2c_adapter *adapter = new_client->adapter;
-       u16 id;
-       u8 ctrl;
+       int id, ctrl, conf;
 
        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
                                        I2C_FUNC_SMBUS_WORD_DATA))
                return -ENODEV;
 
+       /*
+        * Do as much detection as possible with byte reads first, as word
+        * reads can confuse other devices.
+        */
+       ctrl = i2c_smbus_read_byte_data(new_client, LM73_REG_CTRL);
+       if (ctrl < 0 || (ctrl & 0x10))
+               return -ENODEV;
+
+       conf = i2c_smbus_read_byte_data(new_client, LM73_REG_CONF);
+       if (conf < 0 || (conf & 0x0c))
+               return -ENODEV;
+
+       id = i2c_smbus_read_byte_data(new_client, LM73_REG_ID);
+       if (id < 0 || id != (LM73_ID & 0xff))
+               return -ENODEV;
+
        /* Check device ID */
        id = i2c_smbus_read_word_data(new_client, LM73_REG_ID);
-       ctrl = i2c_smbus_read_byte_data(new_client, LM73_REG_CTRL);
-       if ((id != LM73_ID) || (ctrl & 0x10))
+       if (id < 0 || id != LM73_ID)
                return -ENODEV;
 
        strlcpy(info->type, "lm73", I2C_NAME_SIZE);