]> 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 f809a5a8e9ebf029759689dffe649bd09c98e659..6698feabacedfb49ce27a0b851432d38190a3e4b 100644 (file)
@@ -65,7 +65,7 @@ static int pisosr_gpio_get_direction(struct gpio_chip *chip,
                                     unsigned offset)
 {
        /* This device always input */
-       return 1;
+       return GPIO_LINE_DIRECTION_IN;
 }
 
 static int pisosr_gpio_direction_input(struct gpio_chip *chip,
@@ -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;