• Uwe Kleine-König's avatar
    gpiolib: Don't support irq sharing for userspace · fa38869b
    Uwe Kleine-König authored
    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 df1e76f2
    ("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: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
    [Assuming there are no users of interrupt sharing yet]
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    fa38869b
gpiolib.c 119 KB