| From e228ae7b3b0e2076312a7be89d00603e452f9473 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 6 Feb 2025 18:46:00 +0100 |
| Subject: gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0 |
| |
| From: Artur Weber <aweber.kernel@gmail.com> |
| |
| [ Upstream commit de1d0d160f64ee76df1d364d521b2faf465a091c ] |
| |
| The GPIO lock/unlock functions clear/write a bit to the relevant |
| register for each bank. However, due to an oversight the bit that |
| was being written was based on the total GPIO number, not the index |
| of the GPIO within the relevant bank, causing it to fail for any |
| GPIO above 32 (thus any GPIO for banks above bank 0). |
| |
| Fix lock/unlock for these banks by using the correct bit. |
| |
| Fixes: bdb93c03c550 ("gpio: bcm281xx: Centralize register locking") |
| Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com> |
| Reviewed-by: Markus Mayer <mmayer@broadcom.com> |
| Signed-off-by: Artur Weber <aweber.kernel@gmail.com> |
| Reviewed-by: Linus Walleij <linus.walleij@linaro.org> |
| Link: https://lore.kernel.org/r/20250206-kona-gpio-fixes-v2-1-409135eab780@gmail.com |
| Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpio/gpio-bcm-kona.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c |
| index 100575973e1fd..840a4b7e6c4d1 100644 |
| --- a/drivers/gpio/gpio-bcm-kona.c |
| +++ b/drivers/gpio/gpio-bcm-kona.c |
| @@ -94,11 +94,12 @@ static void bcm_kona_gpio_lock_gpio(struct bcm_kona_gpio *kona_gpio, |
| u32 val; |
| unsigned long flags; |
| int bank_id = GPIO_BANK(gpio); |
| + int bit = GPIO_BIT(gpio); |
| |
| raw_spin_lock_irqsave(&kona_gpio->lock, flags); |
| |
| val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id)); |
| - val |= BIT(gpio); |
| + val |= BIT(bit); |
| bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val); |
| |
| raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); |
| @@ -110,11 +111,12 @@ static void bcm_kona_gpio_unlock_gpio(struct bcm_kona_gpio *kona_gpio, |
| u32 val; |
| unsigned long flags; |
| int bank_id = GPIO_BANK(gpio); |
| + int bit = GPIO_BIT(gpio); |
| |
| raw_spin_lock_irqsave(&kona_gpio->lock, flags); |
| |
| val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id)); |
| - val &= ~BIT(gpio); |
| + val &= ~BIT(bit); |
| bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val); |
| |
| raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); |
| -- |
| 2.39.5 |
| |