On Wed, Jun 05, 2019 at 01:49:00PM -0600, Robert Hancock wrote:
> Some chips have attributes which exist on more than one page but the
> attribute is not presently marked as paged. This causes the attributes
> to be generated with the same label, which makes it impossible for
> userspace to tell them apart.
>
> Marking all such attributes as paged would result in the page suffix
> being added regardless of whether they were present on more than one
> page or not, which might break existing setups. Therefore, we add a
> second check which treats the attribute as paged, even if not marked as
> such, if it is present on multiple pages.
>
> Signed-off-by: Robert Hancock <[email protected]>
Applied.
Thanks,
Guenter
> ---
> drivers/hwmon/pmbus/pmbus_core.c | 33 +++++++++++++++++++++++++++++----
> 1 file changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/hwmon/pmbus/pmbus_core.c
> b/drivers/hwmon/pmbus/pmbus_core.c
> index ef7ee90..49dcb84 100644
> --- a/drivers/hwmon/pmbus/pmbus_core.c
> +++ b/drivers/hwmon/pmbus/pmbus_core.c
> @@ -1217,7 +1217,8 @@ static int pmbus_add_sensor_attrs_one(struct i2c_client
> *client,
> const struct pmbus_driver_info *info,
> const char *name,
> int index, int page,
> - const struct pmbus_sensor_attr *attr)
> + const struct pmbus_sensor_attr *attr,
> + bool paged)
> {
> struct pmbus_sensor *base;
> bool upper = !!(attr->gbit & 0xff00); /* need to check STATUS_WORD */
> @@ -1225,7 +1226,7 @@ static int pmbus_add_sensor_attrs_one(struct i2c_client
> *client,
>
> if (attr->label) {
> ret = pmbus_add_label(data, name, index, attr->label,
> - attr->paged ? page + 1 : 0);
> + paged ? page + 1 : 0);
> if (ret)
> return ret;
> }
> @@ -1258,6 +1259,29 @@ static int pmbus_add_sensor_attrs_one(struct
> i2c_client *client,
> return 0;
> }
>
> +static bool pmbus_sensor_is_paged(const struct pmbus_driver_info *info,
> + const struct pmbus_sensor_attr *attr)
> +{
> + int p;
> +
> + if (attr->paged)
> + return true;
> +
> + /* Some attributes may be present on more than one page despite
> + * not being marked with the paged attribute. If that is the case,
> + * then treat the sensor as being paged and add the page suffix to the
> + * attribute name.
> + * We don't just add the paged attribute to all such attributes, in
> + * order to maintain the un-suffixed labels in the case where the
> + * attribute is only on page 0.
> + */
> + for (p = 1; p < info->pages; p++) {
> + if (info->func[p] & attr->func)
> + return true;
> + }
> + return false;
> +}
> +
> static int pmbus_add_sensor_attrs(struct i2c_client *client,
> struct pmbus_data *data,
> const char *name,
> @@ -1271,14 +1295,15 @@ static int pmbus_add_sensor_attrs(struct i2c_client
> *client,
> index = 1;
> for (i = 0; i < nattrs; i++) {
> int page, pages;
> + bool paged = pmbus_sensor_is_paged(info, attrs);
>
> - pages = attrs->paged ? info->pages : 1;
> + pages = paged ? info->pages : 1;
> for (page = 0; page < pages; page++) {
> if (!(info->func[page] & attrs->func))
> continue;
> ret = pmbus_add_sensor_attrs_one(client, data, info,
> name, index, page,
> - attrs);
> + attrs, paged);
> if (ret)
> return ret;
> index++;