On Tue, Mar 05, 2019 at 06:54:34PM +0100, Wolfram Sang wrote: > When sending with DMA, the driver transfers the first byte with PIO (as > documented). However, it started DMA right after the first byte was > written. This worked, but was not according to the datasheet which > suggests to wait until data register was empty again. Implement this. > > Signed-off-by: Wolfram Sang <wsa+renesas@xxxxxxxxxxxxxxxxxxxx> Reviewed-by: Simon Horman <horms+renesas@xxxxxxxxxxxx> > --- > drivers/i2c/busses/i2c-rcar.c | 11 ++++------- > 1 file changed, 4 insertions(+), 7 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c > index 7e009febe97f..63286b3cc69b 100644 > --- a/drivers/i2c/busses/i2c-rcar.c > +++ b/drivers/i2c/busses/i2c-rcar.c > @@ -480,6 +480,10 @@ static void rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr) > if (!(msr & MDE)) > return; > > + /* Check if DMA can be enabled and take over */ > + if (priv->pos == 1 && rcar_i2c_dma(priv)) > + return; > + > if (priv->pos < msg->len) { > /* > * Prepare next data to ICRXTX register. > @@ -490,13 +494,6 @@ static void rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr) > */ > rcar_i2c_write(priv, ICRXTX, msg->buf[priv->pos]); > priv->pos++; > - > - /* > - * Try to use DMA to transmit the rest of the data if > - * address transfer phase just finished. > - */ > - if (msr & MAT) > - rcar_i2c_dma(priv); > } else { > /* > * The last data was pushed to ICRXTX on _PREV_ empty irq. > -- > 2.11.0 >