diff mbox series

[v2,1/2] hwmon: (pmbus) Treat parameters as paged if on multiple pages

Message ID 1559764141-26105-2-git-send-email-hancock@sedsystems.ca (mailing list archive)
State Accepted
Headers show
Series Add pmbus support for Infineon IRPS5401 (v2) | expand

Commit Message

Robert Hancock June 5, 2019, 7:49 p.m. UTC
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 <hancock@sedsystems.ca>
---
 drivers/hwmon/pmbus/pmbus_core.c | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

Comments

Guenter Roeck June 5, 2019, 8:57 p.m. UTC | #1
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 <hancock@sedsystems.ca>

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++;
diff mbox series

Patch

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