|
@@ -269,7 +269,8 @@ handled:
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
|
-static void uniphier_fi2c_tx_init(struct uniphier_fi2c_priv *priv, u16 addr)
|
|
|
+static void uniphier_fi2c_tx_init(struct uniphier_fi2c_priv *priv, u16 addr,
|
|
|
+ bool repeat)
|
|
|
{
|
|
|
priv->enabled_irqs |= UNIPHIER_FI2C_INT_TE;
|
|
|
uniphier_fi2c_set_irqs(priv);
|
|
@@ -279,8 +280,12 @@ static void uniphier_fi2c_tx_init(struct uniphier_fi2c_priv *priv, u16 addr)
|
|
|
/* set slave address */
|
|
|
writel(UNIPHIER_FI2C_DTTX_CMD | addr << 1,
|
|
|
priv->membase + UNIPHIER_FI2C_DTTX);
|
|
|
- /* first chunk of data */
|
|
|
- uniphier_fi2c_fill_txfifo(priv, true);
|
|
|
+ /*
|
|
|
+ * First chunk of data. For a repeated START condition, do not write
|
|
|
+ * data to the TX fifo here to avoid the timing issue.
|
|
|
+ */
|
|
|
+ if (!repeat)
|
|
|
+ uniphier_fi2c_fill_txfifo(priv, true);
|
|
|
}
|
|
|
|
|
|
static void uniphier_fi2c_rx_init(struct uniphier_fi2c_priv *priv, u16 addr)
|
|
@@ -361,7 +366,7 @@ static int uniphier_fi2c_master_xfer_one(struct i2c_adapter *adap,
|
|
|
if (is_read)
|
|
|
uniphier_fi2c_rx_init(priv, msg->addr);
|
|
|
else
|
|
|
- uniphier_fi2c_tx_init(priv, msg->addr);
|
|
|
+ uniphier_fi2c_tx_init(priv, msg->addr, repeat);
|
|
|
|
|
|
dev_dbg(&adap->dev, "start condition\n");
|
|
|
/*
|