|
@@ -398,17 +398,30 @@ void gpiochip_set_chained_irqchip(struct gpio_chip *gpiochip,
|
|
|
int parent_irq,
|
|
|
irq_flow_handler_t parent_handler)
|
|
|
{
|
|
|
+ unsigned int offset;
|
|
|
+
|
|
|
if (gpiochip->can_sleep) {
|
|
|
chip_err(gpiochip, "you cannot have chained interrupts on a chip that may sleep\n");
|
|
|
return;
|
|
|
}
|
|
|
+ if (!gpiochip->irqdomain) {
|
|
|
+ chip_err(gpiochip, "called %s before setting up irqchip\n",
|
|
|
+ __func__);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
irq_set_chained_handler(parent_irq, parent_handler);
|
|
|
+
|
|
|
/*
|
|
|
* The parent irqchip is already using the chip_data for this
|
|
|
* irqchip, so our callbacks simply use the handler_data.
|
|
|
*/
|
|
|
irq_set_handler_data(parent_irq, gpiochip);
|
|
|
+
|
|
|
+ /* Set the parent IRQ for all affected IRQs */
|
|
|
+ for (offset = 0; offset < gpiochip->ngpio; offset++)
|
|
|
+ irq_set_parent(irq_find_mapping(gpiochip->irqdomain, offset),
|
|
|
+ parent_irq);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiochip_set_chained_irqchip);
|
|
|
|