All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] gpio: aggregator: Misc parsing improvements
@ 2020-07-01 11:42 Geert Uytterhoeven
  2020-07-01 11:42 ` [PATCH v2 1/2] gpio: aggregator: Drop pre-initialization in get_arg() Geert Uytterhoeven
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Geert Uytterhoeven @ 2020-07-01 11:42 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko
  Cc: linux-gpio, linux-renesas-soc, linux-kernel, Geert Uytterhoeven

	Hi Linus, Bartosz, Andy,

This patch series contains two improvements for the parsing code in the
GPIO Aggregator.

The second one converts the driver to use bitmap_parselist() for parsing
GPIO offsets and/or ranges, as suggested by Andy[1].  This should have
no impact on the format of the configuration parameters written to the
"new_device" virtual file in sysfs.

Changes compared to v1:
  - Rename mask to bitmap,
  - Allocate bitmap dynamically.

Thanks for your comments!

[1] https://lore.kernel.org/r/20200520121420.GA1867563@smile.fi.intel.com

Geert Uytterhoeven (2):
  gpio: aggregator: Drop pre-initialization in get_arg()
  gpio: aggregator: Use bitmap_parselist() for parsing GPIO offsets

 drivers/gpio/gpio-aggregator.c | 63 +++++++++++++++-------------------
 1 file changed, 28 insertions(+), 35 deletions(-)

-- 
2.17.1

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2 1/2] gpio: aggregator: Drop pre-initialization in get_arg()
  2020-07-01 11:42 [PATCH v2 0/2] gpio: aggregator: Misc parsing improvements Geert Uytterhoeven
@ 2020-07-01 11:42 ` Geert Uytterhoeven
  2020-07-01 11:42 ` [PATCH v2 2/2] gpio: aggregator: Use bitmap_parselist() for parsing GPIO offsets Geert Uytterhoeven
  2020-07-07 12:31 ` [PATCH v2 0/2] gpio: aggregator: Misc parsing improvements Linus Walleij
  2 siblings, 0 replies; 4+ messages in thread
From: Geert Uytterhoeven @ 2020-07-01 11:42 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko
  Cc: linux-gpio, linux-renesas-soc, linux-kernel, Geert Uytterhoeven

In get_arg(), the variable start is pre-initialized, but overwritten
again in the first statement.  Rework the assignment to not rely on
pre-initialization, to make the code easier to read.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v2:
  - No changes.
---
 drivers/gpio/gpio-aggregator.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c
index 9b0adbdddbfccb30..62a3fcbd4b4bb106 100644
--- a/drivers/gpio/gpio-aggregator.c
+++ b/drivers/gpio/gpio-aggregator.c
@@ -38,9 +38,9 @@ static DEFINE_IDR(gpio_aggregator_idr);
 
 static char *get_arg(char **args)
 {
-	char *start = *args, *end;
+	char *start, *end;
 
-	start = skip_spaces(start);
+	start = skip_spaces(*args);
 	if (!*start)
 		return NULL;
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/2] gpio: aggregator: Use bitmap_parselist() for parsing GPIO offsets
  2020-07-01 11:42 [PATCH v2 0/2] gpio: aggregator: Misc parsing improvements Geert Uytterhoeven
  2020-07-01 11:42 ` [PATCH v2 1/2] gpio: aggregator: Drop pre-initialization in get_arg() Geert Uytterhoeven
@ 2020-07-01 11:42 ` Geert Uytterhoeven
  2020-07-07 12:31 ` [PATCH v2 0/2] gpio: aggregator: Misc parsing improvements Linus Walleij
  2 siblings, 0 replies; 4+ messages in thread
From: Geert Uytterhoeven @ 2020-07-01 11:42 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko
  Cc: linux-gpio, linux-renesas-soc, linux-kernel, Geert Uytterhoeven

Replace the custom code to parse GPIO offsets and/or GPIO offset ranges
by a call to bitmap_parselist(), and an iteration over the returned bit
mask.

This should have no impact on the format of the configuration parameters
written to the "new_device" virtual file in sysfs.

Suggested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v2:
  - Rename mask to bitmap,
  - Allocate bitmap dynamically.
---
 drivers/gpio/gpio-aggregator.c | 59 +++++++++++++++-------------------
 1 file changed, 26 insertions(+), 33 deletions(-)

diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c
index 62a3fcbd4b4bb106..424a3d25350bf50d 100644
--- a/drivers/gpio/gpio-aggregator.c
+++ b/drivers/gpio/gpio-aggregator.c
@@ -10,6 +10,7 @@
 #include <linux/bitmap.h>
 #include <linux/bitops.h>
 #include <linux/ctype.h>
+#include <linux/gpio.h>
 #include <linux/gpio/consumer.h>
 #include <linux/gpio/driver.h>
 #include <linux/gpio/machine.h>
@@ -111,55 +112,45 @@ static int aggr_add_gpio(struct gpio_aggregator *aggr, const char *key,
 
 static int aggr_parse(struct gpio_aggregator *aggr)
 {
-	unsigned int first_index, last_index, i, n = 0;
-	char *name, *offsets, *first, *last, *next;
 	char *args = aggr->args;
-	int error;
+	unsigned long *bitmap;
+	unsigned int i, n = 0;
+	char *name, *offsets;
+	int error = 0;
+
+	bitmap = bitmap_alloc(ARCH_NR_GPIOS, GFP_KERNEL);
+	if (!bitmap)
+		return -ENOMEM;
 
 	for (name = get_arg(&args), offsets = get_arg(&args); name;
 	     offsets = get_arg(&args)) {
 		if (IS_ERR(name)) {
 			pr_err("Cannot get GPIO specifier: %pe\n", name);
-			return PTR_ERR(name);
+			error = PTR_ERR(name);
+			goto free_bitmap;
 		}
 
 		if (!isrange(offsets)) {
 			/* Named GPIO line */
 			error = aggr_add_gpio(aggr, name, U16_MAX, &n);
 			if (error)
-				return error;
+				goto free_bitmap;
 
 			name = offsets;
 			continue;
 		}
 
 		/* GPIO chip + offset(s) */
-		for (first = offsets; *first; first = next) {
-			next = strchrnul(first, ',');
-			if (*next)
-				*next++ = '\0';
-
-			last = strchr(first, '-');
-			if (last)
-				*last++ = '\0';
-
-			if (kstrtouint(first, 10, &first_index)) {
-				pr_err("Cannot parse GPIO index %s\n", first);
-				return -EINVAL;
-			}
-
-			if (!last) {
-				last_index = first_index;
-			} else if (kstrtouint(last, 10, &last_index)) {
-				pr_err("Cannot parse GPIO index %s\n", last);
-				return -EINVAL;
-			}
-
-			for (i = first_index; i <= last_index; i++) {
-				error = aggr_add_gpio(aggr, name, i, &n);
-				if (error)
-					return error;
-			}
+		error = bitmap_parselist(offsets, bitmap, ARCH_NR_GPIOS);
+		if (error) {
+			pr_err("Cannot parse %s: %d\n", offsets, error);
+			goto free_bitmap;
+		}
+
+		for_each_set_bit(i, bitmap, ARCH_NR_GPIOS) {
+			error = aggr_add_gpio(aggr, name, i, &n);
+			if (error)
+				goto free_bitmap;
 		}
 
 		name = get_arg(&args);
@@ -167,10 +158,12 @@ static int aggr_parse(struct gpio_aggregator *aggr)
 
 	if (!n) {
 		pr_err("No GPIOs specified\n");
-		return -EINVAL;
+		error = -EINVAL;
 	}
 
-	return 0;
+free_bitmap:
+	bitmap_free(bitmap);
+	return error;
 }
 
 static ssize_t new_device_store(struct device_driver *driver, const char *buf,
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 0/2] gpio: aggregator: Misc parsing improvements
  2020-07-01 11:42 [PATCH v2 0/2] gpio: aggregator: Misc parsing improvements Geert Uytterhoeven
  2020-07-01 11:42 ` [PATCH v2 1/2] gpio: aggregator: Drop pre-initialization in get_arg() Geert Uytterhoeven
  2020-07-01 11:42 ` [PATCH v2 2/2] gpio: aggregator: Use bitmap_parselist() for parsing GPIO offsets Geert Uytterhoeven
@ 2020-07-07 12:31 ` Linus Walleij
  2 siblings, 0 replies; 4+ messages in thread
From: Linus Walleij @ 2020-07-07 12:31 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Bartosz Golaszewski, Andy Shevchenko, open list:GPIO SUBSYSTEM,
	Linux-Renesas, linux-kernel

On Wed, Jul 1, 2020 at 1:42 PM Geert Uytterhoeven
<geert+renesas@glider.be> wrote:

> This patch series contains two improvements for the parsing code in the
> GPIO Aggregator.
>
> The second one converts the driver to use bitmap_parselist() for parsing
> GPIO offsets and/or ranges, as suggested by Andy[1].  This should have
> no impact on the format of the configuration parameters written to the
> "new_device" virtual file in sysfs.
>
> Changes compared to v1:
>   - Rename mask to bitmap,
>   - Allocate bitmap dynamically.

Patches applied for v5.9! If there are further review comments they can surely
be addressed by new patches.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-07-07 12:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-01 11:42 [PATCH v2 0/2] gpio: aggregator: Misc parsing improvements Geert Uytterhoeven
2020-07-01 11:42 ` [PATCH v2 1/2] gpio: aggregator: Drop pre-initialization in get_arg() Geert Uytterhoeven
2020-07-01 11:42 ` [PATCH v2 2/2] gpio: aggregator: Use bitmap_parselist() for parsing GPIO offsets Geert Uytterhoeven
2020-07-07 12:31 ` [PATCH v2 0/2] gpio: aggregator: Misc parsing improvements Linus Walleij

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.