Re: [PATCH 1/7] i2c: img-scb: support I2C_M_IGNORE_NAK

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 27/07/15 12:55, Sifan Naeem wrote:
> This commit adds support for the I2C_M_IGNORE_NAK protocol
> modification.
> 
> Such behaviour can only be implemented in atomic mode. So, if a
> transaction contains a message with such flag the drivers
> switches to atomic mode. The implementation consists simply in
> treating NAKs as ACKs.
> 
> Signed-off-by: Sifan Naeem <sifan.naeem@xxxxxxxxxx>

Looks good,

Acked-by: James Hogan <james.hogan@xxxxxxxxxx>

Thanks!
James

> ---
>  drivers/i2c/busses/i2c-img-scb.c |   15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-img-scb.c b/drivers/i2c/busses/i2c-img-scb.c
> index 07a039c..31cd8c3 100644
> --- a/drivers/i2c/busses/i2c-img-scb.c
> +++ b/drivers/i2c/busses/i2c-img-scb.c
> @@ -767,7 +767,9 @@ static unsigned int img_i2c_atomic(struct img_i2c *i2c,
>  			next_cmd = CMD_RET_ACK;
>  		break;
>  	case CMD_RET_ACK:
> -		if (i2c->line_status & LINESTAT_ACK_DET) {
> +		if (i2c->line_status & LINESTAT_ACK_DET ||
> +		    (i2c->line_status & LINESTAT_NACK_DET &&
> +		    i2c->msg.flags & I2C_M_IGNORE_NAK)) {
>  			if (i2c->msg.len == 0) {
>  				next_cmd = CMD_GEN_STOP;
>  			} else if (i2c->msg.flags & I2C_M_RD) {
> @@ -1042,20 +1044,23 @@ static int img_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
>  		return -EIO;
>  
>  	for (i = 0; i < num; i++) {
> -		if (likely(msgs[i].len))
> -			continue;
>  		/*
>  		 * 0 byte reads are not possible because the slave could try
>  		 * and pull the data line low, preventing a stop bit.
>  		 */
> -		if (unlikely(msgs[i].flags & I2C_M_RD))
> +		if (!msgs[i].len && msgs[i].flags & I2C_M_RD)
>  			return -EIO;
>  		/*
>  		 * 0 byte writes are possible and used for probing, but we
>  		 * cannot do them in automatic mode, so use atomic mode
>  		 * instead.
> +		 *
> +		 * Also, the I2C_M_IGNORE_NAK mode can only be implemented
> +		 * in atomic mode.
>  		 */
> -		atomic = true;
> +		if (!msgs[i].len ||
> +		    (msgs[i].flags & I2C_M_IGNORE_NAK))
> +			atomic = true;
>  	}
>  
>  	ret = clk_prepare_enable(i2c->scb_clk);
> 

Attachment: signature.asc
Description: OpenPGP digital signature


[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux