gpio: dwapb: Remove unneeded has_irq member in struct dwapb_port_property
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 19 May 2020 13:12:33 +0000 (16:12 +0300)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 25 May 2020 09:05:09 +0000 (11:05 +0200)
has_irq member of struct dwapb_port_property is used only in one place,
so, make it local test instead and remove from the structure.
This local test is using memchr_inv() which is quite efficient in comparison
to the original loop and possible little overhead can be neglected.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: Serge Semin <fancer.lancer@gmail.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
Acked-by: Serge Semin <fancer.lancer@gmail.com>
Link: https://lore.kernel.org/r/20200519131233.59032-4-andriy.shevchenko@linux.intel.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-dwapb.c
drivers/mfd/intel_quark_i2c_gpio.c
include/linux/platform_data/gpio-dwapb.h

index d3765672c42b7f9fb778a37cf340f191671c3392..1d8d55bd63aa8118d3cac18922c25d9d1840f365 100644 (file)
@@ -366,6 +366,11 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
        irq_hw_number_t hwirq;
        int err, i;
 
+       if (memchr_inv(pp->irq, 0, sizeof(pp->irq)) == NULL) {
+               dev_warn(gpio->dev, "no IRQ for port%d\n", pp->idx);
+               return;
+       }
+
        gpio->domain = irq_domain_create_linear(fwnode, ngpio,
                                                 &irq_generic_chip_ops, gpio);
        if (!gpio->domain)
@@ -501,7 +506,8 @@ static int dwapb_gpio_add_port(struct dwapb_gpio *gpio,
        if (pp->idx == 0)
                port->gc.set_config = dwapb_gpio_set_config;
 
-       if (pp->has_irq)
+       /* Only port A can provide interrupts in all configurations of the IP */
+       if (pp->idx == 0)
                dwapb_configure_irqs(gpio, port, pp);
 
        err = gpiochip_add_data(&port->gc, port);
@@ -550,13 +556,7 @@ static void dwapb_get_irq(struct device *dev, struct fwnode_handle *fwnode,
                        irq = platform_get_irq_optional(to_platform_device(dev), j);
                if (irq > 0)
                        pp->irq[j] = irq;
-
-               if (pp->irq[j])
-                       pp->has_irq = true;
        }
-
-       if (!pp->has_irq)
-               dev_warn(dev, "no irq for port%d\n", pp->idx);
 }
 
 static struct dwapb_platform_data *dwapb_gpio_get_pdata(struct device *dev)
index 41326b48da557d289b39c19fb34a657704e6804b..84ca7902e1df6fcdf812a7bacc2cb30b9b909ed6 100644 (file)
@@ -216,7 +216,6 @@ static int intel_quark_gpio_setup(struct pci_dev *pdev, struct mfd_cell *cell)
        pdata->properties->ngpio        = INTEL_QUARK_MFD_NGPIO;
        pdata->properties->gpio_base    = INTEL_QUARK_MFD_GPIO_BASE;
        pdata->properties->irq[0]       = pdev->irq;
-       pdata->properties->has_irq      = true;
        pdata->properties->irq_shared   = true;
 
        cell->platform_data = pdata;
index 3c606c450d0596b35a47abd62d4f9fe8e5d9a501..ff1be737bad6aa85f8a8b215c8afb889f40f0b45 100644 (file)
@@ -12,7 +12,6 @@ struct dwapb_port_property {
        unsigned int    ngpio;
        unsigned int    gpio_base;
        int             irq[32];
-       bool            has_irq;
        bool            irq_shared;
 };