}
        }
 
+       /* Read extra device-tree properties into the flags variable */
+       if (of_get_property(node, "big-endian", NULL))
+               flags |= MPIC_BIG_ENDIAN;
+       if (of_get_property(node, "pic-no-reset", NULL))
+               flags |= MPIC_NO_RESET;
+       if (of_device_is_compatible(node, "fsl,mpic"))
+               flags |= MPIC_FSL;
+
        mpic = kzalloc(sizeof(struct mpic), GFP_KERNEL);
        if (mpic == NULL)
                goto err_of_node_put;
        mpic->name = name;
        mpic->node = node;
        mpic->paddr = phys_addr;
+       mpic->flags = flags;
 
        mpic->hc_irq = mpic_irq_chip;
        mpic->hc_irq.name = name;
-       if (!(flags & MPIC_SECONDARY))
+       if (!(mpic->flags & MPIC_SECONDARY))
                mpic->hc_irq.irq_set_affinity = mpic_set_affinity;
 #ifdef CONFIG_MPIC_U3_HT_IRQS
        mpic->hc_ht_irq = mpic_irq_ht_chip;
        mpic->hc_ht_irq.name = name;
-       if (!(flags & MPIC_SECONDARY))
+       if (!(mpic->flags & MPIC_SECONDARY))
                mpic->hc_ht_irq.irq_set_affinity = mpic_set_affinity;
 #endif /* CONFIG_MPIC_U3_HT_IRQS */
 
        mpic->hc_tm = mpic_tm_chip;
        mpic->hc_tm.name = name;
 
-       mpic->flags = flags;
        mpic->isu_size = isu_size;
        mpic->irq_count = irq_count;
        mpic->num_sources = 0; /* so far */
 
-       if (flags & MPIC_LARGE_VECTORS)
+       if (mpic->flags & MPIC_LARGE_VECTORS)
                intvec_top = 2047;
        else
                intvec_top = 255;
        mpic->ipi_vecs[3]   = intvec_top - 1;
        mpic->spurious_vec  = intvec_top;
 
-       /* Check for "big-endian" in device-tree */
-       if (of_get_property(mpic->node, "big-endian", NULL) != NULL)
-               mpic->flags |= MPIC_BIG_ENDIAN;
-       if (of_device_is_compatible(mpic->node, "fsl,mpic"))
-               mpic->flags |= MPIC_FSL;
-
        /* Look for protected sources */
        psrc = of_get_property(mpic->node, "protected-sources", &psize);
        if (psrc) {
        }
 
 #ifdef CONFIG_MPIC_WEIRD
-       mpic->hw_set = mpic_infos[MPIC_GET_REGSET(flags)];
+       mpic->hw_set = mpic_infos[MPIC_GET_REGSET(mpic->flags)];
 #endif
 
        /* default register type */
-       if (flags & MPIC_BIG_ENDIAN)
+       if (mpic->flags & MPIC_BIG_ENDIAN)
                mpic->reg_type = mpic_access_mmio_be;
        else
                mpic->reg_type = mpic_access_mmio_le;
         * only if the kernel includes DCR support.
         */
 #ifdef CONFIG_PPC_DCR
-       if (flags & MPIC_USES_DCR)
+       if (mpic->flags & MPIC_USES_DCR)
                mpic->reg_type = mpic_access_dcr;
 #else
-       BUG_ON(flags & MPIC_USES_DCR);
+       BUG_ON(mpic->flags & MPIC_USES_DCR);
 #endif
 
        /* Map the global registers */
        /* When using a device-node, reset requests are only honored if the MPIC
         * is allowed to reset.
         */
-       if (of_get_property(mpic->node, "pic-no-reset", NULL))
-               mpic->flags |= MPIC_NO_RESET;
-
-       if ((flags & MPIC_WANTS_RESET) && !(mpic->flags & MPIC_NO_RESET)) {
+       if ((mpic->flags & MPIC_WANTS_RESET) && !(mpic->flags & MPIC_NO_RESET)) {
                printk(KERN_DEBUG "mpic: Resetting\n");
                mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
                           mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
        }
 
        /* CoreInt */
-       if (flags & MPIC_ENABLE_COREINT)
+       if (mpic->flags & MPIC_ENABLE_COREINT)
                mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
                           mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
                           | MPIC_GREG_GCONF_COREINT);
 
-       if (flags & MPIC_ENABLE_MCK)
+       if (mpic->flags & MPIC_ENABLE_MCK)
                mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
                           mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
                           | MPIC_GREG_GCONF_MCK);
         */
        greg_feature = mpic_read(mpic->gregs, MPIC_INFO(GREG_FEATURE_0));
        if (isu_size == 0) {
-               if (flags & MPIC_BROKEN_FRR_NIRQS)
+               if (mpic->flags & MPIC_BROKEN_FRR_NIRQS)
                        mpic->num_sources = mpic->irq_count;
                else
                        mpic->num_sources =
 
        mpic->irqhost = irq_alloc_host(mpic->node, IRQ_HOST_MAP_LINEAR,
                                       isu_size ? isu_size : mpic->num_sources,
-                                      &mpic_host_ops,
-                                      flags & MPIC_LARGE_VECTORS ? 2048 : 256);
+                                      &mpic_host_ops, intvec_top + 1);
 
        /*
         * FIXME: The code leaks the MPIC object and mappings here; this
        mpic->next = mpics;
        mpics = mpic;
 
-       if (!(flags & MPIC_SECONDARY)) {
+       if (!(mpic->flags & MPIC_SECONDARY)) {
                mpic_primary = mpic;
                irq_set_default_host(mpic->irqhost);
        }