Commit 88935160 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Bartosz Golaszewski
Browse files

gpiolib: Deduplicate some code in for_each_requested_gpio_in_range()



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: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20250207151149.2119765-2-andriy.shevchenko@linux.intel.com


Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent c11708e2
Loading
Loading
Loading
Loading
+21 −14
Original line number Diff line number Diff line
@@ -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) \
#define for_each_hwgpio_in_range(_chip, _i, _base, _size, _label)			\
	for (CLASS(_gpiochip_for_each_data, _data)(&_label, &_i);			\
	     *_data.i < _chip->ngpio; \
	     *_data.i < _size;								\
	     (*_data.i)++, kfree(*(_data.label)), *_data.label = NULL)			\
		if (IS_ERR(*_data.label =						\
			gpiochip_dup_line_label(_chip, *_data.i))) {} \
			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)						\