mirror of https://gitee.com/openkylin/linux.git
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: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
bb5b06750f
commit
5e4e6fb3ff
|
@ -1,3 +1,4 @@
|
||||||
|
#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,18 +2571,11 @@ 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) {
|
/* set outputs if the corresponding mask bit is set */
|
||||||
/* no more set bits in this mask word;
|
for_each_set_bit(i, mask, chip->ngpio)
|
||||||
* skip ahead to the next word */
|
chip->set(chip, i, test_bit(i, bits));
|
||||||
i = (BIT_WORD(i) + 1) * BITS_PER_LONG - 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* set outputs if the corresponding mask bit is set */
|
|
||||||
if (__test_and_clear_bit(i, mask))
|
|
||||||
chip->set(chip, i, test_bit(i, bits));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue