Message ID | 20230719163446.1398961-3-samuel.holland@sifive.com |
---|---|
State | Accepted |
Commit | 1cd9cee75f99cfe31a6e339af518679649812838 |
Headers | show |
Series | gpio: sifive: Module support | expand |
On 2023-07-19 11:48 AM, Andy Shevchenko wrote: > On Wed, Jul 19, 2023 at 09:34:43AM -0700, Samuel Holland wrote: >> of_irq_count(), or eqivalently platform_irq_count(), simply looks up >> successively-numbered IRQs until that fails. Since this driver needs to >> look up each IRQ anyway to get its virq number, use that existing loop >> to count the IRQs at the same time. > > ... > >> - ngpio = of_irq_count(node); >> - if (ngpio > SIFIVE_GPIO_MAX) { >> - dev_err(dev, "Too many GPIO interrupts (max=%d)\n", >> - SIFIVE_GPIO_MAX); >> - return -ENXIO; > > Do we still need this check? I don't think so. I think this check was only intended to prevent overflowing the irq_number array, and that is now handled by the loop condition. >> - } > > ... > >> + for (ngpio = 0; ngpio < SIFIVE_GPIO_MAX; ngpio++) { >> + ret = platform_get_irq_optional(pdev, ngpio); >> if (ret < 0) >> - return ret; >> - chip->irq_number[i] = ret; >> + break; >> + chip->irq_number[ngpio] = ret; >> } > > If so, here we need something like > > ret = platform_get_irq_optional(pdev, ngpio); > if (ret > 0) { > dev_err(dev, "Too many GPIO interrupts (max=%d)\n", > SIFIVE_GPIO_MAX); > return -ENXIO; > } > > Otherwise you need to mention this relaxation in the commit message. OK, I will add something to the commit message in v3.
diff --git a/drivers/gpio/gpio-sifive.c b/drivers/gpio/gpio-sifive.c index ab32c952c61b..6606c919d957 100644 --- a/drivers/gpio/gpio-sifive.c +++ b/drivers/gpio/gpio-sifive.c @@ -185,7 +185,7 @@ static int sifive_gpio_probe(struct platform_device *pdev) struct irq_domain *parent; struct gpio_irq_chip *girq; struct sifive_gpio *chip; - int ret, ngpio, i; + int ret, ngpio; chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); if (!chip) @@ -202,13 +202,6 @@ static int sifive_gpio_probe(struct platform_device *pdev) if (IS_ERR(chip->regs)) return PTR_ERR(chip->regs); - ngpio = of_irq_count(node); - if (ngpio > SIFIVE_GPIO_MAX) { - dev_err(dev, "Too many GPIO interrupts (max=%d)\n", - SIFIVE_GPIO_MAX); - return -ENXIO; - } - irq_parent = of_irq_find_parent(node); if (!irq_parent) { dev_err(dev, "no IRQ parent node\n"); @@ -221,11 +214,11 @@ static int sifive_gpio_probe(struct platform_device *pdev) return -ENODEV; } - for (i = 0; i < ngpio; i++) { - ret = platform_get_irq(pdev, i); + for (ngpio = 0; ngpio < SIFIVE_GPIO_MAX; ngpio++) { + ret = platform_get_irq_optional(pdev, ngpio); if (ret < 0) - return ret; - chip->irq_number[i] = ret; + break; + chip->irq_number[ngpio] = ret; } ret = bgpio_init(&chip->gc, dev, 4,
of_irq_count(), or eqivalently platform_irq_count(), simply looks up successively-numbered IRQs until that fails. Since this driver needs to look up each IRQ anyway to get its virq number, use that existing loop to count the IRQs at the same time. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> --- Changes in v2: - New patch for v2 drivers/gpio/gpio-sifive.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-)