linux-hwmon.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] hwmon: (pmbus/ibm-cffps) New debugfs entries, VMON, and LED fix
@ 2019-12-19 20:50 Eddie James
  2019-12-19 20:50 ` [PATCH 1/3] hwmon: (pmbus/ibm-cffps) Add new manufacturer debugfs entries Eddie James
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Eddie James @ 2019-12-19 20:50 UTC (permalink / raw)
  To: linux-hwmon; +Cc: linux-kernel, linux, jdelvare, bjwyman, Eddie James

Add a few features to the IBM PSU driver. Fix the LED behavior that I recently
changed due to misunderstanding some user requirements.

Eddie James (3):
  hwmon: (pmbus/ibm-cffps) Add new manufacturer debugfs entries
  hwmon: (pmbus/ibm-cffps) Add the VMON property for version 2
  hwmon: (pmbus/ibm-cffps) Fix the LED behavior when turned off

 drivers/hwmon/pmbus/ibm-cffps.c | 89 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 79 insertions(+), 10 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] hwmon: (pmbus/ibm-cffps) Add new manufacturer debugfs entries
  2019-12-19 20:50 [PATCH 0/3] hwmon: (pmbus/ibm-cffps) New debugfs entries, VMON, and LED fix Eddie James
@ 2019-12-19 20:50 ` Eddie James
  2020-01-04 16:26   ` Guenter Roeck
  2019-12-19 20:50 ` [PATCH 2/3] hwmon: (pmbus/ibm-cffps) Add the VMON property for version 2 Eddie James
  2019-12-19 20:50 ` [PATCH 3/3] hwmon: (pmbus/ibm-cffps) Fix the LED behavior when turned off Eddie James
  2 siblings, 1 reply; 9+ messages in thread
From: Eddie James @ 2019-12-19 20:50 UTC (permalink / raw)
  To: linux-hwmon; +Cc: linux-kernel, linux, jdelvare, bjwyman, Eddie James

Add support for a number of manufacturer-specific registers in the
debugfs entries, as well as support to read and write the
PMBUS_ON_OFF_CONFIG register through debugfs.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
 drivers/hwmon/pmbus/ibm-cffps.c | 74 ++++++++++++++++++++++++++++++++++++++---
 1 file changed, 70 insertions(+), 4 deletions(-)

diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c
index d359b76..a564be9 100644
--- a/drivers/hwmon/pmbus/ibm-cffps.c
+++ b/drivers/hwmon/pmbus/ibm-cffps.c
@@ -20,7 +20,9 @@
 
 #define CFFPS_FRU_CMD				0x9A
 #define CFFPS_PN_CMD				0x9B
+#define CFFPS_HEADER_CMD			0x9C
 #define CFFPS_SN_CMD				0x9E
+#define CFFPS_MAX_POWER_OUT_CMD			0xA7
 #define CFFPS_CCIN_CMD				0xBD
 #define CFFPS_FW_CMD				0xFA
 #define CFFPS1_FW_NUM_BYTES			4
@@ -57,9 +59,12 @@ enum {
 	CFFPS_DEBUGFS_INPUT_HISTORY = 0,
 	CFFPS_DEBUGFS_FRU,
 	CFFPS_DEBUGFS_PN,
+	CFFPS_DEBUGFS_HEADER,
 	CFFPS_DEBUGFS_SN,
+	CFFPS_DEBUGFS_MAX_POWER_OUT,
 	CFFPS_DEBUGFS_CCIN,
 	CFFPS_DEBUGFS_FW,
+	CFFPS_DEBUGFS_ON_OFF_CONFIG,
 	CFFPS_DEBUGFS_NUM_ENTRIES
 };
 
@@ -136,15 +141,15 @@ static ssize_t ibm_cffps_read_input_history(struct ibm_cffps *psu,
 				       psu->input_history.byte_count);
 }
 
-static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
-				    size_t count, loff_t *ppos)
+static ssize_t ibm_cffps_debugfs_read(struct file *file, char __user *buf,
+				      size_t count, loff_t *ppos)
 {
 	u8 cmd;
 	int i, rc;
 	int *idxp = file->private_data;
 	int idx = *idxp;
 	struct ibm_cffps *psu = to_psu(idxp, idx);
-	char data[I2C_SMBUS_BLOCK_MAX] = { 0 };
+	char data[I2C_SMBUS_BLOCK_MAX + 2] = { 0 };
 
 	pmbus_set_page(psu->client, 0);
 
@@ -157,9 +162,20 @@ static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
 	case CFFPS_DEBUGFS_PN:
 		cmd = CFFPS_PN_CMD;
 		break;
+	case CFFPS_DEBUGFS_HEADER:
+		cmd = CFFPS_HEADER_CMD;
+		break;
 	case CFFPS_DEBUGFS_SN:
 		cmd = CFFPS_SN_CMD;
 		break;
+	case CFFPS_DEBUGFS_MAX_POWER_OUT:
+		rc = i2c_smbus_read_word_swapped(psu->client,
+						 CFFPS_MAX_POWER_OUT_CMD);
+		if (rc < 0)
+			return rc;
+
+		rc = snprintf(data, I2C_SMBUS_BLOCK_MAX, "%d", rc);
+		goto done;
 	case CFFPS_DEBUGFS_CCIN:
 		rc = i2c_smbus_read_word_swapped(psu->client, CFFPS_CCIN_CMD);
 		if (rc < 0)
@@ -199,6 +215,14 @@ static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
 			return -EOPNOTSUPP;
 		}
 		goto done;
+	case CFFPS_DEBUGFS_ON_OFF_CONFIG:
+		rc = i2c_smbus_read_byte_data(psu->client,
+					      PMBUS_ON_OFF_CONFIG);
+		if (rc < 0)
+			return rc;
+
+		rc = snprintf(data, 3, "%02x", rc);
+		goto done;
 	default:
 		return -EINVAL;
 	}
@@ -214,9 +238,42 @@ static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
 	return simple_read_from_buffer(buf, count, ppos, data, rc);
 }
 
+static ssize_t ibm_cffps_debugfs_write(struct file *file,
+				       const char __user *buf, size_t count,
+				       loff_t *ppos)
+{
+	u8 data;
+	ssize_t rc;
+	int *idxp = file->private_data;
+	int idx = *idxp;
+	struct ibm_cffps *psu = to_psu(idxp, idx);
+
+	switch (idx) {
+	case CFFPS_DEBUGFS_ON_OFF_CONFIG:
+		pmbus_set_page(psu->client, 0);
+
+		rc = simple_write_to_buffer(&data, 1, ppos, buf, count);
+		if (rc < 0)
+			return rc;
+
+		rc = i2c_smbus_write_byte_data(psu->client,
+					       PMBUS_ON_OFF_CONFIG, data);
+		if (rc)
+			return rc;
+
+		rc = 1;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return rc;
+}
+
 static const struct file_operations ibm_cffps_fops = {
 	.llseek = noop_llseek,
-	.read = ibm_cffps_debugfs_op,
+	.read = ibm_cffps_debugfs_read,
+	.write = ibm_cffps_debugfs_write,
 	.open = simple_open,
 };
 
@@ -486,15 +543,24 @@ static int ibm_cffps_probe(struct i2c_client *client,
 	debugfs_create_file("part_number", 0444, ibm_cffps_dir,
 			    &psu->debugfs_entries[CFFPS_DEBUGFS_PN],
 			    &ibm_cffps_fops);
+	debugfs_create_file("header", 0444, ibm_cffps_dir,
+			    &psu->debugfs_entries[CFFPS_DEBUGFS_HEADER],
+			    &ibm_cffps_fops);
 	debugfs_create_file("serial_number", 0444, ibm_cffps_dir,
 			    &psu->debugfs_entries[CFFPS_DEBUGFS_SN],
 			    &ibm_cffps_fops);
+	debugfs_create_file("max_power_out", 0444, ibm_cffps_dir,
+			    &psu->debugfs_entries[CFFPS_DEBUGFS_MAX_POWER_OUT],
+			    &ibm_cffps_fops);
 	debugfs_create_file("ccin", 0444, ibm_cffps_dir,
 			    &psu->debugfs_entries[CFFPS_DEBUGFS_CCIN],
 			    &ibm_cffps_fops);
 	debugfs_create_file("fw_version", 0444, ibm_cffps_dir,
 			    &psu->debugfs_entries[CFFPS_DEBUGFS_FW],
 			    &ibm_cffps_fops);
+	debugfs_create_file("on_off_config", 0644, ibm_cffps_dir,
+			    &psu->debugfs_entries[CFFPS_DEBUGFS_ON_OFF_CONFIG],
+			    &ibm_cffps_fops);
 
 	return 0;
 }
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] hwmon: (pmbus/ibm-cffps) Add the VMON property for version 2
  2019-12-19 20:50 [PATCH 0/3] hwmon: (pmbus/ibm-cffps) New debugfs entries, VMON, and LED fix Eddie James
  2019-12-19 20:50 ` [PATCH 1/3] hwmon: (pmbus/ibm-cffps) Add new manufacturer debugfs entries Eddie James
@ 2019-12-19 20:50 ` Eddie James
  2020-01-04 16:28   ` Guenter Roeck
  2019-12-19 20:50 ` [PATCH 3/3] hwmon: (pmbus/ibm-cffps) Fix the LED behavior when turned off Eddie James
  2 siblings, 1 reply; 9+ messages in thread
From: Eddie James @ 2019-12-19 20:50 UTC (permalink / raw)
  To: linux-hwmon; +Cc: linux-kernel, linux, jdelvare, bjwyman, Eddie James

Version 2 of the PSU supports reading an auxiliary voltage. Use the
pmbus VMON property and associated virtual register to read it.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
 drivers/hwmon/pmbus/ibm-cffps.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c
index a564be9..b37faf1 100644
--- a/drivers/hwmon/pmbus/ibm-cffps.c
+++ b/drivers/hwmon/pmbus/ibm-cffps.c
@@ -28,6 +28,7 @@
 #define CFFPS1_FW_NUM_BYTES			4
 #define CFFPS2_FW_NUM_WORDS			3
 #define CFFPS_SYS_CONFIG_CMD			0xDA
+#define CFFPS_12VCS_VOUT_CMD			0xDE
 
 #define CFFPS_INPUT_HISTORY_CMD			0xD6
 #define CFFPS_INPUT_HISTORY_SIZE		100
@@ -350,6 +351,9 @@ static int ibm_cffps_read_word_data(struct i2c_client *client, int page,
 		if (mfr & CFFPS_MFR_PS_KILL)
 			rc |= PB_STATUS_OFF;
 		break;
+	case PMBUS_VIRT_READ_VMON:
+		rc = pmbus_read_word_data(client, page, CFFPS_12VCS_VOUT_CMD);
+		break;
 	default:
 		rc = -ENODATA;
 		break;
@@ -453,7 +457,7 @@ static void ibm_cffps_create_led_class(struct ibm_cffps *psu)
 			PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3 |
 			PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT |
 			PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_STATUS_TEMP |
-			PMBUS_HAVE_STATUS_FAN12,
+			PMBUS_HAVE_STATUS_FAN12 | PMBUS_HAVE_VMON,
 		.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT |
 			PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3 |
 			PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT,
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] hwmon: (pmbus/ibm-cffps) Fix the LED behavior when turned off
  2019-12-19 20:50 [PATCH 0/3] hwmon: (pmbus/ibm-cffps) New debugfs entries, VMON, and LED fix Eddie James
  2019-12-19 20:50 ` [PATCH 1/3] hwmon: (pmbus/ibm-cffps) Add new manufacturer debugfs entries Eddie James
  2019-12-19 20:50 ` [PATCH 2/3] hwmon: (pmbus/ibm-cffps) Add the VMON property for version 2 Eddie James
@ 2019-12-19 20:50 ` Eddie James
  2020-01-04 16:30   ` Guenter Roeck
  2 siblings, 1 reply; 9+ messages in thread
From: Eddie James @ 2019-12-19 20:50 UTC (permalink / raw)
  To: linux-hwmon; +Cc: linux-kernel, linux, jdelvare, bjwyman, Eddie James

The driver should remain in control of the LED on the PSU, even while
off, not the PSU firmware as previously indicated.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
 drivers/hwmon/pmbus/ibm-cffps.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c
index b37faf1..1c91ee1 100644
--- a/drivers/hwmon/pmbus/ibm-cffps.c
+++ b/drivers/hwmon/pmbus/ibm-cffps.c
@@ -47,13 +47,9 @@
 #define CFFPS_MFR_VAUX_FAULT			BIT(6)
 #define CFFPS_MFR_CURRENT_SHARE_WARNING		BIT(7)
 
-/*
- * LED off state actually relinquishes LED control to PSU firmware, so it can
- * turn on the LED for faults.
- */
-#define CFFPS_LED_OFF				0
 #define CFFPS_LED_BLINK				BIT(0)
 #define CFFPS_LED_ON				BIT(1)
+#define CFFPS_LED_OFF				BIT(2)
 #define CFFPS_BLINK_RATE_MS			250
 
 enum {
@@ -436,6 +432,9 @@ static void ibm_cffps_create_led_class(struct ibm_cffps *psu)
 	rc = devm_led_classdev_register(dev, &psu->led);
 	if (rc)
 		dev_warn(dev, "failed to register led class: %d\n", rc);
+	else
+		i2c_smbus_write_byte_data(client, CFFPS_SYS_CONFIG_CMD,
+					  CFFPS_LED_OFF);
 }
 
 static struct pmbus_driver_info ibm_cffps_info[] = {
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] hwmon: (pmbus/ibm-cffps) Add new manufacturer debugfs entries
  2019-12-19 20:50 ` [PATCH 1/3] hwmon: (pmbus/ibm-cffps) Add new manufacturer debugfs entries Eddie James
@ 2020-01-04 16:26   ` Guenter Roeck
  2020-01-06 15:32     ` Eddie James
  0 siblings, 1 reply; 9+ messages in thread
From: Guenter Roeck @ 2020-01-04 16:26 UTC (permalink / raw)
  To: Eddie James; +Cc: linux-hwmon, linux-kernel, jdelvare, bjwyman

On Thu, Dec 19, 2019 at 02:50:05PM -0600, Eddie James wrote:
> Add support for a number of manufacturer-specific registers in the
> debugfs entries, as well as support to read and write the
> PMBUS_ON_OFF_CONFIG register through debugfs.
> 
> Signed-off-by: Eddie James <eajames@linux.ibm.com>

I assume you know what you are doing, letting the user write anything
into on_off_config. Applied to -next.

Guenter

> ---
>  drivers/hwmon/pmbus/ibm-cffps.c | 74 ++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 70 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c
> index d359b76..a564be9 100644
> --- a/drivers/hwmon/pmbus/ibm-cffps.c
> +++ b/drivers/hwmon/pmbus/ibm-cffps.c
> @@ -20,7 +20,9 @@
>  
>  #define CFFPS_FRU_CMD				0x9A
>  #define CFFPS_PN_CMD				0x9B
> +#define CFFPS_HEADER_CMD			0x9C
>  #define CFFPS_SN_CMD				0x9E
> +#define CFFPS_MAX_POWER_OUT_CMD			0xA7
>  #define CFFPS_CCIN_CMD				0xBD
>  #define CFFPS_FW_CMD				0xFA
>  #define CFFPS1_FW_NUM_BYTES			4
> @@ -57,9 +59,12 @@ enum {
>  	CFFPS_DEBUGFS_INPUT_HISTORY = 0,
>  	CFFPS_DEBUGFS_FRU,
>  	CFFPS_DEBUGFS_PN,
> +	CFFPS_DEBUGFS_HEADER,
>  	CFFPS_DEBUGFS_SN,
> +	CFFPS_DEBUGFS_MAX_POWER_OUT,
>  	CFFPS_DEBUGFS_CCIN,
>  	CFFPS_DEBUGFS_FW,
> +	CFFPS_DEBUGFS_ON_OFF_CONFIG,
>  	CFFPS_DEBUGFS_NUM_ENTRIES
>  };
>  
> @@ -136,15 +141,15 @@ static ssize_t ibm_cffps_read_input_history(struct ibm_cffps *psu,
>  				       psu->input_history.byte_count);
>  }
>  
> -static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
> -				    size_t count, loff_t *ppos)
> +static ssize_t ibm_cffps_debugfs_read(struct file *file, char __user *buf,
> +				      size_t count, loff_t *ppos)
>  {
>  	u8 cmd;
>  	int i, rc;
>  	int *idxp = file->private_data;
>  	int idx = *idxp;
>  	struct ibm_cffps *psu = to_psu(idxp, idx);
> -	char data[I2C_SMBUS_BLOCK_MAX] = { 0 };
> +	char data[I2C_SMBUS_BLOCK_MAX + 2] = { 0 };
>  
>  	pmbus_set_page(psu->client, 0);
>  
> @@ -157,9 +162,20 @@ static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
>  	case CFFPS_DEBUGFS_PN:
>  		cmd = CFFPS_PN_CMD;
>  		break;
> +	case CFFPS_DEBUGFS_HEADER:
> +		cmd = CFFPS_HEADER_CMD;
> +		break;
>  	case CFFPS_DEBUGFS_SN:
>  		cmd = CFFPS_SN_CMD;
>  		break;
> +	case CFFPS_DEBUGFS_MAX_POWER_OUT:
> +		rc = i2c_smbus_read_word_swapped(psu->client,
> +						 CFFPS_MAX_POWER_OUT_CMD);
> +		if (rc < 0)
> +			return rc;
> +
> +		rc = snprintf(data, I2C_SMBUS_BLOCK_MAX, "%d", rc);
> +		goto done;
>  	case CFFPS_DEBUGFS_CCIN:
>  		rc = i2c_smbus_read_word_swapped(psu->client, CFFPS_CCIN_CMD);
>  		if (rc < 0)
> @@ -199,6 +215,14 @@ static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
>  			return -EOPNOTSUPP;
>  		}
>  		goto done;
> +	case CFFPS_DEBUGFS_ON_OFF_CONFIG:
> +		rc = i2c_smbus_read_byte_data(psu->client,
> +					      PMBUS_ON_OFF_CONFIG);
> +		if (rc < 0)
> +			return rc;
> +
> +		rc = snprintf(data, 3, "%02x", rc);
> +		goto done;
>  	default:
>  		return -EINVAL;
>  	}
> @@ -214,9 +238,42 @@ static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
>  	return simple_read_from_buffer(buf, count, ppos, data, rc);
>  }
>  
> +static ssize_t ibm_cffps_debugfs_write(struct file *file,
> +				       const char __user *buf, size_t count,
> +				       loff_t *ppos)
> +{
> +	u8 data;
> +	ssize_t rc;
> +	int *idxp = file->private_data;
> +	int idx = *idxp;
> +	struct ibm_cffps *psu = to_psu(idxp, idx);
> +
> +	switch (idx) {
> +	case CFFPS_DEBUGFS_ON_OFF_CONFIG:
> +		pmbus_set_page(psu->client, 0);
> +
> +		rc = simple_write_to_buffer(&data, 1, ppos, buf, count);
> +		if (rc < 0)
> +			return rc;
> +
> +		rc = i2c_smbus_write_byte_data(psu->client,
> +					       PMBUS_ON_OFF_CONFIG, data);
> +		if (rc)
> +			return rc;
> +
> +		rc = 1;
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	return rc;
> +}
> +
>  static const struct file_operations ibm_cffps_fops = {
>  	.llseek = noop_llseek,
> -	.read = ibm_cffps_debugfs_op,
> +	.read = ibm_cffps_debugfs_read,
> +	.write = ibm_cffps_debugfs_write,
>  	.open = simple_open,
>  };
>  
> @@ -486,15 +543,24 @@ static int ibm_cffps_probe(struct i2c_client *client,
>  	debugfs_create_file("part_number", 0444, ibm_cffps_dir,
>  			    &psu->debugfs_entries[CFFPS_DEBUGFS_PN],
>  			    &ibm_cffps_fops);
> +	debugfs_create_file("header", 0444, ibm_cffps_dir,
> +			    &psu->debugfs_entries[CFFPS_DEBUGFS_HEADER],
> +			    &ibm_cffps_fops);
>  	debugfs_create_file("serial_number", 0444, ibm_cffps_dir,
>  			    &psu->debugfs_entries[CFFPS_DEBUGFS_SN],
>  			    &ibm_cffps_fops);
> +	debugfs_create_file("max_power_out", 0444, ibm_cffps_dir,
> +			    &psu->debugfs_entries[CFFPS_DEBUGFS_MAX_POWER_OUT],
> +			    &ibm_cffps_fops);
>  	debugfs_create_file("ccin", 0444, ibm_cffps_dir,
>  			    &psu->debugfs_entries[CFFPS_DEBUGFS_CCIN],
>  			    &ibm_cffps_fops);
>  	debugfs_create_file("fw_version", 0444, ibm_cffps_dir,
>  			    &psu->debugfs_entries[CFFPS_DEBUGFS_FW],
>  			    &ibm_cffps_fops);
> +	debugfs_create_file("on_off_config", 0644, ibm_cffps_dir,
> +			    &psu->debugfs_entries[CFFPS_DEBUGFS_ON_OFF_CONFIG],
> +			    &ibm_cffps_fops);
>  
>  	return 0;
>  }

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] hwmon: (pmbus/ibm-cffps) Add the VMON property for version 2
  2019-12-19 20:50 ` [PATCH 2/3] hwmon: (pmbus/ibm-cffps) Add the VMON property for version 2 Eddie James
@ 2020-01-04 16:28   ` Guenter Roeck
  2020-01-04 16:29     ` Guenter Roeck
  0 siblings, 1 reply; 9+ messages in thread
From: Guenter Roeck @ 2020-01-04 16:28 UTC (permalink / raw)
  To: Eddie James; +Cc: linux-hwmon, linux-kernel, jdelvare, bjwyman

On Thu, Dec 19, 2019 at 02:50:06PM -0600, Eddie James wrote:
> Version 2 of the PSU supports reading an auxiliary voltage. Use the
> pmbus VMON property and associated virtual register to read it.
> 
> Signed-off-by: Eddie James <eajames@linux.ibm.com>

I assume you are ok with v1 reading (or trying to read) this voltage.

Applied to hwmon-next.

> ---
>  drivers/hwmon/pmbus/ibm-cffps.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c
> index a564be9..b37faf1 100644
> --- a/drivers/hwmon/pmbus/ibm-cffps.c
> +++ b/drivers/hwmon/pmbus/ibm-cffps.c
> @@ -28,6 +28,7 @@
>  #define CFFPS1_FW_NUM_BYTES			4
>  #define CFFPS2_FW_NUM_WORDS			3
>  #define CFFPS_SYS_CONFIG_CMD			0xDA
> +#define CFFPS_12VCS_VOUT_CMD			0xDE
>  
>  #define CFFPS_INPUT_HISTORY_CMD			0xD6
>  #define CFFPS_INPUT_HISTORY_SIZE		100
> @@ -350,6 +351,9 @@ static int ibm_cffps_read_word_data(struct i2c_client *client, int page,
>  		if (mfr & CFFPS_MFR_PS_KILL)
>  			rc |= PB_STATUS_OFF;
>  		break;
> +	case PMBUS_VIRT_READ_VMON:
> +		rc = pmbus_read_word_data(client, page, CFFPS_12VCS_VOUT_CMD);
> +		break;
>  	default:
>  		rc = -ENODATA;
>  		break;
> @@ -453,7 +457,7 @@ static void ibm_cffps_create_led_class(struct ibm_cffps *psu)
>  			PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3 |
>  			PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT |
>  			PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_STATUS_TEMP |
> -			PMBUS_HAVE_STATUS_FAN12,
> +			PMBUS_HAVE_STATUS_FAN12 | PMBUS_HAVE_VMON,
>  		.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT |
>  			PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3 |
>  			PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT,

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] hwmon: (pmbus/ibm-cffps) Add the VMON property for version 2
  2020-01-04 16:28   ` Guenter Roeck
@ 2020-01-04 16:29     ` Guenter Roeck
  0 siblings, 0 replies; 9+ messages in thread
From: Guenter Roeck @ 2020-01-04 16:29 UTC (permalink / raw)
  To: Eddie James; +Cc: linux-hwmon, linux-kernel, jdelvare, bjwyman

On Sat, Jan 04, 2020 at 08:28:10AM -0800, Guenter Roeck wrote:
> On Thu, Dec 19, 2019 at 02:50:06PM -0600, Eddie James wrote:
> > Version 2 of the PSU supports reading an auxiliary voltage. Use the
> > pmbus VMON property and associated virtual register to read it.
> > 
> > Signed-off-by: Eddie James <eajames@linux.ibm.com>
> 
> I assume you are ok with v1 reading (or trying to read) this voltage.
> 
Ah, never mind, you don't. Sorry for the noise.

> Applied to hwmon-next.
> 
> > ---
> >  drivers/hwmon/pmbus/ibm-cffps.c | 6 +++++-
> >  1 file changed, 5 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c
> > index a564be9..b37faf1 100644
> > --- a/drivers/hwmon/pmbus/ibm-cffps.c
> > +++ b/drivers/hwmon/pmbus/ibm-cffps.c
> > @@ -28,6 +28,7 @@
> >  #define CFFPS1_FW_NUM_BYTES			4
> >  #define CFFPS2_FW_NUM_WORDS			3
> >  #define CFFPS_SYS_CONFIG_CMD			0xDA
> > +#define CFFPS_12VCS_VOUT_CMD			0xDE
> >  
> >  #define CFFPS_INPUT_HISTORY_CMD			0xD6
> >  #define CFFPS_INPUT_HISTORY_SIZE		100
> > @@ -350,6 +351,9 @@ static int ibm_cffps_read_word_data(struct i2c_client *client, int page,
> >  		if (mfr & CFFPS_MFR_PS_KILL)
> >  			rc |= PB_STATUS_OFF;
> >  		break;
> > +	case PMBUS_VIRT_READ_VMON:
> > +		rc = pmbus_read_word_data(client, page, CFFPS_12VCS_VOUT_CMD);
> > +		break;
> >  	default:
> >  		rc = -ENODATA;
> >  		break;
> > @@ -453,7 +457,7 @@ static void ibm_cffps_create_led_class(struct ibm_cffps *psu)
> >  			PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3 |
> >  			PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT |
> >  			PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_STATUS_TEMP |
> > -			PMBUS_HAVE_STATUS_FAN12,
> > +			PMBUS_HAVE_STATUS_FAN12 | PMBUS_HAVE_VMON,
> >  		.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT |
> >  			PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3 |
> >  			PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT,

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] hwmon: (pmbus/ibm-cffps) Fix the LED behavior when turned off
  2019-12-19 20:50 ` [PATCH 3/3] hwmon: (pmbus/ibm-cffps) Fix the LED behavior when turned off Eddie James
@ 2020-01-04 16:30   ` Guenter Roeck
  0 siblings, 0 replies; 9+ messages in thread
From: Guenter Roeck @ 2020-01-04 16:30 UTC (permalink / raw)
  To: Eddie James; +Cc: linux-hwmon, linux-kernel, jdelvare, bjwyman

On Thu, Dec 19, 2019 at 02:50:07PM -0600, Eddie James wrote:
> The driver should remain in control of the LED on the PSU, even while
> off, not the PSU firmware as previously indicated.
> 
> Signed-off-by: Eddie James <eajames@linux.ibm.com>

Applied to hwmon-next.

Thanks,
Guenter

> ---
>  drivers/hwmon/pmbus/ibm-cffps.c | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c
> index b37faf1..1c91ee1 100644
> --- a/drivers/hwmon/pmbus/ibm-cffps.c
> +++ b/drivers/hwmon/pmbus/ibm-cffps.c
> @@ -47,13 +47,9 @@
>  #define CFFPS_MFR_VAUX_FAULT			BIT(6)
>  #define CFFPS_MFR_CURRENT_SHARE_WARNING		BIT(7)
>  
> -/*
> - * LED off state actually relinquishes LED control to PSU firmware, so it can
> - * turn on the LED for faults.
> - */
> -#define CFFPS_LED_OFF				0
>  #define CFFPS_LED_BLINK				BIT(0)
>  #define CFFPS_LED_ON				BIT(1)
> +#define CFFPS_LED_OFF				BIT(2)
>  #define CFFPS_BLINK_RATE_MS			250
>  
>  enum {
> @@ -436,6 +432,9 @@ static void ibm_cffps_create_led_class(struct ibm_cffps *psu)
>  	rc = devm_led_classdev_register(dev, &psu->led);
>  	if (rc)
>  		dev_warn(dev, "failed to register led class: %d\n", rc);
> +	else
> +		i2c_smbus_write_byte_data(client, CFFPS_SYS_CONFIG_CMD,
> +					  CFFPS_LED_OFF);
>  }
>  
>  static struct pmbus_driver_info ibm_cffps_info[] = {

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] hwmon: (pmbus/ibm-cffps) Add new manufacturer debugfs entries
  2020-01-04 16:26   ` Guenter Roeck
@ 2020-01-06 15:32     ` Eddie James
  0 siblings, 0 replies; 9+ messages in thread
From: Eddie James @ 2020-01-06 15:32 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-hwmon, linux-kernel, jdelvare, bjwyman


On 1/4/20 10:26 AM, Guenter Roeck wrote:
> On Thu, Dec 19, 2019 at 02:50:05PM -0600, Eddie James wrote:
>> Add support for a number of manufacturer-specific registers in the
>> debugfs entries, as well as support to read and write the
>> PMBUS_ON_OFF_CONFIG register through debugfs.
>>
>> Signed-off-by: Eddie James <eajames@linux.ibm.com>
> I assume you know what you are doing, letting the user write anything
> into on_off_config. Applied to -next.


Thanks for merging the series! Yep, that's the requirement I was given...


Cheers,

Eddie


>
> Guenter
>
>> ---
>>   drivers/hwmon/pmbus/ibm-cffps.c | 74 ++++++++++++++++++++++++++++++++++++++---
>>   1 file changed, 70 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c
>> index d359b76..a564be9 100644
>> --- a/drivers/hwmon/pmbus/ibm-cffps.c
>> +++ b/drivers/hwmon/pmbus/ibm-cffps.c
>> @@ -20,7 +20,9 @@
>>   
>>   #define CFFPS_FRU_CMD				0x9A
>>   #define CFFPS_PN_CMD				0x9B
>> +#define CFFPS_HEADER_CMD			0x9C
>>   #define CFFPS_SN_CMD				0x9E
>> +#define CFFPS_MAX_POWER_OUT_CMD			0xA7
>>   #define CFFPS_CCIN_CMD				0xBD
>>   #define CFFPS_FW_CMD				0xFA
>>   #define CFFPS1_FW_NUM_BYTES			4
>> @@ -57,9 +59,12 @@ enum {
>>   	CFFPS_DEBUGFS_INPUT_HISTORY = 0,
>>   	CFFPS_DEBUGFS_FRU,
>>   	CFFPS_DEBUGFS_PN,
>> +	CFFPS_DEBUGFS_HEADER,
>>   	CFFPS_DEBUGFS_SN,
>> +	CFFPS_DEBUGFS_MAX_POWER_OUT,
>>   	CFFPS_DEBUGFS_CCIN,
>>   	CFFPS_DEBUGFS_FW,
>> +	CFFPS_DEBUGFS_ON_OFF_CONFIG,
>>   	CFFPS_DEBUGFS_NUM_ENTRIES
>>   };
>>   
>> @@ -136,15 +141,15 @@ static ssize_t ibm_cffps_read_input_history(struct ibm_cffps *psu,
>>   				       psu->input_history.byte_count);
>>   }
>>   
>> -static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
>> -				    size_t count, loff_t *ppos)
>> +static ssize_t ibm_cffps_debugfs_read(struct file *file, char __user *buf,
>> +				      size_t count, loff_t *ppos)
>>   {
>>   	u8 cmd;
>>   	int i, rc;
>>   	int *idxp = file->private_data;
>>   	int idx = *idxp;
>>   	struct ibm_cffps *psu = to_psu(idxp, idx);
>> -	char data[I2C_SMBUS_BLOCK_MAX] = { 0 };
>> +	char data[I2C_SMBUS_BLOCK_MAX + 2] = { 0 };
>>   
>>   	pmbus_set_page(psu->client, 0);
>>   
>> @@ -157,9 +162,20 @@ static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
>>   	case CFFPS_DEBUGFS_PN:
>>   		cmd = CFFPS_PN_CMD;
>>   		break;
>> +	case CFFPS_DEBUGFS_HEADER:
>> +		cmd = CFFPS_HEADER_CMD;
>> +		break;
>>   	case CFFPS_DEBUGFS_SN:
>>   		cmd = CFFPS_SN_CMD;
>>   		break;
>> +	case CFFPS_DEBUGFS_MAX_POWER_OUT:
>> +		rc = i2c_smbus_read_word_swapped(psu->client,
>> +						 CFFPS_MAX_POWER_OUT_CMD);
>> +		if (rc < 0)
>> +			return rc;
>> +
>> +		rc = snprintf(data, I2C_SMBUS_BLOCK_MAX, "%d", rc);
>> +		goto done;
>>   	case CFFPS_DEBUGFS_CCIN:
>>   		rc = i2c_smbus_read_word_swapped(psu->client, CFFPS_CCIN_CMD);
>>   		if (rc < 0)
>> @@ -199,6 +215,14 @@ static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
>>   			return -EOPNOTSUPP;
>>   		}
>>   		goto done;
>> +	case CFFPS_DEBUGFS_ON_OFF_CONFIG:
>> +		rc = i2c_smbus_read_byte_data(psu->client,
>> +					      PMBUS_ON_OFF_CONFIG);
>> +		if (rc < 0)
>> +			return rc;
>> +
>> +		rc = snprintf(data, 3, "%02x", rc);
>> +		goto done;
>>   	default:
>>   		return -EINVAL;
>>   	}
>> @@ -214,9 +238,42 @@ static ssize_t ibm_cffps_debugfs_op(struct file *file, char __user *buf,
>>   	return simple_read_from_buffer(buf, count, ppos, data, rc);
>>   }
>>   
>> +static ssize_t ibm_cffps_debugfs_write(struct file *file,
>> +				       const char __user *buf, size_t count,
>> +				       loff_t *ppos)
>> +{
>> +	u8 data;
>> +	ssize_t rc;
>> +	int *idxp = file->private_data;
>> +	int idx = *idxp;
>> +	struct ibm_cffps *psu = to_psu(idxp, idx);
>> +
>> +	switch (idx) {
>> +	case CFFPS_DEBUGFS_ON_OFF_CONFIG:
>> +		pmbus_set_page(psu->client, 0);
>> +
>> +		rc = simple_write_to_buffer(&data, 1, ppos, buf, count);
>> +		if (rc < 0)
>> +			return rc;
>> +
>> +		rc = i2c_smbus_write_byte_data(psu->client,
>> +					       PMBUS_ON_OFF_CONFIG, data);
>> +		if (rc)
>> +			return rc;
>> +
>> +		rc = 1;
>> +		break;
>> +	default:
>> +		return -EINVAL;
>> +	}
>> +
>> +	return rc;
>> +}
>> +
>>   static const struct file_operations ibm_cffps_fops = {
>>   	.llseek = noop_llseek,
>> -	.read = ibm_cffps_debugfs_op,
>> +	.read = ibm_cffps_debugfs_read,
>> +	.write = ibm_cffps_debugfs_write,
>>   	.open = simple_open,
>>   };
>>   
>> @@ -486,15 +543,24 @@ static int ibm_cffps_probe(struct i2c_client *client,
>>   	debugfs_create_file("part_number", 0444, ibm_cffps_dir,
>>   			    &psu->debugfs_entries[CFFPS_DEBUGFS_PN],
>>   			    &ibm_cffps_fops);
>> +	debugfs_create_file("header", 0444, ibm_cffps_dir,
>> +			    &psu->debugfs_entries[CFFPS_DEBUGFS_HEADER],
>> +			    &ibm_cffps_fops);
>>   	debugfs_create_file("serial_number", 0444, ibm_cffps_dir,
>>   			    &psu->debugfs_entries[CFFPS_DEBUGFS_SN],
>>   			    &ibm_cffps_fops);
>> +	debugfs_create_file("max_power_out", 0444, ibm_cffps_dir,
>> +			    &psu->debugfs_entries[CFFPS_DEBUGFS_MAX_POWER_OUT],
>> +			    &ibm_cffps_fops);
>>   	debugfs_create_file("ccin", 0444, ibm_cffps_dir,
>>   			    &psu->debugfs_entries[CFFPS_DEBUGFS_CCIN],
>>   			    &ibm_cffps_fops);
>>   	debugfs_create_file("fw_version", 0444, ibm_cffps_dir,
>>   			    &psu->debugfs_entries[CFFPS_DEBUGFS_FW],
>>   			    &ibm_cffps_fops);
>> +	debugfs_create_file("on_off_config", 0644, ibm_cffps_dir,
>> +			    &psu->debugfs_entries[CFFPS_DEBUGFS_ON_OFF_CONFIG],
>> +			    &ibm_cffps_fops);
>>   
>>   	return 0;
>>   }

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-01-06 15:33 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-19 20:50 [PATCH 0/3] hwmon: (pmbus/ibm-cffps) New debugfs entries, VMON, and LED fix Eddie James
2019-12-19 20:50 ` [PATCH 1/3] hwmon: (pmbus/ibm-cffps) Add new manufacturer debugfs entries Eddie James
2020-01-04 16:26   ` Guenter Roeck
2020-01-06 15:32     ` Eddie James
2019-12-19 20:50 ` [PATCH 2/3] hwmon: (pmbus/ibm-cffps) Add the VMON property for version 2 Eddie James
2020-01-04 16:28   ` Guenter Roeck
2020-01-04 16:29     ` Guenter Roeck
2019-12-19 20:50 ` [PATCH 3/3] hwmon: (pmbus/ibm-cffps) Fix the LED behavior when turned off Eddie James
2020-01-04 16:30   ` Guenter Roeck

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).