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)  	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 | 
