gpio: pca953x: Move memcpy into mutex lock for set multiple
authorPhil Reid <preid@electromag.com.au>
Tue, 8 Nov 2016 05:18:11 +0000 (13:18 +0800)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 8 Nov 2016 09:29:47 +0000 (10:29 +0100)
Need to ensure that reg_output is not updated while setting multiple
bits. This makes the mutex locking behaviour for the set_multiple call
consistent with that of the set_value call.

Cc: stable@vger.kernel.org
Fixes: b4818afeacbd ("gpio: pca953x: Add set_multiple to allow multiple")
Signed-off-by: Phil Reid <preid@electromag.com.au>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-pca953x.c

index 4a8d0fe60e0c49588da5dfc4ee1c18eb55701b9e..fe731f09425712b546655d7097a84b7a47a35d68 100644 (file)
@@ -372,8 +372,8 @@ static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
 
        bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
 
-       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++) {
                bank_mask = mask[bank / sizeof(*mask)] >>
                           ((bank % sizeof(*mask)) * 8);
@@ -608,7 +608,6 @@ static int pca953x_irq_setup(struct pca953x_chip *chip,
 
        if (client->irq && irq_base != -1
                        && (chip->driver_data & PCA_INT)) {
-
                ret = pca953x_read_regs(chip,
                                        chip->regs->input, chip->irq_stat);
                if (ret)