diff options
Diffstat (limited to 'kernel/irq/autoprobe.c')
| -rw-r--r-- | kernel/irq/autoprobe.c | 43 | 
1 files changed, 16 insertions, 27 deletions
diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c index 533068cfb60..cc0f7321b8c 100644 --- a/kernel/irq/autoprobe.c +++ b/kernel/irq/autoprobe.c @@ -30,17 +30,16 @@ static DEFINE_MUTEX(probing_active);  unsigned long probe_irq_on(void)  {  	struct irq_desc *desc; -	unsigned long mask; -	unsigned int i; +	unsigned long mask = 0; +	unsigned int status; +	int i;  	mutex_lock(&probing_active);  	/*  	 * something may have generated an irq long ago and we want to  	 * flush such a longstanding irq before considering it as spurious.  	 */ -	for (i = NR_IRQS-1; i > 0; i--) { -		desc = irq_desc + i; - +	for_each_irq_desc_reverse(i, desc) {  		spin_lock_irq(&desc->lock);  		if (!desc->action && !(desc->status & IRQ_NOPROBE)) {  			/* @@ -68,9 +67,7 @@ unsigned long probe_irq_on(void)  	 * (we must startup again here because if a longstanding irq  	 * happened in the previous stage, it may have masked itself)  	 */ -	for (i = NR_IRQS-1; i > 0; i--) { -		desc = irq_desc + i; - +	for_each_irq_desc_reverse(i, desc) {  		spin_lock_irq(&desc->lock);  		if (!desc->action && !(desc->status & IRQ_NOPROBE)) {  			desc->status |= IRQ_AUTODETECT | IRQ_WAITING; @@ -88,11 +85,7 @@ unsigned long probe_irq_on(void)  	/*  	 * Now filter out any obviously spurious interrupts  	 */ -	mask = 0; -	for (i = 0; i < NR_IRQS; i++) { -		unsigned int status; - -		desc = irq_desc + i; +	for_each_irq_desc(i, desc) {  		spin_lock_irq(&desc->lock);  		status = desc->status; @@ -126,14 +119,11 @@ EXPORT_SYMBOL(probe_irq_on);   */  unsigned int probe_irq_mask(unsigned long val)  { -	unsigned int mask; +	unsigned int status, mask = 0; +	struct irq_desc *desc;  	int i; -	mask = 0; -	for (i = 0; i < NR_IRQS; i++) { -		struct irq_desc *desc = irq_desc + i; -		unsigned int status; - +	for_each_irq_desc(i, desc) {  		spin_lock_irq(&desc->lock);  		status = desc->status; @@ -171,20 +161,19 @@ EXPORT_SYMBOL(probe_irq_mask);   */  int probe_irq_off(unsigned long val)  { -	int i, irq_found = 0, nr_irqs = 0; - -	for (i = 0; i < NR_IRQS; i++) { -		struct irq_desc *desc = irq_desc + i; -		unsigned int status; +	int i, irq_found = 0, nr_of_irqs = 0; +	struct irq_desc *desc; +	unsigned int status; +	for_each_irq_desc(i, desc) {  		spin_lock_irq(&desc->lock);  		status = desc->status;  		if (status & IRQ_AUTODETECT) {  			if (!(status & IRQ_WAITING)) { -				if (!nr_irqs) +				if (!nr_of_irqs)  					irq_found = i; -				nr_irqs++; +				nr_of_irqs++;  			}  			desc->status = status & ~IRQ_AUTODETECT;  			desc->chip->shutdown(i); @@ -193,7 +182,7 @@ int probe_irq_off(unsigned long val)  	}  	mutex_unlock(&probing_active); -	if (nr_irqs > 1) +	if (nr_of_irqs > 1)  		irq_found = -irq_found;  	return irq_found;  |