*/
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/err.h>
 #include <linux/export.h>
 #include <linux/list.h>
 #include <linux/smp.h>
 #endif
 };
 
-void __init gic_init(unsigned int gic_nr, unsigned int irq_start,
+void __init gic_init(unsigned int gic_nr, int irq_start,
        void __iomem *dist_base, void __iomem *cpu_base)
 {
        struct gic_chip_data *gic;
        if (gic_nr == 0) {
                gic_cpu_base_addr = cpu_base;
                domain->hwirq_base = 16;
-               irq_start = (irq_start & ~31) + 16;
+               if (irq_start > 0)
+                       irq_start = (irq_start & ~31) + 16;
        } else
                domain->hwirq_base = 32;
 
        gic->gic_irqs = gic_irqs;
 
        domain->nr_irq = gic_irqs - domain->hwirq_base;
-       domain->irq_base = irq_alloc_descs(-1, irq_start, domain->nr_irq,
+       domain->irq_base = irq_alloc_descs(irq_start, 16, domain->nr_irq,
                                           numa_node_id());
+       if (IS_ERR_VALUE(domain->irq_base)) {
+               WARN(1, "Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n",
+                    irq_start);
+               domain->irq_base = irq_start;
+       }
        domain->priv = gic;
        domain->ops = &gic_irq_domain_ops;
        irq_domain_add(domain);
 
        domain->of_node = of_node_get(node);
 
-       gic_init(gic_cnt, 16, dist_base, cpu_base);
+       gic_init(gic_cnt, -1, dist_base, cpu_base);
 
        if (parent) {
                irq = irq_of_parse_and_map(node, 0);
 
 extern void __iomem *gic_cpu_base_addr;
 extern struct irq_chip gic_arch_extn;
 
-void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *);
+void gic_init(unsigned int, int, void __iomem *, void __iomem *);
 int gic_of_init(struct device_node *node, struct device_node *parent);
 void gic_secondary_init(unsigned int);
 void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);