Commit 2cd8529c authored by Andrew Jeffery's avatar Andrew Jeffery Committed by Guenter Roeck

hwmon: (pmbus) Expose PEC debugfs attribute

Enable runtime debug control of whether the PEC byte is exchanged with
the PMBus device.

Some manufacturers have asked for the PEC to be disabled as part of
debugging driver communication issues with devices.
Signed-off-by: default avatarAndrew Jeffery <andrew@aj.id.au>
Link: https://lore.kernel.org/r/20200910021106.2958382-1-andrew@aj.id.au
[groeck: Replace %1llu with %llu]
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent a919ba06
...@@ -2351,6 +2351,42 @@ static int pmbus_debugfs_get_status(void *data, u64 *val) ...@@ -2351,6 +2351,42 @@ static int pmbus_debugfs_get_status(void *data, u64 *val)
DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops_status, pmbus_debugfs_get_status, DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops_status, pmbus_debugfs_get_status,
NULL, "0x%04llx\n"); NULL, "0x%04llx\n");
static int pmbus_debugfs_get_pec(void *data, u64 *val)
{
struct i2c_client *client = data;
*val = !!(client->flags & I2C_CLIENT_PEC);
return 0;
}
static int pmbus_debugfs_set_pec(void *data, u64 val)
{
int rc;
struct i2c_client *client = data;
if (!val) {
client->flags &= ~I2C_CLIENT_PEC;
return 0;
}
if (val != 1)
return -EINVAL;
rc = i2c_smbus_read_byte_data(client, PMBUS_CAPABILITY);
if (rc < 0)
return rc;
if (!(rc & PB_CAPABILITY_ERROR_CHECK))
return -EOPNOTSUPP;
client->flags |= I2C_CLIENT_PEC;
return 0;
}
DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops_pec, pmbus_debugfs_get_pec,
pmbus_debugfs_set_pec, "%llu\n");
static int pmbus_init_debugfs(struct i2c_client *client, static int pmbus_init_debugfs(struct i2c_client *client,
struct pmbus_data *data) struct pmbus_data *data)
{ {
...@@ -2379,6 +2415,9 @@ static int pmbus_init_debugfs(struct i2c_client *client, ...@@ -2379,6 +2415,9 @@ static int pmbus_init_debugfs(struct i2c_client *client,
if (!entries) if (!entries)
return -ENOMEM; return -ENOMEM;
debugfs_create_file("pec", 0664, data->debugfs, client,
&pmbus_debugfs_ops_pec);
for (i = 0; i < data->info->pages; ++i) { for (i = 0; i < data->info->pages; ++i) {
/* Check accessibility of status register if it's not page 0 */ /* Check accessibility of status register if it's not page 0 */
if (!i || pmbus_check_status_register(client, i)) { if (!i || pmbus_check_status_register(client, i)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment