i2c: rcar: wait for data empty before starting DMA
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Tue, 5 Mar 2019 17:54:34 +0000 (18:54 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Wed, 20 Mar 2019 17:19:20 +0000 (18:19 +0100)
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@sang-engineering.com>
Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-rcar.c

index b0d85f5957d4ddbae6e48b810174b9230e1343bd..d39a4606f72d3d7849d2727a4f83cad298bd58e3 100644 (file)
@@ -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.