gpio: xilinx: Fix bug where the wrong GPIO register is written to
authorPaul Thomas <pthomas8589@gmail.com>
Sat, 25 Jan 2020 22:14:10 +0000 (17:14 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Feb 2020 18:53:02 +0000 (19:53 +0100)
commit c3afa804c58e5c30ac63858b527fffadc88bce82 upstream.

Care is taken with "index", however with the current version
the actual xgpio_writereg is using index for data but
xgpio_regoffset(chip, i) for the offset. And since i is already
incremented it is incorrect. This patch fixes it so that index
is used for the offset too.

Cc: stable@vger.kernel.org
Signed-off-by: Paul Thomas <pthomas8589@gmail.com>
Link: https://lore.kernel.org/r/20200125221410.8022-1-pthomas8589@gmail.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpio/gpio-xilinx.c

index a9748b5..67f9f82 100644 (file)
@@ -147,9 +147,10 @@ static void xgpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,
        for (i = 0; i < gc->ngpio; i++) {
                if (*mask == 0)
                        break;
+               /* Once finished with an index write it out to the register */
                if (index !=  xgpio_index(chip, i)) {
                        xgpio_writereg(chip->regs + XGPIO_DATA_OFFSET +
-                                      xgpio_regoffset(chip, i),
+                                      index * XGPIO_CHANNEL_OFFSET,
                                       chip->gpio_state[index]);
                        spin_unlock_irqrestore(&chip->gpio_lock[index], flags);
                        index =  xgpio_index(chip, i);
@@ -165,7 +166,7 @@ static void xgpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,
        }
 
        xgpio_writereg(chip->regs + XGPIO_DATA_OFFSET +
-                      xgpio_regoffset(chip, i), chip->gpio_state[index]);
+                      index * XGPIO_CHANNEL_OFFSET, chip->gpio_state[index]);
 
        spin_unlock_irqrestore(&chip->gpio_lock[index], flags);
 }