hwmon: (lm90) Strengthen chip detection for ADM1032, ADT7461(A), and NCT1008
authorGuenter Roeck <linux@roeck-us.net>
Sat, 11 Dec 2021 03:35:20 +0000 (19:35 -0800)
committerGuenter Roeck <linux@roeck-us.net>
Wed, 13 Jul 2022 15:38:18 +0000 (08:38 -0700)
ADT7461A and NCT1008 support the undocumented manufacturer and chip ID
registers at 0x3e and 0x3f, and return 0x61 as chip ID. ADM1032 and
ADT7461 do not support those registers but return 0 when reading them.
Use this information to improve the accuracy of the chip detection code.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/lm90.c

index a915d0356d579cc0be8a1f5e32e756175e99bbea..66d706d665bded4bcc782b67b598e0cbda44c77d 100644 (file)
@@ -1605,22 +1605,26 @@ static const char *lm90_detect_analog(struct i2c_client *client, int chip_id,
 
        switch (chip_id) {
        case 0x40 ... 0x4f:     /* ADM1032 */
-               if ((address == 0x4c || address == 0x4d) && !(config1 & 0x3f) &&
+               if (man_id2 == 0x00 && chip_id2 == 0x00 &&
+                   (address == 0x4c || address == 0x4d) && !(config1 & 0x3f) &&
                    convrate <= 0x0a)
                        name = "adm1032";
                break;
        case 0x51:      /* ADT7461 */
-               if ((address == 0x4c || address == 0x4d) && !(config1 & 0x1b) &&
+               if (man_id2 == 0x00 && chip_id2 == 0x00 &&
+                   (address == 0x4c || address == 0x4d) && !(config1 & 0x1b) &&
                    convrate <= 0x0a)
                        name = "adt7461";
                break;
        case 0x54:      /* NCT1008 */
-               if ((address == 0x4c || address == 0x4d) && !(config1 & 0x1b) &&
+               if (man_id2 == 0x41 && chip_id2 == 0x61 &&
+                   (address == 0x4c || address == 0x4d) && !(config1 & 0x1b) &&
                    convrate <= 0x0a)
                        name = "nct1008";
                break;
        case 0x57:      /* ADT7461A, NCT1008 (datasheet rev. 3) */
-               if ((address == 0x4c || address == 0x4d) && !(config1 & 0x1b) &&
+               if (man_id2 == 0x41 && chip_id2 == 0x61 &&
+                   (address == 0x4c || address == 0x4d) && !(config1 & 0x1b) &&
                    convrate <= 0x0a)
                        name = "adt7461a";
                break;