diff mbox series

[1/3] hwmon: (pmbus) Add paged support for VIN, IIN, PIN parameters

Message ID 1559751434-19879-2-git-send-email-hancock@sedsystems.ca (mailing list archive)
State Superseded
Headers show
Series Add pmbus support for Infineon IRPS5401 | expand

Commit Message

Robert Hancock June 5, 2019, 4:17 p.m. UTC
Previously the VIN, IIN and PIN parameters were marked as non-paged,
however on the IRPS5401 these parameters are present on multiple pages.
Add the paged flag for these parameters so they can be detected properly
on such chips.

Signed-off-by: Robert Hancock <hancock@sedsystems.ca>
---
 drivers/hwmon/pmbus/pmbus_core.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Guenter Roeck June 5, 2019, 4:48 p.m. UTC | #1
On Wed, Jun 05, 2019 at 10:17:12AM -0600, Robert Hancock wrote:
> Previously the VIN, IIN and PIN parameters were marked as non-paged,
> however on the IRPS5401 these parameters are present on multiple pages.
> Add the paged flag for these parameters so they can be detected properly
> on such chips.
> 

Have you tested the impact of this change on other chips where the
registers are non-paged ?

To reduce risk due to potentially mis-detecting support on other chips,
it may be better to add a separate backend driver for this chip. This
would also enable support for the MFR_VOUT_PEAK, MFR_IOUT_PEAK, and
MFR_TEMPERATURE_PEAK registers which is otherwise unavailable.

Thanks,
Guenter

> Signed-off-by: Robert Hancock <hancock@sedsystems.ca>
> ---
>  drivers/hwmon/pmbus/pmbus_core.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
> index ef7ee90..6e3aaf1 100644
> --- a/drivers/hwmon/pmbus/pmbus_core.c
> +++ b/drivers/hwmon/pmbus/pmbus_core.c
> @@ -1395,6 +1395,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
>  		.reg = PMBUS_READ_VIN,
>  		.class = PSC_VOLTAGE_IN,
>  		.label = "vin",
> +		.paged = true,
>  		.func = PMBUS_HAVE_VIN,
>  		.sfunc = PMBUS_HAVE_STATUS_INPUT,
>  		.sbase = PB_STATUS_INPUT_BASE,
> @@ -1499,6 +1500,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
>  		.reg = PMBUS_READ_IIN,
>  		.class = PSC_CURRENT_IN,
>  		.label = "iin",
> +		.paged = true,
>  		.func = PMBUS_HAVE_IIN,
>  		.sfunc = PMBUS_HAVE_STATUS_INPUT,
>  		.sbase = PB_STATUS_INPUT_BASE,
> @@ -1584,6 +1586,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
>  		.reg = PMBUS_READ_PIN,
>  		.class = PSC_POWER,
>  		.label = "pin",
> +		.paged = true,
>  		.func = PMBUS_HAVE_PIN,
>  		.sfunc = PMBUS_HAVE_STATUS_INPUT,
>  		.sbase = PB_STATUS_INPUT_BASE,
> -- 
> 1.8.3.1
>
Robert Hancock June 5, 2019, 5:14 p.m. UTC | #2
On 2019-06-05 10:48 a.m., Guenter Roeck wrote:
> On Wed, Jun 05, 2019 at 10:17:12AM -0600, Robert Hancock wrote:
>> Previously the VIN, IIN and PIN parameters were marked as non-paged,
>> however on the IRPS5401 these parameters are present on multiple pages.
>> Add the paged flag for these parameters so they can be detected properly
>> on such chips.
>>
> 
> Have you tested the impact of this change on other chips where the
> registers are non-paged ?

No, I don't think I have any devices available that have another pmbus chip.

> To reduce risk due to potentially mis-detecting support on other chips,
> it may be better to add a separate backend driver for this chip. This
> would also enable support for the MFR_VOUT_PEAK, MFR_IOUT_PEAK, and
> MFR_TEMPERATURE_PEAK registers which is otherwise unavailable.

To clarify, you're saying instead of having the auto-detection for those
in the generic pmbus driver, create a separate irps5401 driver that
would explicitly add in those parameters?

This particular patch to pmbus_core.c would still be required in order
for the paged parameters to be displayed properly - it shouldn't break
anything on chips that don't detect these parameters on multiple pages.

> 
> Thanks,
> Guenter
> 
>> Signed-off-by: Robert Hancock <hancock@sedsystems.ca>
>> ---
>>  drivers/hwmon/pmbus/pmbus_core.c | 3 +++
>>  1 file changed, 3 insertions(+)
>>
>> diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
>> index ef7ee90..6e3aaf1 100644
>> --- a/drivers/hwmon/pmbus/pmbus_core.c
>> +++ b/drivers/hwmon/pmbus/pmbus_core.c
>> @@ -1395,6 +1395,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
>>  		.reg = PMBUS_READ_VIN,
>>  		.class = PSC_VOLTAGE_IN,
>>  		.label = "vin",
>> +		.paged = true,
>>  		.func = PMBUS_HAVE_VIN,
>>  		.sfunc = PMBUS_HAVE_STATUS_INPUT,
>>  		.sbase = PB_STATUS_INPUT_BASE,
>> @@ -1499,6 +1500,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
>>  		.reg = PMBUS_READ_IIN,
>>  		.class = PSC_CURRENT_IN,
>>  		.label = "iin",
>> +		.paged = true,
>>  		.func = PMBUS_HAVE_IIN,
>>  		.sfunc = PMBUS_HAVE_STATUS_INPUT,
>>  		.sbase = PB_STATUS_INPUT_BASE,
>> @@ -1584,6 +1586,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
>>  		.reg = PMBUS_READ_PIN,
>>  		.class = PSC_POWER,
>>  		.label = "pin",
>> +		.paged = true,
>>  		.func = PMBUS_HAVE_PIN,
>>  		.sfunc = PMBUS_HAVE_STATUS_INPUT,
>>  		.sbase = PB_STATUS_INPUT_BASE,
>> -- 
>> 1.8.3.1
>>
Guenter Roeck June 5, 2019, 6:27 p.m. UTC | #3
On Wed, Jun 05, 2019 at 11:14:46AM -0600, Robert Hancock wrote:
> On 2019-06-05 10:48 a.m., Guenter Roeck wrote:
> > On Wed, Jun 05, 2019 at 10:17:12AM -0600, Robert Hancock wrote:
> >> Previously the VIN, IIN and PIN parameters were marked as non-paged,
> >> however on the IRPS5401 these parameters are present on multiple pages.
> >> Add the paged flag for these parameters so they can be detected properly
> >> on such chips.
> >>
> > 
> > Have you tested the impact of this change on other chips where the
> > registers are non-paged ?
> 
> No, I don't think I have any devices available that have another pmbus chip.
> 
> > To reduce risk due to potentially mis-detecting support on other chips,
> > it may be better to add a separate backend driver for this chip. This
> > would also enable support for the MFR_VOUT_PEAK, MFR_IOUT_PEAK, and
> > MFR_TEMPERATURE_PEAK registers which is otherwise unavailable.
> 
> To clarify, you're saying instead of having the auto-detection for those
> in the generic pmbus driver, create a separate irps5401 driver that
> would explicitly add in those parameters?
> 
Yes.

> This particular patch to pmbus_core.c would still be required in order
> for the paged parameters to be displayed properly - it shouldn't break
> anything on chips that don't detect these parameters on multiple pages.
> 

It should still work, though, except that there would be duplicate labels.

On the downside, with this change, the "vin" etc. label would be "vin1"
for all chips, not just this one. That may break compatibility if there
are users out there looking for specific labels. We may need a better
and more flexible solution to address this problem. For example, the core
could not only look for ".paged", but check if the respective attributes are
present in more than one page, and if so override the "paged" flag.
Something like the following (untested).

static bool pmbus_sensor_is_paged(const struct pmbus_driver_info *info,
				  const struct pmbus_sensor_attr *attr)
{
	int p;

	if (attr->paged)
		return true;

	for (p = 1; p < info->pages; p++) {
		if (info->func[p] & attr->func)
			return true;
	}
	return false;
}

...

static int pmbus_add_sensor_attrs(...)
{
	...

	bool paged = pmbus_sensor_is_paged(info, attrs);

	pages = paged ? info->pages : 1;
	...
	ret = pmbus_add_sensor_attrs_one(client, data, info, name, index, page, attrs, paged)
										       ^^^
										       new parameter
}

Guenter

> > 
> > Thanks,
> > Guenter
> > 
> >> Signed-off-by: Robert Hancock <hancock@sedsystems.ca>
> >> ---
> >>  drivers/hwmon/pmbus/pmbus_core.c | 3 +++
> >>  1 file changed, 3 insertions(+)
> >>
> >> diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
> >> index ef7ee90..6e3aaf1 100644
> >> --- a/drivers/hwmon/pmbus/pmbus_core.c
> >> +++ b/drivers/hwmon/pmbus/pmbus_core.c
> >> @@ -1395,6 +1395,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
> >>  		.reg = PMBUS_READ_VIN,
> >>  		.class = PSC_VOLTAGE_IN,
> >>  		.label = "vin",
> >> +		.paged = true,
> >>  		.func = PMBUS_HAVE_VIN,
> >>  		.sfunc = PMBUS_HAVE_STATUS_INPUT,
> >>  		.sbase = PB_STATUS_INPUT_BASE,
> >> @@ -1499,6 +1500,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
> >>  		.reg = PMBUS_READ_IIN,
> >>  		.class = PSC_CURRENT_IN,
> >>  		.label = "iin",
> >> +		.paged = true,
> >>  		.func = PMBUS_HAVE_IIN,
> >>  		.sfunc = PMBUS_HAVE_STATUS_INPUT,
> >>  		.sbase = PB_STATUS_INPUT_BASE,
> >> @@ -1584,6 +1586,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
> >>  		.reg = PMBUS_READ_PIN,
> >>  		.class = PSC_POWER,
> >>  		.label = "pin",
> >> +		.paged = true,
> >>  		.func = PMBUS_HAVE_PIN,
> >>  		.sfunc = PMBUS_HAVE_STATUS_INPUT,
> >>  		.sbase = PB_STATUS_INPUT_BASE,
> >> -- 
> >> 1.8.3.1
> >>
> 
> -- 
> Robert Hancock
> Senior Software Developer
> SED Systems, a division of Calian Ltd.
> Email: hancock@sedsystems.ca
Robert Hancock June 5, 2019, 7:22 p.m. UTC | #4
On 2019-06-05 12:27 p.m., Guenter Roeck wrote:
>>> To reduce risk due to potentially mis-detecting support on other chips,
>>> it may be better to add a separate backend driver for this chip. This
>>> would also enable support for the MFR_VOUT_PEAK, MFR_IOUT_PEAK, and
>>> MFR_TEMPERATURE_PEAK registers which is otherwise unavailable.
>>
>> To clarify, you're saying instead of having the auto-detection for those
>> in the generic pmbus driver, create a separate irps5401 driver that
>> would explicitly add in those parameters?
>>
> Yes.

OK, I can do that. We initially had a separate driver file for this, but
ended up changing it to update the generic detection instead. But the
separate driver file is likely safer.

> 
>> This particular patch to pmbus_core.c would still be required in order
>> for the paged parameters to be displayed properly - it shouldn't break
>> anything on chips that don't detect these parameters on multiple pages.
>>
> 
> It should still work, though, except that there would be duplicate labels.

I don't think it actually does work, at least not in the sensors utility
- I haven't diagnosed where it was going wrong, but either not all of
the attributes are successfully added at the kernel level, or libsensors
filters out the "duplicate" entries and you only see one of them in the
output.

Actually, it appears there are already drivers in tree that have
multiple pages with VIN, PIN and/or IIN values, such as ir35521, which
would already have this problem.

> 
> On the downside, with this change, the "vin" etc. label would be "vin1"
> for all chips, not just this one. That may break compatibility if there
> are users out there looking for specific labels. We may need a better
> and more flexible solution to address this problem. For example, the core
> could not only look for ".paged", but check if the respective attributes are
> present in more than one page, and if so override the "paged" flag.
> Something like the following (untested).

I think that may be the best solution - though as I mentioned, there are
already some drivers whose behavior would be changed by this in that
they would end up with vin1 and vin2 instead of vin, etc. In those
cases, however, there might be no real alternative - it's not even clear
that the current behavior the user would get in that case would even be
consistent in terms of which parameter would actually be shown,
depending on how that is handled in libsensors.

> 
> static bool pmbus_sensor_is_paged(const struct pmbus_driver_info *info,
> 				  const struct pmbus_sensor_attr *attr)
> {
> 	int p;
> 
> 	if (attr->paged)
> 		return true;
> 
> 	for (p = 1; p < info->pages; p++) {
> 		if (info->func[p] & attr->func)
> 			return true;
> 	}
> 	return false;
> }
> 
> ...
> 
> static int pmbus_add_sensor_attrs(...)
> {
> 	...
> 
> 	bool paged = pmbus_sensor_is_paged(info, attrs);
> 
> 	pages = paged ? info->pages : 1;
> 	...
> 	ret = pmbus_add_sensor_attrs_one(client, data, info, name, index, page, attrs, paged)
> 										       ^^^
> 										       new parameter
> }
> 
> Guenter
Guenter Roeck June 5, 2019, 7:30 p.m. UTC | #5
On Wed, Jun 05, 2019 at 01:22:21PM -0600, Robert Hancock wrote:
> On 2019-06-05 12:27 p.m., Guenter Roeck wrote:
> >>> To reduce risk due to potentially mis-detecting support on other chips,
> >>> it may be better to add a separate backend driver for this chip. This
> >>> would also enable support for the MFR_VOUT_PEAK, MFR_IOUT_PEAK, and
> >>> MFR_TEMPERATURE_PEAK registers which is otherwise unavailable.
> >>
> >> To clarify, you're saying instead of having the auto-detection for those
> >> in the generic pmbus driver, create a separate irps5401 driver that
> >> would explicitly add in those parameters?
> >>
> > Yes.
> 
> OK, I can do that. We initially had a separate driver file for this, but
> ended up changing it to update the generic detection instead. But the
> separate driver file is likely safer.
> 
> > 
> >> This particular patch to pmbus_core.c would still be required in order
> >> for the paged parameters to be displayed properly - it shouldn't break
> >> anything on chips that don't detect these parameters on multiple pages.
> >>
> > 
> > It should still work, though, except that there would be duplicate labels.
> 
> I don't think it actually does work, at least not in the sensors utility
> - I haven't diagnosed where it was going wrong, but either not all of
> the attributes are successfully added at the kernel level, or libsensors
> filters out the "duplicate" entries and you only see one of them in the
> output.
> 
Possibly it is a problem with libsensors. I don't have any of those chips
(or evaluation boards), so I never noticed.

> Actually, it appears there are already drivers in tree that have
> multiple pages with VIN, PIN and/or IIN values, such as ir35521, which
> would already have this problem.
> 
Yes.

> > 
> > On the downside, with this change, the "vin" etc. label would be "vin1"
> > for all chips, not just this one. That may break compatibility if there
> > are users out there looking for specific labels. We may need a better
> > and more flexible solution to address this problem. For example, the core
> > could not only look for ".paged", but check if the respective attributes are
> > present in more than one page, and if so override the "paged" flag.
> > Something like the following (untested).
> 
> I think that may be the best solution - though as I mentioned, there are
> already some drivers whose behavior would be changed by this in that
> they would end up with vin1 and vin2 instead of vin, etc. In those
> cases, however, there might be no real alternative - it's not even clear
> that the current behavior the user would get in that case would even be
> consistent in terms of which parameter would actually be shown,
> depending on how that is handled in libsensors.
> 
For those drivers I would consider this to be a bug fix.

An alternative would be to go with "vin", "vin2", and so on, but I don't
really like that.

Guenter
diff mbox series

Patch

diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index ef7ee90..6e3aaf1 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -1395,6 +1395,7 @@  static int pmbus_add_sensor_attrs(struct i2c_client *client,
 		.reg = PMBUS_READ_VIN,
 		.class = PSC_VOLTAGE_IN,
 		.label = "vin",
+		.paged = true,
 		.func = PMBUS_HAVE_VIN,
 		.sfunc = PMBUS_HAVE_STATUS_INPUT,
 		.sbase = PB_STATUS_INPUT_BASE,
@@ -1499,6 +1500,7 @@  static int pmbus_add_sensor_attrs(struct i2c_client *client,
 		.reg = PMBUS_READ_IIN,
 		.class = PSC_CURRENT_IN,
 		.label = "iin",
+		.paged = true,
 		.func = PMBUS_HAVE_IIN,
 		.sfunc = PMBUS_HAVE_STATUS_INPUT,
 		.sbase = PB_STATUS_INPUT_BASE,
@@ -1584,6 +1586,7 @@  static int pmbus_add_sensor_attrs(struct i2c_client *client,
 		.reg = PMBUS_READ_PIN,
 		.class = PSC_POWER,
 		.label = "pin",
+		.paged = true,
 		.func = PMBUS_HAVE_PIN,
 		.sfunc = PMBUS_HAVE_STATUS_INPUT,
 		.sbase = PB_STATUS_INPUT_BASE,