/* Now start the actual "proper" walk of the interrupt tree */
        while (ipar != NULL) {
-               /* Now check if cursor is an interrupt-controller and if it is
-                * then we are done
+               /*
+                * Now check if cursor is an interrupt-controller and
+                * if it is then we are done, unless there is an
+                * interrupt-map which takes precedence.
                 */
-               if (of_property_read_bool(ipar, "interrupt-controller")) {
+               imap = of_get_property(ipar, "interrupt-map", &imaplen);
+               if (imap == NULL &&
+                   of_property_read_bool(ipar, "interrupt-controller")) {
                        pr_debug(" -> got it !\n");
                        return 0;
                }
                        goto fail;
                }
 
-               /* Now look for an interrupt-map */
-               imap = of_get_property(ipar, "interrupt-map", &imaplen);
                /* No interrupt map, check for an interrupt parent */
                if (imap == NULL) {
                        pr_debug(" -> no map, getting parent\n");
                out_irq->args_count = intsize = newintsize;
                addrsize = newaddrsize;
 
+               if (ipar == newpar) {
+                       pr_debug("%pOF interrupt-map entry to self\n", ipar);
+                       return 0;
+               }
+
        skiplevel:
                /* Iterate again with new parent */
                out_irq->np = newpar;