diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-pnx.c')
| -rw-r--r-- | drivers/i2c/busses/i2c-pnx.c | 9 | 
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c index 9532dee6b58..a97e3fec814 100644 --- a/drivers/i2c/busses/i2c-pnx.c +++ b/drivers/i2c/busses/i2c-pnx.c @@ -22,6 +22,7 @@  #include <linux/io.h>  #include <linux/err.h>  #include <linux/clk.h> +#include <linux/slab.h>  #include <mach/hardware.h>  #include <mach/i2c.h> @@ -172,6 +173,9 @@ static int i2c_pnx_master_xmit(struct i2c_pnx_algo_data *alg_data)  		/* We still have something to talk about... */  		val = *alg_data->mif.buf++; +		if (alg_data->mif.len == 1) +			val |= stop_bit; +  		alg_data->mif.len--;  		iowrite32(val, I2C_REG_TX(alg_data)); @@ -245,6 +249,9 @@ static int i2c_pnx_master_rcv(struct i2c_pnx_algo_data *alg_data)  			__func__);  		if (alg_data->mif.len == 1) { +			/* Last byte, do not acknowledge next rcv. */ +			val |= stop_bit; +  			/*  			 * Enable interrupt RFDAIE (data in Rx fifo),  			 * and disable DRMIE (need data for Tx) @@ -632,6 +639,8 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)  	 */  	tmp = ((freq / 1000) / I2C_PNX_SPEED_KHZ) / 2 - 2; +	if (tmp > 0x3FF) +		tmp = 0x3FF;  	iowrite32(tmp, I2C_REG_CKH(alg_data));  	iowrite32(tmp, I2C_REG_CKL(alg_data));  |