struct irq_desc *desc;
        int irq;
 
-       for (irq = 0; irq < nr_irqs; irq++) {
-               desc = irq_to_desc_alloc_node(irq, 0);
+       for (irq = 0; irq < nr_irqs; irq++)
                desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE;
-       }
 
        init_arch_irq();
 }
 int __init arch_probe_nr_irqs(void)
 {
        nr_irqs = arch_nr_irqs ? arch_nr_irqs : NR_IRQS;
-       return 0;
+       return nr_irqs;
 }
 #endif
 
 
 
 int __init early_irq_init(void)
 {
-       int i, node = first_online_node;
+       int i, initcnt, node = first_online_node;
        struct irq_desc *desc;
 
        init_irq_default_affinity();
 
-        /* initialize nr_irqs based on nr_cpu_ids */
-       arch_probe_nr_irqs();
-       printk(KERN_INFO "NR_IRQS:%d nr_irqs:%d\n", NR_IRQS, nr_irqs);
+       /* Let arch update nr_irqs and return the nr of preallocated irqs */
+       initcnt = arch_probe_nr_irqs();
+       printk(KERN_INFO "NR_IRQS:%d nr_irqs:%d %d\n", NR_IRQS, nr_irqs, initcnt);
 
-       for (i = 0; i < NR_IRQS_LEGACY; i++) {
+       for (i = 0; i < initcnt; i++) {
                desc = alloc_desc(i, node);
                set_bit(i, allocated_irqs);
                irq_insert_desc(i, desc);
 
        return 0;
 }
 
+#ifdef CONFIG_GENERIC_HARDIRQS
 int __init __weak arch_probe_nr_irqs(void)
 {
-       return 0;
+       return NR_IRQS_LEGACY;
 }
 
 int __init __weak arch_early_irq_init(void)
 {
        return 0;
 }
+#endif