aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/irqchip/irq-gic-v3.c
diff options
context:
space:
mode:
authorLiviu Dudau <Liviu.Dudau@arm.com>2015-01-20 11:52:59 -0500
committerThomas Gleixner <tglx@linutronix.de>2015-01-26 05:38:23 -0500
commitfb7e7deb7fc348ae131268d30e391c8184285de6 (patch)
treea036b13c9e0bcaeebbe3ce6691042d9f9840d9b6 /drivers/irqchip/irq-gic-v3.c
parentd7eb4f2ecccd71f701bc8873bcf07c2d3b0375f6 (diff)
irqchip: gic: Allow interrupt level to be set for PPIs
During a recent cleanup of the arm64 DTs it has become clear that the handling of PPIs in xxxx_set_type() is incorrect. The ARM TRMs for GICv2 and later allow for "implementation defined" support for setting the edge or level type of the PPI interrupts and don't restrict the activation level of the signal. Current ARM implementations do restrict the PPI level type to IRQ_TYPE_LEVEL_LOW, but licensees of the IP can decide to shoot themselves in the foot at any time. Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com> Acked-by: Marc Zyngier <Marc.Zyngier@arm.com> Cc: LAKML <linux-arm-kernel@lists.infradead.org> Cc: Russell King <linux@arm.linux.org.uk> Cc: Rob Herring <robh+dt@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Ian Campbell <ijc+devicetree@hellion.org.uk> Cc: Jason Cooper <jason@lakedaemon.net> Cc: Haojian Zhuang <haojian.zhuang@linaro.org> Link: http://lkml.kernel.org/r/1421772779-25764-1-git-send-email-Liviu.Dudau@arm.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/irqchip/irq-gic-v3.c')
-rw-r--r--drivers/irqchip/irq-gic-v3.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
index 1a146ccee701..6e508038f31b 100644
--- a/drivers/irqchip/irq-gic-v3.c
+++ b/drivers/irqchip/irq-gic-v3.c
@@ -238,7 +238,9 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
238 if (irq < 16) 238 if (irq < 16)
239 return -EINVAL; 239 return -EINVAL;
240 240
241 if (type != IRQ_TYPE_LEVEL_HIGH && type != IRQ_TYPE_EDGE_RISING) 241 /* SPIs have restrictions on the supported types */
242 if (irq >= 32 && type != IRQ_TYPE_LEVEL_HIGH &&
243 type != IRQ_TYPE_EDGE_RISING)
242 return -EINVAL; 244 return -EINVAL;
243 245
244 if (gic_irq_in_rdist(d)) { 246 if (gic_irq_in_rdist(d)) {
@@ -249,9 +251,7 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
249 rwp_wait = gic_dist_wait_for_rwp; 251 rwp_wait = gic_dist_wait_for_rwp;
250 } 252 }
251 253
252 gic_configure_irq(irq, type, base, rwp_wait); 254 return gic_configure_irq(irq, type, base, rwp_wait);
253
254 return 0;
255} 255}
256 256
257static u64 gic_mpidr_to_affinity(u64 mpidr) 257static u64 gic_mpidr_to_affinity(u64 mpidr)