On Tue, May 12, 2015 at 9:38 PM, Gregory Fong <[email protected]> wrote: > On Tue, May 12, 2015 at 3:59 AM, Linus Walleij <[email protected]> > wrote: >> On Wed, May 6, 2015 at 10:37 AM, Gregory Fong <[email protected]> wrote: >> >>> There is only one IRQ for each GIO IP block (i.e. several register banks >>> share >>> an IRQ). After briefly looking into the generic IRQ chip implementation, it >>> seemed like in this case that using it would result in the driver being more >>> complex than necessary because AFAICT it expects a 1:1 mapping of >>> irq_chip_generic to gpio_chip. It seemed like less of a pain to have a >>> single >>> irq_chip since we have a single IRQ for all register banks (multiple >>> gpio_chips). I might be missing something, maybe using a shared IRQ across >>> multiple irq_chips is easier than I think? Suggestions welcome. >> >> What is needed is a 1:1 mapping between GPIO offsets and IRQ >> offsets. >> >> If you just number your GPIOs 0...n and your IRQs 0...n >> it should work just fine with one irqchip for all banks. >> >> What screws things up is likely that the hardware supports >> 32 lines per bank and not all are used. >> >> I suggest you enable 32 line and 32 IRQs per bank, >> so that hwirq maps nicely 1:1 on the GPIO offsets, >> then just use the width thing to NACK operations on >> GPIO lines you are not using. This way you can also >> decode and warn on spurious IRQs on the unused lines. > > For having 32 lines per bank, the big problem here is the upper limit > of 256 GPIOs.
Which arch is this? Usually this limit comes from arch/*/include/asm/gpio.h For ARM that was bumped to 512 a while back. It is also possible to define a custom value for your system by defining ARCH_NR_GPIOS > Anyway, I don't think I understand IRQ domains and irq_chip_generic > very well. One possibility _might_ be to use multiple irq_chips. That is probably not possible if there is just one IRQ for all banks. The task of the irqdomain is a 1-to-1 translation from one hardware numberspace to the Linux IRQ number space. In your case the hardware IRQ (hwirq) numberspace should be: bank0: 0..31 bank1: 32..63 .... bankn: 32*n..32*n+31 I think the gpiolib irqchip code can translate that properly as it is just a simple 0...x mapping, the irq handler need some magic to loop over all banks from 0..n though. Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

