aboutsummaryrefslogtreecommitdiffstats
path: root/package
diff options
context:
space:
mode:
authorJohn Crispin <blogic@openwrt.org>2016-03-03 20:24:47 +0000
committerJohn Crispin <blogic@openwrt.org>2016-03-03 20:24:47 +0000
commit4ca2717a8a19fb711fdd39804ad84d1c4549e786 (patch)
tree2b4b2c2b3a792bdf3d1510c9664c6787ad3a7dd5 /package
parent34f9f9401c90a94deb3a0ece3cc077bb1a1372e6 (diff)
downloadmaster-187ad058-4ca2717a8a19fb711fdd39804ad84d1c4549e786.tar.gz
master-187ad058-4ca2717a8a19fb711fdd39804ad84d1c4549e786.tar.bz2
master-187ad058-4ca2717a8a19fb711fdd39804ad84d1c4549e786.zip
kernel: gpio-button-hotplug: Add missing ONESHOT flag to threaded IRQ request
Without the IRQF_ONESHOT flag in devm_request_threaded_irq() call I get following error: genirq: Threaded irq requested with handler=NULL and !ONESHOT for irq 56 gpio-keys gpio-keys: failed to request irq:56 for gpio:20 >From kernel/irq/manage.c: The interrupt was requested with handler = NULL, so we use the default primary handler for it. But it does not have the oneshot flag set. In combination with level interrupts this is deadly, because the default primary handler just wakes the thread, then the irq lines is reenabled, but the device still has the level irq asserted. Rinse and repeat.... While this works for edge type interrupts, we play it safe and reject unconditionally because we can't say for sure which type this interrupt really has. The type flags are unreliable as the underlying chip implementation can override them. Signed-off-by: Petr Štetiar <ynezz@true.cz> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@48894 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package')
-rw-r--r--package/kernel/gpio-button-hotplug/Makefile2
-rw-r--r--package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/package/kernel/gpio-button-hotplug/Makefile b/package/kernel/gpio-button-hotplug/Makefile
index c2fdaecf0f..b9a481ac64 100644
--- a/package/kernel/gpio-button-hotplug/Makefile
+++ b/package/kernel/gpio-button-hotplug/Makefile
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=gpio-button-hotplug
-PKG_RELEASE:=1
+PKG_RELEASE:=2
include $(INCLUDE_DIR)/package.mk
diff --git a/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c b/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
index 6d1a197d61..0ebe6c5576 100644
--- a/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
+++ b/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
@@ -563,7 +563,7 @@ static int gpio_keys_probe(struct platform_device *pdev)
}
ret = devm_request_threaded_irq(&pdev->dev, button->irq, NULL, button_handle_irq,
- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
dev_name(&pdev->dev), bdata);
if (ret < 0)
dev_err(&pdev->dev, "failed to request irq:%d for gpio:%d\n", button->irq, button->gpio);