i2c: uniphier-f: fill TX-FIFO only in IRQ handler for repeated START
- For a repeated START condition, this controller starts data transfer immediately after the slave address is written to the TX-FIFO. - Once the TX-FIFO empty interrupt is asserted, the controller makes a pause even if additional data are written to the TX-FIFO. Given those circumstances, the data after a repeated START may not be transferred if the interrupt is asserted while the TX-FIFO is being filled up. A more reliable way is to append TX data only in the interrupt handler. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
parent
c2a653deaa
commit
cd8843f541
|
@ -269,7 +269,8 @@ handled:
|
||||||
return IRQ_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;
|
priv->enabled_irqs |= UNIPHIER_FI2C_INT_TE;
|
||||||
uniphier_fi2c_set_irqs(priv);
|
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 */
|
/* set slave address */
|
||||||
writel(UNIPHIER_FI2C_DTTX_CMD | addr << 1,
|
writel(UNIPHIER_FI2C_DTTX_CMD | addr << 1,
|
||||||
priv->membase + UNIPHIER_FI2C_DTTX);
|
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)
|
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)
|
if (is_read)
|
||||||
uniphier_fi2c_rx_init(priv, msg->addr);
|
uniphier_fi2c_rx_init(priv, msg->addr);
|
||||||
else
|
else
|
||||||
uniphier_fi2c_tx_init(priv, msg->addr);
|
uniphier_fi2c_tx_init(priv, msg->addr, repeat);
|
||||||
|
|
||||||
dev_dbg(&adap->dev, "start condition\n");
|
dev_dbg(&adap->dev, "start condition\n");
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue