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+rene...@sang-engineering.com>

Reviewed-by: Simon Horman <horms+rene...@verge.net.au>

> ---
>  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
> 

Reply via email to