hwmon: (pmbus/lm25066) Add support for TI LM5066I
authorXo Wang <xow@google.com>
Tue, 29 Aug 2017 21:21:17 +0000 (14:21 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Wed, 30 Aug 2017 13:31:13 +0000 (06:31 -0700)
The TI LM5066I hotswap controller is a more accurate version of the
LM5066 device already supported. It has different measurement conversion
coefficients than the LM5066, so it needs to be recognized as a
different device.

Signed-off-by: Xo Wang <xow@google.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Documentation/hwmon/lm25066
drivers/hwmon/pmbus/lm25066.c

index 2cb20ebb234d4944956512992b1a2d1787c4cbef..3fa6bf820c888ddcd912681a106bfa626acf604d 100644 (file)
@@ -29,6 +29,11 @@ Supported chips:
     Addresses scanned: -
     Datasheet:
        http://www.national.com/pf/LM/LM5066.html
+  * Texas Instruments LM5066I
+    Prefix: 'lm5066i'
+    Addresses scanned: -
+       Datasheet:
+    http://www.ti.com/product/LM5066I
 
 Author: Guenter Roeck <linux@roeck-us.net>
 
@@ -37,8 +42,8 @@ Description
 -----------
 
 This driver supports hardware monitoring for National Semiconductor / TI LM25056,
-LM25063, LM25066, LM5064, and LM5066 Power Management, Monitoring, Control, and
-Protection ICs.
+LM25063, LM25066, LM5064, and LM5066/LM5066I Power Management, Monitoring,
+Control, and Protection ICs.
 
 The driver is a client driver to the core PMBus driver. Please see
 Documentation/hwmon/pmbus for details on PMBus client drivers.
index 232b4af13e126500fecde6165671ad5fd672c703..10d17fb8f283670a2df80e3ab82b635c32abece3 100644 (file)
@@ -28,7 +28,7 @@
 #include <linux/i2c.h>
 #include "pmbus.h"
 
-enum chips { lm25056, lm25063, lm25066, lm5064, lm5066 };
+enum chips { lm25056, lm25063, lm25066, lm5064, lm5066, lm5066i };
 
 #define LM25066_READ_VAUX              0xd0
 #define LM25066_MFR_READ_IIN           0xd1
@@ -65,7 +65,7 @@ struct __coeff {
 #define PSC_CURRENT_IN_L       (PSC_NUM_CLASSES)
 #define PSC_POWER_L            (PSC_NUM_CLASSES + 1)
 
-static struct __coeff lm25066_coeff[5][PSC_NUM_CLASSES + 2] = {
+static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = {
        [lm25056] = {
                [PSC_VOLTAGE_IN] = {
                        .m = 16296,
@@ -210,6 +210,41 @@ static struct __coeff lm25066_coeff[5][PSC_NUM_CLASSES + 2] = {
                        .m = 16,
                },
        },
+       [lm5066i] = {
+               [PSC_VOLTAGE_IN] = {
+                       .m = 4617,
+                       .b = -140,
+                       .R = -2,
+               },
+               [PSC_VOLTAGE_OUT] = {
+                       .m = 4602,
+                       .b = 500,
+                       .R = -2,
+               },
+               [PSC_CURRENT_IN] = {
+                       .m = 15076,
+                       .b = -504,
+                       .R = -2,
+               },
+               [PSC_CURRENT_IN_L] = {
+                       .m = 7645,
+                       .b = 100,
+                       .R = -2,
+               },
+               [PSC_POWER] = {
+                       .m = 1701,
+                       .b = -4000,
+                       .R = -3,
+               },
+               [PSC_POWER_L] = {
+                       .m = 861,
+                       .b = -965,
+                       .R = -3,
+               },
+               [PSC_TEMPERATURE] = {
+                       .m = 16,
+               },
+       },
 };
 
 struct lm25066_data {
@@ -250,6 +285,7 @@ static int lm25066_read_word_data(struct i2c_client *client, int page, int reg)
                        ret = DIV_ROUND_CLOSEST(ret * 70, 453);
                        break;
                case lm5066:
+               case lm5066i:
                        /* VIN: 2.18 mV VAUX: 725 uV LSB */
                        ret = DIV_ROUND_CLOSEST(ret * 725, 2180);
                        break;
@@ -511,6 +547,7 @@ static const struct i2c_device_id lm25066_id[] = {
        {"lm25066", lm25066},
        {"lm5064", lm5064},
        {"lm5066", lm5066},
+       {"lm5066i", lm5066i},
        { }
 };