gpiolib: Don't support irq sharing for userspace
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 20 Aug 2018 06:32:53 +0000 (08:32 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 13 Sep 2018 08:58:38 +0000 (10:58 +0200)
commitfa38869b0161484f28a7e1f34535d5825dca6488
tree683f493aecc4c3f4d46f3560ef3f64088b480975
parent0b35cd7b18608d80cd2e78835ee57456b220f364
gpiolib: Don't support irq sharing for userspace

This concerns gpio edge detection for GPIO IRQs used from
userspace for GPIO event listeners.

Trying to work out the right event if it's not sure that the
examined gpio actually moved is impossible.

Consider two gpios "gpioA" and "gpioB" that share an interrupt.
gpioA's irq should trigger on any edge, gpioB's on a falling edge.
If now the common irq fires and both gpio lines are high, there
are several possibilities that could have happend:

 a) gpioA just had a low-to-high edge
 b) gpioB just had a high-to-low-to-high spike
 c) a combination of both a) and b)

While c) is unlikely (in most setups) a) and b) alone are bad
enough. Currently the code assumes case a) unconditionally and
doesn't report an event for gpioB. Note that even if there is no
irq sharing involved a spike for a gpio might not result in an
event if it's configured to trigger for a single edge only.

The only way to improve this is to drop support for interrupt
sharing. This way a spike results in an event for the right gpio
at least. Note that apart from dropping IRQF_SHARED this
effectively undoes commit df1e76f28ffe
("gpiolib: skip unwanted events, don't convert them to opposite edge").

This obviously breaks setups that rely on interrupt sharing,
but given that this cannot be reliable, this is probably an
acceptable trade-off.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
[Assuming there are no users of interrupt sharing yet]
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib.c