diff options
-rw-r--r-- | drivers/i2c/busses/i2c-rcar.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c index f3c7139dfa25..dc32f5fa75d0 100644 --- a/drivers/i2c/busses/i2c-rcar.c +++ b/drivers/i2c/busses/i2c-rcar.c | |||
@@ -367,18 +367,15 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr) | |||
367 | 367 | ||
368 | msr = rcar_i2c_read(priv, ICMSR); | 368 | msr = rcar_i2c_read(priv, ICMSR); |
369 | 369 | ||
370 | /* Only handle interrupts that are currently enabled */ | ||
371 | msr &= rcar_i2c_read(priv, ICMIER); | ||
372 | |||
370 | /* Arbitration lost */ | 373 | /* Arbitration lost */ |
371 | if (msr & MAL) { | 374 | if (msr & MAL) { |
372 | rcar_i2c_flags_set(priv, (ID_DONE | ID_ARBLOST)); | 375 | rcar_i2c_flags_set(priv, (ID_DONE | ID_ARBLOST)); |
373 | goto out; | 376 | goto out; |
374 | } | 377 | } |
375 | 378 | ||
376 | /* Stop */ | ||
377 | if (msr & MST) { | ||
378 | rcar_i2c_flags_set(priv, ID_DONE); | ||
379 | goto out; | ||
380 | } | ||
381 | |||
382 | /* Nack */ | 379 | /* Nack */ |
383 | if (msr & MNR) { | 380 | if (msr & MNR) { |
384 | /* go to stop phase */ | 381 | /* go to stop phase */ |
@@ -388,6 +385,12 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr) | |||
388 | goto out; | 385 | goto out; |
389 | } | 386 | } |
390 | 387 | ||
388 | /* Stop */ | ||
389 | if (msr & MST) { | ||
390 | rcar_i2c_flags_set(priv, ID_DONE); | ||
391 | goto out; | ||
392 | } | ||
393 | |||
391 | if (rcar_i2c_is_recv(priv)) | 394 | if (rcar_i2c_is_recv(priv)) |
392 | rcar_i2c_flags_set(priv, rcar_i2c_irq_recv(priv, msr)); | 395 | rcar_i2c_flags_set(priv, rcar_i2c_irq_recv(priv, msr)); |
393 | else | 396 | else |