#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
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;
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)