Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e4e6fb3 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Linus Walleij
Browse files

gpiolib: Switch to for_each_set_bit()



The macro for_each_set_bit() effectively looks up to the next
set bit in array of bits.

Instead of open coding that switch to for_each_set_bit() in
gpio_chip_set_multiple().

While here, make gpio_chip_set_multiple() non-destructive
against its parameters. We are safe since all callers, i.e.
gpiod_set_array_value_complex(), handle that already.

Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent bb5b0675
Loading
Loading
Loading
Loading
+6 −12
Original line number Original line Diff line number Diff line
#include <linux/bitops.h>
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/interrupt.h>
@@ -2570,20 +2571,13 @@ static void gpio_chip_set_multiple(struct gpio_chip *chip,
	if (chip->set_multiple) {
	if (chip->set_multiple) {
		chip->set_multiple(chip, mask, bits);
		chip->set_multiple(chip, mask, bits);
	} else {
	} else {
		int i;
		unsigned int i;
		for (i = 0; i < chip->ngpio; i++) {

			if (mask[BIT_WORD(i)] == 0) {
				/* no more set bits in this mask word;
				 * skip ahead to the next word */
				i = (BIT_WORD(i) + 1) * BITS_PER_LONG - 1;
				continue;
			}
		/* set outputs if the corresponding mask bit is set */
		/* set outputs if the corresponding mask bit is set */
			if (__test_and_clear_bit(i, mask))
		for_each_set_bit(i, mask, chip->ngpio)
			chip->set(chip, i, test_bit(i, bits));
			chip->set(chip, i, test_bit(i, bits));
	}
	}
}
}
}


void gpiod_set_array_value_complex(bool raw, bool can_sleep,
void gpiod_set_array_value_complex(bool raw, bool can_sleep,
				   unsigned int array_size,
				   unsigned int array_size,