diff options
| author | Ludovic Desroches <ludovic.desroches@atmel.com> | 2013-03-08 16:13:57 +0100 | 
|---|---|---|
| committer | Nicolas Ferre <nicolas.ferre@atmel.com> | 2013-03-14 09:37:55 +0100 | 
| commit | 0ed66befaae893e82c9f016238282d73ef9fd6c7 (patch) | |
| tree | 677434530e882dbbe208be30aa0d3edefe8a6ab8 | |
| parent | 647f8d94a4e69d39e88a617846755655853c20f5 (diff) | |
| download | olio-linux-3.10-0ed66befaae893e82c9f016238282d73ef9fd6c7.tar.xz olio-linux-3.10-0ed66befaae893e82c9f016238282d73ef9fd6c7.zip  | |
ARM: at91: fix infinite loop in at91_irq_suspend/resume
Fix an infinite loop when suspending or resuming a device with AIC5.
Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
Acked-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
| -rw-r--r-- | arch/arm/mach-at91/irq.c | 20 | 
1 files changed, 8 insertions, 12 deletions
diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c index 8e210262aee..e0ca5917102 100644 --- a/arch/arm/mach-at91/irq.c +++ b/arch/arm/mach-at91/irq.c @@ -92,23 +92,21 @@ static int at91_aic_set_wake(struct irq_data *d, unsigned value)  void at91_irq_suspend(void)  { -	int i = 0, bit; +	int bit = -1;  	if (has_aic5()) {  		/* disable enabled irqs */ -		while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) { +		while ((bit = find_next_bit(backups, n_irqs, bit + 1)) < n_irqs) {  			at91_aic_write(AT91_AIC5_SSR,  				       bit & AT91_AIC5_INTSEL_MSK);  			at91_aic_write(AT91_AIC5_IDCR, 1); -			i = bit;  		}  		/* enable wakeup irqs */ -		i = 0; -		while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) { +		bit = -1; +		while ((bit = find_next_bit(wakeups, n_irqs, bit + 1)) < n_irqs) {  			at91_aic_write(AT91_AIC5_SSR,  				       bit & AT91_AIC5_INTSEL_MSK);  			at91_aic_write(AT91_AIC5_IECR, 1); -			i = bit;  		}  	} else {  		at91_aic_write(AT91_AIC_IDCR, *backups); @@ -118,23 +116,21 @@ void at91_irq_suspend(void)  void at91_irq_resume(void)  { -	int i = 0, bit; +	int bit = -1;  	if (has_aic5()) {  		/* disable wakeup irqs */ -		while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) { +		while ((bit = find_next_bit(wakeups, n_irqs, bit + 1)) < n_irqs) {  			at91_aic_write(AT91_AIC5_SSR,  				       bit & AT91_AIC5_INTSEL_MSK);  			at91_aic_write(AT91_AIC5_IDCR, 1); -			i = bit;  		}  		/* enable irqs disabled for suspend */ -		i = 0; -		while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) { +		bit = -1; +		while ((bit = find_next_bit(backups, n_irqs, bit + 1)) < n_irqs) {  			at91_aic_write(AT91_AIC5_SSR,  				       bit & AT91_AIC5_INTSEL_MSK);  			at91_aic_write(AT91_AIC5_IECR, 1); -			i = bit;  		}  	} else {  		at91_aic_write(AT91_AIC_IDCR, *wakeups);  |