genirq: record IRQ_LEVEL in irq_desc[]
PATCH 1/1 genirq: record IRQ_LEVEL in irq_desc[]
From: David Brownell <[email protected]>
When recording the irq trigger type, let's also make sure that IRQ_LEVEL gets set correctly.
Signed-off-by David Brownell <[email protected]>
---
So long as IRQ_LEVEL exists and is used through enable_irq() and setup_irq(), I suspect it should get set correctly! However, now that we record IRQ_TYPE_LEVEL_* maybe IRQ_LEVEL should vanish...
kernel/irq/chip.c | 1 + kernel/irq/manage.c | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-)
kernel/irq/chip.c +1 -0
@@ -124,6 +124,7 @@ int set_irq_type(unsigned int irq, unsigreturn -ENODEV ; } + type &=IRQ_TYPE_SENSE_MASK ;if (type ==IRQ_TYPE_NONE )return 0 ;
kernel/irq/manage.c +9 -6
@@ -332,16 +332,18 @@ int __irq_set_trigger(struct irq_desc *dreturn 0 ; } - ret = chip->set_type (irq, flags &IRQF_TRIGGER_MASK ); +/* caller masked out all except trigger mode flags */ + ret = chip->set_type (irq, flags);if (ret)pr_err ("setting trigger mode %d for irq %u failed (%pF)\n" , - (int )(flags &IRQF_TRIGGER_MASK ), - irq, chip->set_type); + (int )flags, irq, chip->set_type);else { +if (flags & (IRQ_TYPE_LEVEL_LOW |IRQ_TYPE_LEVEL_HIGH )) + flags |=IRQ_LEVEL ;/* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */ - desc->status &= ~IRQ_TYPE_SENSE_MASK ; - desc->status |= flags &IRQ_TYPE_SENSE_MASK ; + desc->status &= ~(IRQ_LEVEL |IRQ_TYPE_SENSE_MASK ); + desc->status |= flags; }return ret;
@@ -421,7 +423,8 @@ __setup_irq(unsigned int irq, struct irq/* Setup the type (level, edge polarity) if configured: */ if (new->flags &IRQF_TRIGGER_MASK ) { - ret =__irq_set_trigger (desc, irq, new->flags); + ret =__irq_set_trigger (desc, irq, + new->flags &IRQF_TRIGGER_MASK );if (ret) {spin_unlock_irqrestore (&desc->lock, flags);