kernel: gpio-button-hotplug: Add missing ONESHOT flag to threaded IRQ request
authorJohn Crispin <john@openwrt.org>
Thu, 3 Mar 2016 20:24:47 +0000 (20:24 +0000)
committerJohn Crispin <john@openwrt.org>
Thu, 3 Mar 2016 20:24:47 +0000 (20:24 +0000)
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>
SVN-Revision: 48894

package/kernel/gpio-button-hotplug/Makefile
package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c

index c2fdaecf0fb731700906ee5aa51d90b577ed365d..b9a481ac645018c9b3c9d8213c6efe473db4fb63 100644 (file)
@@ -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
 
index 6d1a197d616b627970b61768531c985f75f0c864..0ebe6c55767e642a77d0e5e78d7e36741d1b8476 100644 (file)
@@ -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);