writel(priv->enabled_irqs, priv->membase + UNIPHIER_FI2C_IE);
 }
 
-static void uniphier_fi2c_clear_irqs(struct uniphier_fi2c_priv *priv)
+static void uniphier_fi2c_clear_irqs(struct uniphier_fi2c_priv *priv,
+                                    u32 mask)
 {
-       writel(-1, priv->membase + UNIPHIER_FI2C_IC);
+       writel(mask, priv->membase + UNIPHIER_FI2C_IC);
 }
 
 static void uniphier_fi2c_stop(struct uniphier_fi2c_priv *priv)
                "interrupt: enabled_irqs=%04x, irq_status=%04x\n",
                priv->enabled_irqs, irq_status);
 
+       uniphier_fi2c_clear_irqs(priv, irq_status);
+
        if (irq_status & UNIPHIER_FI2C_INT_STOP)
                goto complete;
 
        }
 
 handled:
-       uniphier_fi2c_clear_irqs(priv);
-
        spin_unlock(&priv->lock);
 
        return IRQ_HANDLED;
                priv->flags |= UNIPHIER_FI2C_STOP;
 
        reinit_completion(&priv->comp);
-       uniphier_fi2c_clear_irqs(priv);
+       uniphier_fi2c_clear_irqs(priv, U32_MAX);
        writel(UNIPHIER_FI2C_RST_TBRST | UNIPHIER_FI2C_RST_RBRST,
               priv->membase + UNIPHIER_FI2C_RST);      /* reset TX/RX FIFO */