]> git.karo-electronics.de Git - linux-beck.git/blobdiff - drivers/gpio/gpiolib.c
Merge branch 'gpio-irq-validmask' of /home/linus/linux-pinctrl into devel
[linux-beck.git] / drivers / gpio / gpiolib.c
index 23be4daefeed7404ed6abe0cb6f80b426f165628..19a665f8d455f36114d683ea264ecf8ec43ff4e7 100644 (file)
@@ -1370,19 +1370,15 @@ struct gpio_chip *gpiochip_find(void *data,
                                             void *data))
 {
        struct gpio_device *gdev;
-       struct gpio_chip *chip;
+       struct gpio_chip *chip = NULL;
        unsigned long flags;
 
        spin_lock_irqsave(&gpio_lock, flags);
        list_for_each_entry(gdev, &gpio_devices, list)
-               if (gdev->chip && match(gdev->chip, data))
+               if (gdev->chip && match(gdev->chip, data)) {
+                       chip = gdev->chip;
                        break;
-
-       /* No match? */
-       if (&gdev->list == &gpio_devices)
-               chip = NULL;
-       else
-               chip = gdev->chip;
+               }
 
        spin_unlock_irqrestore(&gpio_lock, flags);
 
@@ -1667,6 +1663,20 @@ int _gpiochip_irqchip_add(struct gpio_chip *gpiochip,
        if (gpiochip->of_node)
                of_node = gpiochip->of_node;
 #endif
+       /*
+        * Specifying a default trigger is a terrible idea if DT or ACPI is
+        * used to configure the interrupts, as you may end-up with
+        * conflicting triggers. Tell the user, and reset to NONE.
+        */
+       if (WARN(of_node && type != IRQ_TYPE_NONE,
+                "%s: Ignoring %d default trigger\n", of_node->full_name, type))
+               type = IRQ_TYPE_NONE;
+       if (has_acpi_companion(gpiochip->parent) && type != IRQ_TYPE_NONE) {
+               acpi_handle_warn(ACPI_HANDLE(gpiochip->parent),
+                                "Ignoring %d default trigger\n", type);
+               type = IRQ_TYPE_NONE;
+       }
+
        gpiochip->irqchip = irqchip;
        gpiochip->irq_handler = handler;
        gpiochip->irq_default_type = type;