| From 165cdb2b87f10a4dd6d296f04eebeafbca83ad47 Mon Sep 17 00:00:00 2001 |
| From: Paul Thomas <pthomas8589@gmail.com> |
| Date: Sat, 25 Jan 2020 17:14:10 -0500 |
| Subject: [PATCH] gpio: xilinx: Fix bug where the wrong GPIO register is |
| written to |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpio/gpio-xilinx.c b/drivers/gpio/gpio-xilinx.c |
| index 32944eb886c1..0852d8d5c389 100644 |
| --- a/drivers/gpio/gpio-xilinx.c |
| +++ b/drivers/gpio/gpio-xilinx.c |
| @@ -149,9 +149,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(mm_gc->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); |
| @@ -167,7 +168,7 @@ static void xgpio_set_multiple(struct gpio_chip *gc, unsigned long *mask, |
| } |
| |
| xgpio_writereg(mm_gc->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); |
| } |
| -- |
| 2.7.4 |
| |