gpio: flush direction status in gpiochip_lock_as_irq()
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 25 May 2016 08:56:03 +0000 (10:56 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 30 May 2016 07:42:03 +0000 (09:42 +0200)
commit9c10280d85c14a20751ab6c1185ad725172936d6
treef72f8ad76edba5852dd72714dfd0bf8a5ac3bd8c
parent320a6480ef24b03655e1854bd01c9b0a8b8d4a3f
gpio: flush direction status in gpiochip_lock_as_irq()

As irqchip and gpiochip functions are orthogonal, the IRQ
set-up or something else can have changed the direction of
the GPIO line from what the GPIO descriptor knows when we
get into gpiochip_lock_as_irq(). Make sure to re-read the
direction setting if we have the .get_direction() callback
enabled for the chip.

Else we get problems like this:

iio iio:device2: interrupts on the rising edge
gpio gpiochip2: (8012e080.gpio): gpiochip_lock_as_irq:
  tried to flag a GPIO set as output for IRQ
gpio gpiochip2: (8012e080.gpio): unable to lock HW IRQ 0 for IRQ
genirq: Failed to request resources for l3g4200d-trigger
  (irq 111) on irqchip nmk1-32-63
iio iio:device2: failed to request trigger IRQ.
st-gyro-i2c: probe of 2-0068 failed with error -22

Fixes: 72d320006177 ("gpio: set up initial state from .get_direction()")
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib.c