sc16is7xx: Allow sharing the IRQ line
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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6393ff1c44
commit
2d12fc792c
@ -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);
|
||||
|
Reference in New Issue
Block a user