pinctrl: iproc: Set irq handler based on trig type
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>
This commit is contained in:
Родитель
f4a73f5e26
Коммит
534ad35798
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче