]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpio/gpio-pisosr.c
Merge tag 's390-5.6-3' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux.git] / drivers / gpio / gpio-pisosr.c
index 1331b2a94679f4b1ec47cbd742c450bf52af8029..6698feabacedfb49ce27a0b851432d38190a3e4b 100644 (file)
@@ -96,16 +96,16 @@ static int pisosr_gpio_get_multiple(struct gpio_chip *chip,
                                    unsigned long *mask, unsigned long *bits)
 {
        struct pisosr_gpio *gpio = gpiochip_get_data(chip);
-       unsigned int nbytes = DIV_ROUND_UP(chip->ngpio, 8);
-       unsigned int i, j;
+       unsigned long offset;
+       unsigned long gpio_mask;
+       unsigned long buffer_state;
 
        pisosr_gpio_refresh(gpio);
 
        bitmap_zero(bits, chip->ngpio);
-       for (i = 0; i < nbytes; i++) {
-               j = i / sizeof(unsigned long);
-               bits[j] |= ((unsigned long) gpio->buffer[i])
-                          << (8 * (i % sizeof(unsigned long)));
+       for_each_set_clump8(offset, gpio_mask, mask, chip->ngpio) {
+               buffer_state = gpio->buffer[offset / 8] & gpio_mask;
+               bitmap_set_value8(bits, buffer_state, offset);
        }
 
        return 0;