All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro
@ 2021-05-18  8:33 Andy Shevchenko
  2021-05-18 23:41 ` Linus Walleij
  2021-05-20  8:07 ` Johan Hovold
  0 siblings, 2 replies; 9+ messages in thread
From: Andy Shevchenko @ 2021-05-18  8:33 UTC (permalink / raw)
  To: Bartosz Golaszewski, Andy Shevchenko, Kent Gibson, linux-gpio,
	linux-kernel
  Cc: Linus Walleij

In a few places we are using a loop against all GPIO descriptors
with a given flag for a given device. Replace it with a consolidated
for_each type of macro.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
v2: fixed compilation issue (LKP), injected if (test_bit) into the loop
 drivers/gpio/gpiolib-of.c    | 10 ++++------
 drivers/gpio/gpiolib-sysfs.c |  7 ++-----
 drivers/gpio/gpiolib.c       |  7 +++----
 drivers/gpio/gpiolib.h       |  7 +++++++
 4 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index bbcc7c073f63..2f8f3f0c8373 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -711,14 +711,12 @@ static int of_gpiochip_scan_gpios(struct gpio_chip *chip)
 static void of_gpiochip_remove_hog(struct gpio_chip *chip,
 				   struct device_node *hog)
 {
-	struct gpio_desc *descs = chip->gpiodev->descs;
+	struct gpio_desc *desc;
 	unsigned int i;
 
-	for (i = 0; i < chip->ngpio; i++) {
-		if (test_bit(FLAG_IS_HOGGED, &descs[i].flags) &&
-		    descs[i].hog == hog)
-			gpiochip_free_own_desc(&descs[i]);
-	}
+	for_each_gpio_desc_if(i, chip, desc, FLAG_IS_HOGGED)
+		if (desc->hog == hog)
+			gpiochip_free_own_desc(desc);
 }
 
 static int of_gpiochip_match_node(struct gpio_chip *chip, void *data)
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index ae49bb23c6ed..41b3b782bf3f 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -801,11 +801,8 @@ void gpiochip_sysfs_unregister(struct gpio_device *gdev)
 	mutex_unlock(&sysfs_lock);
 
 	/* unregister gpiod class devices owned by sysfs */
-	for (i = 0; i < chip->ngpio; i++) {
-		desc = &gdev->descs[i];
-		if (test_and_clear_bit(FLAG_SYSFS, &desc->flags))
-			gpiod_free(desc);
-	}
+	for_each_gpio_desc_if(i, chip, desc, FLAG_SYSFS)
+		gpiod_free(desc);
 }
 
 static int __init gpiolib_sysfs_init(void)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 220a9d8dd4e3..97a69362a584 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -4012,12 +4012,11 @@ int gpiod_hog(struct gpio_desc *desc, const char *name,
  */
 static void gpiochip_free_hogs(struct gpio_chip *gc)
 {
+	struct gpio_desc *desc;
 	int id;
 
-	for (id = 0; id < gc->ngpio; id++) {
-		if (test_bit(FLAG_IS_HOGGED, &gc->gpiodev->descs[id].flags))
-			gpiochip_free_own_desc(&gc->gpiodev->descs[id]);
-	}
+	for_each_gpio_desc_if(id, gc, desc, FLAG_IS_HOGGED)
+		gpiochip_free_own_desc(desc);
 }
 
 /**
diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
index 30bc3f80f83e..69c96a4276de 100644
--- a/drivers/gpio/gpiolib.h
+++ b/drivers/gpio/gpiolib.h
@@ -82,6 +82,13 @@ struct gpio_array {
 };
 
 struct gpio_desc *gpiochip_get_desc(struct gpio_chip *gc, unsigned int hwnum);
+
+#define for_each_gpio_desc_if(i, gc, desc, flag)		\
+	for (i = 0, desc = gpiochip_get_desc(gc, i);		\
+	     i < gc->ngpio;					\
+	     i++, desc = gpiochip_get_desc(gc, i))		\
+		if (!test_bit(flag, &desc->flags)) {} else
+
 int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 				  unsigned int array_size,
 				  struct gpio_desc **desc_array,
-- 
2.30.2


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

* Re: [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro
  2021-05-18  8:33 [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro Andy Shevchenko
@ 2021-05-18 23:41 ` Linus Walleij
  2021-05-20  8:07 ` Johan Hovold
  1 sibling, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2021-05-18 23:41 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Bartosz Golaszewski, Kent Gibson, open list:GPIO SUBSYSTEM, linux-kernel

On Tue, May 18, 2021 at 10:33 AM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:

> In a few places we are using a loop against all GPIO descriptors
> with a given flag for a given device. Replace it with a consolidated
> for_each type of macro.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

This is great for readability.
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

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

* Re: [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro
  2021-05-18  8:33 [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro Andy Shevchenko
  2021-05-18 23:41 ` Linus Walleij
@ 2021-05-20  8:07 ` Johan Hovold
  2021-05-20  8:15   ` Andy Shevchenko
  1 sibling, 1 reply; 9+ messages in thread
From: Johan Hovold @ 2021-05-20  8:07 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Bartosz Golaszewski, Kent Gibson, linux-gpio, linux-kernel,
	Linus Walleij

On Tue, May 18, 2021 at 11:33:39AM +0300, Andy Shevchenko wrote:
> In a few places we are using a loop against all GPIO descriptors
> with a given flag for a given device. Replace it with a consolidated
> for_each type of macro.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
> v2: fixed compilation issue (LKP), injected if (test_bit) into the loop
>  drivers/gpio/gpiolib-of.c    | 10 ++++------
>  drivers/gpio/gpiolib-sysfs.c |  7 ++-----
>  drivers/gpio/gpiolib.c       |  7 +++----
>  drivers/gpio/gpiolib.h       |  7 +++++++
>  4 files changed, 16 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
> index bbcc7c073f63..2f8f3f0c8373 100644
> --- a/drivers/gpio/gpiolib-of.c
> +++ b/drivers/gpio/gpiolib-of.c
> @@ -711,14 +711,12 @@ static int of_gpiochip_scan_gpios(struct gpio_chip *chip)
>  static void of_gpiochip_remove_hog(struct gpio_chip *chip,
>  				   struct device_node *hog)
>  {
> -	struct gpio_desc *descs = chip->gpiodev->descs;
> +	struct gpio_desc *desc;
>  	unsigned int i;
>  
> -	for (i = 0; i < chip->ngpio; i++) {
> -		if (test_bit(FLAG_IS_HOGGED, &descs[i].flags) &&
> -		    descs[i].hog == hog)
> -			gpiochip_free_own_desc(&descs[i]);
> -	}
> +	for_each_gpio_desc_if(i, chip, desc, FLAG_IS_HOGGED)
> +		if (desc->hog == hog)
> +			gpiochip_free_own_desc(desc);

The _if suffix here is too vague.

Please use a more descriptive name so that you don't need to look at the
implementation to understand what the macro does.

Perhaps call it 

	for_each_gpio_desc_with_flag()

or just add the more generic macro 

	for_each_gpio_desc()

and open-code the test so that it's clear what's going on here.

>  struct gpio_desc *gpiochip_get_desc(struct gpio_chip *gc, unsigned int hwnum);
> +
> +#define for_each_gpio_desc_if(i, gc, desc, flag)		\
> +	for (i = 0, desc = gpiochip_get_desc(gc, i);		\
> +	     i < gc->ngpio;					\
> +	     i++, desc = gpiochip_get_desc(gc, i))		\
> +		if (!test_bit(flag, &desc->flags)) {} else
> +
>  int gpiod_get_array_value_complex(bool raw, bool can_sleep,
>  				  unsigned int array_size,
>  				  struct gpio_desc **desc_array,

Johan

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

* Re: [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro
  2021-05-20  8:07 ` Johan Hovold
@ 2021-05-20  8:15   ` Andy Shevchenko
  2021-05-20  8:33     ` Johan Hovold
  0 siblings, 1 reply; 9+ messages in thread
From: Andy Shevchenko @ 2021-05-20  8:15 UTC (permalink / raw)
  To: Johan Hovold
  Cc: Andy Shevchenko, Bartosz Golaszewski, Kent Gibson,
	open list:GPIO SUBSYSTEM, Linux Kernel Mailing List,
	Linus Walleij

On Thu, May 20, 2021 at 11:07 AM Johan Hovold <johan@kernel.org> wrote:
> On Tue, May 18, 2021 at 11:33:39AM +0300, Andy Shevchenko wrote:

Thank you for the response, my answer below.

...

> The _if suffix here is too vague.
>
> Please use a more descriptive name so that you don't need to look at the
> implementation to understand what the macro does.
>
> Perhaps call it
>
>         for_each_gpio_desc_with_flag()

Haha, I have the same in my internal tree, but then I have changed to
_if and here is why:
- the API is solely for internal use (note, internals of struct
gpio_desc available for the same set of users)
- the current users do only same pattern
- I don't expect that we will have this to be anything else in the future

Thus, _if is a good balance between scope of use and naming.

I prefer to leave it as is.

> or just add the more generic macro
>
>         for_each_gpio_desc()
>
> and open-code the test so that it's clear what's going on here.



-- 
With Best Regards,
Andy Shevchenko

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

* Re: [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro
  2021-05-20  8:15   ` Andy Shevchenko
@ 2021-05-20  8:33     ` Johan Hovold
  2021-05-20  9:03       ` Andy Shevchenko
  2021-05-20  9:16       ` Andy Shevchenko
  0 siblings, 2 replies; 9+ messages in thread
From: Johan Hovold @ 2021-05-20  8:33 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Andy Shevchenko, Bartosz Golaszewski, Kent Gibson,
	open list:GPIO SUBSYSTEM, Linux Kernel Mailing List,
	Linus Walleij

On Thu, May 20, 2021 at 11:15:31AM +0300, Andy Shevchenko wrote:
> On Thu, May 20, 2021 at 11:07 AM Johan Hovold <johan@kernel.org> wrote:
> > On Tue, May 18, 2021 at 11:33:39AM +0300, Andy Shevchenko wrote:

> > The _if suffix here is too vague.
> >
> > Please use a more descriptive name so that you don't need to look at the
> > implementation to understand what the macro does.
> >
> > Perhaps call it
> >
> >         for_each_gpio_desc_with_flag()
> 
> Haha, I have the same in my internal tree, but then I have changed to
> _if and here is why:
> - the API is solely for internal use (note, internals of struct
> gpio_desc available for the same set of users)

That's not a valid argument here. You should never make code harder to
read.

There are other ways of marking functions as intended for internal use
(e.g. do not export them and add a _ prefix or whatever).

> - the current users do only same pattern

That's not an argument against using a descriptive name. Possibly
against adding a generic for_each_gpio_desc() macro.

> - I don't expect that we will have this to be anything else in the future

Again, irrelevant. Possibly an argument against adding another helper in
the first place.

> Thus, _if is a good balance between scope of use and naming.

No, no, no. It's never a good idea to obfuscate code.

> I prefer to leave it as is.

I hope you'll reconsider, or that my arguments can convince the
maintainers to step in here.

> > or just add the more generic macro
> >
> >         for_each_gpio_desc()
> >
> > and open-code the test so that it's clear what's going on here.

FWIW, NAK due to the non-descriptive for_each_desc_if() name.

Johan

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

* Re: [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro
  2021-05-20  8:33     ` Johan Hovold
@ 2021-05-20  9:03       ` Andy Shevchenko
  2021-05-20  9:07         ` Andy Shevchenko
  2021-05-20  9:16       ` Andy Shevchenko
  1 sibling, 1 reply; 9+ messages in thread
From: Andy Shevchenko @ 2021-05-20  9:03 UTC (permalink / raw)
  To: Johan Hovold
  Cc: Bartosz Golaszewski, Kent Gibson, open list:GPIO SUBSYSTEM,
	Linux Kernel Mailing List, Linus Walleij

On Thu, May 20, 2021 at 10:33:38AM +0200, Johan Hovold wrote:
> On Thu, May 20, 2021 at 11:15:31AM +0300, Andy Shevchenko wrote:

> FWIW, NAK due to the non-descriptive for_each_desc_if() name.

I'm fine without this change, thanks for review!

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro
  2021-05-20  9:03       ` Andy Shevchenko
@ 2021-05-20  9:07         ` Andy Shevchenko
  0 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2021-05-20  9:07 UTC (permalink / raw)
  To: Johan Hovold
  Cc: Bartosz Golaszewski, Kent Gibson, open list:GPIO SUBSYSTEM,
	Linux Kernel Mailing List, Linus Walleij

On Thu, May 20, 2021 at 12:03:42PM +0300, Andy Shevchenko wrote:
> On Thu, May 20, 2021 at 10:33:38AM +0200, Johan Hovold wrote:
> > On Thu, May 20, 2021 at 11:15:31AM +0300, Andy Shevchenko wrote:
> 
> > FWIW, NAK due to the non-descriptive for_each_desc_if() name.
> 
> I'm fine without this change, thanks for review!

That said, maybe in the future I will reconsider.

And feel free to amend by yourself, you can keep or drop my SoB,
I'm fine either way.

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro
  2021-05-20  8:33     ` Johan Hovold
  2021-05-20  9:03       ` Andy Shevchenko
@ 2021-05-20  9:16       ` Andy Shevchenko
  2021-05-20  9:41         ` Johan Hovold
  1 sibling, 1 reply; 9+ messages in thread
From: Andy Shevchenko @ 2021-05-20  9:16 UTC (permalink / raw)
  To: Johan Hovold
  Cc: Bartosz Golaszewski, Kent Gibson, open list:GPIO SUBSYSTEM,
	Linux Kernel Mailing List, Linus Walleij

On Thu, May 20, 2021 at 10:33:38AM +0200, Johan Hovold wrote:
> On Thu, May 20, 2021 at 11:15:31AM +0300, Andy Shevchenko wrote:
> > On Thu, May 20, 2021 at 11:07 AM Johan Hovold <johan@kernel.org> wrote:
> > > On Tue, May 18, 2021 at 11:33:39AM +0300, Andy Shevchenko wrote:
> 
> > > The _if suffix here is too vague.
> > >
> > > Please use a more descriptive name so that you don't need to look at the
> > > implementation to understand what the macro does.
> > >
> > > Perhaps call it
> > >
> > >         for_each_gpio_desc_with_flag()
> > 
> > Haha, I have the same in my internal tree, but then I have changed to
> > _if and here is why:
> > - the API is solely for internal use (note, internals of struct
> > gpio_desc available for the same set of users)
> 
> That's not a valid argument here. You should never make code harder to
> read.
> 
> There are other ways of marking functions as intended for internal use
> (e.g. do not export them and add a _ prefix or whatever).
> 
> > - the current users do only same pattern
> 
> That's not an argument against using a descriptive name. Possibly
> against adding a generic for_each_gpio_desc() macro.
> 
> > - I don't expect that we will have this to be anything else in the future
> 
> Again, irrelevant. Possibly an argument against adding another helper in
> the first place.
> 
> > Thus, _if is a good balance between scope of use and naming.
> 
> No, no, no. It's never a good idea to obfuscate code.
> 
> > I prefer to leave it as is.
> 
> I hope you'll reconsider, or that my arguments can convince the
> maintainers to step in here.
> 
> > > or just add the more generic macro
> > >
> > >         for_each_gpio_desc()
> > >
> > > and open-code the test so that it's clear what's going on here.
> 
> FWIW, NAK due to the non-descriptive for_each_desc_if() name.

Btw, missed argument

..._with_flag(..., FLAG_...)

breaks the DRY principle. If you read current code it's clear with that

_if(..., FLAG_...)

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro
  2021-05-20  9:16       ` Andy Shevchenko
@ 2021-05-20  9:41         ` Johan Hovold
  0 siblings, 0 replies; 9+ messages in thread
From: Johan Hovold @ 2021-05-20  9:41 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Bartosz Golaszewski, Kent Gibson, open list:GPIO SUBSYSTEM,
	Linux Kernel Mailing List, Linus Walleij

On Thu, May 20, 2021 at 12:16:20PM +0300, Andy Shevchenko wrote:
> On Thu, May 20, 2021 at 10:33:38AM +0200, Johan Hovold wrote:
> > On Thu, May 20, 2021 at 11:15:31AM +0300, Andy Shevchenko wrote:
> > > On Thu, May 20, 2021 at 11:07 AM Johan Hovold <johan@kernel.org> wrote:
> > > > On Tue, May 18, 2021 at 11:33:39AM +0300, Andy Shevchenko wrote:
> > 
> > > > The _if suffix here is too vague.
> > > >
> > > > Please use a more descriptive name so that you don't need to look at the
> > > > implementation to understand what the macro does.
> > > >
> > > > Perhaps call it
> > > >
> > > >         for_each_gpio_desc_with_flag()

> > > > or just add the more generic macro
> > > >
> > > >         for_each_gpio_desc()
> > > >
> > > > and open-code the test so that it's clear what's going on here.
> > 
> > FWIW, NAK due to the non-descriptive for_each_desc_if() name.
> 
> Btw, missed argument
> 
> ..._with_flag(..., FLAG_...)
> 
> breaks the DRY principle. If you read current code it's clear with that
> 
> _if(..., FLAG_...)

That we have precisely zero for_each_ macros with an _if suffix should
also give you a hint that this is not a good idea.

Again, you shouldn't have to look at the implementation to understand
what a helper does.

Johan

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

end of thread, other threads:[~2021-05-20 10:06 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-18  8:33 [PATCH v2 1/1] gpiolib: Introduce for_each_gpio_desc_if() macro Andy Shevchenko
2021-05-18 23:41 ` Linus Walleij
2021-05-20  8:07 ` Johan Hovold
2021-05-20  8:15   ` Andy Shevchenko
2021-05-20  8:33     ` Johan Hovold
2021-05-20  9:03       ` Andy Shevchenko
2021-05-20  9:07         ` Andy Shevchenko
2021-05-20  9:16       ` Andy Shevchenko
2021-05-20  9:41         ` Johan Hovold

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.