diff options
Diffstat (limited to 'kernel/irq/chip.c')
| -rw-r--r-- | kernel/irq/chip.c | 35 | 
1 files changed, 24 insertions, 11 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 42ec11b2af8..b7091d5ca2f 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c @@ -359,6 +359,23 @@ static inline void mask_ack_irq(struct irq_desc *desc, int irq)  		if (desc->chip->ack)  			desc->chip->ack(irq);  	} +	desc->status |= IRQ_MASKED; +} + +static inline void mask_irq(struct irq_desc *desc, int irq) +{ +	if (desc->chip->mask) { +		desc->chip->mask(irq); +		desc->status |= IRQ_MASKED; +	} +} + +static inline void unmask_irq(struct irq_desc *desc, int irq) +{ +	if (desc->chip->unmask) { +		desc->chip->unmask(irq); +		desc->status &= ~IRQ_MASKED; +	}  }  /* @@ -484,10 +501,8 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc)  	raw_spin_lock(&desc->lock);  	desc->status &= ~IRQ_INPROGRESS; -	if (unlikely(desc->status & IRQ_ONESHOT)) -		desc->status |= IRQ_MASKED; -	else if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) -		desc->chip->unmask(irq); +	if (!(desc->status & (IRQ_DISABLED | IRQ_ONESHOT))) +		unmask_irq(desc, irq);  out_unlock:  	raw_spin_unlock(&desc->lock);  } @@ -524,8 +539,7 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)  	action = desc->action;  	if (unlikely(!action || (desc->status & IRQ_DISABLED))) {  		desc->status |= IRQ_PENDING; -		if (desc->chip->mask) -			desc->chip->mask(irq); +		mask_irq(desc, irq);  		goto out;  	} @@ -593,7 +607,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)  		irqreturn_t action_ret;  		if (unlikely(!action)) { -			desc->chip->mask(irq); +			mask_irq(desc, irq);  			goto out_unlock;  		} @@ -605,8 +619,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)  		if (unlikely((desc->status &  			       (IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) ==  			      (IRQ_PENDING | IRQ_MASKED))) { -			desc->chip->unmask(irq); -			desc->status &= ~IRQ_MASKED; +			unmask_irq(desc, irq);  		}  		desc->status &= ~IRQ_PENDING; @@ -716,7 +729,7 @@ set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,  	__set_irq_handler(irq, handle, 0, name);  } -void __init set_irq_noprobe(unsigned int irq) +void set_irq_noprobe(unsigned int irq)  {  	struct irq_desc *desc = irq_to_desc(irq);  	unsigned long flags; @@ -731,7 +744,7 @@ void __init set_irq_noprobe(unsigned int irq)  	raw_spin_unlock_irqrestore(&desc->lock, flags);  } -void __init set_irq_probe(unsigned int irq) +void set_irq_probe(unsigned int irq)  {  	struct irq_desc *desc = irq_to_desc(irq);  	unsigned long flags;  |