From 23a351657fc63c85f4955e84b67344413f99cee3 Mon Sep 17 00:00:00 2001 From: Gilles Chanteperdrix Date: Sun, 3 Dec 2017 11:53:48 +0100 Subject: [PATCH] pinctrl: ipipe: enable pipelined interrupts --- drivers/pinctrl/pinctrl-single.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index b8b3d932cd73..47ef187f721e 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -182,7 +183,11 @@ struct pcs_device { #define PCS_FEAT_PINCONF (1 << 0) struct property *missing_nr_pinctrl_cells; struct pcs_soc_data socdata; +#ifdef CONFIG_IPIPE + ipipe_spinlock_t lock; +#else /* !IPIPE */ raw_spinlock_t lock; +#endif /* !IPIPE */ struct mutex mutex; unsigned width; unsigned fmask; @@ -1417,7 +1422,7 @@ static int pcs_irq_handle(struct pcs_soc_data *pcs_soc) mask = pcs->read(pcswi->reg); raw_spin_unlock(&pcs->lock); if (mask & pcs_soc->irq_status_mask) { - generic_handle_irq(irq_find_mapping(pcs->domain, + ipipe_handle_demuxed_irq(irq_find_mapping(pcs->domain, pcswi->hwirq)); count++; } @@ -1437,8 +1442,14 @@ static int pcs_irq_handle(struct pcs_soc_data *pcs_soc) static irqreturn_t pcs_irq_handler(int irq, void *d) { struct pcs_soc_data *pcs_soc = d; + unsigned long flags; + irqreturn_t ret; - return pcs_irq_handle(pcs_soc) ? IRQ_HANDLED : IRQ_NONE; + flags = hard_cond_local_irq_save(); + ret = pcs_irq_handle(pcs_soc) ? IRQ_HANDLED : IRQ_NONE; + hard_cond_local_irq_restore(flags); + + return ret; } /** -- 2.34.1