Sunxi GPIO IRQ handling
Hi Linus,
I have a question for you about how the sunxi support for IRQ on GPIOs.
The IP found on these chip is rather unusual, in the sense that not all the pins handled by it can trigger an interrupt, but only a small set of those (32 on the A10, 23 on the A13).
All these pins are not in the same bank, and have to be muxed to a given function (that is different of the GPIO input function).
You can find more details about this in the IP datasheet found at
http://www.henriknordstrom.net/code/A10/A10%20PIO%20Controller.pdf
I'm not exactly sure about how to integrate this into the pinctrl/gpio/irqchip infrastructure, if that is achievable.
Do you have any idea on how we could do this?
Thanks,
Maxime
Signature · 4 lines
Maxime Ripard, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
Quoted 3 lines · Maxime Ripard
The IP found on these chip is rather unusual, in the sense that not all the pins handled by it can trigger an interrupt, but only a small set of those (32 on the A10, 23 on the A13).
That's not all that uncommon. The ABx00's have a similar restriction (but even weirder).
Quoted 2 lines
All these pins are not in the same bank, and have to be muxed to a given function (that is different of the GPIO input function).
Not quite following? Is the pin not in something called GPIO mode when used for IRQ?
Quoted 2 lines
You can find more details about this in the IP datasheet found at
http://www.henriknordstrom.net/code/A10/A10%20PIO%20Controller.pdf
Hm doesn't seem to be there? I get 404.
Quoted 4 lines
I'm not exactly sure about how to integrate this into the pinctrl/gpio/irqchip infrastructure, if that is achievable.
Do you have any idea on how we could do this?
In your gpio_to_irq() function, just return -EINVAL if the GPIO line does not support generating IRQs.
Check what we do in abx500_gpio_to_irq() indrivers/pinctrl/pinctrl-abx500.c for example.
In your struct irqchip callbacks, set up any muxing needed. If this does not need to be exposed to the outside through the pinctrl muxing API with groups and stuff, don't do it. However if you need to set up muxing as part of enabling IRQ on a certain pin, do that in your .irq_unmask() or similar callback. (But I think that sounds strange.)
Yours,
Linus Walleij