hwmon: (pmbus) Expose PEC debugfs attribute
authorAndrew Jeffery <andrew@aj.id.au>
Thu, 10 Sep 2020 02:11:06 +0000 (11:41 +0930)
committerGuenter Roeck <linux@roeck-us.net>
Wed, 23 Sep 2020 16:42:41 +0000 (09:42 -0700)
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: Andrew 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: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pmbus/pmbus_core.c

index 1f43bf0f23b2c3f49f6daca2c013cfabbfcd243b..138f83538c8b53d3e966df932e9018238e9e0e45 100644 (file)
@@ -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,
                         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,
                              struct pmbus_data *data)
 {
@@ -2379,6 +2415,9 @@ static int pmbus_init_debugfs(struct i2c_client *client,
        if (!entries)
                return -ENOMEM;
 
+       debugfs_create_file("pec", 0664, data->debugfs, client,
+                           &pmbus_debugfs_ops_pec);
+
        for (i = 0; i < data->info->pages; ++i) {
                /* Check accessibility of status register if it's not page 0 */
                if (!i || pmbus_check_status_register(client, i)) {