#include <linux/interrupt.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
+#include <linux/ipipe.h>
#define COMBINER_ENABLE_SET 0x0
#define COMBINER_ENABLE_CLEAR 0x4
#define IRQ_IN_COMBINER 8
-static DEFINE_SPINLOCK(irq_controller_lock);
+static IPIPE_DEFINE_SPINLOCK(irq_controller_lock);
struct combiner_chip_data {
unsigned int hwirq_offset;
if (unlikely(!cascade_irq))
handle_bad_irq(desc);
else
- generic_handle_irq(cascade_irq);
+ ipipe_handle_demuxed_irq(cascade_irq);
out:
chained_irq_exit(chip, desc);
#include <linux/spinlock.h>
#include <linux/regmap.h>
#include <linux/err.h>
+#include <linux/ipipe.h>
#include <linux/soc/samsung/exynos-pmu.h>
#include <dt-bindings/pinctrl/samsung.h>
.irq_set_type = exynos_irq_set_type,
.irq_request_resources = exynos_irq_request_resources,
.irq_release_resources = exynos_irq_release_resources,
+ .flags = IRQCHIP_PIPELINE_SAFE,
},
.eint_con = EXYNOS_GPIO_ECON_OFFSET,
.eint_mask = EXYNOS_GPIO_EMASK_OFFSET,
virq = irq_linear_revmap(bank->irq_domain, pin);
if (!virq)
return IRQ_NONE;
- generic_handle_irq(virq);
+ ipipe_handle_demuxed_irq(virq);
return IRQ_HANDLED;
}
.irq_set_wake = exynos_wkup_irq_set_wake,
.irq_request_resources = exynos_irq_request_resources,
.irq_release_resources = exynos_irq_release_resources,
+ .flags = IRQCHIP_PIPELINE_SAFE,
},
.eint_con = EXYNOS_WKUP_ECON_OFFSET,
.eint_mask = EXYNOS_WKUP_EMASK_OFFSET,
.irq_set_wake = exynos_wkup_irq_set_wake,
.irq_request_resources = exynos_irq_request_resources,
.irq_release_resources = exynos_irq_release_resources,
+ .flags = IRQCHIP_PIPELINE_SAFE,
},
.eint_con = EXYNOS7_WKUP_ECON_OFFSET,
.eint_mask = EXYNOS7_WKUP_EMASK_OFFSET,
chained_irq_enter(chip, desc);
eint_irq = irq_linear_revmap(bank->irq_domain, eintd->irq);
- generic_handle_irq(eint_irq);
+ ipipe_handle_demuxed_irq(eint_irq);
chained_irq_exit(chip, desc);
}
while (pend) {
irq = fls(pend) - 1;
- generic_handle_irq(irq_find_mapping(domain, irq));
+ ipipe_handle_demuxed_irq(irq_find_mapping(domain, irq));
pend &= ~(1 << irq);
}
}