Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2b662da authored by David Brownell's avatar David Brownell Committed by Ingo Molnar
Browse files

genirq: record IRQ_LEVEL in irq_desc[]



Impact: fix __irq_set_trigger() for IRQ_LEVEL

When recording the irq trigger type, let's also make sure
that IRQ_LEVEL gets set correctly.

Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Acked-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 061e41fd
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -124,6 +124,7 @@ int set_irq_type(unsigned int irq, unsigned int type)
		return -ENODEV;
		return -ENODEV;
	}
	}


	type &= IRQ_TYPE_SENSE_MASK;
	if (type == IRQ_TYPE_NONE)
	if (type == IRQ_TYPE_NONE)
		return 0;
		return 0;


+9 −6
Original line number Original line Diff line number Diff line
@@ -370,16 +370,18 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
		return 0;
		return 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)
	if (ret)
		pr_err("setting trigger mode %d for irq %u failed (%pF)\n",
		pr_err("setting trigger mode %d for irq %u failed (%pF)\n",
				(int)(flags & IRQF_TRIGGER_MASK),
				(int)flags, irq, chip->set_type);
				irq, chip->set_type);
	else {
	else {
		if (flags & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
			flags |= IRQ_LEVEL;
		/* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */
		/* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */
		desc->status &= ~IRQ_TYPE_SENSE_MASK;
		desc->status &= ~(IRQ_LEVEL | IRQ_TYPE_SENSE_MASK);
		desc->status |= flags & IRQ_TYPE_SENSE_MASK;
		desc->status |= flags;
	}
	}


	return ret;
	return ret;
@@ -459,7 +461,8 @@ __setup_irq(unsigned int irq, struct irq_desc * desc, struct irqaction *new)


		/* Setup the type (level, edge polarity) if configured: */
		/* Setup the type (level, edge polarity) if configured: */
		if (new->flags & IRQF_TRIGGER_MASK) {
		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) {
			if (ret) {
				spin_unlock_irqrestore(&desc->lock, flags);
				spin_unlock_irqrestore(&desc->lock, flags);