From c8dea0828406aae31c7693843f3527d8523600af Mon Sep 17 00:00:00 2001 From: Benjamin Herrenschmidt Date: Wed, 18 Apr 2012 22:16:48 +0000 Subject: [PATCH] --- yaml --- r: 299587 b: refs/heads/master c: 3027691e58bfb21f6ea2e9f1d225d11b4e2b20e2 h: refs/heads/master i: 299585: 57a0b0a4ff5b53987afd9a7e1073dac1014af5e2 299583: 1edab614748caf8155951999217be890a71cabc9 v: v3 --- [refs] | 2 +- trunk/arch/powerpc/platforms/powermac/low_i2c.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 3ba0e9a1eed1..892d9decef51 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2ef822c55371b20548d4f58193c580407a5d738d +refs/heads/master: 3027691e58bfb21f6ea2e9f1d225d11b4e2b20e2 diff --git a/trunk/arch/powerpc/platforms/powermac/low_i2c.c b/trunk/arch/powerpc/platforms/powermac/low_i2c.c index 996c5ff7824b..03685a329d7d 100644 --- a/trunk/arch/powerpc/platforms/powermac/low_i2c.c +++ b/trunk/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); }