hwmon: (pmbus/adm1266) add firmware_revision debugfs entry

The ADM1266 reports its firmware revision via the IC_DEVICE_REV
manufacturer-specific block-read command (0xAE, datasheet Rev. D
Table 80). The first three returned bytes are the firmware
major.minor.patch fields. This is useful when correlating field
behaviour against ADI release notes; expose it through debugfs
alongside the existing sequencer_state entry.

The standard PMBus MFR_REVISION (0x9B) register is already exposed
by pmbus_core's debugfs auto-create path and reports the
manufacturer revision, which is a separate thing from the firmware
running on the device.

Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai>
Link: https://lore.kernel.org/r/20260512-adm1266-v3-1-a81a479b0bb0@nexthop.ai
[groeck: Squashed patch adding serialization with pmbus_lock]
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Abdurrahman Hussain 2026-05-12 11:56:24 -07:00 committed by Guenter Roeck
parent 1000878867
commit 0a31040850

View File

@ -21,6 +21,7 @@
#include <linux/slab.h>
#include <linux/timekeeping.h>
#define ADM1266_IC_DEVICE_REV 0xAE
#define ADM1266_BLACKBOX_CONFIG 0xD3
#define ADM1266_PDIO_CONFIG 0xD4
#define ADM1266_READ_STATE 0xD9
@ -345,6 +346,31 @@ static int adm1266_state_read(struct seq_file *s, void *pdata)
return 0;
}
/*
* IC_DEVICE_REV (0xAE) returns an 8-byte block (datasheet Rev. D, Table 80):
* [2:0] firmware revision major.minor.patch
* [5:3] bootloader revision major.minor.patch
* [7:6] silicon revision two ASCII characters
*/
static int adm1266_firmware_revision_read(struct seq_file *s, void *pdata)
{
struct device *dev = s->private;
struct i2c_client *client = to_i2c_client(dev);
u8 buf[I2C_SMBUS_BLOCK_MAX];
int ret;
guard(pmbus_lock)(client);
ret = i2c_smbus_read_block_data(client, ADM1266_IC_DEVICE_REV, buf);
if (ret < 0)
return ret;
if (ret < 3)
return -EIO;
seq_printf(s, "%u.%u.%u\n", buf[0], buf[1], buf[2]);
return 0;
}
static void adm1266_init_debugfs(struct adm1266_data *data)
{
struct dentry *root;
@ -357,6 +383,8 @@ static void adm1266_init_debugfs(struct adm1266_data *data)
debugfs_create_devm_seqfile(&data->client->dev, "sequencer_state", data->debugfs_dir,
adm1266_state_read);
debugfs_create_devm_seqfile(&data->client->dev, "firmware_revision", data->debugfs_dir,
adm1266_firmware_revision_read);
}
static int adm1266_nvmem_read_blackbox(struct adm1266_data *data, u8 *read_buff)