--- linux-2.6.31.10/arch/powerpc/sysdev/mtvic.c 1970-01-01 03:00:00.000000000 +0300 +++ linux-2.6.31.10.new/arch/powerpc/sysdev/mtvic.c 2010-04-12 15:54:46.000000000 +0300 @@ -0,0 +1,73 @@ +#include +#include +#include +#include + +struct irq_host *virq_host; +EXPORT_SYMBOL(virq_host); + +unsigned get_virq_nr(unsigned hwirq) +{ + return irq_create_mapping(virq_host, hwirq); +} +EXPORT_SYMBOL(get_virq_nr); + +void mtvic_mask_irq(unsigned int irq) +{ +} + +void mtvic_unmask_irq(unsigned int irq) +{ +} + +static struct irq_chip softirq_chip = { + .mask = mtvic_mask_irq, + .unmask = mtvic_unmask_irq, +}; + +static int mtvic_map(struct irq_host *h, unsigned int virq, irq_hw_number_t hw) +{ + set_irq_chip_and_handler(virq, &softirq_chip, handle_simple_irq); + return 0; +} + +static struct irq_host_ops mtvic_ops = { + .map = mtvic_map, +}; + +void __init mtvic_init(int def) +{ + static unsigned virqs; + + virq_host = irq_alloc_host(NULL, IRQ_HOST_MAP_LINEAR, 32, + &mtvic_ops, 32); + virq_host->host_data = &virqs; + + if (def) + irq_set_default_host(virq_host); +} + +unsigned mtvic_get_irq(void) +{ + static unsigned i = 0; + unsigned *irqs = virq_host->host_data; + + if (!irqs) + return NO_IRQ; + + for (i = (i + 1) & 31; *irqs; i = (i + 1) & 31) { + if (*irqs & (1 << i)) { + atomic_sub(1 << i, (atomic_t *) irqs); + return irq_linear_revmap(virq_host, i); + } + } + return NO_IRQ; +} + +unsigned rb_get_irq(void) +{ + unsigned irq = mtvic_get_irq(); + if (irq != NO_IRQ) return irq; + + return mpic_get_irq(); +}