aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2015-03-08 22:13:57 +0100
committerLinus Walleij <linus.walleij@linaro.org>2015-03-18 10:56:46 +0100
commitef6d24cc7f5b2b5c4184eddb039e2add6231a122 (patch)
treee32481835c8e61ef2dc01c7e1ea797c9c8206c00 /drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c
parentpinctrl: at91: move lock/unlock_as_irq calls into request/release (diff)
downloadlinux-dev-ef6d24cc7f5b2b5c4184eddb039e2add6231a122.tar.xz
linux-dev-ef6d24cc7f5b2b5c4184eddb039e2add6231a122.zip
pinctrl: sun4i: GPIOs configured as irq must be set to input before reading
On sun4i-a10, when GPIOs are configured as external interrupt the value for them in the data register does not seem to get updated, so set their mux to input (and restore afterwards) when reading the pin. Missed edges seem to be buffered, so this does not introduce a race condition. I've also tested this on sun5i-a13 and sun7i-a20 and those do not seem to be affected, the input value representation in the data register does seem to correctly get updated to the actual pin value while in irq mode there. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c')
-rw-r--r--drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c b/drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c
index 24c5d88f943f..3c68a8e5e0dd 100644
--- a/drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c
+++ b/drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c
@@ -1011,6 +1011,7 @@ static const struct sunxi_pinctrl_desc sun4i_a10_pinctrl_data = {
.pins = sun4i_a10_pins,
.npins = ARRAY_SIZE(sun4i_a10_pins),
.irq_banks = 1,
+ .irq_read_needs_mux = true,
};
static int sun4i_a10_pinctrl_probe(struct platform_device *pdev)