* [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups
@ 2025-02-06 17:45 Artur Weber
2025-02-06 17:46 ` [PATCH v2 1/3] gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0 Artur Weber
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Artur Weber @ 2025-02-06 17:45 UTC (permalink / raw)
To: Ray Jui, Broadcom internal kernel review list, Linus Walleij,
Bartosz Golaszewski, Florian Fainelli, Scott Branden,
Markus Mayer
Cc: linux-gpio, linux-kernel, ~postmarketos/upstreaming, Artur Weber
Fixes two issues that were preventing GPIO from working correctly:
- Lock/unlock functions tried to write the wrong bit to the unlock
registers for GPIOs with numbers larger than 32
- GPIOs only initialized as IRQs did not unlock the configuration
registers, causing IRQ-related configuration (e.g. setting the IRQ
type) to fail.
Also includes a minor fix to add a missing newline to an error message.
Tested on a Samsung Galaxy Grand Neo (baffinlite rev02) with a BCM23550
(DTS not yet in mainline).
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Changes in v2:
- Made the unlock count code cleaner by using increment/decrement
operators (-- / ++)
- Added extra comment to relres function to match the one in reqres
- Link to v1: https://lore.kernel.org/r/20250130-kona-gpio-fixes-v1-0-dd61e0c0a9e7@gmail.com
---
Artur Weber (3):
gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0
gpio: bcm-kona: Make sure GPIO bits are unlocked when requesting IRQ
gpio: bcm-kona: Add missing newline to dev_err format string
drivers/gpio/gpio-bcm-kona.c | 71 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 58 insertions(+), 13 deletions(-)
---
base-commit: ffd294d346d185b70e28b1a28abe367bbfe53c04
change-id: 20250130-kona-gpio-fixes-6e74595e69f2
Best regards,
--
Artur Weber <aweber.kernel@gmail.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/3] gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0
2025-02-06 17:45 [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups Artur Weber
@ 2025-02-06 17:46 ` Artur Weber
2025-02-06 17:46 ` [PATCH v2 2/3] gpio: bcm-kona: Make sure GPIO bits are unlocked when requesting IRQ Artur Weber
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Artur Weber @ 2025-02-06 17:46 UTC (permalink / raw)
To: Ray Jui, Broadcom internal kernel review list, Linus Walleij,
Bartosz Golaszewski, Florian Fainelli, Scott Branden,
Markus Mayer
Cc: linux-gpio, linux-kernel, ~postmarketos/upstreaming, Artur Weber
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>
---
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 5321ef98f4427d004e62f71d00df6d49bb465ddd..77bd4ec93a231472d7bc40db9d5db12d20bb1611 100644
--- a/drivers/gpio/gpio-bcm-kona.c
+++ b/drivers/gpio/gpio-bcm-kona.c
@@ -86,11 +86,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);
@@ -102,11 +103,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.48.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 2/3] gpio: bcm-kona: Make sure GPIO bits are unlocked when requesting IRQ
2025-02-06 17:45 [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups Artur Weber
2025-02-06 17:46 ` [PATCH v2 1/3] gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0 Artur Weber
@ 2025-02-06 17:46 ` Artur Weber
2025-02-06 17:46 ` [PATCH v2 3/3] gpio: bcm-kona: Add missing newline to dev_err format string Artur Weber
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Artur Weber @ 2025-02-06 17:46 UTC (permalink / raw)
To: Ray Jui, Broadcom internal kernel review list, Linus Walleij,
Bartosz Golaszewski, Florian Fainelli, Scott Branden,
Markus Mayer
Cc: linux-gpio, linux-kernel, ~postmarketos/upstreaming, Artur Weber
The settings for all GPIOs are locked by default in bcm_kona_gpio_reset.
The settings for a GPIO are unlocked when requesting it as a GPIO, but
not when requesting it as an interrupt, causing the IRQ settings to not
get applied.
Fix this by making sure to unlock the right bits when an IRQ is requested.
To avoid a situation where an IRQ being released causes a lock despite
the same GPIO being used by a GPIO request or vice versa, add an unlock
counter and only lock if it reaches 0.
Fixes: 757651e3d60e ("gpio: bcm281xx: Add GPIO driver")
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Markus Mayer <mmayer@broadcom.com>
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Changes in v2:
- Made the unlock count code cleaner by using increment/decrement
operators (-- / ++)
- Added extra comment to relres function to match the one in reqres
---
drivers/gpio/gpio-bcm-kona.c | 67 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 55 insertions(+), 12 deletions(-)
diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c
index 77bd4ec93a231472d7bc40db9d5db12d20bb1611..17f3f210fee9dbb5da3b26e1f86bf8f68089b1cd 100644
--- a/drivers/gpio/gpio-bcm-kona.c
+++ b/drivers/gpio/gpio-bcm-kona.c
@@ -69,6 +69,22 @@ struct bcm_kona_gpio {
struct bcm_kona_gpio_bank {
int id;
int irq;
+ /*
+ * Used to keep track of lock/unlock operations for each GPIO in the
+ * bank.
+ *
+ * All GPIOs are locked by default (see bcm_kona_gpio_reset), and the
+ * unlock count for all GPIOs is 0 by default. Each unlock increments
+ * the counter, and each lock decrements the counter.
+ *
+ * The lock function only locks the GPIO once its unlock counter is
+ * down to 0. This is necessary because the GPIO is unlocked in two
+ * places in this driver: once for requested GPIOs, and once for
+ * requested IRQs. Since it is possible for a GPIO to be requested
+ * as both a GPIO and an IRQ, we need to ensure that we don't lock it
+ * too early.
+ */
+ u8 gpio_unlock_count[GPIO_PER_BANK];
/* Used in the interrupt handler */
struct bcm_kona_gpio *kona_gpio;
};
@@ -87,14 +103,23 @@ static void bcm_kona_gpio_lock_gpio(struct bcm_kona_gpio *kona_gpio,
unsigned long flags;
int bank_id = GPIO_BANK(gpio);
int bit = GPIO_BIT(gpio);
+ struct bcm_kona_gpio_bank *bank = &kona_gpio->banks[bank_id];
- raw_spin_lock_irqsave(&kona_gpio->lock, flags);
+ if (bank->gpio_unlock_count[bit] == 0) {
+ dev_err(kona_gpio->gpio_chip.parent,
+ "Unbalanced locks for GPIO %u\n", gpio);
+ return;
+ }
- val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id));
- val |= BIT(bit);
- bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val);
+ if (--bank->gpio_unlock_count[bit] == 0) {
+ raw_spin_lock_irqsave(&kona_gpio->lock, flags);
- raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
+ val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id));
+ val |= BIT(bit);
+ bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val);
+
+ raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
+ }
}
static void bcm_kona_gpio_unlock_gpio(struct bcm_kona_gpio *kona_gpio,
@@ -104,14 +129,19 @@ static void bcm_kona_gpio_unlock_gpio(struct bcm_kona_gpio *kona_gpio,
unsigned long flags;
int bank_id = GPIO_BANK(gpio);
int bit = GPIO_BIT(gpio);
+ struct bcm_kona_gpio_bank *bank = &kona_gpio->banks[bank_id];
- raw_spin_lock_irqsave(&kona_gpio->lock, flags);
+ if (bank->gpio_unlock_count[bit] == 0) {
+ raw_spin_lock_irqsave(&kona_gpio->lock, flags);
- val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id));
- val &= ~BIT(bit);
- bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val);
+ val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id));
+ val &= ~BIT(bit);
+ bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val);
- raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
+ raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
+ }
+
+ ++bank->gpio_unlock_count[bit];
}
static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio)
@@ -362,6 +392,7 @@ static void bcm_kona_gpio_irq_mask(struct irq_data *d)
kona_gpio = irq_data_get_irq_chip_data(d);
reg_base = kona_gpio->reg_base;
+
raw_spin_lock_irqsave(&kona_gpio->lock, flags);
val = readl(reg_base + GPIO_INT_MASK(bank_id));
@@ -384,6 +415,7 @@ static void bcm_kona_gpio_irq_unmask(struct irq_data *d)
kona_gpio = irq_data_get_irq_chip_data(d);
reg_base = kona_gpio->reg_base;
+
raw_spin_lock_irqsave(&kona_gpio->lock, flags);
val = readl(reg_base + GPIO_INT_MSKCLR(bank_id));
@@ -479,15 +511,26 @@ static void bcm_kona_gpio_irq_handler(struct irq_desc *desc)
static int bcm_kona_gpio_irq_reqres(struct irq_data *d)
{
struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d);
+ unsigned int gpio = d->hwirq;
+
+ /*
+ * We need to unlock the GPIO before any other operations are performed
+ * on the relevant GPIO configuration registers
+ */
+ bcm_kona_gpio_unlock_gpio(kona_gpio, gpio);
- return gpiochip_reqres_irq(&kona_gpio->gpio_chip, d->hwirq);
+ return gpiochip_reqres_irq(&kona_gpio->gpio_chip, gpio);
}
static void bcm_kona_gpio_irq_relres(struct irq_data *d)
{
struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d);
+ unsigned int gpio = d->hwirq;
+
+ /* Once we no longer use it, lock the GPIO again */
+ bcm_kona_gpio_lock_gpio(kona_gpio, gpio);
- gpiochip_relres_irq(&kona_gpio->gpio_chip, d->hwirq);
+ gpiochip_relres_irq(&kona_gpio->gpio_chip, gpio);
}
static struct irq_chip bcm_gpio_irq_chip = {
--
2.48.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 3/3] gpio: bcm-kona: Add missing newline to dev_err format string
2025-02-06 17:45 [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups Artur Weber
2025-02-06 17:46 ` [PATCH v2 1/3] gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0 Artur Weber
2025-02-06 17:46 ` [PATCH v2 2/3] gpio: bcm-kona: Make sure GPIO bits are unlocked when requesting IRQ Artur Weber
@ 2025-02-06 17:46 ` Artur Weber
2025-02-06 18:13 ` [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups Linus Walleij
2025-02-11 8:47 ` Bartosz Golaszewski
4 siblings, 0 replies; 6+ messages in thread
From: Artur Weber @ 2025-02-06 17:46 UTC (permalink / raw)
To: Ray Jui, Broadcom internal kernel review list, Linus Walleij,
Bartosz Golaszewski, Florian Fainelli, Scott Branden,
Markus Mayer
Cc: linux-gpio, linux-kernel, ~postmarketos/upstreaming, Artur Weber
Add a missing newline to the format string of the "Couldn't get IRQ
for bank..." error message.
Fixes: 757651e3d60e ("gpio: bcm281xx: Add GPIO driver")
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Markus Mayer <mmayer@broadcom.com>
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
drivers/gpio/gpio-bcm-kona.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c
index 17f3f210fee9dbb5da3b26e1f86bf8f68089b1cd..64908f1a5e7f9b059a20217714c91ce9aab0c640 100644
--- a/drivers/gpio/gpio-bcm-kona.c
+++ b/drivers/gpio/gpio-bcm-kona.c
@@ -659,7 +659,7 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)
bank->irq = platform_get_irq(pdev, i);
bank->kona_gpio = kona_gpio;
if (bank->irq < 0) {
- dev_err(dev, "Couldn't get IRQ for bank %d", i);
+ dev_err(dev, "Couldn't get IRQ for bank %d\n", i);
ret = -ENOENT;
goto err_irq_domain;
}
--
2.48.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups
2025-02-06 17:45 [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups Artur Weber
` (2 preceding siblings ...)
2025-02-06 17:46 ` [PATCH v2 3/3] gpio: bcm-kona: Add missing newline to dev_err format string Artur Weber
@ 2025-02-06 18:13 ` Linus Walleij
2025-02-11 8:47 ` Bartosz Golaszewski
4 siblings, 0 replies; 6+ messages in thread
From: Linus Walleij @ 2025-02-06 18:13 UTC (permalink / raw)
To: Artur Weber
Cc: Ray Jui, Broadcom internal kernel review list,
Bartosz Golaszewski, Florian Fainelli, Scott Branden,
Markus Mayer, linux-gpio, linux-kernel,
~postmarketos/upstreaming
On Thu, Feb 6, 2025 at 6:46 PM Artur Weber <aweber.kernel@gmail.com> wrote:
> Fixes two issues that were preventing GPIO from working correctly:
>
> - Lock/unlock functions tried to write the wrong bit to the unlock
> registers for GPIOs with numbers larger than 32
>
> - GPIOs only initialized as IRQs did not unlock the configuration
> registers, causing IRQ-related configuration (e.g. setting the IRQ
> type) to fail.
>
> Also includes a minor fix to add a missing newline to an error message.
>
> Tested on a Samsung Galaxy Grand Neo (baffinlite rev02) with a BCM23550
> (DTS not yet in mainline).
>
> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups
2025-02-06 17:45 [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups Artur Weber
` (3 preceding siblings ...)
2025-02-06 18:13 ` [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups Linus Walleij
@ 2025-02-11 8:47 ` Bartosz Golaszewski
4 siblings, 0 replies; 6+ messages in thread
From: Bartosz Golaszewski @ 2025-02-11 8:47 UTC (permalink / raw)
To: Ray Jui, Broadcom internal kernel review list, Linus Walleij,
Bartosz Golaszewski, Florian Fainelli, Scott Branden,
Markus Mayer, Artur Weber
Cc: Bartosz Golaszewski, linux-gpio, linux-kernel, ~postmarketos/upstreaming
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
On Thu, 06 Feb 2025 18:45:59 +0100, Artur Weber wrote:
> Fixes two issues that were preventing GPIO from working correctly:
>
> - Lock/unlock functions tried to write the wrong bit to the unlock
> registers for GPIOs with numbers larger than 32
>
> - GPIOs only initialized as IRQs did not unlock the configuration
> registers, causing IRQ-related configuration (e.g. setting the IRQ
> type) to fail.
>
> [...]
Applied, thanks!
[1/3] gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0
commit: de1d0d160f64ee76df1d364d521b2faf465a091c
[2/3] gpio: bcm-kona: Make sure GPIO bits are unlocked when requesting IRQ
commit: 57f5db77a915cc29461a679a6bcae7097967be1a
[3/3] gpio: bcm-kona: Add missing newline to dev_err format string
commit: 615279db222c3ac56d5c93716efd72b843295c1f
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-02-11 8:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-02-06 17:45 [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups Artur Weber
2025-02-06 17:46 ` [PATCH v2 1/3] gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0 Artur Weber
2025-02-06 17:46 ` [PATCH v2 2/3] gpio: bcm-kona: Make sure GPIO bits are unlocked when requesting IRQ Artur Weber
2025-02-06 17:46 ` [PATCH v2 3/3] gpio: bcm-kona: Add missing newline to dev_err format string Artur Weber
2025-02-06 18:13 ` [PATCH v2 0/3] gpio: bcm-kona: Various GPIO fixups Linus Walleij
2025-02-11 8:47 ` Bartosz Golaszewski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®