pinctrl: iproc: Set irq handler based on trig type
authorHamish Martin <hamish.martin@alliedtelesis.co.nz>
Sun, 15 Dec 2019 21:05:03 +0000 (10:05 +1300)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 16 Dec 2019 09:43:26 +0000 (10:43 +0100)
Rather than always using handle_simple_irq() as the gpio_irq_chip
handler, set a more appropriate handler based on the IRQ trigger type
requested.
This is important for level triggered interrupts which need to be
masked during handling.

Signed-off-by: Hamish Martin <hamish.martin@alliedtelesis.co.nz>
Link: https://lore.kernel.org/r/20191215210503.15488-2-hamish.martin@alliedtelesis.co.nz
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/bcm/pinctrl-iproc-gpio.c

index 831a9318c3845ef586334dfbee093ac373d95c71..aa9b5ba1bf381d624e06933031c44eb7597098b3 100644 (file)
@@ -286,6 +286,12 @@ static int iproc_gpio_irq_set_type(struct irq_data *d, unsigned int type)
        iproc_set_bit(chip, IPROC_GPIO_INT_DE_OFFSET, gpio, dual_edge);
        iproc_set_bit(chip, IPROC_GPIO_INT_EDGE_OFFSET, gpio,
                       rising_or_high);
+
+       if (type & IRQ_TYPE_EDGE_BOTH)
+               irq_set_handler_locked(d, handle_edge_irq);
+       else
+               irq_set_handler_locked(d, handle_level_irq);
+
        raw_spin_unlock_irqrestore(&chip->lock, flags);
 
        dev_dbg(chip->dev,
@@ -868,7 +874,7 @@ static int iproc_gpio_probe(struct platform_device *pdev)
                        return -ENOMEM;
                girq->parents[0] = irq;
                girq->default_type = IRQ_TYPE_NONE;
-               girq->handler = handle_simple_irq;
+               girq->handler = handle_bad_irq;
        }
 
        ret = gpiochip_add_data(gc, chip);