diff options
author | Rob Herring <robherring2@gmail.com> | 2011-09-14 11:31:37 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2011-09-20 12:16:22 +0200 |
commit | eef24afb28561a5a9f4be8f8da97735b7e6a826f (patch) | |
tree | 0014317465c4aac43d40fe0cc7f1b269a5a5b95d /kernel | |
parent | 5bd078dda4d4fbdb4bd138a6bd5b6e274c019ed2 (diff) | |
download | blackbird-op-linux-eef24afb28561a5a9f4be8f8da97735b7e6a826f.tar.gz blackbird-op-linux-eef24afb28561a5a9f4be8f8da97735b7e6a826f.zip |
irq: Fix check for already initialized irq_domain in irq_domain_add
The sanity check in irq_domain_add() tests desc->irq_data != NULL or
irq_data->domain != NULL. This prevents adding an irq_domain to a irq
descriptor when irq_data exists, which true when the irq descriptor
exists.
This went unnoticed so far as the simple domain code did not enter
this code path because domain->nr_irqs is always 0 for the simple domains.
Split the check for irq_data == NULL out and have a separate warning
for it.
[ tglx: Made the check for irq_data == NULL separate ]
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Cc: Grant Likely <grant.likely@secretlab.ca>
Cc: marc.zyngier@arm.com
Cc: thomas.abraham@linaro.org
Cc: jamie@jamieiles.com
Cc: b-cousson@ti.com
Cc: shawn.guo@linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: devicetree-discuss@lists.ozlabs.org
Link: http://lkml.kernel.org/r/1316017900-19918-3-git-send-email-robherring2@gmail.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/irq/irqdomain.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index d5828da3fd38..b57a3776de44 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c @@ -29,7 +29,11 @@ void irq_domain_add(struct irq_domain *domain) */ for (hwirq = 0; hwirq < domain->nr_irq; hwirq++) { d = irq_get_irq_data(irq_domain_to_irq(domain, hwirq)); - if (d || d->domain) { + if (!d) { + WARN(1, "error: assigning domain to non existant irq_desc"); + return; + } + if (d->domain) { /* things are broken; just report, don't clean up */ WARN(1, "error: irq_desc already assigned to a domain"); return; |