irq: irqdomain: Add API to find free irq range

When registering irq chip drivers, one common requirement is to
specify the irq_domain irq_base and nr_irq. These fields represent
the system wide logical interrupt range the domain occupies.
For systems with only one interrupt controller, it's trivial to
know these values. But for systems with several irq chip drivers,
it becomes painful to keep track of interrupt ranges in platform
defines. These create needless compile time dependencies, of
which the Device Tree aims to solve.

irq_alloc_desc() can search for a free irq, but is very
inefficient for determining the availability of large ranges.
Additionally, some irq chip drivers allocate irq descriptors
lazily. For example, portions of the Device Tree may not be parsed
until a particular bus is probed. But of_irq_init() is intended to
be run at init time, and this is a natural time to allocate irq
domains. Thus by the time we allocate our irq descriptors, we already
need to know a range of acceptable irqs to use for the domain.

To solve these problems, let's introduce
irq_domain_find_free_range(), which will return to the caller the
first available irq domain range not used already by the system.
This range can then be specified with irq_domain_add().

Change-Id: I8b0f5d25b173c76b8fc5d4f46b3fe9c6bf5c3c8f
Signed-off-by: Michael Bohan <mbohan@codeaurora.org>
This commit is contained in:
Michael Bohan
2012-01-11 17:53:05 -08:00
parent 33efecf03d
commit cf68d7a3f7
2 changed files with 41 additions and 0 deletions

View File

@@ -95,6 +95,7 @@ extern void irq_domain_register(struct irq_domain *domain);
extern void irq_domain_register_irq(struct irq_domain *domain, int hwirq);
extern void irq_domain_unregister(struct irq_domain *domain);
extern void irq_domain_unregister_irq(struct irq_domain *domain, int hwirq);
extern int irq_domain_find_free_range(unsigned int from, unsigned int cnt);
#endif /* CONFIG_IRQ_DOMAIN */