deprecated
 - generic_handle_domain_irq() handles an interrupt described by a
   domain and a hwirq number
-- handle_domain_irq() does the same thing for root interrupt
-  controllers and deals with the set_irq_reg()/irq_enter() sequences
-  that most architecture requires
 
 Note that irq domain lookups must happen in contexts that are
 compatible with a RCU read-side critical section.
 
        select GENERIC_PCI_IOMAP
        select GENERIC_SCHED_CLOCK
        select GENERIC_SMP_IDLE_THREAD
-       select HANDLE_DOMAIN_IRQ
        select HARDIRQS_SW_RESEND
        select HAVE_ARCH_AUDITSYSCALL if AEABI && !OABI_COMPAT
        select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6
 
                if (nivector == 0xffff)
                        break;
 
-               handle_domain_irq(domain, nivector, regs);
+               generic_handle_domain_irq(domain, nivector);
        } while (1);
 }
 
 
                        while (stat) {
                                handled = 1;
                                irqofs = fls(stat) - 1;
-                               handle_domain_irq(domain, irqofs + i * 32, regs);
+                               generic_handle_domain_irq(domain, irqofs + i * 32);
                                stat &= ~(1 << irqofs);
                        }
                }
 
                }
 irq:
                if (irqnr)
-                       handle_domain_irq(domain, irqnr, regs);
+                       generic_handle_domain_irq(domain, irqnr);
                else
                        break;
        } while (irqnr);
 
        if (!(pnd & (1 << offset)))
                offset =  __ffs(pnd);
 
-       handle_domain_irq(intc->domain, intc_offset + offset, regs);
+       generic_handle_domain_irq(intc->domain, intc_offset + offset);
        return true;
 }
 
 
        select GENERIC_TIME_VSYSCALL
        select GENERIC_GETTIMEOFDAY
        select GENERIC_VDSO_TIME_NS
-       select HANDLE_DOMAIN_IRQ
        select HARDIRQS_SW_RESEND
        select HAVE_MOVE_PMD
        select HAVE_MOVE_PUD
 
        select CSKY_APB_INTC
        select DMA_DIRECT_REMAP
        select IRQ_DOMAIN
-       select HANDLE_DOMAIN_IRQ
        select DW_APB_TIMER_OF
        select GENERIC_IOREMAP
        select GENERIC_LIB_ASHLDI3
 
        select OF
        select OF_EARLY_FLATTREE
        select IRQ_DOMAIN
-       select HANDLE_DOMAIN_IRQ
        select GPIOLIB
        select HAVE_ARCH_TRACEHOOK
        select SPARSE_IRQ
 
        select GENERIC_SCHED_CLOCK
        select GENERIC_SMP_IDLE_THREAD
        select GENERIC_TIME_VSYSCALL if MMU && 64BIT
-       select HANDLE_DOMAIN_IRQ
        select HAVE_ARCH_AUDITSYSCALL
        select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL
        select HAVE_ARCH_JUMP_LABEL_RELATIVE if !XIP_KERNEL
 
                irq = FIELD_GET(AIC_EVENT_NUM, event);
 
                if (type == AIC_EVENT_TYPE_HW)
-                       handle_domain_irq(aic_irqc->hw_domain, irq, regs);
+                       generic_handle_domain_irq(aic_irqc->hw_domain, irq);
                else if (type == AIC_EVENT_TYPE_IPI && irq == 1)
                        aic_handle_ipi(regs);
                else if (event != 0)
        }
 
        if (TIMER_FIRING(read_sysreg(cntp_ctl_el0)))
-               handle_domain_irq(aic_irqc->hw_domain,
-                                 aic_irqc->nr_hw + AIC_TMR_EL0_PHYS, regs);
+               generic_handle_domain_irq(aic_irqc->hw_domain,
+                                         aic_irqc->nr_hw + AIC_TMR_EL0_PHYS);
 
        if (TIMER_FIRING(read_sysreg(cntv_ctl_el0)))
-               handle_domain_irq(aic_irqc->hw_domain,
-                                 aic_irqc->nr_hw + AIC_TMR_EL0_VIRT, regs);
+               generic_handle_domain_irq(aic_irqc->hw_domain,
+                                         aic_irqc->nr_hw + AIC_TMR_EL0_VIRT);
 
        if (is_kernel_in_hyp_mode()) {
                uint64_t enabled = read_sysreg_s(SYS_IMP_APL_VM_TMR_FIQ_ENA_EL2);
 
                if ((enabled & VM_TMR_FIQ_ENABLE_P) &&
                    TIMER_FIRING(read_sysreg_s(SYS_CNTP_CTL_EL02)))
-                       handle_domain_irq(aic_irqc->hw_domain,
-                                         aic_irqc->nr_hw + AIC_TMR_EL02_PHYS, regs);
+                       generic_handle_domain_irq(aic_irqc->hw_domain,
+                                                 aic_irqc->nr_hw + AIC_TMR_EL02_PHYS);
 
                if ((enabled & VM_TMR_FIQ_ENABLE_V) &&
                    TIMER_FIRING(read_sysreg_s(SYS_CNTV_CTL_EL02)))
-                       handle_domain_irq(aic_irqc->hw_domain,
-                                         aic_irqc->nr_hw + AIC_TMR_EL02_VIRT, regs);
+                       generic_handle_domain_irq(aic_irqc->hw_domain,
+                                                 aic_irqc->nr_hw + AIC_TMR_EL02_VIRT);
        }
 
        if ((read_sysreg_s(SYS_IMP_APL_PMCR0_EL1) & (PMCR0_IMODE | PMCR0_IACT)) ==
        firing = atomic_fetch_andnot(enabled, this_cpu_ptr(&aic_vipi_flag)) & enabled;
 
        for_each_set_bit(i, &firing, AIC_NR_SWIPI)
-               handle_domain_irq(aic_irqc->ipi_domain, i, regs);
+               generic_handle_domain_irq(aic_irqc->ipi_domain, i);
 
        /*
         * No ordering needed here; at worst this just changes the timing of
 
 
                irq = msinr - PCI_MSI_DOORBELL_START;
 
-               if (is_chained)
-                       generic_handle_domain_irq(armada_370_xp_msi_inner_domain,
-                                                 irq);
-               else
-                       handle_domain_irq(armada_370_xp_msi_inner_domain,
-                                         irq, regs);
+               generic_handle_domain_irq(armada_370_xp_msi_inner_domain, irq);
        }
 }
 #else
                        break;
 
                if (irqnr > 1) {
-                       handle_domain_irq(armada_370_xp_mpic_domain,
-                                         irqnr, regs);
+                       generic_handle_domain_irq(armada_370_xp_mpic_domain,
+                                                 irqnr);
                        continue;
                }
 
                                & IPI_DOORBELL_MASK;
 
                        for_each_set_bit(ipi, &ipimask, IPI_DOORBELL_END)
-                               handle_domain_irq(ipi_domain, ipi, regs);
+                               generic_handle_domain_irq(ipi_domain, ipi);
                }
 #endif
 
 
                if (stat == 0)
                        break;
                irq += ffs(stat) - 1;
-               handle_domain_irq(vic->dom, irq, regs);
+               generic_handle_domain_irq(vic->dom, irq);
        }
 }
 
 
        if (!irqstat)
                irq_reg_writel(gc, 0, AT91_AIC_EOICR);
        else
-               handle_domain_irq(aic_domain, irqnr, regs);
+               generic_handle_domain_irq(aic_domain, irqnr);
 }
 
 static int aic_retrigger(struct irq_data *d)
 
        if (!irqstat)
                irq_reg_writel(bgc, 0, AT91_AIC5_EOICR);
        else
-               handle_domain_irq(aic5_domain, irqnr, regs);
+               generic_handle_domain_irq(aic5_domain, irqnr);
 }
 
 static void aic5_mask(struct irq_data *d)
 
        u32 hwirq;
 
        while ((hwirq = get_next_armctrl_hwirq()) != ~0)
-               handle_domain_irq(intc.domain, hwirq, regs);
+               generic_handle_domain_irq(intc.domain, hwirq);
 }
 
 static void bcm2836_chained_handle_irq(struct irq_desc *desc)
 
        if (stat) {
                u32 hwirq = ffs(stat) - 1;
 
-               handle_domain_irq(intc.domain, hwirq, regs);
+               generic_handle_domain_irq(intc.domain, hwirq);
        }
 }
 
 
                irqstat = readw_relaxed(clps711x_intc->intmr[0]) &
                          readw_relaxed(clps711x_intc->intsr[0]);
                if (irqstat)
-                       handle_domain_irq(clps711x_intc->domain,
-                                         fls(irqstat) - 1, regs);
+                       generic_handle_domain_irq(clps711x_intc->domain,
+                                                 fls(irqstat) - 1);
 
                irqstat = readw_relaxed(clps711x_intc->intmr[1]) &
                          readw_relaxed(clps711x_intc->intsr[1]);
                if (irqstat)
-                       handle_domain_irq(clps711x_intc->domain,
-                                         fls(irqstat) - 1 + 16, regs);
+                       generic_handle_domain_irq(clps711x_intc->domain,
+                                                 fls(irqstat) - 1 + 16);
        } while (irqstat);
 }
 
 
        if (hwirq == 0)
                return 0;
 
-       handle_domain_irq(root_domain, irq_base + __fls(hwirq), regs);
+       generic_handle_domain_irq(root_domain, irq_base + __fls(hwirq));
 
        return 1;
 }
 
 {
        void __iomem *reg_base = this_cpu_read(intcl_reg);
 
-       handle_domain_irq(root_domain,
-               readl_relaxed(reg_base + INTCL_RDYIR), regs);
+       generic_handle_domain_irq(root_domain,
+               readl_relaxed(reg_base + INTCL_RDYIR));
 }
 
 static void csky_mpintc_enable(struct irq_data *d)
 
        irqnr >>= 2;
        irqnr -= 1;
 
-       handle_domain_irq(davinci_aintc_irq_domain, irqnr, regs);
+       generic_handle_domain_irq(davinci_aintc_irq_domain, irqnr);
 }
 
 /* ARM Interrupt Controller Initialization */
 
                return;
        }
 
-       handle_domain_irq(davinci_cp_intc_irq_domain, irqnr, regs);
+       generic_handle_domain_irq(davinci_cp_intc_irq_domain, irqnr);
 }
 
 static int davinci_cp_intc_host_map(struct irq_domain *h, unsigned int virq,
 
                                return;
                }
 
-               handle_domain_irq(digicolor_irq_domain, hwirq, regs);
+               generic_handle_domain_irq(digicolor_irq_domain, hwirq);
        } while (1);
 }
 
 
                while (stat) {
                        u32 hwirq = ffs(stat) - 1;
 
-                       handle_domain_irq(d, hwirq, regs);
+                       generic_handle_domain_irq(d, hwirq);
                        stat &= ~BIT(hwirq);
                }
        }
 
 
        while ((status = readl(FT010_IRQ_STATUS(f->base)))) {
                irq = ffs(status) - 1;
-               handle_domain_irq(f->domain, irq, regs);
+               generic_handle_domain_irq(f->domain, irq);
        }
 }
 
 
         * PSR.I will be restored when we ERET to the
         * interrupted context.
         */
-       err = handle_domain_nmi(gic_data.domain, irqnr, regs);
+       err = generic_handle_domain_nmi(gic_data.domain, irqnr);
        if (err)
                gic_deactivate_unhandled(irqnr);
 
        else
                isb();
 
-       if (handle_domain_irq(gic_data.domain, irqnr, regs)) {
+       if (generic_handle_domain_irq(gic_data.domain, irqnr)) {
                WARN_ONCE(true, "Unexpected interrupt received!\n");
                gic_deactivate_unhandled(irqnr);
        }
 
                        this_cpu_write(sgi_intid, irqstat);
                }
 
-               handle_domain_irq(gic->domain, irqnr, regs);
+               generic_handle_domain_irq(gic->domain, irqnr);
        } while (1);
 }
 
 
                irqnr = irqstat & GICC_IAR_INT_ID_MASK;
 
                if (irqnr <= HIP04_MAX_IRQS)
-                       handle_domain_irq(hip04_data.domain, irqnr, regs);
+                       generic_handle_domain_irq(hip04_data.domain, irqnr);
        } while (irqnr > HIP04_MAX_IRQS);
 }
 
 
 
        status = __raw_readl(ixi->irqbase + IXP4XX_ICIP);
        for_each_set_bit(i, &status, 32)
-               handle_domain_irq(ixi->domain, i, regs);
+               generic_handle_domain_irq(ixi->domain, i);
 
        /*
         * IXP465/IXP435 has an upper IRQ status register
        if (ixi->is_356) {
                status = __raw_readl(ixi->irqbase + IXP4XX_ICIP2);
                for_each_set_bit(i, &status, 32)
-                       handle_domain_irq(ixi->domain, i + 32, regs);
+                       generic_handle_domain_irq(ixi->domain, i + 32);
        }
 }
 
 
        while (hwirq) {
                irq = __ffs(hwirq);
                hwirq &= ~BIT(irq);
-               handle_domain_irq(lpc32xx_mic_irqc->domain, irq, regs);
+               generic_handle_domain_irq(lpc32xx_mic_irqc->domain, irq);
        }
 }
 
 
        if (!(hwirq & SEL_INT_PENDING))
                return;
        hwirq &= SEL_INT_NUM_MASK;
-       handle_domain_irq(icu_data[0].domain, hwirq, regs);
+       generic_handle_domain_irq(icu_data[0].domain, hwirq);
 }
 
 static void __exception_irq_entry mmp2_handle_irq(struct pt_regs *regs)
        if (!(hwirq & SEL_INT_PENDING))
                return;
        hwirq &= SEL_INT_NUM_MASK;
-       handle_domain_irq(icu_data[0].domain, hwirq, regs);
+       generic_handle_domain_irq(icu_data[0].domain, hwirq);
 }
 
 /* MMP (ARMv5) */
 
 
        irqnr = __raw_readl(icoll_priv.stat);
        __raw_writel(irqnr, icoll_priv.vector);
-       handle_domain_irq(icoll_domain, irqnr, regs);
+       generic_handle_domain_irq(icoll_domain, irqnr);
 }
 
 static int icoll_irq_domain_map(struct irq_domain *d, unsigned int virq,
 
 
 static struct irq_domain *nvic_irq_domain;
 
-static void __nvic_handle_irq(irq_hw_number_t hwirq, struct pt_regs *regs)
+static void __nvic_handle_irq(irq_hw_number_t hwirq)
 {
-       handle_domain_irq(nvic_irq_domain, hwirq, regs);
+       generic_handle_domain_irq(nvic_irq_domain, hwirq);
 }
 
 /*
 
        irq_enter();
        old_regs = set_irq_regs(regs);
-       __nvic_handle_irq(hwirq, regs);
+       __nvic_handle_irq(hwirq);
        set_irq_regs(old_regs);
        irq_exit();
 }
 
        }
 
        irqnr &= ACTIVEIRQ_MASK;
-       handle_domain_irq(domain, irqnr, regs);
+       generic_handle_domain_irq(domain, irqnr);
 }
 
 static int __init intc_of_init(struct device_node *node,
 
        int irq = -1;
 
        while ((irq = pic_get_irq(irq + 1)) != NO_IRQ)
-               handle_domain_irq(root_domain, irq, regs);
+               generic_handle_domain_irq(root_domain, irq);
 }
 
 static int or1k_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
 
                        gc->mask_cache;
                while (stat) {
                        u32 hwirq = __fls(stat);
-                       handle_domain_irq(orion_irq_domain,
-                                         gc->irq_base + hwirq, regs);
+                       generic_handle_domain_irq(orion_irq_domain,
+                                                 gc->irq_base + hwirq);
                        stat &= ~(1 << hwirq);
                }
        }
 
 
        while (stat) {
                hwirq = __fls(stat);
-               handle_domain_irq(rda_irq_domain, hwirq, regs);
+               generic_handle_domain_irq(rda_irq_domain, hwirq);
                stat &= ~BIT(hwirq);
        }
 }
 
                break;
 #endif
        default:
-               handle_domain_irq(intc_domain, cause, regs);
+               generic_handle_domain_irq(intc_domain, cause);
                break;
        }
 }
 
                if (mask == 0)
                        break;
 
-               handle_domain_irq(sa1100_normal_irqdomain,
-                               ffs(mask) - 1, regs);
+               generic_handle_domain_irq(sa1100_normal_irqdomain,
+                                         ffs(mask) - 1);
        } while (1);
 }
 
 
                return;
 
        do {
-               handle_domain_irq(irq_ic_data->irq_domain, hwirq, regs);
+               generic_handle_domain_irq(irq_ic_data->irq_domain, hwirq);
                hwirq = readl(irq_ic_data->irq_base +
                                SUN4I_IRQ_VECTOR_REG) >> 2;
        } while (hwirq != 0);
 
 
        while ((status  = readl(f->base + IRQ_STATUS))) {
                irq = ffs(status) - 1;
-               handle_domain_irq(f->domain, irq, regs);
+               generic_handle_domain_irq(f->domain, irq);
                handled = 1;
        }
 
 
 
        while ((stat = readl_relaxed(vic->base + VIC_IRQ_STATUS))) {
                irq = ffs(stat) - 1;
-               handle_domain_irq(vic->domain, irq, regs);
+               generic_handle_domain_irq(vic->domain, irq);
                handled = 1;
        }
 
 
                                continue;
                }
 
-               handle_domain_irq(intc[i].domain, irqnr, regs);
+               generic_handle_domain_irq(intc[i].domain, irqnr);
        }
 }
 
 
        /* Read IPER to signal that nIRQ can be de-asserted */
        hwirq = readl(aic->regs + AIC_IPER) / 4;
 
-       handle_domain_irq(aic->domain, hwirq, regs);
+       generic_handle_domain_irq(aic->domain, hwirq);
 }
 
 static void wpcm450_aic_eoi(struct irq_data *d)
 
 
        while (readl(zevio_irq_io + IO_STATUS)) {
                irqnr = readl(zevio_irq_io + IO_CURRENT);
-               handle_domain_irq(zevio_irq_domain, irqnr, regs);
+               generic_handle_domain_irq(zevio_irq_domain, irqnr);
        }
 }
 
 
  * conversion failed.
  */
 int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq);
-
-#ifdef CONFIG_HANDLE_DOMAIN_IRQ
-int handle_domain_irq(struct irq_domain *domain,
-                     unsigned int hwirq, struct pt_regs *regs);
-
-int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq,
-                     struct pt_regs *regs);
-#endif
+int generic_handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq);
 #endif
 
 /* Test to see if a driver has successfully requested an irq */
 
 config IRQ_MSI_IOMMU
        bool
 
-config HANDLE_DOMAIN_IRQ
-       bool
-
-# Legacy behaviour; architectures should call irq_{enter,exit}() themselves
-config HANDLE_DOMAIN_IRQ_IRQENTRY
-       bool
-
 config IRQ_TIMINGS
        bool
 
 
  * generic_handle_irq - Invoke the handler for a particular irq
  * @irq:       The irq number to handle
  *
- */
+ * Returns:    0 on success, or -EINVAL if conversion has failed
+ *
+ *             This function must be called from an IRQ context with irq regs
+ *             initialized.
+  */
 int generic_handle_irq(unsigned int irq)
 {
        return handle_irq_desc(irq_to_desc(irq));
 #ifdef CONFIG_IRQ_DOMAIN
 /**
  * generic_handle_domain_irq - Invoke the handler for a HW irq belonging
- *                             to a domain, usually for a non-root interrupt
- *                             controller
+ *                             to a domain.
  * @domain:    The domain where to perform the lookup
  * @hwirq:     The HW irq number to convert to a logical one
  *
  * Returns:    0 on success, or -EINVAL if conversion has failed
  *
+ *             This function must be called from an IRQ context with irq regs
+ *             initialized.
  */
 int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq)
 {
+       WARN_ON_ONCE(!in_irq());
        return handle_irq_desc(irq_resolve_mapping(domain, hwirq));
 }
 EXPORT_SYMBOL_GPL(generic_handle_domain_irq);
 
-#ifdef CONFIG_HANDLE_DOMAIN_IRQ
 /**
- * handle_domain_irq - Invoke the handler for a HW irq belonging to a domain,
- *                     usually for a root interrupt controller
+ * generic_handle_domain_nmi - Invoke the handler for a HW nmi belonging
+ *                             to a domain.
  * @domain:    The domain where to perform the lookup
  * @hwirq:     The HW irq number to convert to a logical one
- * @regs:      Register file coming from the low-level handling code
- *
- *             This function must be called from an IRQ context.
  *
  * Returns:    0 on success, or -EINVAL if conversion has failed
- */
-int handle_domain_irq(struct irq_domain *domain,
-                     unsigned int hwirq, struct pt_regs *regs)
-{
-       struct pt_regs *old_regs = set_irq_regs(regs);
-       int ret;
-
-       /*
-        * IRQ context needs to be setup earlier.
-        */
-       WARN_ON(!in_irq());
-
-       ret = generic_handle_domain_irq(domain, hwirq);
-
-       set_irq_regs(old_regs);
-       return ret;
-}
-
-/**
- * handle_domain_nmi - Invoke the handler for a HW irq belonging to a domain
- * @domain:    The domain where to perform the lookup
- * @hwirq:     The HW irq number to convert to a logical one
- * @regs:      Register file coming from the low-level handling code
- *
- *             This function must be called from an NMI context.
  *
- * Returns:    0 on success, or -EINVAL if conversion has failed
- */
-int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq,
-                     struct pt_regs *regs)
+ *             This function must be called from an NMI context with irq regs
+ *             initialized.
+ **/
+int generic_handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq)
 {
-       struct pt_regs *old_regs = set_irq_regs(regs);
-       int ret;
-
-       /*
-        * NMI context needs to be setup earlier in order to deal with tracing.
-        */
-       WARN_ON(!in_nmi());
-
-       ret = generic_handle_domain_irq(domain, hwirq);
-
-       set_irq_regs(old_regs);
-       return ret;
+       WARN_ON_ONCE(!in_nmi());
+       return handle_irq_desc(irq_resolve_mapping(domain, hwirq));
 }
 #endif
-#endif
 
 /* Dynamic interrupt handling */