예제 #1
0
void move_native_irq(int irq)
{
	struct irq_desc *desc = irq_to_desc(irq);
	int mask = 1;

	if (likely(!(desc->status & IRQ_MOVE_PENDING)))
		return;

	if (unlikely(desc->status & IRQ_DISABLED))
		return;

	/*
	 * If the irq is already in progress, it should be masked.
	 * If we unmask it, we might cause an interrupt storm on RT.
	 */
	if (unlikely((desc->status & IRQ_INPROGRESS) ||
		     desc->forced_threads_active))
		mask = 0;

	if (mask)
		desc->chip->mask(irq);
	move_masked_irq(irq);
	if (mask)
		desc->chip->unmask(irq);
}
예제 #2
0
void move_native_irq(int irq)
{
	struct irq_desc *desc = irq_to_desc(irq);

	if (likely(!(desc->status & IRQ_MOVE_PENDING)))
		return;

	if (unlikely(desc->status & IRQ_DISABLED))
		return;

	desc->chip->mask(irq);
	move_masked_irq(irq);
	desc->chip->unmask(irq);
}
예제 #3
0
void move_native_irq(int irq)
{
	struct irq_desc *desc = irq_desc + irq;

	if (likely(!(desc->status & IRQ_MOVE_PENDING)))
		return;

	if (likely(!(desc->status & IRQ_DISABLED)))
		desc->chip->disable(irq);

	move_masked_irq(irq);

	if (likely(!(desc->status & IRQ_DISABLED)))
		desc->chip->enable(irq);
}