|
@@ -367,18 +367,15 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
|
|
|
|
|
|
msr = rcar_i2c_read(priv, ICMSR);
|
|
|
|
|
|
+ /* Only handle interrupts that are currently enabled */
|
|
|
+ msr &= rcar_i2c_read(priv, ICMIER);
|
|
|
+
|
|
|
/* Arbitration lost */
|
|
|
if (msr & MAL) {
|
|
|
rcar_i2c_flags_set(priv, (ID_DONE | ID_ARBLOST));
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- /* Stop */
|
|
|
- if (msr & MST) {
|
|
|
- rcar_i2c_flags_set(priv, ID_DONE);
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
/* Nack */
|
|
|
if (msr & MNR) {
|
|
|
/* go to stop phase */
|
|
@@ -388,6 +385,12 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ /* Stop */
|
|
|
+ if (msr & MST) {
|
|
|
+ rcar_i2c_flags_set(priv, ID_DONE);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
if (rcar_i2c_is_recv(priv))
|
|
|
rcar_i2c_flags_set(priv, rcar_i2c_irq_recv(priv, msr));
|
|
|
else
|