Hi Thierry! thanks a lot for the patch! This is really in the right direction of how I want things to go with hierarchical IRQs. Some comments: On Thu, Nov 29, 2018 at 6:03 PM Thierry Reding <thierry.reding@xxxxxxxxx> wrote: > config GPIOLIB_IRQCHIP > - select IRQ_DOMAIN > + select IRQ_DOMAIN_HIERARCHY I understand that IRQ_DOMAIN_HIERARCHY implies IRQ_DOMAIN but I kind of like if we anyway select both (unless Kconfig dislikes it). Otherwise it looks like we're just using hierarchies. > static int gpiochip_to_irq(struct gpio_chip *chip, unsigned offset) > { > + struct irq_domain *domain = chip->irq.domain; > + > if (!gpiochip_irqchip_irq_valid(chip, offset)) > return -ENXIO; > > + if (irq_domain_is_hierarchy(domain)) { > + struct irq_fwspec spec; > + > + spec.fwnode = domain->fwnode; > + spec.param_count = 2; > + spec.param[0] = offset; > + spec.param[1] = 0; > + > + return irq_domain_alloc_irqs(domain, 1, NUMA_NO_NODE, &spec); > + } > + > return irq_create_mapping(chip->irq.domain, offset); > } This is really nice. > - gpiochip->to_irq = gpiochip_to_irq; > + /* > + * Allow GPIO chips to override the ->to_irq() if they really need to. > + * This should only be very rarely needed, the majority should be fine > + * with gpiochip_to_irq(). > + */ > + if (!gpiochip->to_irq) > + gpiochip->to_irq = gpiochip_to_irq; And I see this is what your driver does, which leaves the default domain hierarchy callback path unused. It's better if you indirect the pointer like we do with some other irqchip stuff (see Hans Verkuils patches), i.e. if ->to_irq is defined, we save that function pointer and call that at the end of the gpiochip_to_irq() pointer, then we override it with our own. Since the Tegra186 clearly .to_irq() clearly is mostly the same plus some extra, this should work fine and give lesser lines of code in that driver. Apart from that I am a big fan of this patch! Yours, Linus Walleij