Skip to contentSkip to conversation

Support pli1209bc Digital Supervisor

PATCH Superseded Marcello Sylvester Bauer 2 participants 9 messages Feb 14, 2022

Subsystems (3)

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#1 lore raw

PATCH v2 1/4 dt-bindings: vendor-prefixes: add Vicor Corporation

In reply to Marcello Sylvester Bauer

Add vendor prefix for Vicor Corporation.

---
 Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
index 294093d45a23..047a83a089ce 100644
@@ -1298,6 +1298,8 @@ patternProperties:
     description: Vertexcom Technologies, Inc.
   "^via,.*":
     description: VIA Technologies, Inc.
+  "^vicor,.*":
+    description: Vicor Corporation
   "^videostrong,.*":
     description: Videostrong Technology Co., Ltd.
   "^virtio,.*":
Signature · 1 line
2.34.1
#2 lore raw

PATCH v2 2/4 dt-bindings:trivial-devices: Add pli1209bc

In reply to Marcello Sylvester Bauer

Add trivial device entry for PLI1209BC Digital Supervisor from Vicor Corporation.

---
 Documentation/devicetree/bindings/trivial-devices.yaml | 2 ++
 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/trivial-devices.yaml +2 -0
index 091792ba993e..d03d90360aa0 100644
@@ -354,6 +354,8 @@ properties:
           - ti,tps544c25
             # Winbond/Nuvoton H/W Monitor
           - winbond,w83793
+            # Vicor Corporation Digital Supervisor
+          - vicor,pli1209bc
             # i2c trusted platform module (TPM)
           - winbond,wpct301
 
Signature · 1 line
2.34.1
#0 lore raw

v2 cover Support pli1209bc Digital Supervisor

Hi,

This patch set adds support for PLI1209BC Digital Supervisor from Vicor Corporation. It replaces the previous submitted driver "bcm6123" [1], since there are multiple digital supervisors, which uses BCMs in different configurations [2].

Changes in v2:
- Multiply PMBUS_READ_POUT with 10 (R=1)
instead of dividing PMBUS_READ_PIN by 10.
- Set all pmbus formats to direct.
- Comment reason why page 0 is redundant.
- Import pmbus namespace.

[1]: https://www.spinics.net/lists/linux-hwmon/msg14097.html
[2]: https://www.spinics.net/lists/linux-hwmon/msg14123.html

Marcello Sylvester Bauer (4):
dt-bindings: vendor-prefixes: add Vicor Corporation dt-bindings:trivial-devices: Add pli1209bc
pmbus: Add support for pli1209bc
pmbus (pli1209bc): Add regulator support

 .../devicetree/bindings/trivial-devices.yaml  |   2 +
 .../devicetree/bindings/vendor-prefixes.yaml  |   2 +
 Documentation/hwmon/pli1209bc.rst             |  73 +++++++++
 drivers/hwmon/pmbus/Kconfig                   |  16 ++
 drivers/hwmon/pmbus/Makefile                  |   1 +
 drivers/hwmon/pmbus/pli1209bc.c               | 145 ++++++++++++++++++
 6 files changed, 239 insertions(+)
 create mode 100644 Documentation/hwmon/pli1209bc.rst
 create mode 100644 drivers/hwmon/pmbus/pli1209bc.c
Signature · 1 line
2.34.1
#6 lore raw

PATCH v2 4/4 pmbus (pli1209bc): Add regulator support

Add regulator support for PLI1209BC Digital Supervisor.

---
 drivers/hwmon/pmbus/Kconfig     |  7 +++++++
 drivers/hwmon/pmbus/pli1209bc.c | 31 +++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)
drivers/hwmon/pmbus/Kconfig +7 -0
index 831db423bea0..8b8f0d8733b2 100644
@@ -319,6 +319,13 @@ config SENSORS_PLI1209BC
 	  This driver can also be built as a module. If so, the module will
 	  be called pli1209bc.
 
+config SENSORS_PLI1209BC_REGULATOR
+	bool "Regulator support for PLI1209BC"
+	depends on SENSORS_PLI1209BC && REGULATOR
+	help
+	  If you say yes here you get regulator support for Vicor PLI1209BC
+	  Digital Supervisor.
+
 config SENSORS_PM6764TR
 	tristate "ST PM6764TR"
 	help
drivers/hwmon/pmbus/pli1209bc.c +31 -0
index 8a9af2ccc46f..7212d73f6e04 100644
@@ -8,6 +8,7 @@
 #include <linux/i2c.h>
 #include <linux/module.h>
 #include <linux/pmbus.h>
+#include <linux/regulator/driver.h>
 #include "pmbus.h"
 
 /*
@@ -32,11 +33,37 @@ static int pli1209bc_read_word_data(struct i2c_client *client, int page,
 		if (data < 0)
 			return data;
 		return data * 10;
+	/*
+	 * PMBUS_READ_VOUT and PMBUS_READ_TEMPERATURE_1 return invalid data
+	 * when the BCM is turned off. Since it is not possible to return
+	 * ENODATA error, return zero instead.
+	 */
+	case PMBUS_READ_VOUT:
+	case PMBUS_READ_TEMPERATURE_1:
+		data = pmbus_read_word_data(client, page, phase,
+					    PMBUS_STATUS_WORD);
+		if (data < 0)
+			return data;
+		if (data & PB_STATUS_POWER_GOOD_N)
+			return 0L;
+		return pmbus_read_word_data(client, page, phase, reg);
 	default:
 		return -ENODATA;
 	}
 }
 
+#if IS_ENABLED(CONFIG_SENSORS_PLI1209BC_REGULATOR)
+static const struct regulator_desc pli1209bc_reg_desc = {
+	.name = "vout2",
+	.id = 1,
+	.of_match = of_match_ptr("vout2"),
+	.regulators_node = of_match_ptr("regulators"),
+	.ops = &pmbus_regulator_ops,
+	.type = REGULATOR_VOLTAGE,
+	.owner = THIS_MODULE,
+};
+#endif
+
 static struct pmbus_driver_info pli1209bc_info = {
 	.pages = 2,
 	.format[PSC_VOLTAGE_IN] = direct,
@@ -74,6 +101,10 @@ static struct pmbus_driver_info pli1209bc_info = {
 	    | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
 	    | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_INPUT,
 	.read_word_data = pli1209bc_read_word_data,
+#if IS_ENABLED(CONFIG_SENSORS_PLI1209BC_REGULATOR)
+	.num_regulators = 1,
+	.reg_desc = &pli1209bc_reg_desc,
+#endif
 };
 
 static int pli1209bc_probe(struct i2c_client *client)
Signature · 1 line
2.34.1
#3 lore raw

PATCH v2 3/4 pmbus: Add support for pli1209bc

In reply to Marcello Sylvester Bauer

PLI1209BC is a Digital Supervisor from Vicor Corporation.

---
 Documentation/hwmon/pli1209bc.rst |  73 +++++++++++++++++++
 drivers/hwmon/pmbus/Kconfig       |   9 +++
 drivers/hwmon/pmbus/Makefile      |   1 +
 drivers/hwmon/pmbus/pli1209bc.c   | 114 ++++++++++++++++++++++++++++++
 4 files changed, 197 insertions(+)
 create mode 100644 Documentation/hwmon/pli1209bc.rst
 create mode 100644 drivers/hwmon/pmbus/pli1209bc.c
Documentation/hwmon/pli1209bc.rst new file +73 -0
new file mode 100644
index 000000000000..a3f686d03cf2
@@ -0,0 +1,73 @@
+Kernel driver pli1209bc
+=======================
+
+Supported chips:
+
+  * Digital Supervisor PLI1209BC
+
+    Prefix: 'pli1209bc'
+
+    Addresses scanned: 0x50 - 0x5F
+
+    Datasheet: https://www.vicorpower.com/documents/datasheets/ds-PLI1209BCxyzz-VICOR.pdf
+
+Authors:
+    - Marcello Sylvester Bauer <[email protected]>
+
+Description
+-----------
+
+The Vicor PLI1209BC is an isolated digital power system supervisor thatprovides
+a communication interface between a host processor and one Bus Converter Module
+(BCM). The PLI communicates with a system controller via a PMBus compatible
+interface over an isolated UART interface. Through the PLI, the host processor
+can configure, set protection limits, and monitor the BCM.
+
+Sysfs entries
+-------------
+
+======================= ========================================================
+in1_label		"vin2"
+in1_input		Input voltage.
+in1_rated_min		Minimum rated input voltage.
+in1_rated_max		Maximum rated input voltage.
+in1_max			Maximum input voltage.
+in1_max_alarm		Input voltage high alarm.
+in1_crit		Critical input voltage.
+in1_crit_alarm		Input voltage critical alarm.
+
+in2_label		"vout2"
+in2_input		Output voltage.
+in2_rated_min		Minimum rated output voltage.
+in2_rated_max		Maximum rated output voltage.
+in2_alarm		Output voltage alarm
+
+curr1_label		"iin2"
+curr1_input		Input current.
+curr1_max		Maximum input current.
+curr1_max_alarm		Maximum input current high alarm.
+curr1_crit		Critical input current.
+curr1_crit_alarm	Input current critical alarm.
+
+curr2_label		"iout2"
+curr2_input		Output current.
+curr2_crit		Critical output current.
+curr2_crit_alarm	Output current critical alarm.
+curr2_max		Maximum output current.
+curr2_max_alarm		Output current high alarm.
+
+power1_label		"pin2"
+power1_input		Input power.
+power1_alarm		Input power alarm.
+
+power2_label		"pout2"
+power2_input		Output power.
+power2_rated_max	Maximum rated output power.
+
+temp1_input		Die temperature.
+temp1_alarm		Die temperature alarm.
+temp1_max		Maximum die temperature.
+temp1_max_alarm		Die temperature high alarm.
+temp1_crit		Critical die temperature.
+temp1_crit_alarm	Die temperature critical alarm.
+======================= ========================================================
drivers/hwmon/pmbus/Kconfig +9 -0
index c96f7b7338bd..831db423bea0 100644
@@ -310,6 +310,15 @@ config SENSORS_PIM4328
 	  This driver can also be built as a module. If so, the module will
 	  be called pim4328.
 
+config SENSORS_PLI1209BC
+	tristate "Vicor PLI1209BC"
+	help
+	  If you say yes here you get hardware monitoring support for Vicor
+	  PLI1209BC Digital Supervisor.
+
+	  This driver can also be built as a module. If so, the module will
+	  be called pli1209bc.
+
 config SENSORS_PM6764TR
 	tristate "ST PM6764TR"
 	help
drivers/hwmon/pmbus/Makefile +1 -0
index e5935f70c9e0..7ce74e3b8552 100644
@@ -34,6 +34,7 @@ obj-$(CONFIG_SENSORS_MP2888)	+= mp2888.o
 obj-$(CONFIG_SENSORS_MP2975)	+= mp2975.o
 obj-$(CONFIG_SENSORS_MP5023)	+= mp5023.o
 obj-$(CONFIG_SENSORS_PM6764TR)	+= pm6764tr.o
+obj-$(CONFIG_SENSORS_PLI1209BC)	+= pli1209bc.o
 obj-$(CONFIG_SENSORS_PXE1610)	+= pxe1610.o
 obj-$(CONFIG_SENSORS_Q54SJ108A2)	+= q54sj108a2.o
 obj-$(CONFIG_SENSORS_STPDDC60)	+= stpddc60.o
drivers/hwmon/pmbus/pli1209bc.c new file +114 -0

114 lines not on this page · raw message

Signature · 1 line
2.34.1
maintainer
#4 lore raw

Re: [PATCH v2 3/4] pmbus: Add support for pli1209bc

Quoted 153 lines · Marcello Sylvester Bauer

PLI1209BC is a Digital Supervisor from Vicor Corporation.

---
  Documentation/hwmon/pli1209bc.rst |  73 +++++++++++++++++++
  drivers/hwmon/pmbus/Kconfig       |   9 +++
  drivers/hwmon/pmbus/Makefile      |   1 +
  drivers/hwmon/pmbus/pli1209bc.c   | 114 ++++++++++++++++++++++++++++++
  4 files changed, 197 insertions(+)

create mode 100644 Documentation/hwmon/pli1209bc.rst create mode 100644 drivers/hwmon/pmbus/pli1209bc.c

Documentation/hwmon/pli1209bc.rst new file +73 -0
new file mode 100644
index 000000000000..a3f686d03cf2
@@ -0,0 +1,73 @@
+Kernel driver pli1209bc
+=======================
+
+Supported chips:
+
+  * Digital Supervisor PLI1209BC
+
+    Prefix: 'pli1209bc'
+
+    Addresses scanned: 0x50 - 0x5F
+
+    Datasheet: https://www.vicorpower.com/documents/datasheets/ds-PLI1209BCxyzz-VICOR.pdf
+
+Authors:
+    - Marcello Sylvester Bauer <[email protected]>
+
+Description
+-----------
+
+The Vicor PLI1209BC is an isolated digital power system supervisor thatprovides
+a communication interface between a host processor and one Bus Converter Module
+(BCM). The PLI communicates with a system controller via a PMBus compatible
+interface over an isolated UART interface. Through the PLI, the host processor
+can configure, set protection limits, and monitor the BCM.
+
+Sysfs entries
+-------------
+
+======================= ========================================================
+in1_label		"vin2"
+in1_input		Input voltage.
+in1_rated_min		Minimum rated input voltage.
+in1_rated_max		Maximum rated input voltage.
+in1_max			Maximum input voltage.
+in1_max_alarm		Input voltage high alarm.
+in1_crit		Critical input voltage.
+in1_crit_alarm		Input voltage critical alarm.
+
+in2_label		"vout2"
+in2_input		Output voltage.
+in2_rated_min		Minimum rated output voltage.
+in2_rated_max		Maximum rated output voltage.
+in2_alarm		Output voltage alarm
+
+curr1_label		"iin2"
+curr1_input		Input current.
+curr1_max		Maximum input current.
+curr1_max_alarm		Maximum input current high alarm.
+curr1_crit		Critical input current.
+curr1_crit_alarm	Input current critical alarm.
+
+curr2_label		"iout2"
+curr2_input		Output current.
+curr2_crit		Critical output current.
+curr2_crit_alarm	Output current critical alarm.
+curr2_max		Maximum output current.
+curr2_max_alarm		Output current high alarm.
+
+power1_label		"pin2"
+power1_input		Input power.
+power1_alarm		Input power alarm.
+
+power2_label		"pout2"
+power2_input		Output power.
+power2_rated_max	Maximum rated output power.
+
+temp1_input		Die temperature.
+temp1_alarm		Die temperature alarm.
+temp1_max		Maximum die temperature.
+temp1_max_alarm		Die temperature high alarm.
+temp1_crit		Critical die temperature.
+temp1_crit_alarm	Die temperature critical alarm.
+======================= ========================================================
drivers/hwmon/pmbus/Kconfig +9 -0
index c96f7b7338bd..831db423bea0 100644
@@ -310,6 +310,15 @@ config SENSORS_PIM4328
  	  This driver can also be built as a module. If so, the module will
  	  be called pim4328.
 
+config SENSORS_PLI1209BC
+	tristate "Vicor PLI1209BC"
+	help
+	  If you say yes here you get hardware monitoring support for Vicor
+	  PLI1209BC Digital Supervisor.
+
+	  This driver can also be built as a module. If so, the module will
+	  be called pli1209bc.
+
  config SENSORS_PM6764TR
  	tristate "ST PM6764TR"
  	help
drivers/hwmon/pmbus/Makefile +1 -0
index e5935f70c9e0..7ce74e3b8552 100644
@@ -34,6 +34,7 @@ obj-$(CONFIG_SENSORS_MP2888)	+= mp2888.o
  obj-$(CONFIG_SENSORS_MP2975)	+= mp2975.o
  obj-$(CONFIG_SENSORS_MP5023)	+= mp5023.o
  obj-$(CONFIG_SENSORS_PM6764TR)	+= pm6764tr.o
+obj-$(CONFIG_SENSORS_PLI1209BC)	+= pli1209bc.o
  obj-$(CONFIG_SENSORS_PXE1610)	+= pxe1610.o
  obj-$(CONFIG_SENSORS_Q54SJ108A2)	+= q54sj108a2.o
  obj-$(CONFIG_SENSORS_STPDDC60)	+= stpddc60.o
drivers/hwmon/pmbus/pli1209bc.c new file +24 -0
new file mode 100644
index 000000000000..8a9af2ccc46f
@@ -0,0 +1,114 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Hardware monitoring driver for Vicor PLI1209BC Digital Supervisor
+ *
+ * Copyright (c) 2022 9elements GmbH
+ */
+
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/pmbus.h>
+#include "pmbus.h"
+
+/*
+ * The capability command is only supported at page 0. Probing the device while
+ * the page register is set to 1 will falsely enable PEC support. Disable
+ * capability probing accordingly, since the PLI1209BC does not have any
+ * additional capabilities.
+ */
+static struct pmbus_platform_data pli1209bc_plat_data = {
+	.flags = PMBUS_NO_CAPABILITY,
+};
+
+static int pli1209bc_read_word_data(struct i2c_client *client, int page,
+				    int phase, int reg)

drivers/hwmon/pmbus/pli1209bc.c line 34

Quoted 10 lines
drivers/hwmon/pmbus/pli1209bc.c new file +10 -0
+{
+	int data;
+
+	switch (reg) {
+	/* PMBUS_READ_POUT uses a direct format with R=0 */
+	case PMBUS_READ_POUT:
+		data = pmbus_read_word_data(client, page, phase, reg);
+		if (data < 0)
+			return data;
+		return data * 10;

We have to be more careful here. While the datasheet doesn't explicitly say if the reported value is signed or not, the standard says that it is supposed to be signed, so let's assume that this is the case. That means that 'data' is really 16-bit signed value. We have to make sure that it doesn't over- or underflow when multiplying it, and that the sign is retained. Something like the following should do.

		data = sign_extend32(data, 15) * 10;
		return clamp_val(data, -32768, 32767) & 0xffff;

Otherwise the patch looks good.

Thanks,
Guenter

Quoted 80 lines
drivers/hwmon/pmbus/pli1209bc.c new file +80 -0
+	default:
+		return -ENODATA;
+	}
+}
+
+static struct pmbus_driver_info pli1209bc_info = {
+	.pages = 2,
+	.format[PSC_VOLTAGE_IN] = direct,
+	.format[PSC_VOLTAGE_OUT] = direct,
+	.format[PSC_CURRENT_IN] = direct,
+	.format[PSC_CURRENT_OUT] = direct,
+	.format[PSC_POWER] = direct,
+	.format[PSC_TEMPERATURE] = direct,
+	.m[PSC_VOLTAGE_IN] = 1,
+	.b[PSC_VOLTAGE_IN] = 0,
+	.R[PSC_VOLTAGE_IN] = 1,
+	.m[PSC_VOLTAGE_OUT] = 1,
+	.b[PSC_VOLTAGE_OUT] = 0,
+	.R[PSC_VOLTAGE_OUT] = 1,
+	.m[PSC_CURRENT_IN] = 1,
+	.b[PSC_CURRENT_IN] = 0,
+	.R[PSC_CURRENT_IN] = 3,
+	.m[PSC_CURRENT_OUT] = 1,
+	.b[PSC_CURRENT_OUT] = 0,
+	.R[PSC_CURRENT_OUT] = 2,
+	.m[PSC_POWER] = 1,
+	.b[PSC_POWER] = 0,
+	.R[PSC_POWER] = 1,
+	.m[PSC_TEMPERATURE] = 1,
+	.b[PSC_TEMPERATURE] = 0,
+	.R[PSC_TEMPERATURE] = 0,
+	/*
+	 * Page 0 sums up all attributes except voltage readings.
+	 * The pli1209 digital supervisor only contains a single BCM, making
+	 * page 0 redundant.
+	 */
+	.func[1] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT
+	    | PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT
+	    | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT
+	    | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
+	    | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_INPUT,
+	.read_word_data = pli1209bc_read_word_data,
+};
+
+static int pli1209bc_probe(struct i2c_client *client)
+{
+	client->dev.platform_data = &pli1209bc_plat_data;
+	return pmbus_do_probe(client, &pli1209bc_info);
+}
+
+static const struct i2c_device_id pli1209bc_id[] = {
+	{"pli1209bc", 0},
+	{}
+};
+
+MODULE_DEVICE_TABLE(i2c, pli1209bc_id);
+
+#ifdef CONFIG_OF
+static const struct of_device_id pli1209bc_of_match[] = {
+	{ .compatible = "vicor,pli1209bc" },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, pli1209bc_of_match);
+#endif
+
+static struct i2c_driver pli1209bc_driver = {
+	.driver = {
+		   .name = "pli1209bc",
+		   .of_match_table = of_match_ptr(pli1209bc_of_match),
+		   },
+	.probe_new = pli1209bc_probe,
+	.id_table = pli1209bc_id,
+};
+
+module_i2c_driver(pli1209bc_driver);
+
+MODULE_AUTHOR("Marcello Sylvester Bauer <[email protected]>");
+MODULE_DESCRIPTION("PMBus driver for Vicor PLI1209BC");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS(PMBUS);
maintainer
#7 lore raw

Re: [PATCH v2 4/4] pmbus (pli1209bc): Add regulator support

In reply to Marcello Sylvester Bauer
Quoted 45 lines · Marcello Sylvester Bauer

Add regulator support for PLI1209BC Digital Supervisor.

---
  drivers/hwmon/pmbus/Kconfig     |  7 +++++++
  drivers/hwmon/pmbus/pli1209bc.c | 31 +++++++++++++++++++++++++++++++
  2 files changed, 38 insertions(+)
drivers/hwmon/pmbus/Kconfig +7 -0
index 831db423bea0..8b8f0d8733b2 100644
@@ -319,6 +319,13 @@ config SENSORS_PLI1209BC
  	  This driver can also be built as a module. If so, the module will
  	  be called pli1209bc.
 
+config SENSORS_PLI1209BC_REGULATOR
+	bool "Regulator support for PLI1209BC"
+	depends on SENSORS_PLI1209BC && REGULATOR
+	help
+	  If you say yes here you get regulator support for Vicor PLI1209BC
+	  Digital Supervisor.
+
  config SENSORS_PM6764TR
  	tristate "ST PM6764TR"
  	help
drivers/hwmon/pmbus/pli1209bc.c +4 -0
index 8a9af2ccc46f..7212d73f6e04 100644
@@ -8,6 +8,7 @@
  #include <linux/i2c.h>
  #include <linux/module.h>
  #include <linux/pmbus.h>
+#include <linux/regulator/driver.h>
  #include "pmbus.h"
 
  /*
@@ -32,11 +33,37 @@ static int pli1209bc_read_word_data(struct i2c_client *client, int page,
  		if (data < 0)
  			return data;
  		return data * 10;
+	/*
+	 * PMBUS_READ_VOUT and PMBUS_READ_TEMPERATURE_1 return invalid data
+	 * when the BCM is turned off. Since it is not possible to return

drivers/hwmon/pmbus/pli1209bc.c static int pli1209bc_read_word_data(struct i2c_client *client, int page, · line 48

Quoted 10 lines
drivers/hwmon/pmbus/pli1209bc.c +10 -0
+	 * ENODATA error, return zero instead.
+	 */
+	case PMBUS_READ_VOUT:
+	case PMBUS_READ_TEMPERATURE_1:
+		data = pmbus_read_word_data(client, page, phase,
+					    PMBUS_STATUS_WORD);
+		if (data < 0)
+			return data;
+		if (data & PB_STATUS_POWER_GOOD_N)
+			return 0L;

Why 0L ? The return value of pli1209bc_read_word_data() is int.

Quoted 32 lines
drivers/hwmon/pmbus/pli1209bc.c +17 -0
+		return pmbus_read_word_data(client, page, phase, reg);
  	default:
  		return -ENODATA;
  	}
  }
 
+#if IS_ENABLED(CONFIG_SENSORS_PLI1209BC_REGULATOR)
+static const struct regulator_desc pli1209bc_reg_desc = {
+	.name = "vout2",
+	.id = 1,
+	.of_match = of_match_ptr("vout2"),
+	.regulators_node = of_match_ptr("regulators"),
+	.ops = &pmbus_regulator_ops,
+	.type = REGULATOR_VOLTAGE,
+	.owner = THIS_MODULE,
+};
+#endif
+
  static struct pmbus_driver_info pli1209bc_info = {
  	.pages = 2,
  	.format[PSC_VOLTAGE_IN] = direct,
@@ -74,6 +101,10 @@ static struct pmbus_driver_info pli1209bc_info = {
  	    | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
  	    | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_INPUT,
  	.read_word_data = pli1209bc_read_word_data,
+#if IS_ENABLED(CONFIG_SENSORS_PLI1209BC_REGULATOR)
+	.num_regulators = 1,
+	.reg_desc = &pli1209bc_reg_desc,
+#endif
  };
 
  static int pli1209bc_probe(struct i2c_client *client)
author
#8 lore raw

Re: [PATCH v2 4/4] pmbus (pli1209bc): Add regulator support

Quoted 58 lines · Guenter Roeck
Quoted 57 lines · Marcello Sylvester Bauer

Add regulator support for PLI1209BC Digital Supervisor.

---
  drivers/hwmon/pmbus/Kconfig     |  7 +++++++
  drivers/hwmon/pmbus/pli1209bc.c | 31
+++++++++++++++++++++++++++++++

  2 files changed, 38 insertions(+)
drivers/hwmon/pmbus/Kconfig +0 -0
index 831db423bea0..8b8f0d8733b2 100644
@@ -319,6 +319,13 @@ config SENSORS_PLI1209BC

          This driver can also be built as a module. If so, the module will
          be called pli1209bc.

+config SENSORS_PLI1209BC_REGULATOR
+       bool "Regulator support for PLI1209BC"
+       depends on SENSORS_PLI1209BC && REGULATOR
+       help
+         If you say yes here you get regulator support for Vicor PLI1209BC
+         Digital Supervisor.
+
  config SENSORS_PM6764TR
        tristate "ST PM6764TR"
        help

drivers/hwmon/pmbus/pli1209bc.c +1 -0
index 8a9af2ccc46f..7212d73f6e04 100644
@@ -8,6 +8,7 @@
   #include <linux/i2c.h>
   #include <linux/module.h>
   #include <linux/pmbus.h>
+#include <linux/regulator/driver.h>
   #include "pmbus.h"


  /*

drivers/hwmon/pmbus/pli1209bc.c +2 -0
@@ -32,11 +33,37 @@ static int pli1209bc_read_word_data(struct
 i2c_client *client, int page,
                 if (data < 0)
                         return data;
                 return data * 10;
+       /*
+        * PMBUS_READ_VOUT and PMBUS_READ_TEMPERATURE_1 return

invalid data
+        * when the BCM is turned off. Since it is not possible to return
+        * ENODATA error, return zero instead.
+        */
+       case PMBUS_READ_VOUT:
+       case PMBUS_READ_TEMPERATURE_1:

Quoted 8 lines
Quoted 6 lines

+               data = pmbus_read_word_data(client, page, phase, +                                           PMBUS_STATUS_WORD); +               if (data < 0)
+                       return data;
+               if (data & PB_STATUS_POWER_GOOD_N)
+                       return 0L;

Why 0L ? The return value of pli1209bc_read_word_data() is int.

ack. 0L makes no sense here.

Quoted 36 lines
Quoted 35 lines

+               return pmbus_read_word_data(client, page, phase, reg);
        default:
                return -ENODATA;
        }
  }

drivers/hwmon/pmbus/pli1209bc.c +12 -0
+#if IS_ENABLED(CONFIG_SENSORS_PLI1209BC_REGULATOR)
+static const struct regulator_desc pli1209bc_reg_desc = {
+       .name = "vout2",
+       .id = 1,
+       .of_match = of_match_ptr("vout2"),
+       .regulators_node = of_match_ptr("regulators"),
+       .ops = &pmbus_regulator_ops,
+       .type = REGULATOR_VOLTAGE,
+       .owner = THIS_MODULE,
+};
+#endif
+

  static struct pmbus_driver_info pli1209bc_info = { .pages = 2,
        .format[PSC_VOLTAGE_IN] = direct,

drivers/hwmon/pmbus/pli1209bc.c +0 -0
@@ -74,6 +101,10 @@ static struct pmbus_driver_info pli1209bc_info
 = {
            | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
            | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_INPUT,

        .read_word_data = pli1209bc_read_word_data,

drivers/hwmon/pmbus/pli1209bc.c +4 -0
+#if IS_ENABLED(CONFIG_SENSORS_PLI1209BC_REGULATOR)
+       .num_regulators = 1,
+       .reg_desc = &pli1209bc_reg_desc,
+#endif

  };

  static int pli1209bc_probe(struct i2c_client *client)

author
#5 lore raw

Re: [PATCH v2 3/4] pmbus: Add support for pli1209bc

In reply to Guenter Roeck
Quoted 195 lines · Guenter Roeck
Quoted 180 lines · Marcello Sylvester Bauer

PLI1209BC is a Digital Supervisor from Vicor Corporation.

---
  Documentation/hwmon/pli1209bc.rst |  73 +++++++++++++++++++ drivers/hwmon/pmbus/Kconfig       |   9 +++ drivers/hwmon/pmbus/Makefile      |   1 + drivers/hwmon/pmbus/pli1209bc.c   | 114
++++++++++++++++++++++++++++++

  4 files changed, 197 insertions(+)

  create mode 100644 Documentation/hwmon/pli1209bc.rst create mode 100644 drivers/hwmon/pmbus/pli1209bc.c

Documentation/hwmon/pli1209bc.rst new file +12 -0
new file mode 100644
index 000000000000..a3f686d03cf2
@@ -0,0 +1,73 @@
+Kernel driver pli1209bc
+=======================
+
+Supported chips:
+
+  * Digital Supervisor PLI1209BC
+
+    Prefix: 'pli1209bc'
+
+    Addresses scanned: 0x50 - 0x5F
+
+    Datasheet:

https://www.vicorpower.com/documents/datasheets/ds-PLI1209BCxyzz-VICOR.pdf

Documentation/hwmon/pli1209bc.rst new file +8 -0
+
+Authors:
+    - Marcello Sylvester Bauer <[email protected]>
+
+Description
+-----------
+
+The Vicor PLI1209BC is an isolated digital power system supervisor

thatprovides
+a communication interface between a host processor and one Bus Converter Module
+(BCM). The PLI communicates with a system controller via a PMBus compatible
+interface over an isolated UART interface. Through the PLI, the host processor

Documentation/hwmon/pli1209bc.rst new file +6 -0
+can configure, set protection limits, and monitor the BCM.
+
+Sysfs entries
+-------------
+
+=======================

========================================================

Documentation/hwmon/pli1209bc.rst new file +44 -0
+in1_label              "vin2"
+in1_input              Input voltage.
+in1_rated_min          Minimum rated input voltage.
+in1_rated_max          Maximum rated input voltage.
+in1_max                        Maximum input voltage.
+in1_max_alarm          Input voltage high alarm.
+in1_crit               Critical input voltage.
+in1_crit_alarm         Input voltage critical alarm.
+
+in2_label              "vout2"
+in2_input              Output voltage.
+in2_rated_min          Minimum rated output voltage.
+in2_rated_max          Maximum rated output voltage.
+in2_alarm              Output voltage alarm
+
+curr1_label            "iin2"
+curr1_input            Input current.
+curr1_max              Maximum input current.
+curr1_max_alarm                Maximum input current high alarm.
+curr1_crit             Critical input current.
+curr1_crit_alarm       Input current critical alarm.
+
+curr2_label            "iout2"
+curr2_input            Output current.
+curr2_crit             Critical output current.
+curr2_crit_alarm       Output current critical alarm.
+curr2_max              Maximum output current.
+curr2_max_alarm                Output current high alarm.
+
+power1_label           "pin2"
+power1_input           Input power.
+power1_alarm           Input power alarm.
+
+power2_label           "pout2"
+power2_input           Output power.
+power2_rated_max       Maximum rated output power.
+
+temp1_input            Die temperature.
+temp1_alarm            Die temperature alarm.
+temp1_max              Maximum die temperature.
+temp1_max_alarm                Die temperature high alarm.
+temp1_crit             Critical die temperature.
+temp1_crit_alarm       Die temperature critical alarm.
+=======================

========================================================

drivers/hwmon/pmbus/Kconfig +0 -0
index c96f7b7338bd..831db423bea0 100644
@@ -310,6 +310,15 @@ config SENSORS_PIM4328

          This driver can also be built as a module. If so, the module will
          be called pim4328.

+config SENSORS_PLI1209BC
+       tristate "Vicor PLI1209BC"
+       help
+         If you say yes here you get hardware monitoring support for Vicor
+         PLI1209BC Digital Supervisor.
+
+         This driver can also be built as a module. If so, the module will
+         be called pli1209bc.
+
  config SENSORS_PM6764TR
        tristate "ST PM6764TR"
        help

drivers/hwmon/pmbus/Makefile +0 -0
index e5935f70c9e0..7ce74e3b8552 100644
@@ -34,6 +34,7 @@ obj-$(CONFIG_SENSORS_MP2888)  += mp2888.o

  obj-$(CONFIG_SENSORS_MP2975)  += mp2975.o obj-$(CONFIG_SENSORS_MP5023)  += mp5023.o obj-$(CONFIG_SENSORS_PM6764TR)        += pm6764tr.o +obj-$(CONFIG_SENSORS_PLI1209BC)        += pli1209bc.o obj-$(CONFIG_SENSORS_PXE1610) += pxe1610.o obj-$(CONFIG_SENSORS_Q54SJ108A2)      += q54sj108a2.o obj-$(CONFIG_SENSORS_STPDDC60)        += stpddc60.o

drivers/hwmon/pmbus/pli1209bc.c new file +3 -0
new file mode 100644
index 000000000000..8a9af2ccc46f
@@ -0,0 +1,114 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Hardware monitoring driver for Vicor PLI1209BC Digital

Supervisor
+ *
+ * Copyright (c) 2022 9elements GmbH
+ */

drivers/hwmon/pmbus/pli1209bc.c new file +8 -0
+
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/pmbus.h>
+#include "pmbus.h"
+
+/*
+ * The capability command is only supported at page 0. Probing the

device while
+ * the page register is set to 1 will falsely enable PEC support. Disable
+ * capability probing accordingly, since the PLI1209BC does not have any
+ * additional capabilities.
+ */

drivers/hwmon/pmbus/pli1209bc.c new file +5 -0
+static struct pmbus_platform_data pli1209bc_plat_data = {
+       .flags = PMBUS_NO_CAPABILITY,
+};
+
+static int pli1209bc_read_word_data(struct i2c_client *client, int

page,
+                                   int phase, int reg)

drivers/hwmon/pmbus/pli1209bc.c new file +7 -0
+{
+       int data;
+
+       switch (reg) {
+       /* PMBUS_READ_POUT uses a direct format with R=0 */
+       case PMBUS_READ_POUT:
+               data = pmbus_read_word_data(client, page, phase,
Quoted 4 lines

reg);
+               if (data < 0)
+                       return data;
+               return data * 10;

We have to be more careful here. While the datasheet doesn't explicitly
say if the reported value is signed or not, the standard says that it is supposed to be signed, so let's assume that this is the case. That means that 'data' is really 16-bit signed value. We have to make sure that it doesn't over- or underflow when multiplying it, and that the sign is retained. Something like the following should do.

Quoted 2 lines

                data = sign_extend32(data, 15) * 10; return clamp_val(data, -32768, 32767) & 0xffff;

Being careful makes sense indeed.
I guess we should not use definitions in limit.h, since int size is arch specific. I'll take it like this.

Thanks,
Marcello

Quoted 92 lines

Otherwise the patch looks good.

Thanks,
Guenter

Quoted 82 lines

+       default:
+               return -ENODATA;
+       }

drivers/hwmon/pmbus/pli1209bc.c new file +31 -0
+}
+
+static struct pmbus_driver_info pli1209bc_info = {
+       .pages = 2,
+       .format[PSC_VOLTAGE_IN] = direct,
+       .format[PSC_VOLTAGE_OUT] = direct,
+       .format[PSC_CURRENT_IN] = direct,
+       .format[PSC_CURRENT_OUT] = direct,
+       .format[PSC_POWER] = direct,
+       .format[PSC_TEMPERATURE] = direct,
+       .m[PSC_VOLTAGE_IN] = 1,
+       .b[PSC_VOLTAGE_IN] = 0,
+       .R[PSC_VOLTAGE_IN] = 1,
+       .m[PSC_VOLTAGE_OUT] = 1,
+       .b[PSC_VOLTAGE_OUT] = 0,
+       .R[PSC_VOLTAGE_OUT] = 1,
+       .m[PSC_CURRENT_IN] = 1,
+       .b[PSC_CURRENT_IN] = 0,
+       .R[PSC_CURRENT_IN] = 3,
+       .m[PSC_CURRENT_OUT] = 1,
+       .b[PSC_CURRENT_OUT] = 0,
+       .R[PSC_CURRENT_OUT] = 2,
+       .m[PSC_POWER] = 1,
+       .b[PSC_POWER] = 0,
+       .R[PSC_POWER] = 1,
+       .m[PSC_TEMPERATURE] = 1,
+       .b[PSC_TEMPERATURE] = 0,
+       .R[PSC_TEMPERATURE] = 0,
+       /*
+        * Page 0 sums up all attributes except voltage readings.
+        * The pli1209 digital supervisor only contains a single

BCM, making
+        * page 0 redundant.
+        */
+       .func[1] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT

+           | PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT
+           | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT
+           | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
+           | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_INPUT,

+       .read_word_data = pli1209bc_read_word_data,

drivers/hwmon/pmbus/pli1209bc.c new file +27 -0
+};
+
+static int pli1209bc_probe(struct i2c_client *client)
+{
+       client->dev.platform_data = &pli1209bc_plat_data;
+       return pmbus_do_probe(client, &pli1209bc_info);
+}
+
+static const struct i2c_device_id pli1209bc_id[] = {
+       {"pli1209bc", 0},
+       {}
+};
+
+MODULE_DEVICE_TABLE(i2c, pli1209bc_id);
+
+#ifdef CONFIG_OF
+static const struct of_device_id pli1209bc_of_match[] = {
+       { .compatible = "vicor,pli1209bc" },
+       { },
+};
+MODULE_DEVICE_TABLE(of, pli1209bc_of_match);
+#endif
+
+static struct i2c_driver pli1209bc_driver = {
+       .driver = {
+                  .name = "pli1209bc",
+                  .of_match_table =

of_match_ptr(pli1209bc_of_match),
+                  },
+       .probe_new = pli1209bc_probe,
+       .id_table = pli1209bc_id,

drivers/hwmon/pmbus/pli1209bc.c new file +8 -0
+};
+
+module_i2c_driver(pli1209bc_driver);
+
+MODULE_AUTHOR("Marcello Sylvester Bauer <[email protected]>");
+MODULE_DESCRIPTION("PMBus driver for Vicor PLI1209BC");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS(PMBUS);