diff options
author | Tomasz Figa <t.figa@samsung.com> | 2014-08-09 01:48:05 +0200 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2014-08-21 07:24:29 -0500 |
commit | f6a8249f9e55d45a47777d2a3cc69defa23c87bb (patch) | |
tree | fe98f6b10bd5d6a0f6401dca9b098b6e87005b15 /mm/rmap.c | |
parent | 4b6fe45a79a9ca2429eaf8713be7bdc936c211c3 (diff) | |
download | linux-f6a8249f9e55d45a47777d2a3cc69defa23c87bb.tar.bz2 |
pinctrl: exynos: Lock GPIOs as interrupts when used as EINTs
Currently after configuring a GPIO pin as an interrupt related pinmux
registers are changed, but there is no protection from calling
gpio_direction_*() in a badly written driver, which would cause the same
pinmux register to be reconfigured for regular input/output and this
disabling interrupt capability of the pin.
This patch addresses this issue by moving pinmux reconfiguration to
.irq_{request,release}_resources() callback of irq_chip and calling
gpio_lock_as_irq() helper to prevent reconfiguration of pin direction.
Setting up a GPIO interrupt on Samsung SoCs is a two-step operation -
in addition to trigger configuration in a dedicated register, the pinmux
must be also reconfigured to GPIO interrupt, which is a different function
than normal GPIO input, although I/O-wise they both behave in the same way
and gpio_get_value() can be used on a pin configured as IRQ as well.
Such design implies subtleties such as gpio_direction_input() not having
to fail if a pin is already configured as an interrupt nor change the
configuration to normal input. But the FLAG_USED_AS_IRQ set in gpiolib by
gpio_lock_as_irq() is only used to check that gpio_direction_output() is
not called, it's not used to prevent gpio_direction_input() to be called.
So this is not a complete solution for Samsung SoCs but it's definitely a
move in the right direction.
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
[javier: use request resources instead of startup and expand commit message]
Signed-off-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'mm/rmap.c')
0 files changed, 0 insertions, 0 deletions