Thread (5 messages) 5 messages, 4 authors, 2018-05-09

Re: [PATCH v5] gpio: dwapb: Add support for 1 interrupt per port A GPIO

From: Andy Shevchenko <hidden>
Date: 2018-05-05 10:49:04
Also in: linux-gpio, linux-renesas-soc, lkml

On Thu, Apr 26, 2018 at 7:19 PM, Phil Edworthy
[off-list ref] wrote:

Sotty fo a late response. Consider follow up fixes for below.
        if (!pp->irq_shared) {
+               int i;
+
+               for (i = 0; i < pp->ngpio; i++) {
+                       if (pp->irq[i])
+                               irq_set_chained_handler_and_data(pp->irq[i],
+                                               dwapb_irq_handler, gpio);
+               }
        } else {
                /*
                 * Request a shared IRQ since where MFD would have devices
                 * using the same irq pin
                 */
+               err = devm_request_irq(gpio->dev, pp->irq[0],
                                       dwapb_irq_handler_mfd,
                                       IRQF_SHARED, "gpio-dwapb-mfd", gpio);
+       if (pp->has_irq)
                dwapb_configure_irqs(gpio, port, pp);
I would rather make irq array a type of signed int and move
conditional into the function to test per IRQ based.
        /* Add GPIO-signaled ACPI event support */
+       if (pp->has_irq)
                acpi_gpiochip_request_interrupts(&port->gc);
Perhaps something similar.
                if (dev->of_node && pp->idx == 0 &&
                        fwnode_property_read_bool(fwnode,
                                                  "interrupt-controller")) {
+                       struct device_node *np = to_of_node(fwnode);
+                       unsigned int j;
+
+                       /*
+                        * The IP has configuration options to allow a single
+                        * combined interrupt or one per gpio. If one per gpio,
+                        * some might not be used.
+                        */
+                       for (j = 0; j < pp->ngpio; j++) {
+                               int irq = of_irq_get(np, j);
+                               if (irq < 0)
+                                       continue;
+
+                               pp->irq[j] = irq;
+                               pp->has_irq = true;
+                       }
for (...)
 pp->irq = of_irq_get();
                }
+               if (has_acpi_companion(dev) && pp->idx == 0) {
+                       unsigned int j;
+
+                       for (j = 0; j < pp->ngpio; j++) {
+                               pp->irq[j] = platform_get_irq(to_platform_device(dev), j);
+                               if (pp->irq[j])
+                                       pp->has_irq = true;
+                       }
Ditto.
Moreover you have a bug here. See my proposal at the top of this message.

And now even better to ask, why platform_get_irq() wouldn't work for DT case?
+
+                       if (!pp->has_irq)
                                dev_warn(dev, "no irq for port%d\n", pp->idx);
This could be issued in the actual function which will try to allocate
IRQs (perhaps on debug level)


P.S. Just think about it, perhaps you find even better solutions.

-- 
With Best Regards,
Andy Shevchenko
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help