From: David Daney <email@example.com>
Back in early Nov. I send the first version of this patch set. Now
things are heating up again in the world of irq_domain, so I wanted to
try to get some closure on the issues I had. The Octeon patch is
included here to show how I am using irq_domain, but is part of a much
larger effort to merge Octeon device tree support.
The basic problem I am attempting to solve is using irq domains when
there is a 'non-linear' mapping of hwirq <--> irq within a domain.
Octeon has a single set of irq numbers that is used across two
different implementations of the interrupt controller as well as more
than 10 different SOCs all which use different subsets of the irq
number space. The result is that the hwirq to irq mapping function
contains many gaps and discontinuities, it is really quite random.
The existing irq domain infrastructure assumes a continuous linear
mapping of hwirq to irq that can be encapsulated by the irq_base,
hwirq_base and nr_irq elements of struct irq_domain. This is not
suitable for the Octeon implementation.
The gist of my change is to add an optional iterator function to
irq_domain_ops which knows how to iterate over the irq numbers in a
given domain. For simple linear domains (those currently supported),
we iterate using the current method based on irq_base, hwirq_base and
Summary of the patches:
1) Get rid of some unused code to make subsequent changes simpler.
2) Cleanup the data type used by various hwirq functions and users.
3) Add the irq iterator, and fix up the ARM GIC code to use it instead
of the current irq_domain_for_each_irq().
4) Add the Octeon users of the interface.
In an earlier exchange, Rob Herring had said:
... Handling sparse irqs is a potentially common problem, so we
should address that in the core irqdomain code.
Which is what this patch set is doing.
There was a suggestion that perhaps having .to_irq() return a magic
value if there was no mapping would also work. However I prefer this
approach as it separates the concepts of iteration and mapping of irq
David Daney (4):
irq: Get rid of irq_domain_for_each_hwirq().
irq/of/ARM: Make irq_domain hwirq type consistent throughout the
irq/of/ARM: Enhance irq iteration capability of irq_domain code.
MIPS: Octeon: Add irq_create_of_mapping() and GPIO interrupts.
arch/arm/common/gic.c | 34 +++--
arch/mips/Kconfig | 1 +
arch/mips/cavium-octeon/octeon-irq.c | 259 +++++++++++++++++++++++++++++++++-
include/linux/irqdomain.h | 23 ++--
kernel/irq/irqdomain.c | 88 ++++++++----
5 files changed, 354 insertions(+), 51 deletions(-)