LKML Archive on lore.kernel.org help / color / mirror / Atom feed
* [PATCH v2 0/2] hwmon: (pmbus/bpa-rs600) cleanup and workaround @ 2021-08-12 1:39 Chris Packham 2021-08-12 1:39 ` [PATCH v2 1/2] hwmon: (pmbus/bpa-rs600) Don't use rated limits as warn limits Chris Packham 2021-08-12 1:40 ` [PATCH v2 2/2] hwmon: (pmbus/bpa-rs600) Add workaround for incorrect Pin max Chris Packham 0 siblings, 2 replies; 5+ messages in thread From: Chris Packham @ 2021-08-12 1:39 UTC (permalink / raw) To: linux, jdelvare; +Cc: linux-hwmon, linux-kernel, Chris Packham This series should apply cleanly without the BPD-RS600 support[1] which is in Guenter's tree by hasn't made it to Linus' yet. Patch 2/2 technically fixes a problem that is only present on the BPD-RS600. Patch 1/2 might need to head to stable but it's probably not the end of the world if it doesn't. [1] - https://lore.kernel.org/linux-hwmon/20210708220618.23576-1-chris.packham@alliedtelesis.co.nz/ Chris Packham (2): hwmon: (pmbus/bpa-rs600) Don't use rated limits as warn limits hwmon: (pmbus/bpa-rs600) Add workaround for incorrect Pin max drivers/hwmon/pmbus/bpa-rs600.c | 48 ++++++++++++++++----------------- 1 file changed, 23 insertions(+), 25 deletions(-) -- 2.32.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] hwmon: (pmbus/bpa-rs600) Don't use rated limits as warn limits 2021-08-12 1:39 [PATCH v2 0/2] hwmon: (pmbus/bpa-rs600) cleanup and workaround Chris Packham @ 2021-08-12 1:39 ` Chris Packham 2021-08-12 4:40 ` Guenter Roeck 2021-08-12 1:40 ` [PATCH v2 2/2] hwmon: (pmbus/bpa-rs600) Add workaround for incorrect Pin max Chris Packham 1 sibling, 1 reply; 5+ messages in thread From: Chris Packham @ 2021-08-12 1:39 UTC (permalink / raw) To: linux, jdelvare; +Cc: linux-hwmon, linux-kernel, Chris Packham In the initial implementation a number of PMBUS_x_WARN_LIMITs were mapped to MFR fields. This was incorrect as these MFR limits reflect the rated limit as opposed to a limit which will generate warning. Instead return -ENXIO like we were already doing for other WARN_LIMITs. Subsequently these rated limits have been exposed generically as new fields in the sysfs ABI so the values are still available. Fixes: 15b2703e5e02 ("hwmon: (pmbus) Add driver for BluTek BPA-RS600") Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- Notes: Changes in v2: - Reworked to remove the mapping of warning limits to rated limits. drivers/hwmon/pmbus/bpa-rs600.c | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/drivers/hwmon/pmbus/bpa-rs600.c b/drivers/hwmon/pmbus/bpa-rs600.c index d205b41540ce..84dee86399cb 100644 --- a/drivers/hwmon/pmbus/bpa-rs600.c +++ b/drivers/hwmon/pmbus/bpa-rs600.c @@ -12,15 +12,6 @@ #include <linux/pmbus.h> #include "pmbus.h" -#define BPARS600_MFR_VIN_MIN 0xa0 -#define BPARS600_MFR_VIN_MAX 0xa1 -#define BPARS600_MFR_IIN_MAX 0xa2 -#define BPARS600_MFR_PIN_MAX 0xa3 -#define BPARS600_MFR_VOUT_MIN 0xa4 -#define BPARS600_MFR_VOUT_MAX 0xa5 -#define BPARS600_MFR_IOUT_MAX 0xa6 -#define BPARS600_MFR_POUT_MAX 0xa7 - enum chips { bpa_rs600, bpd_rs600 }; static int bpa_rs600_read_byte_data(struct i2c_client *client, int page, int reg) @@ -83,29 +74,13 @@ static int bpa_rs600_read_word_data(struct i2c_client *client, int page, int pha switch (reg) { case PMBUS_VIN_UV_WARN_LIMIT: - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_VIN_MIN); - break; case PMBUS_VIN_OV_WARN_LIMIT: - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_VIN_MAX); - break; case PMBUS_VOUT_UV_WARN_LIMIT: - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_VOUT_MIN); - break; case PMBUS_VOUT_OV_WARN_LIMIT: - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_VOUT_MAX); - break; case PMBUS_IIN_OC_WARN_LIMIT: - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_IIN_MAX); - break; case PMBUS_IOUT_OC_WARN_LIMIT: - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_IOUT_MAX); - break; case PMBUS_PIN_OP_WARN_LIMIT: - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_PIN_MAX); - break; case PMBUS_POUT_OP_WARN_LIMIT: - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_POUT_MAX); - break; case PMBUS_VIN_UV_FAULT_LIMIT: case PMBUS_VIN_OV_FAULT_LIMIT: case PMBUS_VOUT_UV_FAULT_LIMIT: -- 2.32.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] hwmon: (pmbus/bpa-rs600) Don't use rated limits as warn limits 2021-08-12 1:39 ` [PATCH v2 1/2] hwmon: (pmbus/bpa-rs600) Don't use rated limits as warn limits Chris Packham @ 2021-08-12 4:40 ` Guenter Roeck 0 siblings, 0 replies; 5+ messages in thread From: Guenter Roeck @ 2021-08-12 4:40 UTC (permalink / raw) To: Chris Packham; +Cc: jdelvare, linux-hwmon, linux-kernel On Thu, Aug 12, 2021 at 01:39:59PM +1200, Chris Packham wrote: > In the initial implementation a number of PMBUS_x_WARN_LIMITs were > mapped to MFR fields. This was incorrect as these MFR limits reflect the > rated limit as opposed to a limit which will generate warning. Instead > return -ENXIO like we were already doing for other WARN_LIMITs. > > Subsequently these rated limits have been exposed generically as new > fields in the sysfs ABI so the values are still available. > > Fixes: 15b2703e5e02 ("hwmon: (pmbus) Add driver for BluTek BPA-RS600") > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> Applied. Thanks, Guenter > --- > > Notes: > Changes in v2: > - Reworked to remove the mapping of warning limits to rated limits. > > drivers/hwmon/pmbus/bpa-rs600.c | 25 ------------------------- > 1 file changed, 25 deletions(-) > > diff --git a/drivers/hwmon/pmbus/bpa-rs600.c b/drivers/hwmon/pmbus/bpa-rs600.c > index d205b41540ce..84dee86399cb 100644 > --- a/drivers/hwmon/pmbus/bpa-rs600.c > +++ b/drivers/hwmon/pmbus/bpa-rs600.c > @@ -12,15 +12,6 @@ > #include <linux/pmbus.h> > #include "pmbus.h" > > -#define BPARS600_MFR_VIN_MIN 0xa0 > -#define BPARS600_MFR_VIN_MAX 0xa1 > -#define BPARS600_MFR_IIN_MAX 0xa2 > -#define BPARS600_MFR_PIN_MAX 0xa3 > -#define BPARS600_MFR_VOUT_MIN 0xa4 > -#define BPARS600_MFR_VOUT_MAX 0xa5 > -#define BPARS600_MFR_IOUT_MAX 0xa6 > -#define BPARS600_MFR_POUT_MAX 0xa7 > - > enum chips { bpa_rs600, bpd_rs600 }; > > static int bpa_rs600_read_byte_data(struct i2c_client *client, int page, int reg) > @@ -83,29 +74,13 @@ static int bpa_rs600_read_word_data(struct i2c_client *client, int page, int pha > > switch (reg) { > case PMBUS_VIN_UV_WARN_LIMIT: > - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_VIN_MIN); > - break; > case PMBUS_VIN_OV_WARN_LIMIT: > - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_VIN_MAX); > - break; > case PMBUS_VOUT_UV_WARN_LIMIT: > - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_VOUT_MIN); > - break; > case PMBUS_VOUT_OV_WARN_LIMIT: > - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_VOUT_MAX); > - break; > case PMBUS_IIN_OC_WARN_LIMIT: > - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_IIN_MAX); > - break; > case PMBUS_IOUT_OC_WARN_LIMIT: > - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_IOUT_MAX); > - break; > case PMBUS_PIN_OP_WARN_LIMIT: > - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_PIN_MAX); > - break; > case PMBUS_POUT_OP_WARN_LIMIT: > - ret = pmbus_read_word_data(client, 0, 0xff, BPARS600_MFR_POUT_MAX); > - break; > case PMBUS_VIN_UV_FAULT_LIMIT: > case PMBUS_VIN_OV_FAULT_LIMIT: > case PMBUS_VOUT_UV_FAULT_LIMIT: ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] hwmon: (pmbus/bpa-rs600) Add workaround for incorrect Pin max 2021-08-12 1:39 [PATCH v2 0/2] hwmon: (pmbus/bpa-rs600) cleanup and workaround Chris Packham 2021-08-12 1:39 ` [PATCH v2 1/2] hwmon: (pmbus/bpa-rs600) Don't use rated limits as warn limits Chris Packham @ 2021-08-12 1:40 ` Chris Packham 2021-08-12 4:41 ` Guenter Roeck 1 sibling, 1 reply; 5+ messages in thread From: Chris Packham @ 2021-08-12 1:40 UTC (permalink / raw) To: linux, jdelvare; +Cc: linux-hwmon, linux-kernel, Chris Packham BPD-RS600 modules running firmware v5.70 misreport the MFR_PIN_MAX. The indicate a maximum of 1640W instead of 700W. Detect the invalid reading and return a sensible value instead. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- Notes: Changes in v2: - Add comments for magic values drivers/hwmon/pmbus/bpa-rs600.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/hwmon/pmbus/bpa-rs600.c b/drivers/hwmon/pmbus/bpa-rs600.c index 84dee86399cb..f2d4e378a775 100644 --- a/drivers/hwmon/pmbus/bpa-rs600.c +++ b/drivers/hwmon/pmbus/bpa-rs600.c @@ -65,6 +65,26 @@ static int bpa_rs600_read_vin(struct i2c_client *client) return ret; } +/* + * Firmware V5.70 incorrectly reports 1640W for MFR_PIN_MAX. + * Deal with this by returning a sensible value. + */ +static int bpa_rs600_read_pin_max(struct i2c_client *client) +{ + int ret; + + ret = pmbus_read_word_data(client, 0, 0xff, PMBUS_MFR_PIN_MAX); + if (ret < 0) + return ret; + + /* Detect invalid 1640W (linear encoding) */ + if (ret == 0x0b34) + /* Report 700W (linear encoding) */ + return 0x095e; + + return ret; +} + static int bpa_rs600_read_word_data(struct i2c_client *client, int page, int phase, int reg) { int ret; @@ -91,6 +111,9 @@ static int bpa_rs600_read_word_data(struct i2c_client *client, int page, int pha case PMBUS_READ_VIN: ret = bpa_rs600_read_vin(client); break; + case PMBUS_MFR_PIN_MAX: + ret = bpa_rs600_read_pin_max(client); + break; default: if (reg >= PMBUS_VIRT_BASE) ret = -ENXIO; -- 2.32.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] hwmon: (pmbus/bpa-rs600) Add workaround for incorrect Pin max 2021-08-12 1:40 ` [PATCH v2 2/2] hwmon: (pmbus/bpa-rs600) Add workaround for incorrect Pin max Chris Packham @ 2021-08-12 4:41 ` Guenter Roeck 0 siblings, 0 replies; 5+ messages in thread From: Guenter Roeck @ 2021-08-12 4:41 UTC (permalink / raw) To: Chris Packham; +Cc: jdelvare, linux-hwmon, linux-kernel On Thu, Aug 12, 2021 at 01:40:00PM +1200, Chris Packham wrote: > BPD-RS600 modules running firmware v5.70 misreport the MFR_PIN_MAX. > The indicate a maximum of 1640W instead of 700W. Detect the invalid > reading and return a sensible value instead. > > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> Applied. Thanks, Guenter > --- > > Notes: > Changes in v2: > - Add comments for magic values > > drivers/hwmon/pmbus/bpa-rs600.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/drivers/hwmon/pmbus/bpa-rs600.c b/drivers/hwmon/pmbus/bpa-rs600.c > index 84dee86399cb..f2d4e378a775 100644 > --- a/drivers/hwmon/pmbus/bpa-rs600.c > +++ b/drivers/hwmon/pmbus/bpa-rs600.c > @@ -65,6 +65,26 @@ static int bpa_rs600_read_vin(struct i2c_client *client) > return ret; > } > > +/* > + * Firmware V5.70 incorrectly reports 1640W for MFR_PIN_MAX. > + * Deal with this by returning a sensible value. > + */ > +static int bpa_rs600_read_pin_max(struct i2c_client *client) > +{ > + int ret; > + > + ret = pmbus_read_word_data(client, 0, 0xff, PMBUS_MFR_PIN_MAX); > + if (ret < 0) > + return ret; > + > + /* Detect invalid 1640W (linear encoding) */ > + if (ret == 0x0b34) > + /* Report 700W (linear encoding) */ > + return 0x095e; > + > + return ret; > +} > + > static int bpa_rs600_read_word_data(struct i2c_client *client, int page, int phase, int reg) > { > int ret; > @@ -91,6 +111,9 @@ static int bpa_rs600_read_word_data(struct i2c_client *client, int page, int pha > case PMBUS_READ_VIN: > ret = bpa_rs600_read_vin(client); > break; > + case PMBUS_MFR_PIN_MAX: > + ret = bpa_rs600_read_pin_max(client); > + break; > default: > if (reg >= PMBUS_VIRT_BASE) > ret = -ENXIO; ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-08-12 4:41 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-08-12 1:39 [PATCH v2 0/2] hwmon: (pmbus/bpa-rs600) cleanup and workaround Chris Packham 2021-08-12 1:39 ` [PATCH v2 1/2] hwmon: (pmbus/bpa-rs600) Don't use rated limits as warn limits Chris Packham 2021-08-12 4:40 ` Guenter Roeck 2021-08-12 1:40 ` [PATCH v2 2/2] hwmon: (pmbus/bpa-rs600) Add workaround for incorrect Pin max Chris Packham 2021-08-12 4:41 ` 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).