diff options
Diffstat (limited to 'arch/powerpc/platforms/powermac/low_i2c.c')
| -rw-r--r-- | arch/powerpc/platforms/powermac/low_i2c.c | 9 | 
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/powermac/low_i2c.c b/arch/powerpc/platforms/powermac/low_i2c.c index 996c5ff7824..03685a329d7 100644 --- a/arch/powerpc/platforms/powermac/low_i2c.c +++ b/arch/powerpc/platforms/powermac/low_i2c.c @@ -366,11 +366,20 @@ static void kw_i2c_timeout(unsigned long data)  	unsigned long flags;  	spin_lock_irqsave(&host->lock, flags); + +	/* +	 * If the timer is pending, that means we raced with the +	 * irq, in which case we just return +	 */ +	if (timer_pending(&host->timeout_timer)) +		goto skip; +  	kw_i2c_handle_interrupt(host, kw_read_reg(reg_isr));  	if (host->state != state_idle) {  		host->timeout_timer.expires = jiffies + KW_POLL_TIMEOUT;  		add_timer(&host->timeout_timer);  	} + skip:  	spin_unlock_irqrestore(&host->lock, flags);  }  |