]> git.ipfire.org Git - people/ms/linux.git/commitdiff
hwmon: (lm90) Add support for ADM1021, ADM1021A, and ADM1023
authorGuenter Roeck <linux@roeck-us.net>
Sat, 20 Nov 2021 00:21:37 +0000 (16:21 -0800)
committerGuenter Roeck <linux@roeck-us.net>
Wed, 13 Jul 2022 15:38:18 +0000 (08:38 -0700)
Both chips are quite similar to other chips of this series, so add
support for them to the lm90 driver. Also mention ON Semiconductor NCT210,
which is pin and register compatible to ADM1021A.

None of the chips support the secondary manufacturer and chip ID registers
at 0x3e and 0x3f, but return 0 when reading from those registers.
Use that information to improve the accuracy of chip detection code.

Devicetree nodes are not added for the added chips since it is quite
unlikely that such old chips will ever be used in a devicetree based
system. They can be added later if needed.

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

index e2ee0f2e1b7b7698ba372af074e84d8a23e7a51d..075be136210bb6cdc41f328cdfcef601db650b99 100644 (file)
@@ -51,6 +51,22 @@ Supported chips:
 
               http://www.national.com/mpf/LM/LM86.html
 
+  * Analog Devices ADM1021
+
+    Prefix: 'adm1021'
+
+    Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e
+
+    Datasheet: Publicly available at the Analog Devices website
+
+  * Analog Devices ADM1021A/ADM1023
+
+    Prefix: 'adm1023'
+
+    Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e
+
+    Datasheet: Publicly available at the Analog Devices website
+
   * Analog Devices ADM1032
 
     Prefix: 'adm1032'
@@ -369,10 +385,15 @@ features:
 LM84:
   * 8 bit sensor resolution
 
-MAX1617:
+ADM1021, MAX1617:
   * 8 bit sensor resolution
   * Low temperature limits
 
+ADM1021A, ADM1023:
+  * Temperature offset register for remote temperature sensor
+  * 11 bit resolution for remote temperature sensor
+  * Low temperature limits
+
 LM90:
   * 11 bit resolution for remote temperature sensor
   * Temperature offset register for remote temperature sensor
index 1dd812cf15bbe8a4956c0da6def4763d8218f99f..50fa255b1e3cf11a799481f346e114914066aa13 100644 (file)
@@ -1359,8 +1359,8 @@ config SENSORS_LM90
        depends on I2C
        help
          If you say yes here you get support for National Semiconductor LM84,
-         LM90, LM86, LM89 and LM99, Analog Devices ADM1032, ADT7461, ADT7461A,
-         ADT7481, ADT7482, and ADT7483A,
+         LM90, LM86, LM89 and LM99, Analog Devices ADM2021, ADM1021A, ADM1023,
+         ADM1032, ADT7461, ADT7461A, ADT7481, ADT7482, and ADT7483A,
          Maxim MAX1617, MAX6642, MAX6646, MAX6647, MAX6648, MAX6649, MAX6654,
          MAX6657, MAX6658, MAX6659, MAX6680, MAX6681, MAX6692, MAX6695,
          MAX6696,
index 2e85dbc4def7d9d6fa7952f3eeef0b02a51a8d37..2c4a66b93fde8fce3d178a827db87fc9db7671f7 100644 (file)
@@ -122,7 +122,8 @@ static const unsigned short normal_i2c[] = {
        0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x48, 0x49, 0x4a, 0x4b, 0x4c,
        0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
 
-enum chips { adm1032, adt7461, adt7461a, adt7481, g781, lm84, lm86, lm90, lm99,
+enum chips { adm1023, adm1032, adt7461, adt7461a, adt7481,
+       g781, lm84, lm86, lm90, lm99,
        max1617, max6642, max6646, max6648, max6654, max6657, max6659, max6680, max6696,
        sa56004, tmp451, tmp461, w83l771,
 };
@@ -223,6 +224,8 @@ enum chips { adm1032, adt7461, adt7461a, adt7481, g781, lm84, lm86, lm90, lm99,
  */
 
 static const struct i2c_device_id lm90_id[] = {
+       { "adm1021", max1617 },
+       { "adm1023", adm1023 },
        { "adm1032", adm1032 },
        { "adt7461", adt7461 },
        { "adt7461a", adt7461a },
@@ -375,6 +378,14 @@ struct lm90_params {
 };
 
 static const struct lm90_params lm90_params[] = {
+       [adm1023] = {
+               .flags = LM90_HAVE_ALARMS | LM90_HAVE_OFFSET | LM90_HAVE_BROKEN_ALERT
+                 | LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_LOW | LM90_HAVE_CONVRATE
+                 | LM90_HAVE_REMOTE_EXT,
+               .alert_alarms = 0x7c,
+               .resolution = 8,
+               .max_convrate = 7,
+       },
        [adm1032] = {
                .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
                  | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT
@@ -1742,19 +1753,43 @@ static const char *lm90_detect_national(struct i2c_client *client, int chip_id,
        return name;
 }
 
-static const char *lm90_detect_analog(struct i2c_client *client, int chip_id,
-                                     int config1, int convrate)
+static const char *lm90_detect_analog(struct i2c_client *client, bool common_address,
+                                     int chip_id, int config1, int convrate)
 {
+       int status = i2c_smbus_read_byte_data(client, LM90_REG_STATUS);
        int config2 = i2c_smbus_read_byte_data(client, ADT7481_REG_CONFIG2);
        int man_id2 = i2c_smbus_read_byte_data(client, ADT7481_REG_MAN_ID);
        int chip_id2 = i2c_smbus_read_byte_data(client, ADT7481_REG_CHIP_ID);
        int address = client->addr;
        const char *name = NULL;
 
-       if (config2 < 0 || man_id2 < 0 || chip_id2 < 0)
+       if (status < 0 || config2 < 0 || man_id2 < 0 || chip_id2 < 0)
                return NULL;
 
        switch (chip_id) {
+       case 0x00 ... 0x0f:     /* ADM1021, undocumented */
+               if (man_id2 == 0x00 && chip_id2 == 0x00 && common_address &&
+                   !(status & 0x03) && !(config1 & 0x3f) && !(convrate & 0xf8))
+                       name = "adm1021";
+               break;
+       case 0x30 ... 0x3f:     /* ADM1021A, ADM1023 */
+               /*
+                * ADM1021A and compatible chips will be mis-detected as
+                * ADM1023. Chips labeled 'ADM1021A' and 'ADM1023' were both
+                * found to have a Chip ID of 0x3c.
+                * ADM1021A does not officially support low byte registers
+                * (0x12 .. 0x14), but a chip labeled ADM1021A does support it.
+                * Official support for the temperature offset high byte
+                * register (0x11) was added to revision F of the ADM1021A
+                * datasheet.
+                * It is currently unknown if there is a means to distinguish
+                * ADM1021A from ADM1023, and/or if revisions of ADM1021A exist
+                * which differ in functionality from ADM1023.
+                */
+               if (man_id2 == 0x00 && chip_id2 == 0x00 && common_address &&
+                   !(status & 0x03) && !(config1 & 0x3f) && !(convrate & 0xf8))
+                       name = "adm1023";
+               break;
        case 0x40 ... 0x4f:     /* ADM1032 */
                if (man_id2 == 0x00 && chip_id2 == 0x00 &&
                    (address == 0x4c || address == 0x4d) && !(config1 & 0x3f) &&
@@ -1795,6 +1830,7 @@ static const char *lm90_detect_analog(struct i2c_client *client, int chip_id,
                break;
        case 0x94:      /* ADT7483 */
                if (man_id2 == 0x41 && chip_id2 == 0x83 &&
+                   common_address &&
                    ((address >= 0x18 && address <= 0x1a) ||
                     (address >= 0x29 && address <= 0x2b) ||
                     (address >= 0x4c && address <= 0x4e)) &&
@@ -2175,7 +2211,8 @@ static int lm90_detect(struct i2c_client *client, struct i2c_board_info *info)
                name = lm90_detect_national(client, chip_id, config1, convrate);
                break;
        case 0x41:      /* Analog Devices */
-               name = lm90_detect_analog(client, chip_id, config1, convrate);
+               name = lm90_detect_analog(client, common_address, chip_id, config1,
+                                         convrate);
                break;
        case 0x47:      /* GMT */
                name = lm90_detect_gmt(client, chip_id, config1, convrate);