diff options
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/gpio-pca953x.c | 3 | ||||
-rw-r--r-- | drivers/gpio/gpiolib.c | 7 |
2 files changed, 7 insertions, 3 deletions
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index 02f2a5621..47d08b9da 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c @@ -372,14 +372,15 @@ static void pca953x_gpio_set_multiple(struct gpio_chip *gc, break; } - memcpy(reg_val, chip->reg_output, NBANK(chip)); mutex_lock(&chip->i2c_lock); + memcpy(reg_val, chip->reg_output, NBANK(chip)); for(bank=0; bank<NBANK(chip); bank++) { unsigned bankmask = mask[bank / sizeof(*mask)] >> ((bank % sizeof(*mask)) * 8); if(bankmask) { unsigned bankval = bits[bank / sizeof(*bits)] >> ((bank % sizeof(*bits)) * 8); + bankval &= bankmask; reg_val[bank] = (reg_val[bank] & ~bankmask) | bankval; } } diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index b2dee1024..15704aaf9 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -2667,8 +2667,11 @@ int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset) if (IS_ERR(desc)) return PTR_ERR(desc); - /* Flush direction if something changed behind our back */ - if (chip->get_direction) { + /* + * If it's fast: flush the direction setting if something changed + * behind our back + */ + if (!chip->can_sleep && chip->get_direction) { int dir = chip->get_direction(chip, offset); if (dir) |