sc16is7xx: Allow sharing the IRQ line
authorDaniel Mack <daniel@zonque.org>
Thu, 21 May 2020 09:11:51 +0000 (11:11 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 22 May 2020 09:06:14 +0000 (11:06 +0200)
When the interrupt line is shared with other devices, the IRQ must be
level-triggered, as only one device can trigger a falling edge. To support
this, try to acquire the IRQ with IRQF_TRIGGER_LOW|IRQF_SHARED first.

Interrupt controllers that lack support for level-triggers will return an
error, in which case the driver will now retry the acqusition with
IRQF_TRIGGER_FALLING, which was also the default before.

Signed-off-by: Daniel Mack <daniel@zonque.org>
Link: https://lore.kernel.org/r/20200521091152.404404-6-daniel@zonque.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/sc16is7xx.c

index 3908a21..7d98367 100644 (file)
@@ -1293,7 +1293,19 @@ static int sc16is7xx_probe(struct device *dev,
                sc16is7xx_power(&s->p[i].port, 0);
        }
 
-       /* Setup interrupt */
+       /*
+        * Setup interrupt. We first try to acquire the IRQ line as level IRQ.
+        * If that succeeds, we can allow sharing the interrupt as well.
+        * In case the interrupt controller doesn't support that, we fall
+        * back to a non-shared falling-edge trigger.
+        */
+       ret = devm_request_threaded_irq(dev, irq, NULL, sc16is7xx_irq,
+                                       IRQF_TRIGGER_LOW | IRQF_SHARED |
+                                       IRQF_ONESHOT,
+                                       dev_name(dev), s);
+       if (!ret)
+               return 0;
+
        ret = devm_request_threaded_irq(dev, irq, NULL, sc16is7xx_irq,
                                        IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
                                        dev_name(dev), s);