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++;

Reply via email to