Skip to contentSkip to conversation

Input: synaptics-rmi4 - use %ph to form F34 configuration ID

PATCH In review Dmitry Torokhov 5 participants 8 messages May 30, 2017 – Jun 2, 2017

Subsystems (2)
lore
Share & tools
lore

Dmitry Torokhov

author maintainer
#0 lore raw

PATCH 1/1 Input: synaptics-rmi4 - use %ph to form F34 configuration ID

Instead of printing bytes one by one, let's use %phN to print the buffer in one go.

Also use hweight8 to count number of partitions instead of inspecting it bit by bit.

---
 drivers/input/rmi4/rmi_f34v7.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)
drivers/input/rmi4/rmi_f34v7.c +8 -14
index ae2db1c3aebf..3991d2943660 100644
@@ -9,13 +9,14 @@
  * the Free Software Foundation.
  */
 
+#include <linux/bitops.h>
 #include <linux/kernel.h>
 #include <linux/rmi.h>
 #include <linux/firmware.h>
-#include <asm/unaligned.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/jiffies.h>
+#include <asm/unaligned.h>
 
 #include "rmi_driver.h"
 #include "rmi_f34.h"
@@ -464,7 +465,7 @@ static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34)
 static int rmi_f34v7_read_queries(struct f34_data *f34)
 {
 	int ret;
-	int i, j;
+	int i;
 	u8 base;
 	int offset;
 	u8 *ptable;
@@ -519,9 +520,6 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	if (query_0 & HAS_CONFIG_ID) {
 		u8 f34_ctrl[CONFIG_ID_SIZE];
-		int i = 0;
-		u8 *p = f34->configuration_id;
-		*p = '\0';
 
 		ret = rmi_read_block(f34->fn->rmi_dev,
 				f34->fn->fd.control_base_addr,
@@ -531,13 +529,11 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 			return ret;
 
 		/* Eat leading zeros */
-		while (i < sizeof(f34_ctrl) && !f34_ctrl[i])
-			i++;
+		for (i = 0; i < sizeof(f34_ctrl) - 1 && !f34_ctrl[i]; i++)
+			/* Empty */;
 
-		for (; i < sizeof(f34_ctrl); i++)
-			p += snprintf(p, f34->configuration_id
-				      + sizeof(f34->configuration_id) - p,
-				      "%02X", f34_ctrl[i]);
+		snprintf(f34->configuration_id, sizeof(f34->configuration_id),
+			 "%*phN", (int)sizeof(f34_ctrl) - i, f34_ctrl + i);
 
 		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n",
 			f34->configuration_id);
@@ -545,9 +541,7 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	f34->v7.partitions = 0;
 	for (i = 0; i < sizeof(query_1_7.partition_support); i++)
-		for (j = 0; j < 8; j++)
-			if (query_1_7.partition_support[i] & (1 << j))
-				f34->v7.partitions++;
+		f34->v7.partitions += hweight8(query_1_7.partition_support[i]);
 
 	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n",
 		__func__, sizeof(query_1_7.partition_support),
Signature · 5 lines
2.13.0.219.gdb65acc882-goog


-- 
Dmitry
Reviewed-by on v1 1/1
#1 lore raw
Quoted 8 lines · Dmitry Torokhov

Instead of printing bytes one by one, let's use %phN to print the buffer in one go.

Also use hweight8 to count number of partitions instead of inspecting it bit by bit.

---

Looks good to me:

Cheers,
Benjamin

Quoted 77 lines
 drivers/input/rmi4/rmi_f34v7.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)
drivers/input/rmi4/rmi_f34v7.c +8 -14
index ae2db1c3aebf..3991d2943660 100644
@@ -9,13 +9,14 @@
  * the Free Software Foundation.
  */
 
+#include <linux/bitops.h>
 #include <linux/kernel.h>
 #include <linux/rmi.h>
 #include <linux/firmware.h>
-#include <asm/unaligned.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/jiffies.h>
+#include <asm/unaligned.h>
 
 #include "rmi_driver.h"
 #include "rmi_f34.h"
@@ -464,7 +465,7 @@ static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34)
 static int rmi_f34v7_read_queries(struct f34_data *f34)
 {
 	int ret;
-	int i, j;
+	int i;
 	u8 base;
 	int offset;
 	u8 *ptable;
@@ -519,9 +520,6 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	if (query_0 & HAS_CONFIG_ID) {
 		u8 f34_ctrl[CONFIG_ID_SIZE];
-		int i = 0;
-		u8 *p = f34->configuration_id;
-		*p = '\0';
 
 		ret = rmi_read_block(f34->fn->rmi_dev,
 				f34->fn->fd.control_base_addr,
@@ -531,13 +529,11 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 			return ret;
 
 		/* Eat leading zeros */
-		while (i < sizeof(f34_ctrl) && !f34_ctrl[i])
-			i++;
+		for (i = 0; i < sizeof(f34_ctrl) - 1 && !f34_ctrl[i]; i++)
+			/* Empty */;
 
-		for (; i < sizeof(f34_ctrl); i++)
-			p += snprintf(p, f34->configuration_id
-				      + sizeof(f34->configuration_id) - p,
-				      "%02X", f34_ctrl[i]);
+		snprintf(f34->configuration_id, sizeof(f34->configuration_id),
+			 "%*phN", (int)sizeof(f34_ctrl) - i, f34_ctrl + i);
 
 		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n",
 			f34->configuration_id);
@@ -545,9 +541,7 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	f34->v7.partitions = 0;
 	for (i = 0; i < sizeof(query_1_7.partition_support); i++)
-		for (j = 0; j < 8; j++)
-			if (query_1_7.partition_support[i] & (1 << j))
-				f34->v7.partitions++;
+		f34->v7.partitions += hweight8(query_1_7.partition_support[i]);
 
 	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n",
 		__func__, sizeof(query_1_7.partition_support),
Signature · 5 lines
2.13.0.219.gdb65acc882-goog


-- 
Dmitry
author maintainer
#2 lore raw
Quoted 4 lines · Benjamin Tissoires
Quoted 3 lines · Dmitry Torokhov

Instead of printing bytes one by one, let's use %phN to print the buffer in one go.

Quoted 8 lines
Quoted 5 lines

Also use hweight8 to count number of partitions instead of inspecting it bit by bit.

---

Looks good to me:

Hm, I just realized taht we'd go from upper to lowercase hex digits. I think it should be OK, but I'd like to hear interested parties (Nick).

Or we'd need to introduce %pH I guess.

Quoted 81 lines

Cheers,
Benjamin

Quoted 77 lines
 drivers/input/rmi4/rmi_f34v7.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)
drivers/input/rmi4/rmi_f34v7.c +8 -14
index ae2db1c3aebf..3991d2943660 100644
@@ -9,13 +9,14 @@
  * the Free Software Foundation.
  */
 
+#include <linux/bitops.h>
 #include <linux/kernel.h>
 #include <linux/rmi.h>
 #include <linux/firmware.h>
-#include <asm/unaligned.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/jiffies.h>
+#include <asm/unaligned.h>
 
 #include "rmi_driver.h"
 #include "rmi_f34.h"
@@ -464,7 +465,7 @@ static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34)
 static int rmi_f34v7_read_queries(struct f34_data *f34)
 {
 	int ret;
-	int i, j;
+	int i;
 	u8 base;
 	int offset;
 	u8 *ptable;
@@ -519,9 +520,6 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	if (query_0 & HAS_CONFIG_ID) {
 		u8 f34_ctrl[CONFIG_ID_SIZE];
-		int i = 0;
-		u8 *p = f34->configuration_id;
-		*p = '\0';
 
 		ret = rmi_read_block(f34->fn->rmi_dev,
 				f34->fn->fd.control_base_addr,
@@ -531,13 +529,11 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 			return ret;
 
 		/* Eat leading zeros */
-		while (i < sizeof(f34_ctrl) && !f34_ctrl[i])
-			i++;
+		for (i = 0; i < sizeof(f34_ctrl) - 1 && !f34_ctrl[i]; i++)
+			/* Empty */;
 
-		for (; i < sizeof(f34_ctrl); i++)
-			p += snprintf(p, f34->configuration_id
-				      + sizeof(f34->configuration_id) - p,
-				      "%02X", f34_ctrl[i]);
+		snprintf(f34->configuration_id, sizeof(f34->configuration_id),
+			 "%*phN", (int)sizeof(f34_ctrl) - i, f34_ctrl + i);
 
 		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n",
 			f34->configuration_id);
@@ -545,9 +541,7 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	f34->v7.partitions = 0;
 	for (i = 0; i < sizeof(query_1_7.partition_support); i++)
-		for (j = 0; j < 8; j++)
-			if (query_1_7.partition_support[i] & (1 << j))
-				f34->v7.partitions++;
+		f34->v7.partitions += hweight8(query_1_7.partition_support[i]);
 
 	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n",
 		__func__, sizeof(query_1_7.partition_support),
Signature · 5 lines
2.13.0.219.gdb65acc882-goog


-- 
Dmitry
Signature · 1 line
Dmitry
#3 lore raw
Quoted 11 lines · Dmitry Torokhov
Quoted 10 lines · Benjamin Tissoires
Quoted 8 lines · Dmitry Torokhov

Instead of printing bytes one by one, let's use %phN to print the buffer in one go.

Also use hweight8 to count number of partitions instead of inspecting it bit by bit.

---

Quoted 7 lines
Quoted 2 lines

Looks good to me:

Hm, I just realized taht we'd go from upper to lowercase hex digits. I think it should be OK, but I'd like to hear interested parties (Nick).

Or we'd need to introduce %pH I guess.

As it's debugging output, I'd hazard to guess it doesn't matter.

If someone _really_ needs upper-case output in *ph, I'd also suggest adding another qualifier to keep the number of letter prefixes used down. %ph[CDNU].

A pity that %ph[cdnCDN] isn't possible as that's the style used by %pU[blBL] for lower/upper case output.

There are < 80 uses of %[\*\d]+ph[CDN], maybe it'd be reasonable to do a treewide sed to lowercase for them. Dunno.

#4 lore raw
Quoted 10 lines · Joe Perches
Quoted 5 lines · Dmitry Torokhov
Quoted 2 lines · Benjamin Tissoires
Quoted 1 line · Dmitry Torokhov

Or we'd need to introduce %pH I guess.

As it's debugging output, I'd hazard to guess it doesn't matter.

If someone _really_ needs upper-case output in *ph,

Starting from the same...

Quoted 6 lines

A pity that %ph[cdnCDN] isn't possible as that's the style used by %pU[blBL] for lower/upper case output.

There are < 80 uses of %[\*\d]+ph[CDN], maybe it'd be reasonable to do a treewide sed to lowercase for them.  Dunno.

And I think less intrusive would be
%pH[CDN]
since the latter proposal misses plain %*ph use.

But for now I would rather avoid it at all, I'm pretty sure there very rare cases when one needs
1) to print a dump, *and*
2) it should be upper cased.

Signature · 2 lines
Andy Shevchenko <[email protected]>
Intel Finland Oy
#5 lore raw
Quoted 5 lines · Andy Shevchenko
Quoted 4 lines · Joe Perches
Quoted 3 lines · Dmitry Torokhov
Quoted 2 lines · Benjamin Tissoires
Quoted 1 line · Dmitry Torokhov
Quoted 13 lines
Quoted 5 lines
Quoted 1 line

Or we'd need to introduce %pH I guess.

As it's debugging output, I'd hazard to guess it doesn't matter.

If someone _really_ needs upper-case output in *ph,

Starting from the same...

Quoted 6 lines

A pity that %ph[cdnCDN] isn't possible as that's the style used by %pU[blBL] for lower/upper case output.

There are < 80 uses of %[\*\d]+ph[CDN], maybe it'd be reasonable to do a treewide sed to lowercase for them.  Dunno.

It's more like ~300 when the grep is done properly, -E needed to be -P, so I believe that's too many to bother with a treewide sed.

Quoted 3 lines

And I think less intrusive would be
%pH[CDN]
since the latter proposal misses plain %*ph use.

No it wouldn't necessarily.
%*phU could still be upper case too.

Quoted 4 lines

But for now I would rather avoid it at all, I'm pretty sure there very rare cases when one needs
1) to print a dump, *and*
2) it should be upper cased.

Doubtful, but maybe there is a seq_ use somewhere
that could be converted.

Anyway I think the proposed change in the original patch is fine and nothing else needs to be done.

Tested-by
#6 lore raw
In reply to Dmitry Torokhov
Quoted 11 lines · Dmitry Torokhov
Quoted 10 lines · Benjamin Tissoires
Quoted 8 lines · Dmitry Torokhov

Instead of printing bytes one by one, let's use %phN to print the buffer in one go.

Also use hweight8 to count number of partitions instead of inspecting it bit by bit.

---

Quoted 7 lines
Quoted 2 lines

Looks good to me:

Hm, I just realized taht we'd go from upper to lowercase hex digits. I think it should be OK, but I'd like to hear interested parties (Nick).

Or we'd need to introduce %pH I guess.

Hi Dmitry-

I can't see any issue with this: all the firmwares I've encountered are purely numerical anyway.

Quoted 85 lines
Quoted 82 lines

Cheers,
Benjamin

Quoted 77 lines
 drivers/input/rmi4/rmi_f34v7.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)
drivers/input/rmi4/rmi_f34v7.c +8 -14
index ae2db1c3aebf..3991d2943660 100644
@@ -9,13 +9,14 @@
  * the Free Software Foundation.
  */
 
+#include <linux/bitops.h>
 #include <linux/kernel.h>
 #include <linux/rmi.h>
 #include <linux/firmware.h>
-#include <asm/unaligned.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/jiffies.h>
+#include <asm/unaligned.h>
 
 #include "rmi_driver.h"
 #include "rmi_f34.h"
@@ -464,7 +465,7 @@ static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34)
 static int rmi_f34v7_read_queries(struct f34_data *f34)
 {
 	int ret;
-	int i, j;
+	int i;
 	u8 base;
 	int offset;
 	u8 *ptable;
@@ -519,9 +520,6 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	if (query_0 & HAS_CONFIG_ID) {
 		u8 f34_ctrl[CONFIG_ID_SIZE];
-		int i = 0;
-		u8 *p = f34->configuration_id;
-		*p = '\0';
 
 		ret = rmi_read_block(f34->fn->rmi_dev,
 				f34->fn->fd.control_base_addr,
@@ -531,13 +529,11 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 			return ret;
 
 		/* Eat leading zeros */
-		while (i < sizeof(f34_ctrl) && !f34_ctrl[i])
-			i++;
+		for (i = 0; i < sizeof(f34_ctrl) - 1 && !f34_ctrl[i]; i++)
+			/* Empty */;
 
-		for (; i < sizeof(f34_ctrl); i++)
-			p += snprintf(p, f34->configuration_id
-				      + sizeof(f34->configuration_id) - p,
-				      "%02X", f34_ctrl[i]);
+		snprintf(f34->configuration_id, sizeof(f34->configuration_id),
+			 "%*phN", (int)sizeof(f34_ctrl) - i, f34_ctrl + i);
 
 		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n",
 			f34->configuration_id);
@@ -545,9 +541,7 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	f34->v7.partitions = 0;
 	for (i = 0; i < sizeof(query_1_7.partition_support); i++)
-		for (j = 0; j < 8; j++)
-			if (query_1_7.partition_support[i] & (1 << j))
-				f34->v7.partitions++;
+		f34->v7.partitions += hweight8(query_1_7.partition_support[i]);
 
 	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n",
 		__func__, sizeof(query_1_7.partition_support),
Signature · 5 lines
2.13.0.219.gdb65acc882-goog


-- 
Dmitry
Signature · 1 line
Dmitry
author maintainer
#7 lore raw
Quoted 18 lines · Nick Dyer
Quoted 17 lines · Dmitry Torokhov
Quoted 4 lines · Benjamin Tissoires
Quoted 3 lines · Dmitry Torokhov

Instead of printing bytes one by one, let's use %phN to print the buffer in one go.

Quoted 8 lines
Quoted 5 lines

Also use hweight8 to count number of partitions instead of inspecting it bit by bit.

---

Looks good to me:

Hm, I just realized taht we'd go from upper to lowercase hex digits. I think it should be OK, but I'd like to hear interested parties (Nick).

Quoted 8 lines
Quoted 1 line

Or we'd need to introduce %pH I guess.

Hi Dmitry-

I can't see any issue with this: all the firmwares I've encountered are purely numerical anyway.

Thanks Nick!

Quoted 86 lines
Quoted 86 lines
Quoted 83 lines

Cheers,
Benjamin

Quoted 77 lines
 drivers/input/rmi4/rmi_f34v7.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)
drivers/input/rmi4/rmi_f34v7.c +8 -14
index ae2db1c3aebf..3991d2943660 100644
@@ -9,13 +9,14 @@
  * the Free Software Foundation.
  */
 
+#include <linux/bitops.h>
 #include <linux/kernel.h>
 #include <linux/rmi.h>
 #include <linux/firmware.h>
-#include <asm/unaligned.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/jiffies.h>
+#include <asm/unaligned.h>
 
 #include "rmi_driver.h"
 #include "rmi_f34.h"
@@ -464,7 +465,7 @@ static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34)
 static int rmi_f34v7_read_queries(struct f34_data *f34)
 {
 	int ret;
-	int i, j;
+	int i;
 	u8 base;
 	int offset;
 	u8 *ptable;
@@ -519,9 +520,6 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	if (query_0 & HAS_CONFIG_ID) {
 		u8 f34_ctrl[CONFIG_ID_SIZE];
-		int i = 0;
-		u8 *p = f34->configuration_id;
-		*p = '\0';
 
 		ret = rmi_read_block(f34->fn->rmi_dev,
 				f34->fn->fd.control_base_addr,
@@ -531,13 +529,11 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 			return ret;
 
 		/* Eat leading zeros */
-		while (i < sizeof(f34_ctrl) && !f34_ctrl[i])
-			i++;
+		for (i = 0; i < sizeof(f34_ctrl) - 1 && !f34_ctrl[i]; i++)
+			/* Empty */;
 
-		for (; i < sizeof(f34_ctrl); i++)
-			p += snprintf(p, f34->configuration_id
-				      + sizeof(f34->configuration_id) - p,
-				      "%02X", f34_ctrl[i]);
+		snprintf(f34->configuration_id, sizeof(f34->configuration_id),
+			 "%*phN", (int)sizeof(f34_ctrl) - i, f34_ctrl + i);
 
 		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n",
 			f34->configuration_id);
@@ -545,9 +541,7 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
 
 	f34->v7.partitions = 0;
 	for (i = 0; i < sizeof(query_1_7.partition_support); i++)
-		for (j = 0; j < 8; j++)
-			if (query_1_7.partition_support[i] & (1 << j))
-				f34->v7.partitions++;
+		f34->v7.partitions += hweight8(query_1_7.partition_support[i]);
 
 	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n",
 		__func__, sizeof(query_1_7.partition_support),
Signature · 5 lines
2.13.0.219.gdb65acc882-goog


-- 
Dmitry
Signature · 1 line
Dmitry
Signature · 1 line
Dmitry