gpiolib: Introduce for_each_gpio_desc_with_flag() macro
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 1 Feb 2022 15:27:56 +0000 (17:27 +0200)
committerBartosz Golaszewski <brgl@bgdev.pl>
Tue, 8 Feb 2022 09:35:49 +0000 (10:35 +0100)
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>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
drivers/gpio/gpiolib-of.c
drivers/gpio/gpiolib-sysfs.c
drivers/gpio/gpiolib.c
drivers/gpio/gpiolib.h

index 91dcf2c..ae1ce31 100644 (file)
@@ -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_with_flag(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)
index 4098bc7..fc9ec6a 100644 (file)
@@ -793,11 +793,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_with_flag(i, chip, desc, FLAG_SYSFS)
+               gpiod_free(desc);
 }
 
 static int __init gpiolib_sysfs_init(void)
index 3859911..e3702bc 100644 (file)
@@ -4102,12 +4102,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_with_flag(id, gc, desc, FLAG_IS_HOGGED)
+               gpiochip_free_own_desc(desc);
 }
 
 /**
index 30bc3f8..e1fff54 100644 (file)
@@ -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_with_flag(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,