|
@@ -143,9 +143,10 @@ static void uniphier_fi2c_set_irqs(struct uniphier_fi2c_priv *priv)
|
|
|
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)
|
|
@@ -172,6 +173,8 @@ static irqreturn_t uniphier_fi2c_interrupt(int irq, void *dev_id)
|
|
|
"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;
|
|
|
|
|
@@ -250,8 +253,6 @@ complete:
|
|
|
}
|
|
|
|
|
|
handled:
|
|
|
- uniphier_fi2c_clear_irqs(priv);
|
|
|
-
|
|
|
spin_unlock(&priv->lock);
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
@@ -340,7 +341,7 @@ static int uniphier_fi2c_master_xfer_one(struct i2c_adapter *adap,
|
|
|
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 */
|
|
|
|