summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2021-12-11 04:35:20 +0100
committerGuenter Roeck <linux@roeck-us.net>2022-07-13 17:38:18 +0200
commit9888775be8c07e134c1c5b281ee0a4e01773aed1 (patch)
tree54792d7cd8b674a1a2d304c0a2657ccf5e18c298
parenthwmon: (lm90) Add support for ADT7481, ADT7482, and ADT7483 (diff)
downloadlinux-9888775be8c07e134c1c5b281ee0a4e01773aed1.tar.xz
linux-9888775be8c07e134c1c5b281ee0a4e01773aed1.zip
hwmon: (lm90) Strengthen chip detection for ADM1032, ADT7461(A), and NCT1008
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>
-rw-r--r--drivers/hwmon/lm90.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
index a915d0356d57..66d706d665bd 100644
--- a/drivers/hwmon/lm90.c
+++ b/drivers/hwmon/lm90.c
@@ -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;