* Revmap data, used internally by irq_domain
  * @revmap_size: Size of the linear map table @revmap[]
  * @revmap_tree: Radix map tree for hwirqs that don't fit in the linear map
- * @revmap: Linear table of hwirq->virq reverse mappings
+ * @revmap: Linear table of irq_data pointers
  */
 struct irq_domain {
        struct list_head link;
        unsigned int revmap_size;
        struct radix_tree_root revmap_tree;
        struct mutex revmap_tree_mutex;
-       unsigned int revmap[];
+       struct irq_data *revmap[];
 };
 
 /* Irq domain flags */
 
                return;
 
        if (hwirq < domain->revmap_size) {
-               domain->revmap[hwirq] = 0;
+               domain->revmap[hwirq] = NULL;
        } else {
                mutex_lock(&domain->revmap_tree_mutex);
                radix_tree_delete(&domain->revmap_tree, hwirq);
                return;
 
        if (hwirq < domain->revmap_size) {
-               domain->revmap[hwirq] = irq_data->irq;
+               domain->revmap[hwirq] = irq_data;
        } else {
                mutex_lock(&domain->revmap_tree_mutex);
                radix_tree_insert(&domain->revmap_tree, hwirq, irq_data);
 
        /* Check if the hwirq is in the linear revmap. */
        if (hwirq < domain->revmap_size)
-               return domain->revmap[hwirq];
+               return domain->revmap[hwirq]->irq;
 
        rcu_read_lock();
        data = radix_tree_lookup(&domain->revmap_tree, hwirq);
 {
        void __rcu **slot;
 
-       if (irq_domain_is_nomap(d->domain) || d->hwirq < d->domain->revmap_size)
-               return; /* Not using radix tree. */
+       if (irq_domain_is_nomap(d->domain))
+               return;
+
+       if (d->hwirq < d->domain->revmap_size) {
+               /* Not using radix tree */
+               d->domain->revmap[d->hwirq] = d;
+               return;
+       }
 
        /* Fix up the revmap. */
        mutex_lock(&d->domain->revmap_tree_mutex);