summaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-6.1/950-1017-gpio-brcmstb-Use-dynamic-GPIO-base-numbers.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-6.1/950-1017-gpio-brcmstb-Use-dynamic-GPIO-base-numbers.patch')
-rw-r--r--target/linux/bcm27xx/patches-6.1/950-1017-gpio-brcmstb-Use-dynamic-GPIO-base-numbers.patch117
1 files changed, 117 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-6.1/950-1017-gpio-brcmstb-Use-dynamic-GPIO-base-numbers.patch b/target/linux/bcm27xx/patches-6.1/950-1017-gpio-brcmstb-Use-dynamic-GPIO-base-numbers.patch
new file mode 100644
index 0000000000..9bf9e6d96d
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1017-gpio-brcmstb-Use-dynamic-GPIO-base-numbers.patch
@@ -0,0 +1,117 @@
+From 450d617786926b27c25e930241efbd2e37d66bb8 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.com>
+Date: Fri, 6 Oct 2023 16:30:35 +0100
+Subject: [PATCH] gpio: brcmstb: Use dynamic GPIO base numbers
+
+Forcing a gpiochip to have a fixed base number now leads to a warning
+message. Remove the need to do so by calculating hwirq numbers based
+on bank numbers.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.com>
+Fixes: 3b0213d56eb7 ("gpio: Add GPIO support for Broadcom STB SoCs")
+---
+ drivers/gpio/gpio-brcmstb.c | 21 ++++++++++-----------
+ 1 file changed, 10 insertions(+), 11 deletions(-)
+
+--- a/drivers/gpio/gpio-brcmstb.c
++++ b/drivers/gpio/gpio-brcmstb.c
+@@ -50,7 +50,6 @@ struct brcmstb_gpio_priv {
+ struct irq_domain *irq_domain;
+ struct irq_chip irq_chip;
+ int parent_irq;
+- int gpio_base;
+ int num_gpios;
+ int parent_wake_irq;
+ };
+@@ -92,7 +91,7 @@ brcmstb_gpio_get_active_irqs(struct brcm
+ static int brcmstb_gpio_hwirq_to_offset(irq_hw_number_t hwirq,
+ struct brcmstb_gpio_bank *bank)
+ {
+- return hwirq - (bank->gc.base - bank->parent_priv->gpio_base);
++ return hwirq - bank->id * 32;
+ }
+
+ static void brcmstb_gpio_set_imask(struct brcmstb_gpio_bank *bank,
+@@ -117,8 +116,9 @@ static void brcmstb_gpio_set_imask(struc
+ static int brcmstb_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
+ {
+ struct brcmstb_gpio_priv *priv = brcmstb_gpio_gc_to_priv(gc);
++ struct brcmstb_gpio_bank *bank = gpiochip_get_data(gc);
+ /* gc_offset is relative to this gpio_chip; want real offset */
+- int hwirq = offset + (gc->base - priv->gpio_base);
++ int hwirq = offset + bank->id * 32;
+
+ if (hwirq >= priv->num_gpios)
+ return -ENXIO;
+@@ -263,7 +263,7 @@ static void brcmstb_gpio_irq_bank_handle
+ {
+ struct brcmstb_gpio_priv *priv = bank->parent_priv;
+ struct irq_domain *domain = priv->irq_domain;
+- int hwbase = bank->gc.base - priv->gpio_base;
++ int hwbase = bank->id * 32;
+ unsigned long status;
+
+ while ((status = brcmstb_gpio_get_active_irqs(bank))) {
+@@ -414,7 +414,7 @@ static int brcmstb_gpio_of_xlate(struct
+ if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
+ return -EINVAL;
+
+- offset = gpiospec->args[0] - (gc->base - priv->gpio_base);
++ offset = gpiospec->args[0] - bank->id * 32;
+ if (offset >= gc->ngpio || offset < 0)
+ return -EINVAL;
+
+@@ -598,8 +598,8 @@ static int brcmstb_gpio_probe(struct pla
+ const __be32 *p;
+ u32 bank_width;
+ int num_banks = 0;
++ int num_gpios = 0;
+ int err;
+- static int gpio_base;
+ unsigned long flags = 0;
+ bool need_wakeup_event = false;
+
+@@ -614,7 +614,6 @@ static int brcmstb_gpio_probe(struct pla
+ if (IS_ERR(reg_base))
+ return PTR_ERR(reg_base);
+
+- priv->gpio_base = gpio_base;
+ priv->reg_base = reg_base;
+ priv->pdev = pdev;
+
+@@ -656,7 +655,7 @@ static int brcmstb_gpio_probe(struct pla
+ dev_dbg(dev, "Width 0 found: Empty bank @ %d\n",
+ num_banks);
+ num_banks++;
+- gpio_base += MAX_GPIO_PER_BANK;
++ num_gpios += MAX_GPIO_PER_BANK;
+ continue;
+ }
+
+@@ -698,7 +697,7 @@ static int brcmstb_gpio_probe(struct pla
+ err = -ENOMEM;
+ goto fail;
+ }
+- gc->base = gpio_base;
++ gc->base = -1;
+ gc->of_gpio_n_cells = 2;
+ gc->of_xlate = brcmstb_gpio_of_xlate;
+ /* not all ngpio lines are valid, will use bank width later */
+@@ -722,7 +721,7 @@ static int brcmstb_gpio_probe(struct pla
+ bank->id);
+ goto fail;
+ }
+- gpio_base += gc->ngpio;
++ num_gpios += gc->ngpio;
+
+ dev_dbg(dev, "bank=%d, base=%d, ngpio=%d, width=%d\n", bank->id,
+ gc->base, gc->ngpio, bank->width);
+@@ -733,7 +732,7 @@ static int brcmstb_gpio_probe(struct pla
+ num_banks++;
+ }
+
+- priv->num_gpios = gpio_base - priv->gpio_base;
++ priv->num_gpios = num_gpios;
+ if (priv->parent_irq > 0) {
+ err = brcmstb_gpio_irq_setup(pdev, priv);
+ if (err)