]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0
authorArtur Weber <aweber.kernel@gmail.com>
Thu, 6 Feb 2025 17:46:00 +0000 (18:46 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Feb 2025 12:49:57 +0000 (13:49 +0100)
[ 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

index 70770429ba483befbf8f53ec38a4bf79308dc7a3..7e8adc5cc15a0485206ba420c686651076b5159e 100644 (file)
@@ -85,11 +85,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);
@@ -101,11 +102,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);