hwmon: (lm90) Add support and detection of Philips/NXP NE1618
authorGuenter Roeck <linux@roeck-us.net>
Fri, 7 Jan 2022 03:52:36 +0000 (19:52 -0800)
committerGuenter Roeck <linux@roeck-us.net>
Wed, 13 Jul 2022 15:38:19 +0000 (08:38 -0700)
NE1618 is similar to NE1617 but supports manufacturer and chip ID
registers as well as 11 bit external temperature resolution.

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

index f8dd2de9a41c6a37ef9d721602374f7ebd3d0190..23af17a0ab442da9e3882fcbe0c0d0f325e4bad5 100644 (file)
@@ -411,6 +411,14 @@ Supported chips:
 
     Datasheets: Publicly available at the Philips website
 
+  * Philips NE1618
+
+    Prefix: 'ne1618'
+
+    Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e
+
+    Datasheets: Publicly available at the Philips website
+
   * Genesys Logic GL523SM
 
     Prefix: 'gl523sm'
@@ -469,7 +477,7 @@ ADM1020, ADM1021, GL523SM, MAX1617, NE1617, NE1617A, THMC10:
   * 8 bit sensor resolution
   * Low temperature limits
 
-NCT210:
+NCT210, NE1618:
   * 11 bit sensor resolution for remote temperature sensor
   * Low temperature limits
 
index 494539e4be3d9e3c9d55e57e6ac951965254cbfe..981df62bd6ab3f87234f58f0e041a9e2d001732e 100644 (file)
@@ -1367,7 +1367,7 @@ config SENSORS_LM90
          MAX6696,
          ON Semiconductor NCT1008, NCT210, NCT72, NCT214, NCT218,
          Winbond/Nuvoton W83L771W/G/AWG/ASG,
-         Philips SA56004, GMT G781, Texas Instruments TMP451 and TMP461
+         Philips NE1618, SA56004, GMT G781, Texas Instruments TMP451 and TMP461
          sensor chips.
 
          This driver can also be built as a module. If so, the module
index 42f6d9d6677bb1a29d8821d767a2939e62faa739..4694807fa69856c011a242d216e6ff385c087efc 100644 (file)
@@ -87,6 +87,9 @@
  * This driver also supports MAX1617 and various clones such as G767
  * and NE1617. Such clones will be detected as MAX1617.
  *
+ * This driver also supports NE1618 from Philips. It is similar to NE1617
+ * but supports 11 bit external temperature values.
+ *
  * Since the LM90 was the first chipset supported by this driver, most
  * comments will refer to this chipset, but are actually general and
  * concern all supported chipsets, unless mentioned otherwise.
@@ -129,7 +132,7 @@ static const unsigned short normal_i2c[] = {
 enum chips { adm1023, adm1032, adt7461, adt7461a, adt7481,
        g781, lm84, lm90, lm99,
        max1617, max6642, max6646, max6648, max6654, max6657, max6659, max6680, max6696,
-       nct210, nct72, sa56004, tmp451, tmp461, w83l771,
+       nct210, nct72, ne1618, sa56004, tmp451, tmp461, w83l771,
 };
 
 /*
@@ -267,6 +270,7 @@ static const struct i2c_device_id lm90_id[] = {
        { "nct214", nct72 },
        { "nct218", nct72 },
        { "nct72", nct72 },
+       { "ne1618", ne1618 },
        { "w83l771", w83l771 },
        { "sa56004", sa56004 },
        { "thmc10", max1617 },
@@ -572,6 +576,13 @@ static const struct lm90_params lm90_params[] = {
                .resolution = 11,
                .max_convrate = 7,
        },
+       [ne1618] = {
+               .flags = LM90_PAUSE_FOR_CONFIG | LM90_HAVE_BROKEN_ALERT
+                 | LM90_HAVE_LOW | LM90_HAVE_CONVRATE | LM90_HAVE_REMOTE_EXT,
+               .alert_alarms = 0x7c,
+               .resolution = 11,
+               .max_convrate = 7,
+       },
        [w83l771] = {
                .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_CRIT
                  | LM90_HAVE_ALARMS | LM90_HAVE_LOW | LM90_HAVE_CONVRATE
@@ -2151,20 +2162,29 @@ static const char *lm90_detect_nuvoton(struct i2c_client *client, int chip_id,
        return name;
 }
 
-static const char *lm90_detect_nxp(struct i2c_client *client, int chip_id,
-                                  int config1, int convrate)
+static const char *lm90_detect_nxp(struct i2c_client *client, bool common_address,
+                                  int chip_id, int config1, int convrate)
 {
-       int config2 = i2c_smbus_read_byte_data(client, LM90_REG_CONFIG2);
        int address = client->addr;
        const char *name = NULL;
+       int config2;
 
-       if (config2 < 0)
-               return NULL;
-
-       if (address >= 0x48 && address <= 0x4f && chip_id == 0x00 &&
-           !(config1 & 0x2a) && !(config2 & 0xfe) && convrate <= 0x09)
-               name = "sa56004";
-
+       switch (chip_id) {
+       case 0x00:
+               config2 = i2c_smbus_read_byte_data(client, LM90_REG_CONFIG2);
+               if (config2 < 0)
+                       return NULL;
+               if (address >= 0x48 && address <= 0x4f &&
+                   !(config1 & 0x2a) && !(config2 & 0xfe) && convrate <= 0x09)
+                       name = "sa56004";
+               break;
+       case 0x80:
+               if (common_address && !(config1 & 0x3f) && convrate <= 0x07)
+                       name = "ne1618";
+               break;
+       default:
+               break;
+       }
        return name;
 }
 
@@ -2337,7 +2357,7 @@ static int lm90_detect(struct i2c_client *client, struct i2c_board_info *info)
                name = lm90_detect_nuvoton(client, chip_id, config1, convrate);
                break;
        case 0xa1:      /*  NXP Semiconductor/Philips */
-               name = lm90_detect_nxp(client, chip_id, config1, convrate);
+               name = lm90_detect_nxp(client, common_address, chip_id, config1, convrate);
                break;
        case 0xff:      /* MAX1617, G767, NE1617 */
                if (common_address && chip_id == 0xff && convrate < 8)