Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[deliverable/linux.git] / drivers / sh / intc.c
index ccee18945d910f4bfc20498c45f3d494f46059d8..3a5a17db94744d73d1086b0bc3e89ef6bdb62e52 100644 (file)
@@ -851,6 +851,9 @@ void __init register_intc_controller(struct intc_desc *desc)
                d->chip.mask_ack = intc_mask_ack;
        }
 
+       /* disable bits matching force_disable before registering irqs */
+       if (desc->force_disable)
+               intc_enable_disable_enum(desc, d, desc->force_disable, 0);
 
        /* disable bits matching force_enable before registering irqs */
        if (desc->force_enable)
@@ -896,8 +899,8 @@ void __init register_intc_controller(struct intc_desc *desc)
                        vect2->enum_id = 0;
 
                        /* redirect this interrupts to the first one */
-                       set_irq_chip_and_handler_name(irq2, &d->chip,
-                                       intc_redirect_irq, "redirect");
+                       set_irq_chip(irq2, &dummy_irq_chip);
+                       set_irq_chained_handler(irq2, intc_redirect_irq);
                        set_irq_data(irq2, (void *)irq);
                }
        }
@@ -987,7 +990,7 @@ device_initcall(register_intc_sysdevs);
 /*
  * Dynamic IRQ allocation and deallocation
  */
-static unsigned int create_irq_on_node(unsigned int irq_want, int node)
+unsigned int create_irq_nr(unsigned int irq_want, int node)
 {
        unsigned int irq = 0, new;
        unsigned long flags;
@@ -996,24 +999,28 @@ static unsigned int create_irq_on_node(unsigned int irq_want, int node)
        spin_lock_irqsave(&vector_lock, flags);
 
        /*
-        * First try the wanted IRQ, then scan.
+        * First try the wanted IRQ
         */
-       if (test_and_set_bit(irq_want, intc_irq_map)) {
+       if (test_and_set_bit(irq_want, intc_irq_map) == 0) {
+               new = irq_want;
+       } else {
+               /* .. then fall back to scanning. */
                new = find_first_zero_bit(intc_irq_map, nr_irqs);
                if (unlikely(new == nr_irqs))
                        goto out_unlock;
 
-               desc = irq_to_desc_alloc_node(new, node);
-               if (unlikely(!desc)) {
-                       pr_info("can't get irq_desc for %d\n", new);
-                       goto out_unlock;
-               }
-
-               desc = move_irq_desc(desc, node);
                __set_bit(new, intc_irq_map);
-               irq = new;
        }
 
+       desc = irq_to_desc_alloc_node(new, node);
+       if (unlikely(!desc)) {
+               pr_info("can't get irq_desc for %d\n", new);
+               goto out_unlock;
+       }
+
+       desc = move_irq_desc(desc, node);
+       irq = new;
+
 out_unlock:
        spin_unlock_irqrestore(&vector_lock, flags);
 
@@ -1028,7 +1035,7 @@ int create_irq(void)
        int nid = cpu_to_node(smp_processor_id());
        int irq;
 
-       irq = create_irq_on_node(NR_IRQS_LEGACY, nid);
+       irq = create_irq_nr(NR_IRQS_LEGACY, nid);
        if (irq == 0)
                irq = -1;
 
This page took 0.02696 seconds and 5 git commands to generate.