2017-08-29 21:21:35

by Xo Wang

[permalink] [raw]
Subject: [PATCH 0/2] Add hwmon support for TI LM5066I hotswap controller

Tested with hardware on Aspeed AST2500 connected to LM5066I on a custom board.

Xo Wang (2):
hwmon: (pmbus/lm25066) Offset coefficient depends on CL
hwmon: (pmbus/lm25066) Add support for TI LM5066I

Documentation/hwmon/lm25066 | 9 +++++++--
drivers/hwmon/pmbus/lm25066.c | 47 +++++++++++++++++++++++++++++++++++++++----
2 files changed, 50 insertions(+), 6 deletions(-)

--
2.14.1.342.g6490525c54-goog


2017-08-29 21:21:40

by Xo Wang

[permalink] [raw]
Subject: [PATCH 2/2] hwmon: (pmbus/lm25066) Add support for TI LM5066I

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 <[email protected]>
---
Documentation/hwmon/lm25066 | 9 +++++++--
drivers/hwmon/pmbus/lm25066.c | 41 +++++++++++++++++++++++++++++++++++++++--
2 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/Documentation/hwmon/lm25066 b/Documentation/hwmon/lm25066
index 2cb20ebb234d..3fa6bf820c88 100644
--- a/Documentation/hwmon/lm25066
+++ b/Documentation/hwmon/lm25066
@@ -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 <[email protected]>

@@ -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.
diff --git a/drivers/hwmon/pmbus/lm25066.c b/drivers/hwmon/pmbus/lm25066.c
index 232b4af13e12..10d17fb8f283 100644
--- a/drivers/hwmon/pmbus/lm25066.c
+++ b/drivers/hwmon/pmbus/lm25066.c
@@ -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},
{ }
};

--
2.14.1.342.g6490525c54-goog

2017-08-29 21:22:03

by Xo Wang

[permalink] [raw]
Subject: [PATCH 1/2] hwmon: (pmbus/lm25066) Offset coefficient depends on CL

When converting the DIRECT format CURRENT_IN and POWER commands, make
the offset coefficient ("b") predicate on the value of the current limit
setting.

Signed-off-by: Xo Wang <[email protected]>
---
drivers/hwmon/pmbus/lm25066.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/hwmon/pmbus/lm25066.c b/drivers/hwmon/pmbus/lm25066.c
index a3d912cd3b8d..232b4af13e12 100644
--- a/drivers/hwmon/pmbus/lm25066.c
+++ b/drivers/hwmon/pmbus/lm25066.c
@@ -488,16 +488,18 @@ static int lm25066_probe(struct i2c_client *client,
info->m[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].m;
info->b[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].b;
info->R[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].R;
- info->b[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].b;
info->R[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].R;
- info->b[PSC_POWER] = coeff[PSC_POWER].b;
info->R[PSC_POWER] = coeff[PSC_POWER].R;
if (config & LM25066_DEV_SETUP_CL) {
info->m[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN_L].m;
+ info->b[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN_L].b;
info->m[PSC_POWER] = coeff[PSC_POWER_L].m;
+ info->b[PSC_POWER] = coeff[PSC_POWER_L].b;
} else {
info->m[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].m;
+ info->b[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].b;
info->m[PSC_POWER] = coeff[PSC_POWER].m;
+ info->b[PSC_POWER] = coeff[PSC_POWER].b;
}

return pmbus_do_probe(client, id, info);
--
2.14.1.342.g6490525c54-goog

2017-08-30 02:02:25

by Guenter Roeck

[permalink] [raw]
Subject: Re: [1/2] hwmon: (pmbus/lm25066) Offset coefficient depends on CL

On Tue, Aug 29, 2017 at 02:21:16PM -0700, Xo Wang wrote:
> When converting the DIRECT format CURRENT_IN and POWER commands, make
> the offset coefficient ("b") predicate on the value of the current limit
> setting.
>
> Signed-off-by: Xo Wang <[email protected]>

Applied to hwmon-next.

Thanks,
Guenter

> ---
> drivers/hwmon/pmbus/lm25066.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/hwmon/pmbus/lm25066.c b/drivers/hwmon/pmbus/lm25066.c
> index a3d912cd3b8d..232b4af13e12 100644
> --- a/drivers/hwmon/pmbus/lm25066.c
> +++ b/drivers/hwmon/pmbus/lm25066.c
> @@ -488,16 +488,18 @@ static int lm25066_probe(struct i2c_client *client,
> info->m[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].m;
> info->b[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].b;
> info->R[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].R;
> - info->b[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].b;
> info->R[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].R;
> - info->b[PSC_POWER] = coeff[PSC_POWER].b;
> info->R[PSC_POWER] = coeff[PSC_POWER].R;
> if (config & LM25066_DEV_SETUP_CL) {
> info->m[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN_L].m;
> + info->b[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN_L].b;
> info->m[PSC_POWER] = coeff[PSC_POWER_L].m;
> + info->b[PSC_POWER] = coeff[PSC_POWER_L].b;
> } else {
> info->m[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].m;
> + info->b[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].b;
> info->m[PSC_POWER] = coeff[PSC_POWER].m;
> + info->b[PSC_POWER] = coeff[PSC_POWER].b;
> }
>
> return pmbus_do_probe(client, id, info);

2017-08-30 02:03:34

by Guenter Roeck

[permalink] [raw]
Subject: Re: [2/2] hwmon: (pmbus/lm25066) Add support for TI LM5066I

On Tue, Aug 29, 2017 at 02:21:17PM -0700, Xo Wang wrote:
> 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 <[email protected]>

Applied to hwmon-next.

Thanks,
Guenter

> ---
> Documentation/hwmon/lm25066 | 9 +++++++--
> drivers/hwmon/pmbus/lm25066.c | 41 +++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 46 insertions(+), 4 deletions(-)
>
> diff --git a/Documentation/hwmon/lm25066 b/Documentation/hwmon/lm25066
> index 2cb20ebb234d..3fa6bf820c88 100644
> --- a/Documentation/hwmon/lm25066
> +++ b/Documentation/hwmon/lm25066
> @@ -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 <[email protected]>
>
> @@ -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.
> diff --git a/drivers/hwmon/pmbus/lm25066.c b/drivers/hwmon/pmbus/lm25066.c
> index 232b4af13e12..10d17fb8f283 100644
> --- a/drivers/hwmon/pmbus/lm25066.c
> +++ b/drivers/hwmon/pmbus/lm25066.c
> @@ -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},
> { }
> };
>