[PATCH v1 1/2] i2c: microchip: fix ack sending logic

Padmarao.Begari at microchip.com Padmarao.Begari at microchip.com
Fri Oct 28 06:44:39 CEST 2022


> On Wed, 2022-10-26 at 08:49 +0100, Conor Dooley wrote:
> "Master receive mode" was not correctly sending ACKs/NACKs in the
> interrupt handler. Bring the handling of M_SLAR_ACK, M_RX_DATA_ACKED
> &
> M_RX_DATA_NACKED in line with the Linux driver.
> 
> Fixes: 0dc0d1e094 ("i2c: Add Microchip PolarFire SoC I2C driver")
> Reported-by: Shravan Chippa <shravan.chippa at microchip.com>
> Signed-off-by: Conor Dooley <conor.dooley at microchip.com>
> ---
>  drivers/i2c/i2c-microchip.c | 23 +++++++++++++++++------
>  1 file changed, 17 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/i2c/i2c-microchip.c b/drivers/i2c/i2c-
> microchip.c
> index 12f65d0af7..3a27459386 100644
> --- a/drivers/i2c/i2c-microchip.c
> +++ b/drivers/i2c/i2c-microchip.c
> @@ -2,8 +2,9 @@
>  /*
>   * Microchip I2C controller driver
>   *
> - * Copyright (C) 2021 Microchip Technology Inc.
> + * Copyright (C) 2021-2022 Microchip Technology Inc.
>   * Padmarao Begari <padmarao.begari at microchip.com>
> + * Conor Dooley <conor.dooley at microchip.com>
>   */
>  #include <common.h>
>  #include <clk.h>
> @@ -265,16 +266,27 @@ static int mpfs_i2c_service_handler(struct
> mpfs_i2c_bus *bus)
>  		}
>  		break;
>  	case STATUS_M_SLAR_ACK:
> -		ctrl = readl(bus->base + MPFS_I2C_CTRL);
> -		ctrl |= CTRL_AA;
> -		writel(ctrl, bus->base + MPFS_I2C_CTRL);
> -		if (bus->msg_len == 0) {
> +		if (bus->msg_len > 1u) {
> +			ctrl = readl(bus->base + MPFS_I2C_CTRL);
> +			ctrl |= CTRL_AA;
> +			writel(ctrl, bus->base + MPFS_I2C_CTRL);
> +		} else if (bus->msg_len == 1u) {
> +			ctrl = readl(bus->base + MPFS_I2C_CTRL);
> +			ctrl &= ~CTRL_AA;
> +			writel(ctrl, bus->base + MPFS_I2C_CTRL);
> +		} else {
> +			ctrl = readl(bus->base + MPFS_I2C_CTRL);
> +			ctrl |= CTRL_AA;
> +			writel(ctrl, bus->base + MPFS_I2C_CTRL);
>  			/* On the last byte to be transmitted, send
> STOP */
>  			mpfs_i2c_stop(bus);
>  			finish = true;
>  		}
>  		break;
>  	case STATUS_M_RX_DATA_ACKED:
> +		mpfs_i2c_empty_rx(bus);
> +		break;
> +	case STATUS_M_RX_DATA_NACKED:
>  		mpfs_i2c_empty_rx(bus);
>  		if (bus->msg_len == 0) {
>  			/* On the last byte to be transmitted, send
> STOP */
> @@ -283,7 +295,6 @@ static int mpfs_i2c_service_handler(struct
> mpfs_i2c_bus *bus)
>  		}
>  		break;
>  	case STATUS_M_TX_DATA_NACK:
> -	case STATUS_M_RX_DATA_NACKED:
>  	case STATUS_M_SLAR_NACK:
>  	case STATUS_M_SLAW_NACK:
>  		bus->msg_err = -ENXIO;

Reviewed-by: Padmarao Begari <padmarao.begari at microchip.com>


More information about the U-Boot mailing list