diff options
| -rw-r--r-- | arch/powerpc/kernel/irq.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 6cb3fcd7fc37..5b428e308666 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
| @@ -1007,14 +1007,23 @@ void irq_free_virt(unsigned int virq, unsigned int count) | |||
| 1007 | WARN_ON (virq < NUM_ISA_INTERRUPTS); | 1007 | WARN_ON (virq < NUM_ISA_INTERRUPTS); |
| 1008 | WARN_ON (count == 0 || (virq + count) > irq_virq_count); | 1008 | WARN_ON (count == 0 || (virq + count) > irq_virq_count); |
| 1009 | 1009 | ||
| 1010 | if (virq < NUM_ISA_INTERRUPTS) { | ||
| 1011 | if (virq + count < NUM_ISA_INTERRUPTS) | ||
| 1012 | return; | ||
| 1013 | count =- NUM_ISA_INTERRUPTS - virq; | ||
| 1014 | virq = NUM_ISA_INTERRUPTS; | ||
| 1015 | } | ||
| 1016 | |||
| 1017 | if (count > irq_virq_count || virq > irq_virq_count - count) { | ||
| 1018 | if (virq > irq_virq_count) | ||
| 1019 | return; | ||
| 1020 | count = irq_virq_count - virq; | ||
| 1021 | } | ||
| 1022 | |||
| 1010 | raw_spin_lock_irqsave(&irq_big_lock, flags); | 1023 | raw_spin_lock_irqsave(&irq_big_lock, flags); |
| 1011 | for (i = virq; i < (virq + count); i++) { | 1024 | for (i = virq; i < (virq + count); i++) { |
| 1012 | struct irq_host *host; | 1025 | struct irq_host *host; |
| 1013 | 1026 | ||
| 1014 | if (i < NUM_ISA_INTERRUPTS || | ||
| 1015 | (virq + count) > irq_virq_count) | ||
| 1016 | continue; | ||
| 1017 | |||
| 1018 | host = irq_map[i].host; | 1027 | host = irq_map[i].host; |
| 1019 | irq_map[i].hwirq = host->inval_irq; | 1028 | irq_map[i].hwirq = host->inval_irq; |
| 1020 | smp_wmb(); | 1029 | smp_wmb(); |
