* [RFC PATCH hwmon-next v1 1/5] hwmon: (pmbus/core) Add support for vid mode detection per page bases
2020-01-08 14:11 [RFC PATCH hwmon-next v1 0/5] hwmon: (pmbus) Add support for vid mode calculation per page bases Vadim Pasternak
@ 2020-01-08 14:11 ` Vadim Pasternak
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 2/5] hwmon: (pmbus/core) Add support for Intel IMVP9 and AMD 6.25mV modes Vadim Pasternak
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Vadim Pasternak @ 2020-01-08 14:11 UTC (permalink / raw)
To: linux, robh+dt, vijaykhemka; +Cc: linux-hwmon, devicetree, Vadim Pasternak
Add support for VID protocol detection per page bases, instead of
detecting it based on "PMBU_VOUT" readout from page 0 for all the pages
supported by particular device.
The reason that some devices allows to configure different VID modes
per page within the same device.
Patch modifies the field "vrm_version" within the structure
"pmbus_driver_info" to be per page array.
Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
---
drivers/hwmon/pmbus/max20751.c | 2 +-
drivers/hwmon/pmbus/pmbus.c | 5 +++--
drivers/hwmon/pmbus/pmbus.h | 2 +-
drivers/hwmon/pmbus/pmbus_core.c | 2 +-
drivers/hwmon/pmbus/pxe1610.c | 44 ++++++++++++++++++++++------------------
drivers/hwmon/pmbus/tps53679.c | 44 +++++++++++++++++++++-------------------
6 files changed, 53 insertions(+), 46 deletions(-)
diff --git a/drivers/hwmon/pmbus/max20751.c b/drivers/hwmon/pmbus/max20751.c
index ee5f0cdbde06..da3c38cb9a5c 100644
--- a/drivers/hwmon/pmbus/max20751.c
+++ b/drivers/hwmon/pmbus/max20751.c
@@ -16,7 +16,7 @@ static struct pmbus_driver_info max20751_info = {
.pages = 1,
.format[PSC_VOLTAGE_IN] = linear,
.format[PSC_VOLTAGE_OUT] = vid,
- .vrm_version = vr12,
+ .vrm_version[0] = vr12,
.format[PSC_TEMPERATURE] = linear,
.format[PSC_CURRENT_OUT] = linear,
.format[PSC_POWER] = linear,
diff --git a/drivers/hwmon/pmbus/pmbus.c b/drivers/hwmon/pmbus/pmbus.c
index c0bc43d01018..9109f305ebbb 100644
--- a/drivers/hwmon/pmbus/pmbus.c
+++ b/drivers/hwmon/pmbus/pmbus.c
@@ -115,7 +115,7 @@ static int pmbus_identify(struct i2c_client *client,
}
if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) {
- int vout_mode;
+ int vout_mode, i;
vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
if (vout_mode >= 0 && vout_mode != 0xff) {
@@ -124,7 +124,8 @@ static int pmbus_identify(struct i2c_client *client,
break;
case 1:
info->format[PSC_VOLTAGE_OUT] = vid;
- info->vrm_version = vr11;
+ for (i = 0; i < info->pages; i++)
+ info->vrm_version[i] = vr11;
break;
case 2:
info->format[PSC_VOLTAGE_OUT] = direct;
diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h
index d198af3a92b6..2bdebd0ea9c1 100644
--- a/drivers/hwmon/pmbus/pmbus.h
+++ b/drivers/hwmon/pmbus/pmbus.h
@@ -382,7 +382,7 @@ enum vrm_version { vr11 = 0, vr12, vr13 };
struct pmbus_driver_info {
int pages; /* Total number of pages */
enum pmbus_data_format format[PSC_NUM_CLASSES];
- enum vrm_version vrm_version;
+ enum vrm_version vrm_version[PMBUS_PAGES]; /* vrm version per page */
/*
* Support one set of coefficients for each sensor type
* Used for chips providing data in direct mode.
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index 8470097907bc..98226e84b351 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -696,7 +696,7 @@ static long pmbus_reg2data_vid(struct pmbus_data *data,
long val = sensor->data;
long rv = 0;
- switch (data->info->vrm_version) {
+ switch (data->info->vrm_version[sensor->page]) {
case vr11:
if (val >= 0x02 && val <= 0xb2)
rv = DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100);
diff --git a/drivers/hwmon/pmbus/pxe1610.c b/drivers/hwmon/pmbus/pxe1610.c
index ebe3f023f840..517584cff3de 100644
--- a/drivers/hwmon/pmbus/pxe1610.c
+++ b/drivers/hwmon/pmbus/pxe1610.c
@@ -19,26 +19,30 @@
static int pxe1610_identify(struct i2c_client *client,
struct pmbus_driver_info *info)
{
- if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) {
- u8 vout_mode;
- int ret;
-
- /* Read the register with VOUT scaling value.*/
- ret = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
- if (ret < 0)
- return ret;
-
- vout_mode = ret & GENMASK(4, 0);
-
- switch (vout_mode) {
- case 1:
- info->vrm_version = vr12;
- break;
- case 2:
- info->vrm_version = vr13;
- break;
- default:
- return -ENODEV;
+ int i;
+
+ for (i = 0; i < PXE1610_NUM_PAGES; i++) {
+ if (pmbus_check_byte_register(client, i, PMBUS_VOUT_MODE)) {
+ u8 vout_mode;
+ int ret;
+
+ /* Read the register with VOUT scaling value.*/
+ ret = pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE);
+ if (ret < 0)
+ return ret;
+
+ vout_mode = ret & GENMASK(4, 0);
+
+ switch (vout_mode) {
+ case 1:
+ info->vrm_version[i] = vr12;
+ break;
+ case 2:
+ info->vrm_version[i] = vr13;
+ break;
+ default:
+ return -ENODEV;
+ }
}
}
diff --git a/drivers/hwmon/pmbus/tps53679.c b/drivers/hwmon/pmbus/tps53679.c
index 86bb3aca09ed..163e8c6aaa8e 100644
--- a/drivers/hwmon/pmbus/tps53679.c
+++ b/drivers/hwmon/pmbus/tps53679.c
@@ -24,27 +24,29 @@ static int tps53679_identify(struct i2c_client *client,
struct pmbus_driver_info *info)
{
u8 vout_params;
- int ret;
-
- /* Read the register with VOUT scaling value.*/
- ret = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
- if (ret < 0)
- return ret;
-
- vout_params = ret & GENMASK(4, 0);
-
- switch (vout_params) {
- case TPS53679_PROT_VR13_10MV:
- case TPS53679_PROT_VR12_5_10MV:
- info->vrm_version = vr13;
- break;
- case TPS53679_PROT_VR13_5MV:
- case TPS53679_PROT_VR12_5MV:
- case TPS53679_PROT_IMVP8_5MV:
- info->vrm_version = vr12;
- break;
- default:
- return -EINVAL;
+ int i, ret;
+
+ for (i = 0; i < TPS53679_PAGE_NUM; i++) {
+ /* Read the register with VOUT scaling value.*/
+ ret = pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE);
+ if (ret < 0)
+ return ret;
+
+ vout_params = ret & GENMASK(4, 0);
+
+ switch (vout_params) {
+ case TPS53679_PROT_VR13_10MV:
+ case TPS53679_PROT_VR12_5_10MV:
+ info->vrm_version[i] = vr13;
+ break;
+ case TPS53679_PROT_VR13_5MV:
+ case TPS53679_PROT_VR12_5MV:
+ case TPS53679_PROT_IMVP8_5MV:
+ info->vrm_version[i] = vr12;
+ break;
+ default:
+ return -EINVAL;
+ }
}
return 0;
--
2.11.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RFC PATCH hwmon-next v1 2/5] hwmon: (pmbus/core) Add support for Intel IMVP9 and AMD 6.25mV modes
2020-01-08 14:11 [RFC PATCH hwmon-next v1 0/5] hwmon: (pmbus) Add support for vid mode calculation per page bases Vadim Pasternak
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 1/5] hwmon: (pmbus/core) Add support for vid mode detection " Vadim Pasternak
@ 2020-01-08 14:11 ` Vadim Pasternak
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 3/5] hwmon: (pmbus/tps53679) Extend device list supported by driver Vadim Pasternak
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Vadim Pasternak @ 2020-01-08 14:11 UTC (permalink / raw)
To: linux, robh+dt, vijaykhemka; +Cc: linux-hwmon, devicetree, Vadim Pasternak
Extend "vrm_version" with the type for Intel IMVP9 and AMD 6.25mV VID
modes.
Add calculation for those types.
Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
---
drivers/hwmon/pmbus/pmbus.h | 2 +-
drivers/hwmon/pmbus/pmbus_core.c | 8 ++++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h
index 2bdebd0ea9c1..a7f90e18119c 100644
--- a/drivers/hwmon/pmbus/pmbus.h
+++ b/drivers/hwmon/pmbus/pmbus.h
@@ -377,7 +377,7 @@ enum pmbus_sensor_classes {
#define PMBUS_PAGE_VIRTUAL BIT(31)
enum pmbus_data_format { linear = 0, direct, vid };
-enum vrm_version { vr11 = 0, vr12, vr13 };
+enum vrm_version { vr11 = 0, vr12, vr13, imvp9, amd625mv };
struct pmbus_driver_info {
int pages; /* Total number of pages */
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index 98226e84b351..811819e41a72 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -709,6 +709,14 @@ static long pmbus_reg2data_vid(struct pmbus_data *data,
if (val >= 0x01)
rv = 500 + (val - 1) * 10;
break;
+ case imvp9:
+ if (val >= 0x01)
+ rv = 200 + (val - 1) * 10;
+ break;
+ case amd625mv:
+ if (val >= 0x0 && val <= 0xd8)
+ rv = DIV_ROUND_CLOSEST(155000 - val * 625, 100);
+ break;
}
return rv;
}
--
2.11.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RFC PATCH hwmon-next v1 3/5] hwmon: (pmbus/tps53679) Extend device list supported by driver
2020-01-08 14:11 [RFC PATCH hwmon-next v1 0/5] hwmon: (pmbus) Add support for vid mode calculation per page bases Vadim Pasternak
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 1/5] hwmon: (pmbus/core) Add support for vid mode detection " Vadim Pasternak
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 2/5] hwmon: (pmbus/core) Add support for Intel IMVP9 and AMD 6.25mV modes Vadim Pasternak
@ 2020-01-08 14:11 ` Vadim Pasternak
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 4/5] hwmon: (pmbus) Add support for Infineon Multi-phase xdpe122 family controllers Vadim Pasternak
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 5/5] dt-bindings: Add TI and Infineon VR Controllers as trivial devices Vadim Pasternak
4 siblings, 0 replies; 7+ messages in thread
From: Vadim Pasternak @ 2020-01-08 14:11 UTC (permalink / raw)
To: linux, robh+dt, vijaykhemka; +Cc: linux-hwmon, devicetree, Vadim Pasternak
Extends driver with support of the additional devices:
Texas Instruments Dual channel DCAP+ multiphase controllers: TPS53688.
Extend Kconfig with added device.
Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
---
drivers/hwmon/pmbus/Kconfig | 4 ++--
drivers/hwmon/pmbus/tps53679.c | 2 ++
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
index 59859979571d..0dd30b07bf18 100644
--- a/drivers/hwmon/pmbus/Kconfig
+++ b/drivers/hwmon/pmbus/Kconfig
@@ -200,10 +200,10 @@ config SENSORS_TPS40422
be called tps40422.
config SENSORS_TPS53679
- tristate "TI TPS53679"
+ tristate "TI TPS53679, TPS53688"
help
If you say yes here you get hardware monitoring support for TI
- TPS53679.
+ TPS53679, TPS53688
This driver can also be built as a module. If so, the module will
be called tps53679.
diff --git a/drivers/hwmon/pmbus/tps53679.c b/drivers/hwmon/pmbus/tps53679.c
index 163e8c6aaa8e..9c22e9013dd7 100644
--- a/drivers/hwmon/pmbus/tps53679.c
+++ b/drivers/hwmon/pmbus/tps53679.c
@@ -85,6 +85,7 @@ static int tps53679_probe(struct i2c_client *client,
static const struct i2c_device_id tps53679_id[] = {
{"tps53679", 0},
+ {"tps53688", 0},
{}
};
@@ -92,6 +93,7 @@ MODULE_DEVICE_TABLE(i2c, tps53679_id);
static const struct of_device_id __maybe_unused tps53679_of_match[] = {
{.compatible = "ti,tps53679"},
+ {.compatible = "ti,tps53688"},
{}
};
MODULE_DEVICE_TABLE(of, tps53679_of_match);
--
2.11.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RFC PATCH hwmon-next v1 4/5] hwmon: (pmbus) Add support for Infineon Multi-phase xdpe122 family controllers
2020-01-08 14:11 [RFC PATCH hwmon-next v1 0/5] hwmon: (pmbus) Add support for vid mode calculation per page bases Vadim Pasternak
` (2 preceding siblings ...)
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 3/5] hwmon: (pmbus/tps53679) Extend device list supported by driver Vadim Pasternak
@ 2020-01-08 14:11 ` Vadim Pasternak
2020-01-11 16:45 ` Guenter Roeck
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 5/5] dt-bindings: Add TI and Infineon VR Controllers as trivial devices Vadim Pasternak
4 siblings, 1 reply; 7+ messages in thread
From: Vadim Pasternak @ 2020-01-08 14:11 UTC (permalink / raw)
To: linux, robh+dt, vijaykhemka; +Cc: linux-hwmon, devicetree, Vadim Pasternak
Add support for devices XDPE12250, XDPE12254, XDPE12283, XDPE12284,
XDPE12286.
All these device support two pages.
The below lists of VOUT_MODE command readout with their related VID
protocols, Digital to Analog Converter steps, supported by these
devices:
VR12.0 mode, 5-mV DAC - 0x01;
VR12.5 mode, 10-mV DAC - 0x02;
IMVP9 mode, 5-mV DAC - 0x03;
AMD mode 6.25mV - 0x10.
Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
---
drivers/hwmon/pmbus/Kconfig | 9 +++
drivers/hwmon/pmbus/Makefile | 1 +
drivers/hwmon/pmbus/xdpe12284.c | 121 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 131 insertions(+)
create mode 100644 drivers/hwmon/pmbus/xdpe12284.c
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
index 0dd30b07bf18..ae6eb02419e6 100644
--- a/drivers/hwmon/pmbus/Kconfig
+++ b/drivers/hwmon/pmbus/Kconfig
@@ -228,6 +228,15 @@ config SENSORS_UCD9200
This driver can also be built as a module. If so, the module will
be called ucd9200.
+config SENSORS_XDPE122
+ tristate "Infineon XDPE122 family"
+ help
+ If you say yes here you get hardware monitoring support for Infineon
+ XDPE12250, XDPE12254, XDPE12283, XDPE12284, XDPE12286 devices.
+
+ This driver can also be built as a module. If so, the module will
+ be called xdpe12284.
+
config SENSORS_ZL6100
tristate "Intersil ZL6100 and compatibles"
help
diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
index 3f8c1014938b..5421fcc0a01c 100644
--- a/drivers/hwmon/pmbus/Makefile
+++ b/drivers/hwmon/pmbus/Makefile
@@ -26,4 +26,5 @@ obj-$(CONFIG_SENSORS_TPS40422) += tps40422.o
obj-$(CONFIG_SENSORS_TPS53679) += tps53679.o
obj-$(CONFIG_SENSORS_UCD9000) += ucd9000.o
obj-$(CONFIG_SENSORS_UCD9200) += ucd9200.o
+obj-$(CONFIG_SENSORS_XDPE122) += xdpe12284.o
obj-$(CONFIG_SENSORS_ZL6100) += zl6100.o
diff --git a/drivers/hwmon/pmbus/xdpe12284.c b/drivers/hwmon/pmbus/xdpe12284.c
new file mode 100644
index 000000000000..91162cfe1be6
--- /dev/null
+++ b/drivers/hwmon/pmbus/xdpe12284.c
@@ -0,0 +1,121 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Hardware monitoring driver for Infineon Multi-phase Digital VR Controllers
+ *
+ * Copyright (c) 2020 Mellanox Technologies. All rights reserved.
+ */
+
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include "pmbus.h"
+
+#define XDPE122_PROT_VR12_5MV 0x01 /* VR12.0 mode, 5-mV DAC */
+#define XDPE122_PROT_VR12_5_10MV 0x02 /* VR12.5 mode, 10-mV DAC */
+#define XDPE122_PROT_IMVP9_10MV 0x03 /* IMVP9 mode, 10-mV DAC */
+#define XDPE122_AMD_625MV 0x10 /* AMD mode 6.25mV */
+#define XDPE122_PAGE_NUM 2
+
+static int xdpe122_identify(struct i2c_client *client,
+ struct pmbus_driver_info *info)
+{
+ u8 vout_params;
+ int i, ret;
+
+ for (i = 0; i < XDPE122_PAGE_NUM; i++) {
+ /* Read the register with VOUT scaling value.*/
+ ret = pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE);
+ if (ret < 0)
+ return ret;
+
+ vout_params = ret & GENMASK(4, 0);
+
+ switch (vout_params) {
+ case XDPE122_PROT_VR12_5_10MV:
+ info->vrm_version[i] = vr13;
+ break;
+ case XDPE122_PROT_VR12_5MV:
+ info->vrm_version[i] = vr12;
+ break;
+ case XDPE122_PROT_IMVP9_10MV:
+ info->vrm_version[i] = imvp9;
+ case XDPE122_AMD_625MV:
+ info->vrm_version[i] = amd625mv;
+ break;
+ default:
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
+static struct pmbus_driver_info xdpe122_info = {
+ .pages = XDPE122_PAGE_NUM,
+ .format[PSC_VOLTAGE_IN] = linear,
+ .format[PSC_VOLTAGE_OUT] = vid,
+ .format[PSC_TEMPERATURE] = linear,
+ .format[PSC_CURRENT_OUT] = linear,
+ .format[PSC_POWER] = linear,
+ .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
+ PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
+ PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
+ PMBUS_HAVE_POUT,
+ .func[1] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
+ PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
+ PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
+ PMBUS_HAVE_POUT,
+ .identify = xdpe122_identify,
+};
+
+static int xdpe122_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ struct pmbus_driver_info *info;
+
+ info = devm_kmemdup(&client->dev, &xdpe122_info, sizeof(*info),
+ GFP_KERNEL);
+ if (!info)
+ return -ENOMEM;
+
+ return pmbus_do_probe(client, id, info);
+}
+
+static const struct i2c_device_id xdpe122_id[] = {
+ {"xdpe12250", 0},
+ {"xdpe12254", 0},
+ {"xdpe12283", 0},
+ {"xdpe12284", 0},
+ {"xdpe12286", 0},
+ {}
+};
+
+MODULE_DEVICE_TABLE(i2c, xdpe122_id);
+
+static const struct of_device_id __maybe_unused xdpe122_of_match[] = {
+ {.compatible = "infineon, xdpe12250"},
+ {.compatible = "infineon, xdpe12254"},
+ {.compatible = "infineon, xdpe12283"},
+ {.compatible = "infineon, xdpe12284"},
+ {.compatible = "infineon, xdpe12286"},
+ {}
+};
+MODULE_DEVICE_TABLE(of, xdpe122_of_match);
+
+static struct i2c_driver xdpe122_driver = {
+ .driver = {
+ .name = "xdpe12284",
+ .of_match_table = of_match_ptr(xdpe122_of_match),
+ },
+ .probe = xdpe122_probe,
+ .remove = pmbus_do_remove,
+ .id_table = xdpe122_id,
+};
+
+module_i2c_driver(xdpe122_driver);
+
+MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>");
+MODULE_DESCRIPTION("PMBus driver for Infineon XDPE122 family");
+MODULE_LICENSE("GPL");
--
2.11.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [RFC PATCH hwmon-next v1 4/5] hwmon: (pmbus) Add support for Infineon Multi-phase xdpe122 family controllers
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 4/5] hwmon: (pmbus) Add support for Infineon Multi-phase xdpe122 family controllers Vadim Pasternak
@ 2020-01-11 16:45 ` Guenter Roeck
0 siblings, 0 replies; 7+ messages in thread
From: Guenter Roeck @ 2020-01-11 16:45 UTC (permalink / raw)
To: Vadim Pasternak; +Cc: robh+dt, vijaykhemka, linux-hwmon, devicetree
On Wed, Jan 08, 2020 at 02:11:39PM +0000, Vadim Pasternak wrote:
> Add support for devices XDPE12250, XDPE12254, XDPE12283, XDPE12284,
> XDPE12286.
>
> All these device support two pages.
> The below lists of VOUT_MODE command readout with their related VID
> protocols, Digital to Analog Converter steps, supported by these
> devices:
> VR12.0 mode, 5-mV DAC - 0x01;
> VR12.5 mode, 10-mV DAC - 0x02;
> IMVP9 mode, 5-mV DAC - 0x03;
> AMD mode 6.25mV - 0x10.
>
> Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
> ---
> drivers/hwmon/pmbus/Kconfig | 9 +++
> drivers/hwmon/pmbus/Makefile | 1 +
> drivers/hwmon/pmbus/xdpe12284.c | 121 ++++++++++++++++++++++++++++++++++++++++
Please also provide Documentation/hwmon/xdpe12284.rst.
That we don't have that for the TI chips is an oversight from my side
and not a reason to skip it here.
Thanks,
Guenter
> 3 files changed, 131 insertions(+)
> create mode 100644 drivers/hwmon/pmbus/xdpe12284.c
>
> diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
> index 0dd30b07bf18..ae6eb02419e6 100644
> --- a/drivers/hwmon/pmbus/Kconfig
> +++ b/drivers/hwmon/pmbus/Kconfig
> @@ -228,6 +228,15 @@ config SENSORS_UCD9200
> This driver can also be built as a module. If so, the module will
> be called ucd9200.
>
> +config SENSORS_XDPE122
> + tristate "Infineon XDPE122 family"
> + help
> + If you say yes here you get hardware monitoring support for Infineon
> + XDPE12250, XDPE12254, XDPE12283, XDPE12284, XDPE12286 devices.
> +
> + This driver can also be built as a module. If so, the module will
> + be called xdpe12284.
> +
> config SENSORS_ZL6100
> tristate "Intersil ZL6100 and compatibles"
> help
> diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
> index 3f8c1014938b..5421fcc0a01c 100644
> --- a/drivers/hwmon/pmbus/Makefile
> +++ b/drivers/hwmon/pmbus/Makefile
> @@ -26,4 +26,5 @@ obj-$(CONFIG_SENSORS_TPS40422) += tps40422.o
> obj-$(CONFIG_SENSORS_TPS53679) += tps53679.o
> obj-$(CONFIG_SENSORS_UCD9000) += ucd9000.o
> obj-$(CONFIG_SENSORS_UCD9200) += ucd9200.o
> +obj-$(CONFIG_SENSORS_XDPE122) += xdpe12284.o
> obj-$(CONFIG_SENSORS_ZL6100) += zl6100.o
> diff --git a/drivers/hwmon/pmbus/xdpe12284.c b/drivers/hwmon/pmbus/xdpe12284.c
> new file mode 100644
> index 000000000000..91162cfe1be6
> --- /dev/null
> +++ b/drivers/hwmon/pmbus/xdpe12284.c
> @@ -0,0 +1,121 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Hardware monitoring driver for Infineon Multi-phase Digital VR Controllers
> + *
> + * Copyright (c) 2020 Mellanox Technologies. All rights reserved.
> + */
> +
> +#include <linux/err.h>
> +#include <linux/i2c.h>
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include "pmbus.h"
> +
> +#define XDPE122_PROT_VR12_5MV 0x01 /* VR12.0 mode, 5-mV DAC */
> +#define XDPE122_PROT_VR12_5_10MV 0x02 /* VR12.5 mode, 10-mV DAC */
> +#define XDPE122_PROT_IMVP9_10MV 0x03 /* IMVP9 mode, 10-mV DAC */
> +#define XDPE122_AMD_625MV 0x10 /* AMD mode 6.25mV */
> +#define XDPE122_PAGE_NUM 2
> +
> +static int xdpe122_identify(struct i2c_client *client,
> + struct pmbus_driver_info *info)
> +{
> + u8 vout_params;
> + int i, ret;
> +
> + for (i = 0; i < XDPE122_PAGE_NUM; i++) {
> + /* Read the register with VOUT scaling value.*/
> + ret = pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE);
> + if (ret < 0)
> + return ret;
> +
> + vout_params = ret & GENMASK(4, 0);
> +
> + switch (vout_params) {
> + case XDPE122_PROT_VR12_5_10MV:
> + info->vrm_version[i] = vr13;
> + break;
> + case XDPE122_PROT_VR12_5MV:
> + info->vrm_version[i] = vr12;
> + break;
> + case XDPE122_PROT_IMVP9_10MV:
> + info->vrm_version[i] = imvp9;
> + case XDPE122_AMD_625MV:
> + info->vrm_version[i] = amd625mv;
> + break;
> + default:
> + return -EINVAL;
> + }
> + }
> +
> + return 0;
> +}
> +
> +static struct pmbus_driver_info xdpe122_info = {
> + .pages = XDPE122_PAGE_NUM,
> + .format[PSC_VOLTAGE_IN] = linear,
> + .format[PSC_VOLTAGE_OUT] = vid,
> + .format[PSC_TEMPERATURE] = linear,
> + .format[PSC_CURRENT_OUT] = linear,
> + .format[PSC_POWER] = linear,
> + .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
> + PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
> + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
> + PMBUS_HAVE_POUT,
> + .func[1] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
> + PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
> + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
> + PMBUS_HAVE_POUT,
> + .identify = xdpe122_identify,
> +};
> +
> +static int xdpe122_probe(struct i2c_client *client,
> + const struct i2c_device_id *id)
> +{
> + struct pmbus_driver_info *info;
> +
> + info = devm_kmemdup(&client->dev, &xdpe122_info, sizeof(*info),
> + GFP_KERNEL);
> + if (!info)
> + return -ENOMEM;
> +
> + return pmbus_do_probe(client, id, info);
> +}
> +
> +static const struct i2c_device_id xdpe122_id[] = {
> + {"xdpe12250", 0},
> + {"xdpe12254", 0},
> + {"xdpe12283", 0},
> + {"xdpe12284", 0},
> + {"xdpe12286", 0},
> + {}
> +};
> +
> +MODULE_DEVICE_TABLE(i2c, xdpe122_id);
> +
> +static const struct of_device_id __maybe_unused xdpe122_of_match[] = {
> + {.compatible = "infineon, xdpe12250"},
> + {.compatible = "infineon, xdpe12254"},
> + {.compatible = "infineon, xdpe12283"},
> + {.compatible = "infineon, xdpe12284"},
> + {.compatible = "infineon, xdpe12286"},
> + {}
> +};
> +MODULE_DEVICE_TABLE(of, xdpe122_of_match);
> +
> +static struct i2c_driver xdpe122_driver = {
> + .driver = {
> + .name = "xdpe12284",
> + .of_match_table = of_match_ptr(xdpe122_of_match),
> + },
> + .probe = xdpe122_probe,
> + .remove = pmbus_do_remove,
> + .id_table = xdpe122_id,
> +};
> +
> +module_i2c_driver(xdpe122_driver);
> +
> +MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>");
> +MODULE_DESCRIPTION("PMBus driver for Infineon XDPE122 family");
> +MODULE_LICENSE("GPL");
^ permalink raw reply [flat|nested] 7+ messages in thread
* [RFC PATCH hwmon-next v1 5/5] dt-bindings: Add TI and Infineon VR Controllers as trivial devices
2020-01-08 14:11 [RFC PATCH hwmon-next v1 0/5] hwmon: (pmbus) Add support for vid mode calculation per page bases Vadim Pasternak
` (3 preceding siblings ...)
2020-01-08 14:11 ` [RFC PATCH hwmon-next v1 4/5] hwmon: (pmbus) Add support for Infineon Multi-phase xdpe122 family controllers Vadim Pasternak
@ 2020-01-08 14:11 ` Vadim Pasternak
4 siblings, 0 replies; 7+ messages in thread
From: Vadim Pasternak @ 2020-01-08 14:11 UTC (permalink / raw)
To: linux, robh+dt, vijaykhemka; +Cc: linux-hwmon, devicetree, Vadim Pasternak
Add Texas Instruments Dual channel DCAP+ multiphase controllers:
TPS53679, TPS53688, and Infineon Multi-phase Digital VR controllers
XDPE12286, XDPE12284, XDPE12283, XDPE12254, XDPE12250 as trivial
devices.
Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
---
Documentation/devicetree/bindings/trivial-devices.yaml | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Documentation/devicetree/bindings/trivial-devices.yaml
index 765fd1c170df..815400b63bc2 100644
--- a/Documentation/devicetree/bindings/trivial-devices.yaml
+++ b/Documentation/devicetree/bindings/trivial-devices.yaml
@@ -104,6 +104,16 @@ properties:
- infineon,slb9645tt
# Infineon TLV493D-A1B6 I2C 3D Magnetic Sensor
- infineon,tlv493d-a1b6
+ # Infineon Multi-phase Digital VR Controller xdpe12250
+ - infineon,xdpe12250
+ # Infineon Multi-phase Digital VR Controller xdpe12254
+ - infineon,xdpe12254
+ # Infineon Multi-phase Digital VR Controller xdpe12283
+ - infineon,xdpe12283
+ # Infineon Multi-phase Digital VR Controller xdpe12284
+ - infineon,xdpe12284
+ # Infineon Multi-phase Digital VR Controller xdpe12286
+ - infineon,xdpe12286
# Inspur Power System power supply unit version 1
- inspur,ipsps1
# Intersil ISL29028 Ambient Light and Proximity Sensor
@@ -354,6 +364,10 @@ properties:
- ti,tmp103
# Digital Temperature Sensor
- ti,tmp275
+ # TI Dual channel DCAP+ multiphase controller TPS53679
+ - ti,tps53679
+ # TI Dual channel DCAP+ multiphase controller TPS53688
+ - ti,tps53688
# Winbond/Nuvoton H/W Monitor
- winbond,w83793
# i2c trusted platform module (TPM)
--
2.11.0
^ permalink raw reply related [flat|nested] 7+ messages in thread