]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpiolib: Deduplicate some code in for_each_requested_gpio_in_range()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 7 Feb 2025 15:07:34 +0000 (17:07 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 12 Feb 2025 14:20:16 +0000 (15:20 +0100)
Refactor for_each_requested_gpio_in_range() to deduplicate some code
which is basically repeats the for_each_hwgpio(). In order to achieve
this, split the latter to two, for_each_hwgpio_in_range() and
for_each_hwgpio().

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20250207151149.2119765-2-andriy.shevchenko@linux.intel.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
include/linux/gpio/driver.h

index 2dd7cb9cc270a68ddedbcdd5d44e0d0f88dfa785..314f4241e306b8bbeef918264d46ffb654b9c767 100644 (file)
@@ -550,20 +550,32 @@ DEFINE_CLASS(_gpiochip_for_each_data,
             const char **label, int *i)
 
 /**
- * for_each_hwgpio - Iterates over all GPIOs for given chip.
+ * for_each_hwgpio_in_range - Iterates over all GPIOs in a given range
  * @_chip: Chip to iterate over.
  * @_i: Loop counter.
+ * @_base: First GPIO in the ranger.
+ * @_size: Amount of GPIOs to check starting from @base.
  * @_label: Place to store the address of the label if the GPIO is requested.
  *          Set to NULL for unused GPIOs.
  */
-#define for_each_hwgpio(_chip, _i, _label) \
-       for (CLASS(_gpiochip_for_each_data, _data)(&_label, &_i); \
-            *_data.i < _chip->ngpio; \
-            (*_data.i)++, kfree(*(_data.label)), *_data.label = NULL) \
-               if (IS_ERR(*_data.label = \
-                       gpiochip_dup_line_label(_chip, *_data.i))) {} \
+#define for_each_hwgpio_in_range(_chip, _i, _base, _size, _label)                      \
+       for (CLASS(_gpiochip_for_each_data, _data)(&_label, &_i);                       \
+            *_data.i < _size;                                                          \
+            (*_data.i)++, kfree(*(_data.label)), *_data.label = NULL)                  \
+               if (IS_ERR(*_data.label =                                               \
+                       gpiochip_dup_line_label(_chip, _base + *_data.i))) {}           \
                else
 
+/**
+ * for_each_hwgpio - Iterates over all GPIOs for given chip.
+ * @_chip: Chip to iterate over.
+ * @_i: Loop counter.
+ * @_label: Place to store the address of the label if the GPIO is requested.
+ *          Set to NULL for unused GPIOs.
+ */
+#define for_each_hwgpio(_chip, _i, _label)                                             \
+       for_each_hwgpio_in_range(_chip, _i, 0, _chip->ngpio, _label)
+
 /**
  * for_each_requested_gpio_in_range - iterates over requested GPIOs in a given range
  * @_chip:     the chip to query
@@ -573,13 +585,8 @@ DEFINE_CLASS(_gpiochip_for_each_data,
  * @_label:    label of current GPIO
  */
 #define for_each_requested_gpio_in_range(_chip, _i, _base, _size, _label)              \
-       for (CLASS(_gpiochip_for_each_data, _data)(&_label, &_i);                       \
-            *_data.i < _size;                                                          \
-            (*_data.i)++, kfree(*(_data.label)), *_data.label = NULL)                  \
-               if ((*_data.label =                                                     \
-                       gpiochip_dup_line_label(_chip, _base + *_data.i)) == NULL) {}   \
-               else if (IS_ERR(*_data.label)) {}                                       \
-               else
+       for_each_hwgpio_in_range(_chip, _i, _base, _size, _label)                       \
+               if (_label == NULL) {} else
 
 /* Iterates over all requested GPIO of the given @chip */
 #define for_each_requested_gpio(chip, i, label)                                                \