Re: [PATCH] hwmon: (pmbus) Let PMBus drivers report the supported PMBus revision
Nuno Sá <[email protected]> Mon, 3 Aug 2026 14:27:37 +0100
| Newsgroups | org.kernel.vger.linux-hwmon |
|---|---|
| Message-ID | <anCWlguPT2qPALCg@nsa> |
On Tue, Jul 28, 2026 at 06:19:14PM -0700, Guenter Roeck wrote: > Some PMBus chips do not support the PMBUS_REVISION command. Knowing > the PMBUs revision supported by a chip is relevant for PMBUs core > functionality, so add support for letting chip drivers report the PMBUs > revision. > > Use the new capability to report the PMBus revision supported by MAX20830. > > While at it, add definitions for PMBUs revisons 1.3.1 and 1.4. > > Cc: Nuno Sá <[email protected]> > Cc: Alexis Czezar Torreno <[email protected]> > Signed-off-by: Guenter Roeck <[email protected]> > --- LGTM, Reviewed-by: Nuno Sá <[email protected]> > drivers/hwmon/pmbus/max20830.c | 2 ++ > drivers/hwmon/pmbus/pmbus.h | 20 +++++++++++++---- > drivers/hwmon/pmbus/pmbus_core.c | 38 ++++++++++++++++++++++---------- > 3 files changed, 44 insertions(+), 16 deletions(-) > > diff --git a/drivers/hwmon/pmbus/max20830.c b/drivers/hwmon/pmbus/max20830.c > index e3470118fd36..d43ee6438b26 100644 > --- a/drivers/hwmon/pmbus/max20830.c > +++ b/drivers/hwmon/pmbus/max20830.c > @@ -23,6 +23,8 @@ static struct pmbus_driver_info max20830_info = { > PMBUS_HAVE_TEMP | > PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT | > PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_STATUS_TEMP, > + .have_pmbus_revision = true, > + .pmbus_revision = PMBUS_REV_13, > }; > > static int max20830_probe(struct i2c_client *client) > diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h > index 23e3eda58870..1af247de9075 100644 > --- a/drivers/hwmon/pmbus/pmbus.h > +++ b/drivers/hwmon/pmbus/pmbus.h > @@ -420,10 +420,12 @@ enum pmbus_data_format { linear = 0, ieee754, direct, vid }; > enum vrm_version { vr11 = 0, vr12, vr13, imvp9, amd625mv, nvidia195mv }; > > /* PMBus revision identifiers */ > -#define PMBUS_REV_10 0x00 /* PMBus revision 1.0 */ > -#define PMBUS_REV_11 0x11 /* PMBus revision 1.1 */ > -#define PMBUS_REV_12 0x22 /* PMBus revision 1.2 */ > -#define PMBUS_REV_13 0x33 /* PMBus revision 1.3 */ > +#define PMBUS_REV_10 0x00 /* PMBus revision 1.0 */ > +#define PMBUS_REV_11 0x11 /* PMBus revision 1.1 */ > +#define PMBUS_REV_12 0x22 /* PMBus revision 1.2 */ > +#define PMBUS_REV_13 0x33 /* PMBus revision 1.3 */ > +#define PMBUS_REV_131 0x44 /* PMBus revision 1.3.1 */ > +#define PMBUS_REV_14 0x55 /* PMBus revision 1.4 */ > > /* Operation type flags for pmbus_update_ts */ > #define PMBUS_OP_WRITE BIT(0) > @@ -488,6 +490,16 @@ struct pmbus_driver_info { > int access_delay; /* in microseconds */ > int write_delay; /* in microseconds */ > int page_change_delay; /* in microseconds */ > + > + /* > + * Some chips do not support the PMBUS_REVISION command. > + * Drivers for such chips can report the supported PMBus revision here. > + * > + * Drivers must set have_pmbus_revision to true and provide the > + * supported PMBus version in pmbus_revision. > + */ > + bool have_pmbus_revision; /* true if pmbus_revision is valid */ > + u8 pmbus_revision; /* PMBus revision */ > }; > > /* Regulator ops */ > diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c > index 53501fa1a28e..3e13d09e2c1c 100644 > --- a/drivers/hwmon/pmbus/pmbus_core.c > +++ b/drivers/hwmon/pmbus/pmbus_core.c > @@ -96,7 +96,8 @@ struct pmbus_data { > > u32 flags; /* from platform data */ > > - u8 revision; /* The PMBus revision the device is compliant with */ > + bool have_pmbus_revision; > + u8 revision; /* The PMBus revision the device is compliant with */ > > int exponent[PMBUS_PAGES]; > /* linear mode: exponent for output voltages */ > @@ -2847,9 +2848,16 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data, > if (!(data->flags & PMBUS_NO_WRITE_PROTECT)) > pmbus_init_wp(client, data); > > - ret = i2c_smbus_read_byte_data(client, PMBUS_REVISION); > - if (ret >= 0) > - data->revision = ret; > + if (info->have_pmbus_revision) { > + data->have_pmbus_revision = true; > + data->revision = info->pmbus_revision; > + } else { > + ret = i2c_smbus_read_byte_data(client, PMBUS_REVISION); > + if (ret >= 0) { > + data->have_pmbus_revision = true; > + data->revision = ret; > + } > + } > > if (data->info->pages) > pmbus_clear_faults(client); > @@ -3537,6 +3545,17 @@ static int pmbus_debugfs_get(void *data, u64 *val) > DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops, pmbus_debugfs_get, NULL, > "0x%02llx\n"); > > +static int pmbus_debugfs_get_revision(void *data, u64 *val) > +{ > + struct pmbus_data *pdata = data; > + > + *val = pdata->revision; > + > + return 0; > +} > +DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_revision_ops, pmbus_debugfs_get_revision, NULL, > + "0x%02llx\n"); > + > static int pmbus_debugfs_get_status(void *data, u64 *val) > { > struct pmbus_debugfs_entry *entry = data; > @@ -3690,14 +3709,9 @@ static void pmbus_init_debugfs(struct i2c_client *client, > &entries[idx++], > &pmbus_debugfs_ops); > } > - if (pmbus_check_byte_register(client, 0, PMBUS_REVISION)) { > - entries[idx].client = client; > - entries[idx].page = 0; > - entries[idx].reg = PMBUS_REVISION; > - debugfs_create_file("pmbus_revision", 0444, debugfs, > - &entries[idx++], > - &pmbus_debugfs_ops); > - } > + if (data->have_pmbus_revision) > + debugfs_create_file("pmbus_revision", 0444, debugfs, data, > + &pmbus_debugfs_revision_ops); > > for (i = 0; i < ARRAY_SIZE(pmbus_debugfs_block_data); i++) { > const struct pmbus_debugfs_data *d = &pmbus_debugfs_block_data[i]; > -- > 2.45.2 >