sh: intc: switch irq_desc iteration to new active IRQ iterator.
[pandora-kernel.git] / drivers / sh / intc / core.c
index 306ed28..873a99f 100644 (file)
@@ -71,6 +71,7 @@ static void __init intc_register_irq(struct intc_desc *desc,
                                     unsigned int irq)
 {
        struct intc_handle_int *hp;
+       struct irq_data *irq_data;
        unsigned int data[2], primary;
        unsigned long flags;
 
@@ -78,7 +79,7 @@ static void __init intc_register_irq(struct intc_desc *desc,
         * Register the IRQ position with the global IRQ map, then insert
         * it in to the radix tree.
         */
-       reserve_irq_vector(irq);
+       irq_reserve_irqs(irq, 1);
 
        raw_spin_lock_irqsave(&intc_big_lock, flags);
        radix_tree_insert(&d->tree, enum_id, intc_irq_xlate_get(irq));
@@ -111,6 +112,8 @@ static void __init intc_register_irq(struct intc_desc *desc,
 
        BUG_ON(!data[primary]); /* must have primary masking method */
 
+       irq_data = irq_get_irq_data(irq);
+
        disable_irq_nosync(irq);
        set_irq_chip_and_handler_name(irq, &d->chip,
                                      handle_level_irq, "level");
@@ -123,7 +126,7 @@ static void __init intc_register_irq(struct intc_desc *desc,
 
        /* enable secondary masking method if present */
        if (data[!primary])
-               _intc_enable(irq, data[!primary]);
+               _intc_enable(irq_data, data[!primary]);
 
        /* add irq to d->prio list if priority is available */
        if (data[1]) {
@@ -151,7 +154,7 @@ static void __init intc_register_irq(struct intc_desc *desc,
        }
 
        /* irq should be disabled by default */
-       d->chip.mask(irq);
+       d->chip.irq_mask(irq_data);
 
        intc_set_ack_handle(irq, desc, d, enum_id);
        intc_set_dist_handle(irq, desc, d, enum_id);
@@ -284,7 +287,7 @@ int __init register_intc_controller(struct intc_desc *desc)
                for (i = 0; i < hw->nr_ack_regs; i++)
                        k += save_reg(d, k, hw->ack_regs[i].set_reg, 0);
        else
-               d->chip.mask_ack = d->chip.disable;
+               d->chip.irq_mask_ack = d->chip.irq_disable;
 
        /* disable bits matching force_disable before registering irqs */
        if (desc->force_disable)
@@ -300,13 +303,13 @@ int __init register_intc_controller(struct intc_desc *desc)
        for (i = 0; i < hw->nr_vectors; i++) {
                struct intc_vect *vect = hw->vectors + i;
                unsigned int irq = evt2irq(vect->vect);
-               struct irq_desc *irq_desc;
+               int res;
 
                if (!vect->enum_id)
                        continue;
 
-               irq_desc = irq_to_desc_alloc_node(irq, numa_node_id());
-               if (unlikely(!irq_desc)) {
+               res = irq_alloc_desc_at(irq, numa_node_id());
+               if (res != irq && res != -EEXIST) {
                        pr_err("can't get irq_desc for %d\n", irq);
                        continue;
                }
@@ -326,8 +329,8 @@ int __init register_intc_controller(struct intc_desc *desc)
                         * IRQ support, each vector still needs to have
                         * its own backing irq_desc.
                         */
-                       irq_desc = irq_to_desc_alloc_node(irq2, numa_node_id());
-                       if (unlikely(!irq_desc)) {
+                       res = irq_alloc_desc_at(irq2, numa_node_id());
+                       if (res != irq2 && res != -EEXIST) {
                                pr_err("can't get irq_desc for %d\n", irq2);
                                continue;
                        }
@@ -387,7 +390,9 @@ static SYSDEV_ATTR(name, S_IRUGO, show_intc_name, NULL);
 static int intc_suspend(struct sys_device *dev, pm_message_t state)
 {
        struct intc_desc_int *d;
+       struct irq_data *data;
        struct irq_desc *desc;
+       struct irq_chip *chip;
        int irq;
 
        /* get intc controller associated with this sysdev */
@@ -398,17 +403,21 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state)
                if (d->state.event != PM_EVENT_FREEZE)
                        break;
 
-               for_each_irq_desc(irq, desc) {
+               for_each_active_irq(irq) {
+                       desc = irq_to_desc(irq);
+                       data = irq_get_irq_data(irq);
+                       chip = irq_data_get_irq_chip(data);
+
                        /*
                         * This will catch the redirect and VIRQ cases
                         * due to the dummy_irq_chip being inserted.
                         */
-                       if (desc->chip != &d->chip)
+                       if (chip != &d->chip)
                                continue;
                        if (desc->status & IRQ_DISABLED)
-                               desc->chip->disable(irq);
+                               chip->irq_disable(data);
                        else
-                               desc->chip->enable(irq);
+                               chip->irq_enable(data);
                }
                break;
        case PM_EVENT_FREEZE:
@@ -416,11 +425,15 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state)
                break;
        case PM_EVENT_SUSPEND:
                /* enable wakeup irqs belonging to this intc controller */
-               for_each_irq_desc(irq, desc) {
-                       if (desc->chip != &d->chip)
+               for_each_active_irq(irq) {
+                       desc = irq_to_desc(irq);
+                       data = irq_get_irq_data(irq);
+                       chip = irq_data_get_irq_chip(data);
+
+                       if (chip != &d->chip)
                                continue;
                        if ((desc->status & IRQ_WAKEUP))
-                               desc->chip->enable(irq);
+                               chip->irq_enable(data);
                }
                break;
        }