* [PATCH v1 0/4] Add support for Intel CRPS PSU
@ 2024-12-12 21:48 Ninad Palsule
2024-12-12 21:49 ` [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp Ninad Palsule
` (3 more replies)
0 siblings, 4 replies; 12+ messages in thread
From: Ninad Palsule @ 2024-12-12 21:48 UTC (permalink / raw)
To: robh, krzk+dt, conor+dt, eajames, jdelvare, linux, corbet, joel,
andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
Cc: Ninad Palsule
Hello,
Please review the changes for Intel CRPS power supply driver.
I need to add label in the pmbus core as new application like PSUSensor
requires it.
Ninad Palsule (4):
hwmon: pmbus-core: Add label for fan and temp
hwmon: (pmbus/crps) Add Intel CRPS185 power supply
dt-bindings: hwmon: intel,crps185: Add to trivial
ARM: dts: aspeed: system1: Use crps PSU driver
.../devicetree/bindings/trivial-devices.yaml | 2 +
Documentation/hwmon/crps.rst | 95 ++++++
MAINTAINERS | 7 +
.../dts/aspeed/aspeed-bmc-ibm-system1.dts | 8 +-
drivers/hwmon/pmbus/Kconfig | 9 +
drivers/hwmon/pmbus/Makefile | 1 +
drivers/hwmon/pmbus/crps.c | 299 ++++++++++++++++++
drivers/hwmon/pmbus/pmbus_core.c | 14 +
8 files changed, 431 insertions(+), 4 deletions(-)
create mode 100644 Documentation/hwmon/crps.rst
create mode 100644 drivers/hwmon/pmbus/crps.c
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp
2024-12-12 21:48 [PATCH v1 0/4] Add support for Intel CRPS PSU Ninad Palsule
@ 2024-12-12 21:49 ` Ninad Palsule
2024-12-12 22:06 ` Guenter Roeck
2024-12-12 21:49 ` [PATCH v1 2/4] hwmon: (pmbus/crps) Add Intel CRPS185 power supply Ninad Palsule
` (2 subsequent siblings)
3 siblings, 1 reply; 12+ messages in thread
From: Ninad Palsule @ 2024-12-12 21:49 UTC (permalink / raw)
To: robh, krzk+dt, conor+dt, eajames, jdelvare, linux, corbet, joel,
andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
Cc: Ninad Palsule
Adding label files for fan and temperature sensors in the power supply.
The openbmc application dbus-sensor(psusensor) requires those files to
consfigure those sensors.
Note that prefix for temp label is temp[A..C] used instead of temp[1..3]
as dbus-sensor(psusensor) application calculate index based on last
digit in the name so we do not want to make index double digit after
appending page index.
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
---
drivers/hwmon/pmbus/pmbus_core.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index a7000314e5ad..149b3c5f3a4c 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -2144,6 +2144,7 @@ static const struct pmbus_sensor_attr temp_attributes[] = {
{
.reg = PMBUS_READ_TEMPERATURE_1,
.class = PSC_TEMPERATURE,
+ .label = "tempA",
.paged = true,
.update = true,
.compare = true,
@@ -2156,6 +2157,7 @@ static const struct pmbus_sensor_attr temp_attributes[] = {
}, {
.reg = PMBUS_READ_TEMPERATURE_2,
.class = PSC_TEMPERATURE,
+ .label = "tempB",
.paged = true,
.update = true,
.compare = true,
@@ -2168,6 +2170,7 @@ static const struct pmbus_sensor_attr temp_attributes[] = {
}, {
.reg = PMBUS_READ_TEMPERATURE_3,
.class = PSC_TEMPERATURE,
+ .label = "tempC",
.paged = true,
.update = true,
.compare = true,
@@ -2282,6 +2285,17 @@ static int pmbus_add_fan_attributes(struct i2c_client *client,
PSC_FAN, true, true, true) == NULL)
return -ENOMEM;
+ /*
+ * Add fan label.
+ * Assuming paged attributes while passing page index
+ */
+ ret = pmbus_add_label(data, "fan", index, "fan",
+ page + 1, 0xff);
+ if (ret) {
+ dev_err(data->dev, "Fan label add failed ret=%d\n", ret);
+ return ret;
+ }
+
/* Fan control */
if (pmbus_check_word_register(client, page,
pmbus_fan_command_registers[f])) {
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v1 2/4] hwmon: (pmbus/crps) Add Intel CRPS185 power supply
2024-12-12 21:48 [PATCH v1 0/4] Add support for Intel CRPS PSU Ninad Palsule
2024-12-12 21:49 ` [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp Ninad Palsule
@ 2024-12-12 21:49 ` Ninad Palsule
2024-12-13 1:29 ` Guenter Roeck
2024-12-12 21:49 ` [PATCH v1 3/4] dt-bindings: hwmon: intel,crps185: Add to trivial Ninad Palsule
2024-12-12 21:49 ` [PATCH v1 4/4] ARM: dts: aspeed: system1: Use crps PSU driver Ninad Palsule
3 siblings, 1 reply; 12+ messages in thread
From: Ninad Palsule @ 2024-12-12 21:49 UTC (permalink / raw)
To: robh, krzk+dt, conor+dt, eajames, jdelvare, linux, corbet, joel,
andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
Cc: Ninad Palsule
Add the driver to monitor Intel common redundant power supply (crps185)
with hwmon over pmbus.
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
---
Documentation/hwmon/crps.rst | 95 +++++++++++
MAINTAINERS | 7 +
drivers/hwmon/pmbus/Kconfig | 9 ++
drivers/hwmon/pmbus/Makefile | 1 +
drivers/hwmon/pmbus/crps.c | 299 +++++++++++++++++++++++++++++++++++
5 files changed, 411 insertions(+)
create mode 100644 Documentation/hwmon/crps.rst
create mode 100644 drivers/hwmon/pmbus/crps.c
diff --git a/Documentation/hwmon/crps.rst b/Documentation/hwmon/crps.rst
new file mode 100644
index 000000000000..81d5dfd68a46
--- /dev/null
+++ b/Documentation/hwmon/crps.rst
@@ -0,0 +1,95 @@
+.. SPDX-License-Identifier: GPL-2.0-or-later
+
+Kernel driver crps
+========================
+
+Supported chips:
+
+ * Intel CRPS185
+
+ Prefix: 'crps185'
+
+ Addresses scanned: -
+
+Authors:
+ Ninad Palsule <ninad@linux.ibm.com>
+
+
+Description
+-----------
+
+This driver implements support for Common Redundant Power supply with PMBus
+support.
+
+The driver is a client driver to the core PMBus driver.
+Please see Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
+
+
+Usage Notes
+-----------
+
+This driver does not auto-detect devices. You will have to instantiate the
+devices explicitly. Please see Documentation/i2c/instantiating-devices.rst for
+details.
+
+
+Sysfs entries
+-------------
+
+======================= ======================================================
+curr1_label "iin"
+curr1_input Measured input current
+curr1_max Maximum input current
+curr1_max_alarm Input maximum current high alarm
+curr1_crit Critial high input current
+curr1_crit_alarm Input critical current high alarm
+curr1_rated_max Maximum rated input current
+
+curr2_label "iout1"
+curr2_input Measured output current
+curr2_max Maximum output current
+curr2_max_alarm Output maximum current high alarm
+curr2_crit Critial high output current
+curr2_crit_alarm Output critical current high alarm
+curr2_rated_max Maximum rated output current
+
+in1_label "vin"
+in1_input Measured input voltage
+in1_crit Critical input over voltage
+in1_crit_alarm Critical input over voltage alarm
+in1_max Maximum input over voltage
+in1_max_alarm Maximum input over voltage alarm
+in1_rated_min Minimum rated input voltage
+in1_rated_max Maximum rated input voltage
+
+in2_label "vout1"
+in2_input Measured input voltage
+in2_crit Critical input over voltage
+in2_crit_alarm Critical input over voltage alarm
+in2_lcrit Critical input under voltage fault
+in2_lcrit_alarm Critical input under voltage fault alarm
+in2_max Maximum input over voltage
+in2_max_alarm Maximum input over voltage alarm
+in2_min Minimum input under voltage warning
+in2_min_alarm Minimum input under voltage warning alarm
+in2_rated_min Minimum rated input voltage
+in2_rated_max Maximum rated input voltage
+
+power1_label "pin"
+power1_input Measured input power
+power1_alarm Input power high alarm
+power1_max Maximum input power
+power1_rated_max Maximum rated input power
+
+temp[1-2]_input Measured temperature
+temp[1-2]_crit Critical temperature
+temp[1-2]_crit_alarm Critical temperature alarm
+temp[1-2]_max Maximum temperature
+temp[1-2]_max_alarm Maximum temperature alarm
+temp[1-2]_rated_max Maximum rated temperature
+
+fan1_alarm Fan 1 warning.
+fan1_fault Fan 1 fault.
+fan1_input Fan 1 speed in RPM.
+fan1_target Fan 1 target.
+======================= ======================================================
diff --git a/MAINTAINERS b/MAINTAINERS
index 637ddd44245f..6b31d545f0f1 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -6100,6 +6100,13 @@ L: linux-input@vger.kernel.org
S: Maintained
F: drivers/hid/hid-creative-sb0540.c
+CRPS COMMON REDUNDANT PSU DRIVER
+M: Ninad Palsule <ninad@linux.ibm.com>
+L: linux-hwmon@vger.kernel.org
+S: Maintained
+F: Documentation/hwmon/crps.rst
+F: drivers/hwmon/pmbus/crps.c
+
CRYPTO API
M: Herbert Xu <herbert@gondor.apana.org.au>
M: "David S. Miller" <davem@davemloft.net>
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
index 22418a05ced0..56c4eb4b846e 100644
--- a/drivers/hwmon/pmbus/Kconfig
+++ b/drivers/hwmon/pmbus/Kconfig
@@ -85,6 +85,15 @@ config SENSORS_BPA_RS600
This driver can also be built as a module. If so, the module will
be called bpa-rs600.
+config SENSORS_CRPS
+ tristate "Common Redundant Power Supply"
+ help
+ If you say yes here you get hardware monitoring support for the Common
+ Redundant Power Supply.
+
+ This driver can also be built as a module. If so, the module will
+ be called crps.
+
config SENSORS_DELTA_AHE50DC_FAN
tristate "Delta AHE-50DC fan control module"
help
diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
index 3d3183f8d2a7..c7eb7739b7f8 100644
--- a/drivers/hwmon/pmbus/Makefile
+++ b/drivers/hwmon/pmbus/Makefile
@@ -62,3 +62,4 @@ obj-$(CONFIG_SENSORS_XDPE122) += xdpe12284.o
obj-$(CONFIG_SENSORS_XDPE152) += xdpe152c4.o
obj-$(CONFIG_SENSORS_ZL6100) += zl6100.o
obj-$(CONFIG_SENSORS_PIM4328) += pim4328.o
+obj-$(CONFIG_SENSORS_CRPS) += crps.o
diff --git a/drivers/hwmon/pmbus/crps.c b/drivers/hwmon/pmbus/crps.c
new file mode 100644
index 000000000000..44d309f81803
--- /dev/null
+++ b/drivers/hwmon/pmbus/crps.c
@@ -0,0 +1,299 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright 2024 IBM Corp.
+ */
+
+#include <linux/debugfs.h>
+#include <linux/i2c.h>
+#include <linux/of.h>
+#include <linux/pmbus.h>
+
+#include "pmbus.h"
+
+/* Intel crps185 specific commands. */
+#define CRPS185_MFR_IOUT_MAX 0xA6
+#define CRPS185_MFR_POUT_MAX 0xA7
+
+enum {
+ CRPS_DEBUGFS_PMBUS_REVISION = 0,
+ CRPS_DEBUGFS_MAX_POWER_OUT,
+ CRPS_DEBUGFS_MAX_CURRENT_OUT,
+ CRPS_DEBUGFS_NUM_ENTRIES
+};
+
+enum models { crps185 = 1, crps_unknown };
+
+struct crps {
+ enum models version;
+ struct i2c_client *client;
+
+ int debugfs_entries[CRPS_DEBUGFS_NUM_ENTRIES];
+};
+
+#define to_psu(x, y) container_of((x), struct crps, debugfs_entries[(y)])
+
+static struct pmbus_platform_data crps_pdata = {
+ .flags = PMBUS_SKIP_STATUS_CHECK,
+};
+
+static const struct i2c_device_id crps_id[] = {
+ { "intel_crps185", crps185 },
+ {}
+};
+MODULE_DEVICE_TABLE(i2c, crps_id);
+
+/*
+ * Convert linear format word to machine format. 11 LSB side bits are two's
+ * complement integer mantissa and 5 MSB side bits are two's complement
+ * exponent
+ */
+static int crps_convert_linear(int rc)
+{
+ s16 exponent;
+ s32 mantissa;
+ s64 val;
+
+ exponent = ((s16)rc) >> 11;
+ mantissa = ((s16)((rc & 0x7ff) << 5)) >> 5;
+
+ val = mantissa;
+ if (exponent >= 0)
+ val <<= exponent;
+ else
+ val >>= -exponent;
+
+ return (int)val;
+}
+
+static ssize_t crps_debugfs_read(struct file *file, char __user *buf,
+ size_t count, loff_t *ppos)
+{
+ int rc;
+ int *idxp = file->private_data;
+ int idx = *idxp;
+ struct crps *psu = to_psu(idxp, idx);
+ char data[2 * I2C_SMBUS_BLOCK_MAX] = { 0 };
+
+ rc = pmbus_lock_interruptible(psu->client);
+ if (rc)
+ return rc;
+
+ rc = pmbus_set_page(psu->client, 0, 0xff);
+ if (rc)
+ goto unlock;
+
+ switch (idx) {
+ case CRPS_DEBUGFS_PMBUS_REVISION:
+ rc = i2c_smbus_read_byte_data(psu->client, PMBUS_REVISION);
+ if (rc >= 0) {
+ if (psu->version == crps185) {
+ if (rc == 0)
+ rc = sprintf(data, "%s", "1.0");
+ else if (rc == 0x11)
+ rc = sprintf(data, "%s", "1.1");
+ else if (rc == 0x22)
+ rc = sprintf(data, "%s", "1.2");
+ else
+ rc = snprintf(data, 3, "0x%02x", rc);
+ } else {
+ rc = snprintf(data, 3, "%02x", rc);
+ }
+ }
+ break;
+ case CRPS_DEBUGFS_MAX_POWER_OUT:
+ rc = i2c_smbus_read_word_data(psu->client, PMBUS_MFR_POUT_MAX);
+ if (rc >= 0) {
+ rc = crps_convert_linear(rc);
+ rc = snprintf(data, I2C_SMBUS_BLOCK_MAX, "%d", rc);
+ }
+ break;
+ case CRPS_DEBUGFS_MAX_CURRENT_OUT:
+ rc = i2c_smbus_read_word_data(psu->client, PMBUS_MFR_IOUT_MAX);
+ if (rc >= 0) {
+ rc = crps_convert_linear(rc);
+ rc = snprintf(data, I2C_SMBUS_BLOCK_MAX, "%d", rc);
+ }
+ break;
+ default:
+ rc = -EINVAL;
+ break;
+ }
+
+unlock:
+ pmbus_unlock(psu->client);
+ if (rc < 0)
+ return rc;
+
+ data[rc] = '\n';
+ rc += 2;
+
+ return simple_read_from_buffer(buf, count, ppos, data, rc);
+}
+
+static const struct file_operations crps_debugfs_fops = {
+ .llseek = noop_llseek,
+ .read = crps_debugfs_read,
+ .open = simple_open,
+};
+
+static int crps_read_word_data(struct i2c_client *client, int page,
+ int phase, int reg)
+{
+ int rc;
+
+ switch (reg) {
+ case PMBUS_STATUS_WORD:
+ rc = pmbus_read_word_data(client, page, phase, reg);
+ if (rc < 0)
+ return rc;
+ break;
+ case PMBUS_OT_WARN_LIMIT:
+ rc = pmbus_read_word_data(client, page, phase,
+ PMBUS_MFR_MAX_TEMP_1);
+ if (rc < 0)
+ return rc;
+ break;
+ case PMBUS_IOUT_OC_WARN_LIMIT:
+ rc = pmbus_read_word_data(client, page, phase,
+ CRPS185_MFR_IOUT_MAX);
+ if (rc < 0)
+ return rc;
+ break;
+ case PMBUS_POUT_OP_WARN_LIMIT:
+ rc = pmbus_read_word_data(client, page, phase,
+ CRPS185_MFR_POUT_MAX);
+ if (rc < 0)
+ return rc;
+ break;
+ default:
+ rc = -ENODATA;
+ break;
+ }
+
+ return rc;
+}
+
+static struct pmbus_driver_info crps_info[] = {
+ [crps185] = {
+ .pages = 1,
+ /* PSU uses default linear data format. */
+ .func[0] = PMBUS_HAVE_PIN | PMBUS_HAVE_IOUT |
+ PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_IIN |
+ PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT |
+ PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
+ PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 |
+ PMBUS_HAVE_STATUS_TEMP |
+ PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
+ .read_word_data = crps_read_word_data,
+ },
+};
+
+#define to_psu(x, y) container_of((x), struct crps, debugfs_entries[(y)])
+
+static void crps_init_debugfs(struct crps *psu)
+{
+ struct i2c_client *client = psu->client;
+ struct dentry *debugfs;
+ int i;
+
+ /* Don't fail the probe if we can't create debugfs */
+ debugfs = pmbus_get_debugfs_dir(client);
+ if (!debugfs)
+ return;
+
+ for (i = 0; i < CRPS_DEBUGFS_NUM_ENTRIES; ++i)
+ psu->debugfs_entries[i] = i;
+
+ debugfs_create_file("pmbus_revision", 0444, debugfs,
+ &psu->debugfs_entries[CRPS_DEBUGFS_PMBUS_REVISION],
+ &crps_debugfs_fops);
+ debugfs_create_file("max_power_out", 0444, debugfs,
+ &psu->debugfs_entries[CRPS_DEBUGFS_MAX_POWER_OUT],
+ &crps_debugfs_fops);
+ debugfs_create_file("max_current_out", 0444, debugfs,
+ &psu->debugfs_entries[CRPS_DEBUGFS_MAX_CURRENT_OUT],
+ &crps_debugfs_fops);
+}
+
+static int crps_probe(struct i2c_client *client)
+{
+ int rc;
+ struct device *dev = &client->dev;
+ enum models vs = crps_unknown;
+ struct crps *psu;
+ const void *md = of_device_get_match_data(&client->dev);
+ const struct i2c_device_id *id = NULL;
+ char buf[I2C_SMBUS_BLOCK_MAX + 2] = { 0 };
+
+ if (md) {
+ vs = (uintptr_t)md;
+ } else {
+ id = i2c_match_id(crps_id, client);
+ if (id)
+ vs = (enum models)id->driver_data;
+ }
+
+ if (!vs || vs >= crps_unknown) {
+ dev_err(dev, "Version %d not supported\n", vs);
+ return -EINVAL;
+ }
+
+ rc = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf);
+ if (rc < 0) {
+ dev_err(dev, "Failed to read PMBUS_MFR_MODEL\n");
+ return rc;
+ }
+ if (strncmp(buf, "03NK260", 7)) {
+ buf[rc] = '\0';
+ dev_err(dev, "Model '%s' not supported\n", buf);
+ return -ENODEV;
+ }
+
+ client->dev.platform_data = &crps_pdata;
+ rc = pmbus_do_probe(client, &crps_info[vs]);
+ if (rc) {
+ dev_err(dev, "Failed to probe %d\n", rc);
+ return rc;
+ }
+
+ /*
+ * Don't fail the probe if there isn't enough memory for debugfs.
+ */
+ psu = devm_kzalloc(&client->dev, sizeof(*psu), GFP_KERNEL);
+ if (!psu) {
+ dev_warn(dev, "Failed to allocate memory. debugfs are not supported.\n");
+ return 0;
+ }
+
+ psu->version = vs;
+ psu->client = client;
+
+ crps_init_debugfs(psu);
+
+ return 0;
+}
+
+static const struct of_device_id crps_of_match[] = {
+ {
+ .compatible = "intel,crps185",
+ .data = (void *)crps185
+ },
+ {}
+};
+MODULE_DEVICE_TABLE(of, crps_of_match);
+
+static struct i2c_driver crps_driver = {
+ .driver = {
+ .name = "crps",
+ .of_match_table = crps_of_match,
+ },
+ .probe = crps_probe,
+ .id_table = crps_id,
+};
+
+module_i2c_driver(crps_driver);
+
+MODULE_AUTHOR("Ninad Palsule");
+MODULE_DESCRIPTION("PMBus driver for Common Redundant power supplies");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("PMBUS");
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v1 3/4] dt-bindings: hwmon: intel,crps185: Add to trivial
2024-12-12 21:48 [PATCH v1 0/4] Add support for Intel CRPS PSU Ninad Palsule
2024-12-12 21:49 ` [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp Ninad Palsule
2024-12-12 21:49 ` [PATCH v1 2/4] hwmon: (pmbus/crps) Add Intel CRPS185 power supply Ninad Palsule
@ 2024-12-12 21:49 ` Ninad Palsule
2024-12-13 11:08 ` Krzysztof Kozlowski
2024-12-12 21:49 ` [PATCH v1 4/4] ARM: dts: aspeed: system1: Use crps PSU driver Ninad Palsule
3 siblings, 1 reply; 12+ messages in thread
From: Ninad Palsule @ 2024-12-12 21:49 UTC (permalink / raw)
To: robh, krzk+dt, conor+dt, eajames, jdelvare, linux, corbet, joel,
andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
Cc: Ninad Palsule
Add INTEL Common Redundant Power Supply Versions crps185 bindings as
trivial.
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
---
Documentation/devicetree/bindings/trivial-devices.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Documentation/devicetree/bindings/trivial-devices.yaml
index 73a49d50c4ef..7d07b08b1459 100644
--- a/Documentation/devicetree/bindings/trivial-devices.yaml
+++ b/Documentation/devicetree/bindings/trivial-devices.yaml
@@ -151,6 +151,8 @@ properties:
- injoinic,ip5306
# Inspur Power System power supply unit version 1
- inspur,ipsps1
+ # Intel common redudant power supply crps185
+ - intel,crps185
# Intersil ISL29028 Ambient Light and Proximity Sensor
- isil,isl29028
# Intersil ISL29030 Ambient Light and Proximity Sensor
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v1 4/4] ARM: dts: aspeed: system1: Use crps PSU driver
2024-12-12 21:48 [PATCH v1 0/4] Add support for Intel CRPS PSU Ninad Palsule
` (2 preceding siblings ...)
2024-12-12 21:49 ` [PATCH v1 3/4] dt-bindings: hwmon: intel,crps185: Add to trivial Ninad Palsule
@ 2024-12-12 21:49 ` Ninad Palsule
3 siblings, 0 replies; 12+ messages in thread
From: Ninad Palsule @ 2024-12-12 21:49 UTC (permalink / raw)
To: robh, krzk+dt, conor+dt, eajames, jdelvare, linux, corbet, joel,
andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
Cc: Ninad Palsule
The system1 uses Intel common redundant (crps185) power supplies so move
to correct new crps driver.
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
---
arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-system1.dts | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-system1.dts b/arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-system1.dts
index 8f77bc9e860c..360b9ce3c850 100644
--- a/arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-system1.dts
+++ b/arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-system1.dts
@@ -681,22 +681,22 @@ &i2c2 {
status = "okay";
power-supply@58 {
- compatible = "ibm,cffps";
+ compatible = "intel,crps185";
reg = <0x58>;
};
power-supply@59 {
- compatible = "ibm,cffps";
+ compatible = "intel,crps185";
reg = <0x59>;
};
power-supply@5a {
- compatible = "ibm,cffps";
+ compatible = "intel,crps185";
reg = <0x5a>;
};
power-supply@5b {
- compatible = "ibm,cffps";
+ compatible = "intel,crps185";
reg = <0x5b>;
};
};
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp
2024-12-12 21:49 ` [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp Ninad Palsule
@ 2024-12-12 22:06 ` Guenter Roeck
2024-12-13 16:12 ` Ninad Palsule
0 siblings, 1 reply; 12+ messages in thread
From: Guenter Roeck @ 2024-12-12 22:06 UTC (permalink / raw)
To: Ninad Palsule, robh, krzk+dt, conor+dt, eajames, jdelvare, corbet,
joel, andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
On 12/12/24 13:49, Ninad Palsule wrote:
> Adding label files for fan and temperature sensors in the power supply.
> The openbmc application dbus-sensor(psusensor) requires those files to
> consfigure those sensors.
> Note that prefix for temp label is temp[A..C] used instead of temp[1..3]
> as dbus-sensor(psusensor) application calculate index based on last
> digit in the name so we do not want to make index double digit after
> appending page index.
>
> Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
We are not going to fix userspace problems in the kernel.
Guenter
> ---
> drivers/hwmon/pmbus/pmbus_core.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
> index a7000314e5ad..149b3c5f3a4c 100644
> --- a/drivers/hwmon/pmbus/pmbus_core.c
> +++ b/drivers/hwmon/pmbus/pmbus_core.c
> @@ -2144,6 +2144,7 @@ static const struct pmbus_sensor_attr temp_attributes[] = {
> {
> .reg = PMBUS_READ_TEMPERATURE_1,
> .class = PSC_TEMPERATURE,
> + .label = "tempA",
> .paged = true,
> .update = true,
> .compare = true,
> @@ -2156,6 +2157,7 @@ static const struct pmbus_sensor_attr temp_attributes[] = {
> }, {
> .reg = PMBUS_READ_TEMPERATURE_2,
> .class = PSC_TEMPERATURE,
> + .label = "tempB",
> .paged = true,
> .update = true,
> .compare = true,
> @@ -2168,6 +2170,7 @@ static const struct pmbus_sensor_attr temp_attributes[] = {
> }, {
> .reg = PMBUS_READ_TEMPERATURE_3,
> .class = PSC_TEMPERATURE,
> + .label = "tempC",
> .paged = true,
> .update = true,
> .compare = true,
> @@ -2282,6 +2285,17 @@ static int pmbus_add_fan_attributes(struct i2c_client *client,
> PSC_FAN, true, true, true) == NULL)
> return -ENOMEM;
>
> + /*
> + * Add fan label.
> + * Assuming paged attributes while passing page index
> + */
> + ret = pmbus_add_label(data, "fan", index, "fan",
> + page + 1, 0xff);
> + if (ret) {
> + dev_err(data->dev, "Fan label add failed ret=%d\n", ret);
> + return ret;
> + }
> +
> /* Fan control */
> if (pmbus_check_word_register(client, page,
> pmbus_fan_command_registers[f])) {
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 2/4] hwmon: (pmbus/crps) Add Intel CRPS185 power supply
2024-12-12 21:49 ` [PATCH v1 2/4] hwmon: (pmbus/crps) Add Intel CRPS185 power supply Ninad Palsule
@ 2024-12-13 1:29 ` Guenter Roeck
2024-12-16 18:01 ` Ninad Palsule
0 siblings, 1 reply; 12+ messages in thread
From: Guenter Roeck @ 2024-12-13 1:29 UTC (permalink / raw)
To: Ninad Palsule, robh, krzk+dt, conor+dt, eajames, jdelvare, corbet,
joel, andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
On 12/12/24 13:49, Ninad Palsule wrote:
> Add the driver to monitor Intel common redundant power supply (crps185)
> with hwmon over pmbus.
>
> Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
> ---
> Documentation/hwmon/crps.rst | 95 +++++++++++
Documentation/hwmon/index.rst needs to be updated.
> MAINTAINERS | 7 +
> drivers/hwmon/pmbus/Kconfig | 9 ++
> drivers/hwmon/pmbus/Makefile | 1 +
> drivers/hwmon/pmbus/crps.c | 299 +++++++++++++++++++++++++++++++++++
> 5 files changed, 411 insertions(+)
> create mode 100644 Documentation/hwmon/crps.rst
> create mode 100644 drivers/hwmon/pmbus/crps.c
>
> diff --git a/Documentation/hwmon/crps.rst b/Documentation/hwmon/crps.rst
> new file mode 100644
> index 000000000000..81d5dfd68a46
> --- /dev/null
> +++ b/Documentation/hwmon/crps.rst
> @@ -0,0 +1,95 @@
> +.. SPDX-License-Identifier: GPL-2.0-or-later
> +
> +Kernel driver crps
> +========================
I am quite sure that this triggers a documentation warning.
> +
> +Supported chips:
> +
> + * Intel CRPS185
> +
> + Prefix: 'crps185'
> +
> + Addresses scanned: -
> +
> +Authors:
> + Ninad Palsule <ninad@linux.ibm.com>
> +
> +
Is the documentation available somewhere ?
If yes, please add a reference. If not, add a comment explaining that
it is not available to the public.
> +Description
> +-----------
> +
> +This driver implements support for Common Redundant Power supply with PMBus
For _Intel_ ...
> +support.
> +
> +The driver is a client driver to the core PMBus driver.
> +Please see Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
> +
> +
> +Usage Notes
> +-----------
> +
> +This driver does not auto-detect devices. You will have to instantiate the
> +devices explicitly. Please see Documentation/i2c/instantiating-devices.rst for
> +details.
> +
> +
> +Sysfs entries
> +-------------
> +
> +======================= ======================================================
> +curr1_label "iin"
> +curr1_input Measured input current
> +curr1_max Maximum input current
> +curr1_max_alarm Input maximum current high alarm
> +curr1_crit Critial high input current
> +curr1_crit_alarm Input critical current high alarm
> +curr1_rated_max Maximum rated input current
> +
> +curr2_label "iout1"
> +curr2_input Measured output current
> +curr2_max Maximum output current
> +curr2_max_alarm Output maximum current high alarm
> +curr2_crit Critial high output current
> +curr2_crit_alarm Output critical current high alarm
> +curr2_rated_max Maximum rated output current
> +
> +in1_label "vin"
> +in1_input Measured input voltage
> +in1_crit Critical input over voltage
> +in1_crit_alarm Critical input over voltage alarm
> +in1_max Maximum input over voltage
> +in1_max_alarm Maximum input over voltage alarm
> +in1_rated_min Minimum rated input voltage
> +in1_rated_max Maximum rated input voltage
> +
> +in2_label "vout1"
> +in2_input Measured input voltage
> +in2_crit Critical input over voltage
> +in2_crit_alarm Critical input over voltage alarm
> +in2_lcrit Critical input under voltage fault
> +in2_lcrit_alarm Critical input under voltage fault alarm
> +in2_max Maximum input over voltage
> +in2_max_alarm Maximum input over voltage alarm
> +in2_min Minimum input under voltage warning
> +in2_min_alarm Minimum input under voltage warning alarm
> +in2_rated_min Minimum rated input voltage
> +in2_rated_max Maximum rated input voltage
> +
> +power1_label "pin"
> +power1_input Measured input power
> +power1_alarm Input power high alarm
> +power1_max Maximum input power
> +power1_rated_max Maximum rated input power
> +
> +temp[1-2]_input Measured temperature
> +temp[1-2]_crit Critical temperature
> +temp[1-2]_crit_alarm Critical temperature alarm
> +temp[1-2]_max Maximum temperature
> +temp[1-2]_max_alarm Maximum temperature alarm
> +temp[1-2]_rated_max Maximum rated temperature
> +
> +fan1_alarm Fan 1 warning.
> +fan1_fault Fan 1 fault.
> +fan1_input Fan 1 speed in RPM.
> +fan1_target Fan 1 target.
> +======================= ======================================================
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 637ddd44245f..6b31d545f0f1 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -6100,6 +6100,13 @@ L: linux-input@vger.kernel.org
> S: Maintained
> F: drivers/hid/hid-creative-sb0540.c
>
> +CRPS COMMON REDUNDANT PSU DRIVER
This is _INTEL_ CRPS.
> +M: Ninad Palsule <ninad@linux.ibm.com>
> +L: linux-hwmon@vger.kernel.org
> +S: Maintained
> +F: Documentation/hwmon/crps.rst
> +F: drivers/hwmon/pmbus/crps.c
> +
> CRYPTO API
> M: Herbert Xu <herbert@gondor.apana.org.au>
> M: "David S. Miller" <davem@davemloft.net>
> diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
> index 22418a05ced0..56c4eb4b846e 100644
> --- a/drivers/hwmon/pmbus/Kconfig
> +++ b/drivers/hwmon/pmbus/Kconfig
> @@ -85,6 +85,15 @@ config SENSORS_BPA_RS600
> This driver can also be built as a module. If so, the module will
> be called bpa-rs600.
>
> +config SENSORS_CRPS
> + tristate "Common Redundant Power Supply"
Again, this is an Intel product.
> + help
> + If you say yes here you get hardware monitoring support for the Common
> + Redundant Power Supply.
> +
> + This driver can also be built as a module. If so, the module will
> + be called crps.
> +
> config SENSORS_DELTA_AHE50DC_FAN
> tristate "Delta AHE-50DC fan control module"
> help
> diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
> index 3d3183f8d2a7..c7eb7739b7f8 100644
> --- a/drivers/hwmon/pmbus/Makefile
> +++ b/drivers/hwmon/pmbus/Makefile
> @@ -62,3 +62,4 @@ obj-$(CONFIG_SENSORS_XDPE122) += xdpe12284.o
> obj-$(CONFIG_SENSORS_XDPE152) += xdpe152c4.o
> obj-$(CONFIG_SENSORS_ZL6100) += zl6100.o
> obj-$(CONFIG_SENSORS_PIM4328) += pim4328.o
> +obj-$(CONFIG_SENSORS_CRPS) += crps.o
> diff --git a/drivers/hwmon/pmbus/crps.c b/drivers/hwmon/pmbus/crps.c
> new file mode 100644
> index 000000000000..44d309f81803
> --- /dev/null
> +++ b/drivers/hwmon/pmbus/crps.c
> @@ -0,0 +1,299 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright 2024 IBM Corp.
> + */
> +
> +#include <linux/debugfs.h>
> +#include <linux/i2c.h>
> +#include <linux/of.h>
> +#include <linux/pmbus.h>
> +
> +#include "pmbus.h"
> +
> +/* Intel crps185 specific commands. */
> +#define CRPS185_MFR_IOUT_MAX 0xA6
> +#define CRPS185_MFR_POUT_MAX 0xA7
> +
I fail to see the point in those defines, even more so since
PMBUS_MFR_POUT_MAX and PMBUS_MFR_IOUT_MAX are used below.
> +enum {
> + CRPS_DEBUGFS_PMBUS_REVISION = 0,
> + CRPS_DEBUGFS_MAX_POWER_OUT,
> + CRPS_DEBUGFS_MAX_CURRENT_OUT,
> + CRPS_DEBUGFS_NUM_ENTRIES
> +};
> +
> +enum models { crps185 = 1, crps_unknown };
Pointless enum. The driver only supports a single power supply.
> +
> +struct crps {
> + enum models version;
> + struct i2c_client *client;
> +
> + int debugfs_entries[CRPS_DEBUGFS_NUM_ENTRIES];
> +};
> +
> +#define to_psu(x, y) container_of((x), struct crps, debugfs_entries[(y)])
> +
> +static struct pmbus_platform_data crps_pdata = {
> + .flags = PMBUS_SKIP_STATUS_CHECK,
> +};
Did you confirm that it is needed ? If so, explain why it is needed.
> +
> +static const struct i2c_device_id crps_id[] = {
> + { "intel_crps185", crps185 },
> + {}
> +};
> +MODULE_DEVICE_TABLE(i2c, crps_id);
> +
> +/*
> + * Convert linear format word to machine format. 11 LSB side bits are two's
> + * complement integer mantissa and 5 MSB side bits are two's complement
> + * exponent
> + */
> +static int crps_convert_linear(int rc)
> +{
> + s16 exponent;
> + s32 mantissa;
> + s64 val;
> +
> + exponent = ((s16)rc) >> 11;
> + mantissa = ((s16)((rc & 0x7ff) << 5)) >> 5;
> +
> + val = mantissa;
> + if (exponent >= 0)
> + val <<= exponent;
> + else
> + val >>= -exponent;
> +
> + return (int)val;
> +}
> +
> +static ssize_t crps_debugfs_read(struct file *file, char __user *buf,
> + size_t count, loff_t *ppos)
> +{
> + int rc;
> + int *idxp = file->private_data;
> + int idx = *idxp;
> + struct crps *psu = to_psu(idxp, idx);
> + char data[2 * I2C_SMBUS_BLOCK_MAX] = { 0 };
> +
> + rc = pmbus_lock_interruptible(psu->client);
> + if (rc)
> + return rc;
> +
> + rc = pmbus_set_page(psu->client, 0, 0xff);
> + if (rc)
> + goto unlock;
> +
> + switch (idx) {
> + case CRPS_DEBUGFS_PMBUS_REVISION:
> + rc = i2c_smbus_read_byte_data(psu->client, PMBUS_REVISION);
> + if (rc >= 0) {
> + if (psu->version == crps185) {
> + if (rc == 0)
> + rc = sprintf(data, "%s", "1.0");
> + else if (rc == 0x11)
> + rc = sprintf(data, "%s", "1.1");
> + else if (rc == 0x22)
> + rc = sprintf(data, "%s", "1.2");
> + else
> + rc = snprintf(data, 3, "0x%02x", rc);
> + } else {
> + rc = snprintf(data, 3, "%02x", rc);
> + }
> + }
This attribute should be added into the PMBus core.
> + break;
> + case CRPS_DEBUGFS_MAX_POWER_OUT:
> + rc = i2c_smbus_read_word_data(psu->client, PMBUS_MFR_POUT_MAX);
> + if (rc >= 0) {
> + rc = crps_convert_linear(rc);
> + rc = snprintf(data, I2C_SMBUS_BLOCK_MAX, "%d", rc);
> + }
> + break;
> + case CRPS_DEBUGFS_MAX_CURRENT_OUT:
> + rc = i2c_smbus_read_word_data(psu->client, PMBUS_MFR_IOUT_MAX);
> + if (rc >= 0) {
> + rc = crps_convert_linear(rc);
> + rc = snprintf(data, I2C_SMBUS_BLOCK_MAX, "%d", rc);
> + }
> + break;
What is the point of those two attributes ? There are already
standard sysfs attributes reporting those values.
> + default:
> + rc = -EINVAL;
> + break;
> + }
> +
> +unlock:
> + pmbus_unlock(psu->client);
> + if (rc < 0)
> + return rc;
> +
> + data[rc] = '\n';
> + rc += 2;
> +
> + return simple_read_from_buffer(buf, count, ppos, data, rc);
> +}
> +
> +static const struct file_operations crps_debugfs_fops = {
> + .llseek = noop_llseek,
> + .read = crps_debugfs_read,
> + .open = simple_open,
> +};
> +
> +static int crps_read_word_data(struct i2c_client *client, int page,
> + int phase, int reg)
> +{
> + int rc;
> +
> + switch (reg) {
> + case PMBUS_STATUS_WORD:
> + rc = pmbus_read_word_data(client, page, phase, reg);
> + if (rc < 0)
> + return rc;
> + break;
Why is this needed ?
> + case PMBUS_OT_WARN_LIMIT:
> + rc = pmbus_read_word_data(client, page, phase,
> + PMBUS_MFR_MAX_TEMP_1);
> + if (rc < 0)
> + return rc;
> + break;
> + case PMBUS_IOUT_OC_WARN_LIMIT:
> + rc = pmbus_read_word_data(client, page, phase,
> + CRPS185_MFR_IOUT_MAX);
> + if (rc < 0)
> + return rc;
> + break;
> + case PMBUS_POUT_OP_WARN_LIMIT:
> + rc = pmbus_read_word_data(client, page, phase,
> + CRPS185_MFR_POUT_MAX);
> + if (rc < 0)
> + return rc;
> + break;
The above three values are more than odd. They duplicate the respective
standard rated_max attributes as warning limits. Why ?
On top of that, on writes, the actual warning limits are overwritten.
That makes even less sense.
> + default:
> + rc = -ENODATA;
> + break;
> + }
> +
> + return rc;
> +}
> +
> +static struct pmbus_driver_info crps_info[] = {
> + [crps185] = {
> + .pages = 1,
> + /* PSU uses default linear data format. */
> + .func[0] = PMBUS_HAVE_PIN | PMBUS_HAVE_IOUT |
> + PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_IIN |
> + PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT |
> + PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
> + PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 |
> + PMBUS_HAVE_STATUS_TEMP |
> + PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
> + .read_word_data = crps_read_word_data,
> + },
> +};
> +
> +#define to_psu(x, y) container_of((x), struct crps, debugfs_entries[(y)])
> +
> +static void crps_init_debugfs(struct crps *psu)
> +{
> + struct i2c_client *client = psu->client;
> + struct dentry *debugfs;
> + int i;
> +
> + /* Don't fail the probe if we can't create debugfs */
> + debugfs = pmbus_get_debugfs_dir(client);
> + if (!debugfs)
> + return;
> +
> + for (i = 0; i < CRPS_DEBUGFS_NUM_ENTRIES; ++i)
> + psu->debugfs_entries[i] = i;
> +
> + debugfs_create_file("pmbus_revision", 0444, debugfs,
> + &psu->debugfs_entries[CRPS_DEBUGFS_PMBUS_REVISION],
> + &crps_debugfs_fops);
> + debugfs_create_file("max_power_out", 0444, debugfs,
> + &psu->debugfs_entries[CRPS_DEBUGFS_MAX_POWER_OUT],
> + &crps_debugfs_fops);
> + debugfs_create_file("max_current_out", 0444, debugfs,
> + &psu->debugfs_entries[CRPS_DEBUGFS_MAX_CURRENT_OUT],
> + &crps_debugfs_fops);
> +}
> +
> +static int crps_probe(struct i2c_client *client)
> +{
> + int rc;
> + struct device *dev = &client->dev;
> + enum models vs = crps_unknown;
> + struct crps *psu;
> + const void *md = of_device_get_match_data(&client->dev);
> + const struct i2c_device_id *id = NULL;
> + char buf[I2C_SMBUS_BLOCK_MAX + 2] = { 0 };
> +
> + if (md) {
> + vs = (uintptr_t)md;
> + } else {
> + id = i2c_match_id(crps_id, client);
> + if (id)
> + vs = (enum models)id->driver_data;
> + }
> +
Consider using i2c_get_match_data().
> + if (!vs || vs >= crps_unknown) {
> + dev_err(dev, "Version %d not supported\n", vs);
> + return -EINVAL;
> + }
This is very much pointless. The driver would not be instantiated withut match.
> +
> + rc = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf);
> + if (rc < 0) {
> + dev_err(dev, "Failed to read PMBUS_MFR_MODEL\n");
> + return rc;
dev_err_probe().
> + }
> + if (strncmp(buf, "03NK260", 7)) {
This should also check and ensure that rc == 7.
> + buf[rc] = '\0';
> + dev_err(dev, "Model '%s' not supported\n", buf);
dev_err_probe()
> + return -ENODEV;
> + }
> +
> + client->dev.platform_data = &crps_pdata;
> + rc = pmbus_do_probe(client, &crps_info[vs]);
> + if (rc) {
> + dev_err(dev, "Failed to probe %d\n", rc);
> + return rc;
dev_err_probe().
> + }
> +
> + /*
> + * Don't fail the probe if there isn't enough memory for debugfs.
> + */
> + psu = devm_kzalloc(&client->dev, sizeof(*psu), GFP_KERNEL);
> + if (!psu) {
> + dev_warn(dev, "Failed to allocate memory. debugfs are not supported.\n");
> + return 0;
> + }
> +
> + psu->version = vs;
> + psu->client = client;
> +
Drop all this. Add the PMBus version as standard debugfs attribute to the PMBus core
if needed/wanted. The rest is already provided as standard sysfs attributes, and
reporting the same value in debugfs files adds no value.
> + crps_init_debugfs(psu);
> +
> + return 0;
> +}
> +
> +static const struct of_device_id crps_of_match[] = {
> + {
> + .compatible = "intel,crps185",
> + .data = (void *)crps185
> + },
> + {}
> +};
> +MODULE_DEVICE_TABLE(of, crps_of_match);
> +
> +static struct i2c_driver crps_driver = {
> + .driver = {
> + .name = "crps",
> + .of_match_table = crps_of_match,
> + },
> + .probe = crps_probe,
> + .id_table = crps_id,
> +};
> +
> +module_i2c_driver(crps_driver);
> +
> +MODULE_AUTHOR("Ninad Palsule");
> +MODULE_DESCRIPTION("PMBus driver for Common Redundant power supplies");
Again, this is for _Intel_ power supplies.
> +MODULE_LICENSE("GPL");
> +MODULE_IMPORT_NS("PMBUS");
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 3/4] dt-bindings: hwmon: intel,crps185: Add to trivial
2024-12-12 21:49 ` [PATCH v1 3/4] dt-bindings: hwmon: intel,crps185: Add to trivial Ninad Palsule
@ 2024-12-13 11:08 ` Krzysztof Kozlowski
0 siblings, 0 replies; 12+ messages in thread
From: Krzysztof Kozlowski @ 2024-12-13 11:08 UTC (permalink / raw)
To: Ninad Palsule
Cc: robh, krzk+dt, conor+dt, eajames, jdelvare, linux, corbet, joel,
andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
On Thu, Dec 12, 2024 at 03:49:02PM -0600, Ninad Palsule wrote:
> Add INTEL Common Redundant Power Supply Versions crps185 bindings as
> trivial.
becuse they are trivial or you don't care? Some broader context would be
useful here.
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp
2024-12-12 22:06 ` Guenter Roeck
@ 2024-12-13 16:12 ` Ninad Palsule
2024-12-13 17:08 ` Guenter Roeck
0 siblings, 1 reply; 12+ messages in thread
From: Ninad Palsule @ 2024-12-13 16:12 UTC (permalink / raw)
To: Guenter Roeck, robh, krzk+dt, conor+dt, eajames, jdelvare, corbet,
joel, andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c, ninad
Hello Guenter,
On 12/12/24 16:06, Guenter Roeck wrote:
> On 12/12/24 13:49, Ninad Palsule wrote:
>> Adding label files for fan and temperature sensors in the power supply.
>> The openbmc application dbus-sensor(psusensor) requires those files to
>> consfigure those sensors.
>> Note that prefix for temp label is temp[A..C] used instead of temp[1..3]
>> as dbus-sensor(psusensor) application calculate index based on last
>> digit in the name so we do not want to make index double digit after
>> appending page index.
>>
>> Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
>
> We are not going to fix userspace problems in the kernel.
>
> Guenter
>
Thanks for the quick review.
Sorry I am not clear on this. I feel that it is better to support labels
for temperature
sensors and fans like other. Are you saying we should not support these
labels or
I need update in the patch to support them better?
Please let me know.
Thanks & Regards,
Ninad Palsule
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp
2024-12-13 16:12 ` Ninad Palsule
@ 2024-12-13 17:08 ` Guenter Roeck
2024-12-16 17:53 ` Ninad Palsule
0 siblings, 1 reply; 12+ messages in thread
From: Guenter Roeck @ 2024-12-13 17:08 UTC (permalink / raw)
To: Ninad Palsule, robh, krzk+dt, conor+dt, eajames, jdelvare, corbet,
joel, andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
On 12/13/24 08:12, Ninad Palsule wrote:
> Hello Guenter,
>
> On 12/12/24 16:06, Guenter Roeck wrote:
>> On 12/12/24 13:49, Ninad Palsule wrote:
>>> Adding label files for fan and temperature sensors in the power supply.
>>> The openbmc application dbus-sensor(psusensor) requires those files to
>>> consfigure those sensors.
>>> Note that prefix for temp label is temp[A..C] used instead of temp[1..3]
>>> as dbus-sensor(psusensor) application calculate index based on last
>>> digit in the name so we do not want to make index double digit after
>>> appending page index.
>>>
>>> Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
>>
>> We are not going to fix userspace problems in the kernel.
>>
>> Guenter
>>
>
> Thanks for the quick review.
>
> Sorry I am not clear on this. I feel that it is better to support labels for temperature
>
> sensors and fans like other. Are you saying we should not support these labels or
>
> I need update in the patch to support them better?
>
There should be no such labels. Labels are supposed to have specific meanings,
such as "this is the CPU temperature sensor", not vague meanings such as "tempA".
Guenter
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp
2024-12-13 17:08 ` Guenter Roeck
@ 2024-12-16 17:53 ` Ninad Palsule
0 siblings, 0 replies; 12+ messages in thread
From: Ninad Palsule @ 2024-12-16 17:53 UTC (permalink / raw)
To: Guenter Roeck, robh, krzk+dt, conor+dt, eajames, jdelvare, corbet,
joel, andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
Hi Guenter,
On 12/13/24 11:08, Guenter Roeck wrote:
> On 12/13/24 08:12, Ninad Palsule wrote:
>> Hello Guenter,
>>
>> On 12/12/24 16:06, Guenter Roeck wrote:
>>> On 12/12/24 13:49, Ninad Palsule wrote:
>>>> Adding label files for fan and temperature sensors in the power
>>>> supply.
>>>> The openbmc application dbus-sensor(psusensor) requires those files to
>>>> consfigure those sensors.
>>>> Note that prefix for temp label is temp[A..C] used instead of
>>>> temp[1..3]
>>>> as dbus-sensor(psusensor) application calculate index based on last
>>>> digit in the name so we do not want to make index double digit after
>>>> appending page index.
>>>>
>>>> Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
>>>
>>> We are not going to fix userspace problems in the kernel.
>>>
>>> Guenter
>>>
>>
>> Thanks for the quick review.
>>
>> Sorry I am not clear on this. I feel that it is better to support
>> labels for temperature
>>
>> sensors and fans like other. Are you saying we should not support
>> these labels or
>>
>> I need update in the patch to support them better?
>>
>
> There should be no such labels. Labels are supposed to have specific
> meanings,
> such as "this is the CPU temperature sensor", not vague meanings such
> as "tempA".
>
> Guenter
Thanks for the quick response. I will remove these changes for now and
will talk to you later about
better option.
Thanks & Regards,
Ninad Palsule
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 2/4] hwmon: (pmbus/crps) Add Intel CRPS185 power supply
2024-12-13 1:29 ` Guenter Roeck
@ 2024-12-16 18:01 ` Ninad Palsule
0 siblings, 0 replies; 12+ messages in thread
From: Ninad Palsule @ 2024-12-16 18:01 UTC (permalink / raw)
To: Guenter Roeck, robh, krzk+dt, conor+dt, eajames, jdelvare, corbet,
joel, andrew, Delphine_CC_Chiu, broonie, peteryin.openbmc,
noahwang.wang, naresh.solanki, lukas, jbrunet, patrick.rudolph,
gregkh, peterz, pbiel7, devicetree, linux-kernel, linux-hwmon,
linux-doc, linux-arm-kernel, linux-aspeed, linux-i2c
Hi Guenter,
Thanks for the review!
On 12/12/24 19:29, Guenter Roeck wrote:
> On 12/12/24 13:49, Ninad Palsule wrote:
>> Add the driver to monitor Intel common redundant power supply (crps185)
>> with hwmon over pmbus.
>>
>> Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
>> ---
>> Documentation/hwmon/crps.rst | 95 +++++++++++
>
> Documentation/hwmon/index.rst needs to be updated.
Added the entry. Sorry for that.
>
>> MAINTAINERS | 7 +
>> drivers/hwmon/pmbus/Kconfig | 9 ++
>> drivers/hwmon/pmbus/Makefile | 1 +
>> drivers/hwmon/pmbus/crps.c | 299 +++++++++++++++++++++++++++++++++++
>> 5 files changed, 411 insertions(+)
>> create mode 100644 Documentation/hwmon/crps.rst
>> create mode 100644 drivers/hwmon/pmbus/crps.c
>>
>> diff --git a/Documentation/hwmon/crps.rst b/Documentation/hwmon/crps.rst
>> new file mode 100644
>> index 000000000000..81d5dfd68a46
>> --- /dev/null
>> +++ b/Documentation/hwmon/crps.rst
>> @@ -0,0 +1,95 @@
>> +.. SPDX-License-Identifier: GPL-2.0-or-later
>> +
>> +Kernel driver crps
>> +========================
>
> I am quite sure that this triggers a documentation warning.
Fixed it.
>
>> +
>> +Supported chips:
>> +
>> + * Intel CRPS185
>> +
>> + Prefix: 'crps185'
>> +
>> + Addresses scanned: -
>> +
>> +Authors:
>> + Ninad Palsule <ninad@linux.ibm.com>
>> +
>> +
>
> Is the documentation available somewhere ?
> If yes, please add a reference. If not, add a comment explaining that
> it is not available to the public.
There is no public spec, added the comment
>
>> +Description
>> +-----------
>> +
>> +This driver implements support for Common Redundant Power supply
>> with PMBus
>
> For _Intel_ ...
Updated.
>
>> +support.
>> +
>> +The driver is a client driver to the core PMBus driver.
>> +Please see Documentation/hwmon/pmbus.rst for details on PMBus client
>> drivers.
>> +
>> +
>> +Usage Notes
>> +-----------
>> +
>> +This driver does not auto-detect devices. You will have to
>> instantiate the
>> +devices explicitly. Please see
>> Documentation/i2c/instantiating-devices.rst for
>> +details.
>> +
>> +
>> +Sysfs entries
>> +-------------
>> +
>> +=======================
>> ======================================================
>> +curr1_label "iin"
>> +curr1_input Measured input current
>> +curr1_max Maximum input current
>> +curr1_max_alarm Input maximum current high alarm
>> +curr1_crit Critial high input current
>> +curr1_crit_alarm Input critical current high alarm
>> +curr1_rated_max Maximum rated input current
>> +
>> +curr2_label "iout1"
>> +curr2_input Measured output current
>> +curr2_max Maximum output current
>> +curr2_max_alarm Output maximum current high alarm
>> +curr2_crit Critial high output current
>> +curr2_crit_alarm Output critical current high alarm
>> +curr2_rated_max Maximum rated output current
>> +
>> +in1_label "vin"
>> +in1_input Measured input voltage
>> +in1_crit Critical input over voltage
>> +in1_crit_alarm Critical input over voltage alarm
>> +in1_max Maximum input over voltage
>> +in1_max_alarm Maximum input over voltage alarm
>> +in1_rated_min Minimum rated input voltage
>> +in1_rated_max Maximum rated input voltage
>> +
>> +in2_label "vout1"
>> +in2_input Measured input voltage
>> +in2_crit Critical input over voltage
>> +in2_crit_alarm Critical input over voltage alarm
>> +in2_lcrit Critical input under voltage fault
>> +in2_lcrit_alarm Critical input under voltage fault alarm
>> +in2_max Maximum input over voltage
>> +in2_max_alarm Maximum input over voltage alarm
>> +in2_min Minimum input under voltage warning
>> +in2_min_alarm Minimum input under voltage warning alarm
>> +in2_rated_min Minimum rated input voltage
>> +in2_rated_max Maximum rated input voltage
>> +
>> +power1_label "pin"
>> +power1_input Measured input power
>> +power1_alarm Input power high alarm
>> +power1_max Maximum input power
>> +power1_rated_max Maximum rated input power
>> +
>> +temp[1-2]_input Measured temperature
>> +temp[1-2]_crit Critical temperature
>> +temp[1-2]_crit_alarm Critical temperature alarm
>> +temp[1-2]_max Maximum temperature
>> +temp[1-2]_max_alarm Maximum temperature alarm
>> +temp[1-2]_rated_max Maximum rated temperature
>> +
>> +fan1_alarm Fan 1 warning.
>> +fan1_fault Fan 1 fault.
>> +fan1_input Fan 1 speed in RPM.
>> +fan1_target Fan 1 target.
>> +=======================
>> ======================================================
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index 637ddd44245f..6b31d545f0f1 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -6100,6 +6100,13 @@ L: linux-input@vger.kernel.org
>> S: Maintained
>> F: drivers/hid/hid-creative-sb0540.c
>> +CRPS COMMON REDUNDANT PSU DRIVER
>
> This is _INTEL_ CRPS.
Updated.
>
>> +M: Ninad Palsule <ninad@linux.ibm.com>
>> +L: linux-hwmon@vger.kernel.org
>> +S: Maintained
>> +F: Documentation/hwmon/crps.rst
>> +F: drivers/hwmon/pmbus/crps.c
>> +
>> CRYPTO API
>> M: Herbert Xu <herbert@gondor.apana.org.au>
>> M: "David S. Miller" <davem@davemloft.net>
>> diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
>> index 22418a05ced0..56c4eb4b846e 100644
>> --- a/drivers/hwmon/pmbus/Kconfig
>> +++ b/drivers/hwmon/pmbus/Kconfig
>> @@ -85,6 +85,15 @@ config SENSORS_BPA_RS600
>> This driver can also be built as a module. If so, the module
>> will
>> be called bpa-rs600.
>> +config SENSORS_CRPS
>> + tristate "Common Redundant Power Supply"
>
> Again, this is an Intel product.
Fixed.
>
>> + help
>> + If you say yes here you get hardware monitoring support for
>> the Common
>> + Redundant Power Supply.
>> +
>> + This driver can also be built as a module. If so, the module will
>> + be called crps.
>> +
>> config SENSORS_DELTA_AHE50DC_FAN
>> tristate "Delta AHE-50DC fan control module"
>> help
>> diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
>> index 3d3183f8d2a7..c7eb7739b7f8 100644
>> --- a/drivers/hwmon/pmbus/Makefile
>> +++ b/drivers/hwmon/pmbus/Makefile
>> @@ -62,3 +62,4 @@ obj-$(CONFIG_SENSORS_XDPE122) += xdpe12284.o
>> obj-$(CONFIG_SENSORS_XDPE152) += xdpe152c4.o
>> obj-$(CONFIG_SENSORS_ZL6100) += zl6100.o
>> obj-$(CONFIG_SENSORS_PIM4328) += pim4328.o
>> +obj-$(CONFIG_SENSORS_CRPS) += crps.o
>> diff --git a/drivers/hwmon/pmbus/crps.c b/drivers/hwmon/pmbus/crps.c
>> new file mode 100644
>> index 000000000000..44d309f81803
>> --- /dev/null
>> +++ b/drivers/hwmon/pmbus/crps.c
>> @@ -0,0 +1,299 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright 2024 IBM Corp.
>> + */
>> +
>> +#include <linux/debugfs.h>
>> +#include <linux/i2c.h>
>> +#include <linux/of.h>
>> +#include <linux/pmbus.h>
>> +
>> +#include "pmbus.h"
>> +
>> +/* Intel crps185 specific commands. */
>> +#define CRPS185_MFR_IOUT_MAX 0xA6
>> +#define CRPS185_MFR_POUT_MAX 0xA7
>> +
>
> I fail to see the point in those defines, even more so since
> PMBUS_MFR_POUT_MAX and PMBUS_MFR_IOUT_MAX are used below.
Removed these defines.
>
>> +enum {
>> + CRPS_DEBUGFS_PMBUS_REVISION = 0,
>> + CRPS_DEBUGFS_MAX_POWER_OUT,
>> + CRPS_DEBUGFS_MAX_CURRENT_OUT,
>> + CRPS_DEBUGFS_NUM_ENTRIES
>> +};
>> +
>> +enum models { crps185 = 1, crps_unknown };
>
> Pointless enum. The driver only supports a single power supply.
Removed the enum.
>
>> +
>> +struct crps {
>> + enum models version;
>> + struct i2c_client *client;
>> +
>> + int debugfs_entries[CRPS_DEBUGFS_NUM_ENTRIES];
>> +};
>> +
>> +#define to_psu(x, y) container_of((x), struct crps,
>> debugfs_entries[(y)])
>> +
>> +static struct pmbus_platform_data crps_pdata = {
>> + .flags = PMBUS_SKIP_STATUS_CHECK,
>> +};
>
> Did you confirm that it is needed ? If so, explain why it is needed.
I removed it and still driver is working. I added it because spec did
not mention about PMBUS_STATUS_CML
>
>> +
>> +static const struct i2c_device_id crps_id[] = {
>> + { "intel_crps185", crps185 },
>> + {}
>> +};
>> +MODULE_DEVICE_TABLE(i2c, crps_id);
>> +
>> +/*
>> + * Convert linear format word to machine format. 11 LSB side bits
>> are two's
>> + * complement integer mantissa and 5 MSB side bits are two's complement
>> + * exponent
>> + */
>> +static int crps_convert_linear(int rc)
>> +{
>> + s16 exponent;
>> + s32 mantissa;
>> + s64 val;
>> +
>> + exponent = ((s16)rc) >> 11;
>> + mantissa = ((s16)((rc & 0x7ff) << 5)) >> 5;
>> +
>> + val = mantissa;
>> + if (exponent >= 0)
>> + val <<= exponent;
>> + else
>> + val >>= -exponent;
>> +
>> + return (int)val;
>> +}
>> +
>> +static ssize_t crps_debugfs_read(struct file *file, char __user *buf,
>> + size_t count, loff_t *ppos)
>> +{
>> + int rc;
>> + int *idxp = file->private_data;
>> + int idx = *idxp;
>> + struct crps *psu = to_psu(idxp, idx);
>> + char data[2 * I2C_SMBUS_BLOCK_MAX] = { 0 };
>> +
>> + rc = pmbus_lock_interruptible(psu->client);
>> + if (rc)
>> + return rc;
>> +
>> + rc = pmbus_set_page(psu->client, 0, 0xff);
>> + if (rc)
>> + goto unlock;
>> +
>> + switch (idx) {
>> + case CRPS_DEBUGFS_PMBUS_REVISION:
>> + rc = i2c_smbus_read_byte_data(psu->client, PMBUS_REVISION);
>> + if (rc >= 0) {
>> + if (psu->version == crps185) {
>> + if (rc == 0)
>> + rc = sprintf(data, "%s", "1.0");
>> + else if (rc == 0x11)
>> + rc = sprintf(data, "%s", "1.1");
>> + else if (rc == 0x22)
>> + rc = sprintf(data, "%s", "1.2");
>> + else
>> + rc = snprintf(data, 3, "0x%02x", rc);
>> + } else {
>> + rc = snprintf(data, 3, "%02x", rc);
>> + }
>> + }
>
> This attribute should be added into the PMBus core.
Moved the attribute in the core.
>
>> + break;
>> + case CRPS_DEBUGFS_MAX_POWER_OUT:
>> + rc = i2c_smbus_read_word_data(psu->client, PMBUS_MFR_POUT_MAX);
>> + if (rc >= 0) {
>> + rc = crps_convert_linear(rc);
>> + rc = snprintf(data, I2C_SMBUS_BLOCK_MAX, "%d", rc);
>> + }
>> + break;
>> + case CRPS_DEBUGFS_MAX_CURRENT_OUT:
>> + rc = i2c_smbus_read_word_data(psu->client, PMBUS_MFR_IOUT_MAX);
>> + if (rc >= 0) {
>> + rc = crps_convert_linear(rc);
>> + rc = snprintf(data, I2C_SMBUS_BLOCK_MAX, "%d", rc);
>> + }
>> + break;
>
> What is the point of those two attributes ? There are already
> standard sysfs attributes reporting those values.
Removed debugfs
>
>> + default:
>> + rc = -EINVAL;
>> + break;
>> + }
>> +
>> +unlock:
>> + pmbus_unlock(psu->client);
>> + if (rc < 0)
>> + return rc;
>> +
>> + data[rc] = '\n';
>> + rc += 2;
>> +
>> + return simple_read_from_buffer(buf, count, ppos, data, rc);
>> +}
>> +
>> +static const struct file_operations crps_debugfs_fops = {
>> + .llseek = noop_llseek,
>> + .read = crps_debugfs_read,
>> + .open = simple_open,
>> +};
>> +
>> +static int crps_read_word_data(struct i2c_client *client, int page,
>> + int phase, int reg)
>> +{
>> + int rc;
>> +
>> + switch (reg) {
>> + case PMBUS_STATUS_WORD:
>> + rc = pmbus_read_word_data(client, page, phase, reg);
>> + if (rc < 0)
>> + return rc;
>> + break;
>
> Why is this needed ?
You are right, removed it.
>
>> + case PMBUS_OT_WARN_LIMIT:
>> + rc = pmbus_read_word_data(client, page, phase,
>> + PMBUS_MFR_MAX_TEMP_1);
>> + if (rc < 0)
>> + return rc;
>> + break;
>> + case PMBUS_IOUT_OC_WARN_LIMIT:
>> + rc = pmbus_read_word_data(client, page, phase,
>> + CRPS185_MFR_IOUT_MAX);
>> + if (rc < 0)
>> + return rc;
>> + break;
>> + case PMBUS_POUT_OP_WARN_LIMIT:
>> + rc = pmbus_read_word_data(client, page, phase,
>> + CRPS185_MFR_POUT_MAX);
>> + if (rc < 0)
>> + return rc;
>> + break;
>
> The above three values are more than odd. They duplicate the respective
> standard rated_max attributes as warning limits. Why ?
I realized that some of these registers exist. So removed it.
>
> On top of that, on writes, the actual warning limits are overwritten.
> That makes even less sense.
I have removed read function so now we don't need write too.
>
>> + default:
>> + rc = -ENODATA;
>> + break;
>> + }
>> +
>> + return rc;
>> +}
>> +
>> +static struct pmbus_driver_info crps_info[] = {
>> + [crps185] = {
>> + .pages = 1,
>> + /* PSU uses default linear data format. */
>> + .func[0] = PMBUS_HAVE_PIN | PMBUS_HAVE_IOUT |
>> + PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_IIN |
>> + PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT |
>> + PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
>> + PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 |
>> + PMBUS_HAVE_STATUS_TEMP |
>> + PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
>> + .read_word_data = crps_read_word_data,
>> + },
>> +};
>> +
>> +#define to_psu(x, y) container_of((x), struct crps,
>> debugfs_entries[(y)])
>> +
>> +static void crps_init_debugfs(struct crps *psu)
>> +{
>> + struct i2c_client *client = psu->client;
>> + struct dentry *debugfs;
>> + int i;
>> +
>> + /* Don't fail the probe if we can't create debugfs */
>> + debugfs = pmbus_get_debugfs_dir(client);
>> + if (!debugfs)
>> + return;
>> +
>> + for (i = 0; i < CRPS_DEBUGFS_NUM_ENTRIES; ++i)
>> + psu->debugfs_entries[i] = i;
>> +
>> + debugfs_create_file("pmbus_revision", 0444, debugfs,
>> + &psu->debugfs_entries[CRPS_DEBUGFS_PMBUS_REVISION],
>> + &crps_debugfs_fops);
>> + debugfs_create_file("max_power_out", 0444, debugfs,
>> + &psu->debugfs_entries[CRPS_DEBUGFS_MAX_POWER_OUT],
>> + &crps_debugfs_fops);
>> + debugfs_create_file("max_current_out", 0444, debugfs,
>> + &psu->debugfs_entries[CRPS_DEBUGFS_MAX_CURRENT_OUT],
>> + &crps_debugfs_fops);
>> +}
>> +
>> +static int crps_probe(struct i2c_client *client)
>> +{
>> + int rc;
>> + struct device *dev = &client->dev;
>> + enum models vs = crps_unknown;
>> + struct crps *psu;
>> + const void *md = of_device_get_match_data(&client->dev);
>> + const struct i2c_device_id *id = NULL;
>> + char buf[I2C_SMBUS_BLOCK_MAX + 2] = { 0 };
>> +
>> + if (md) {
>> + vs = (uintptr_t)md;
>> + } else {
>> + id = i2c_match_id(crps_id, client);
>> + if (id)
>> + vs = (enum models)id->driver_data;
>> + }
>> +
> Consider using i2c_get_match_data().
Removed this code.
>
>> + if (!vs || vs >= crps_unknown) {
>> + dev_err(dev, "Version %d not supported\n", vs);
>> + return -EINVAL;
>> + }
>
> This is very much pointless. The driver would not be instantiated
> withut match.
Yes, removed it.
>
>> +
>> + rc = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf);
>> + if (rc < 0) {
>> + dev_err(dev, "Failed to read PMBUS_MFR_MODEL\n");
>> + return rc;
>
> dev_err_probe().
Changed to use this function.
>
>> + }
>> + if (strncmp(buf, "03NK260", 7)) {
>
> This should also check and ensure that rc == 7.
Good idea, Added this check.
>
>> + buf[rc] = '\0';
>> + dev_err(dev, "Model '%s' not supported\n", buf);
>
> dev_err_probe()
Changed the function
>
>> + return -ENODEV;
>> + }
>> +
>> + client->dev.platform_data = &crps_pdata;
>> + rc = pmbus_do_probe(client, &crps_info[vs]);
>> + if (rc) {
>> + dev_err(dev, "Failed to probe %d\n", rc);
>> + return rc;
>
> dev_err_probe().
Changed this function.
>
>> + }
>> +
>> + /*
>> + * Don't fail the probe if there isn't enough memory for debugfs.
>> + */
>> + psu = devm_kzalloc(&client->dev, sizeof(*psu), GFP_KERNEL);
>> + if (!psu) {
>> + dev_warn(dev, "Failed to allocate memory. debugfs are not
>> supported.\n");
>> + return 0;
>> + }
>> +
>> + psu->version = vs;
>> + psu->client = client;
>> +
>
> Drop all this. Add the PMBus version as standard debugfs attribute to
> the PMBus core
> if needed/wanted. The rest is already provided as standard sysfs
> attributes, and
> reporting the same value in debugfs files adds no value.
Yes, Removed debugfs.
>
>> + crps_init_debugfs(psu);
>> +
>> + return 0;
>> +}
>> +
>> +static const struct of_device_id crps_of_match[] = {
>> + {
>> + .compatible = "intel,crps185",
>> + .data = (void *)crps185
>> + },
>> + {}
>> +};
>> +MODULE_DEVICE_TABLE(of, crps_of_match);
>> +
>> +static struct i2c_driver crps_driver = {
>> + .driver = {
>> + .name = "crps",
>> + .of_match_table = crps_of_match,
>> + },
>> + .probe = crps_probe,
>> + .id_table = crps_id,
>> +};
>> +
>> +module_i2c_driver(crps_driver);
>> +
>> +MODULE_AUTHOR("Ninad Palsule");
>> +MODULE_DESCRIPTION("PMBus driver for Common Redundant power supplies");
>
> Again, this is for _Intel_ power supplies.
Yes, Added Intel
Thanks and Regards,
Ninad Palsule
>
>> +MODULE_LICENSE("GPL");
>> +MODULE_IMPORT_NS("PMBUS");
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-12-16 18:01 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-12 21:48 [PATCH v1 0/4] Add support for Intel CRPS PSU Ninad Palsule
2024-12-12 21:49 ` [PATCH v1 1/4] hwmon: pmbus-core: Add label for fan and temp Ninad Palsule
2024-12-12 22:06 ` Guenter Roeck
2024-12-13 16:12 ` Ninad Palsule
2024-12-13 17:08 ` Guenter Roeck
2024-12-16 17:53 ` Ninad Palsule
2024-12-12 21:49 ` [PATCH v1 2/4] hwmon: (pmbus/crps) Add Intel CRPS185 power supply Ninad Palsule
2024-12-13 1:29 ` Guenter Roeck
2024-12-16 18:01 ` Ninad Palsule
2024-12-12 21:49 ` [PATCH v1 3/4] dt-bindings: hwmon: intel,crps185: Add to trivial Ninad Palsule
2024-12-13 11:08 ` Krzysztof Kozlowski
2024-12-12 21:49 ` [PATCH v1 4/4] ARM: dts: aspeed: system1: Use crps PSU driver Ninad Palsule
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).