Commit ec37529e authored by Doug Berger's avatar Doug Berger Committed by Bartosz Golaszewski

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 using the offset value of the
gpiochip.
Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.com>
Signed-off-by: default avatarDoug Berger <opendmb@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Tested-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20240423184605.2094376-1-opendmb@gmail.comSigned-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent 8a7a6103
...@@ -50,7 +50,6 @@ struct brcmstb_gpio_priv { ...@@ -50,7 +50,6 @@ struct brcmstb_gpio_priv {
struct irq_domain *irq_domain; struct irq_domain *irq_domain;
struct irq_chip irq_chip; struct irq_chip irq_chip;
int parent_irq; int parent_irq;
int gpio_base;
int num_gpios; int num_gpios;
int parent_wake_irq; int parent_wake_irq;
}; };
...@@ -92,7 +91,7 @@ brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank *bank) ...@@ -92,7 +91,7 @@ brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank *bank)
static int brcmstb_gpio_hwirq_to_offset(irq_hw_number_t hwirq, static int brcmstb_gpio_hwirq_to_offset(irq_hw_number_t hwirq,
struct brcmstb_gpio_bank *bank) struct brcmstb_gpio_bank *bank)
{ {
return hwirq - (bank->gc.base - bank->parent_priv->gpio_base); return hwirq - bank->gc.offset;
} }
static void brcmstb_gpio_set_imask(struct brcmstb_gpio_bank *bank, static void brcmstb_gpio_set_imask(struct brcmstb_gpio_bank *bank,
...@@ -118,7 +117,7 @@ static int brcmstb_gpio_to_irq(struct gpio_chip *gc, unsigned offset) ...@@ -118,7 +117,7 @@ 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_priv *priv = brcmstb_gpio_gc_to_priv(gc);
/* gc_offset is relative to this gpio_chip; want real offset */ /* gc_offset is relative to this gpio_chip; want real offset */
int hwirq = offset + (gc->base - priv->gpio_base); int hwirq = offset + gc->offset;
if (hwirq >= priv->num_gpios) if (hwirq >= priv->num_gpios)
return -ENXIO; return -ENXIO;
...@@ -263,7 +262,7 @@ static void brcmstb_gpio_irq_bank_handler(struct brcmstb_gpio_bank *bank) ...@@ -263,7 +262,7 @@ static void brcmstb_gpio_irq_bank_handler(struct brcmstb_gpio_bank *bank)
{ {
struct brcmstb_gpio_priv *priv = bank->parent_priv; struct brcmstb_gpio_priv *priv = bank->parent_priv;
struct irq_domain *domain = priv->irq_domain; struct irq_domain *domain = priv->irq_domain;
int hwbase = bank->gc.base - priv->gpio_base; int hwbase = bank->gc.offset;
unsigned long status; unsigned long status;
while ((status = brcmstb_gpio_get_active_irqs(bank))) { while ((status = brcmstb_gpio_get_active_irqs(bank))) {
...@@ -412,7 +411,7 @@ static int brcmstb_gpio_of_xlate(struct gpio_chip *gc, ...@@ -412,7 +411,7 @@ static int brcmstb_gpio_of_xlate(struct gpio_chip *gc,
if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells)) if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
return -EINVAL; return -EINVAL;
offset = gpiospec->args[0] - (gc->base - priv->gpio_base); offset = gpiospec->args[0] - bank->gc.offset;
if (offset >= gc->ngpio || offset < 0) if (offset >= gc->ngpio || offset < 0)
return -EINVAL; return -EINVAL;
...@@ -596,8 +595,8 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) ...@@ -596,8 +595,8 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
const __be32 *p; const __be32 *p;
u32 bank_width; u32 bank_width;
int num_banks = 0; int num_banks = 0;
int num_gpios = 0;
int err; int err;
static int gpio_base;
unsigned long flags = 0; unsigned long flags = 0;
bool need_wakeup_event = false; bool need_wakeup_event = false;
...@@ -611,7 +610,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) ...@@ -611,7 +610,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
if (IS_ERR(reg_base)) if (IS_ERR(reg_base))
return PTR_ERR(reg_base); return PTR_ERR(reg_base);
priv->gpio_base = gpio_base;
priv->reg_base = reg_base; priv->reg_base = reg_base;
priv->pdev = pdev; priv->pdev = pdev;
...@@ -651,7 +649,7 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) ...@@ -651,7 +649,7 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
dev_dbg(dev, "Width 0 found: Empty bank @ %d\n", dev_dbg(dev, "Width 0 found: Empty bank @ %d\n",
num_banks); num_banks);
num_banks++; num_banks++;
gpio_base += MAX_GPIO_PER_BANK; num_gpios += MAX_GPIO_PER_BANK;
continue; continue;
} }
...@@ -691,7 +689,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) ...@@ -691,7 +689,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
err = -ENOMEM; err = -ENOMEM;
goto fail; goto fail;
} }
gc->base = gpio_base;
gc->of_gpio_n_cells = 2; gc->of_gpio_n_cells = 2;
gc->of_xlate = brcmstb_gpio_of_xlate; gc->of_xlate = brcmstb_gpio_of_xlate;
/* not all ngpio lines are valid, will use bank width later */ /* not all ngpio lines are valid, will use bank width later */
...@@ -713,7 +710,7 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) ...@@ -713,7 +710,7 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
bank->id); bank->id);
goto fail; goto fail;
} }
gpio_base += gc->ngpio; num_gpios += gc->ngpio;
dev_dbg(dev, "bank=%d, base=%d, ngpio=%d, width=%d\n", bank->id, dev_dbg(dev, "bank=%d, base=%d, ngpio=%d, width=%d\n", bank->id,
gc->base, gc->ngpio, bank->width); gc->base, gc->ngpio, bank->width);
...@@ -724,7 +721,7 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) ...@@ -724,7 +721,7 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
num_banks++; num_banks++;
} }
priv->num_gpios = gpio_base - priv->gpio_base; priv->num_gpios = num_gpios;
if (priv->parent_irq > 0) { if (priv->parent_irq > 0) {
err = brcmstb_gpio_irq_setup(pdev, priv); err = brcmstb_gpio_irq_setup(pdev, priv);
if (err) if (err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment