diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/designware_i2c.c | 11 | ||||
| -rw-r--r-- | drivers/i2c/designware_i2c.h | 1 | 
2 files changed, 9 insertions, 3 deletions
| diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c index 4e4bfd4f5..eab313102 100644 --- a/drivers/i2c/designware_i2c.c +++ b/drivers/i2c/designware_i2c.c @@ -283,7 +283,10 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)  	start_time_rx = get_timer(0);  	while (len) { -		writel(IC_CMD, &i2c_regs_p->ic_cmd_data); +		if (len == 1) +			writel(IC_CMD | IC_STOP, &i2c_regs_p->ic_cmd_data); +		else +			writel(IC_CMD, &i2c_regs_p->ic_cmd_data);  		if (readl(&i2c_regs_p->ic_status) & IC_STATUS_RFNE) {  			*buffer++ = (uchar)readl(&i2c_regs_p->ic_cmd_data); @@ -322,9 +325,11 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)  	start_time_tx = get_timer(0);  	while (len) {  		if (readl(&i2c_regs_p->ic_status) & IC_STATUS_TFNF) { -			writel(*buffer, &i2c_regs_p->ic_cmd_data); +			if (--len == 0) +				writel(*buffer | IC_STOP, &i2c_regs_p->ic_cmd_data); +			else +				writel(*buffer, &i2c_regs_p->ic_cmd_data);  			buffer++; -			len--;  			start_time_tx = get_timer(0);  		} else if (get_timer(start_time_tx) > (nb * I2C_BYTE_TO)) { diff --git a/drivers/i2c/designware_i2c.h b/drivers/i2c/designware_i2c.h index 03b520ed4..e004152ac 100644 --- a/drivers/i2c/designware_i2c.h +++ b/drivers/i2c/designware_i2c.h @@ -95,6 +95,7 @@ struct i2c_regs {  /* i2c data buffer and command register definitions */  #define IC_CMD			0x0100 +#define IC_STOP			0x0200  /* i2c interrupt status register definitions */  #define IC_GEN_CALL		0x0800 |