GIC is designed to support two types of trigger mechanism. Either active level high or edge rising.
static int gic_set_type(struct irq_data *d, unsigned int type) { ... if (type != IRQ_TYPE_LEVEL_HIGH && type != IRQ_TYPE_EDGE_RISING) return -EINVAL; However, this cause problem with requesting driver uses combo selections to tie down trigger mechanism. In below case gpio_keys_setup_key tries to use either rising or falling edge trigger, but accidently cause a false positive in the gic code. static int gpio_keys_setup_key(struct platform_device *pdev, { irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; This patch fixes this problem by filter the selection type first. Signed-off-by: Feng Kan <f...@apm.com> --- drivers/irqchip/irq-gic.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index c31eea4..bea167e 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c @@ -194,6 +194,7 @@ static int gic_set_type(struct irq_data *d, unsigned int type) if (gicirq < 16) return -EINVAL; + type &= IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_EDGE_RISING; if (type != IRQ_TYPE_LEVEL_HIGH && type != IRQ_TYPE_EDGE_RISING) return -EINVAL; -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/