|
@@ -420,10 +420,14 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy)
|
|
return -EAGAIN;
|
|
return -EAGAIN;
|
|
}
|
|
}
|
|
|
|
|
|
- if (for_busy && (temp & I2SR_IBB))
|
|
|
|
|
|
+ if (for_busy && (temp & I2SR_IBB)) {
|
|
|
|
+ i2c_imx->stopped = 0;
|
|
break;
|
|
break;
|
|
- if (!for_busy && !(temp & I2SR_IBB))
|
|
|
|
|
|
+ }
|
|
|
|
+ if (!for_busy && !(temp & I2SR_IBB)) {
|
|
|
|
+ i2c_imx->stopped = 1;
|
|
break;
|
|
break;
|
|
|
|
+ }
|
|
if (time_after(jiffies, orig_jiffies + msecs_to_jiffies(500))) {
|
|
if (time_after(jiffies, orig_jiffies + msecs_to_jiffies(500))) {
|
|
dev_dbg(&i2c_imx->adapter.dev,
|
|
dev_dbg(&i2c_imx->adapter.dev,
|
|
"<%s> I2C bus is busy\n", __func__);
|
|
"<%s> I2C bus is busy\n", __func__);
|
|
@@ -537,7 +541,6 @@ static int i2c_imx_start(struct imx_i2c_struct *i2c_imx)
|
|
result = i2c_imx_bus_busy(i2c_imx, 1);
|
|
result = i2c_imx_bus_busy(i2c_imx, 1);
|
|
if (result)
|
|
if (result)
|
|
return result;
|
|
return result;
|
|
- i2c_imx->stopped = 0;
|
|
|
|
|
|
|
|
temp |= I2CR_IIEN | I2CR_MTX | I2CR_TXAK;
|
|
temp |= I2CR_IIEN | I2CR_MTX | I2CR_TXAK;
|
|
temp &= ~I2CR_DMAEN;
|
|
temp &= ~I2CR_DMAEN;
|
|
@@ -566,10 +569,8 @@ static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx)
|
|
udelay(i2c_imx->disable_delay);
|
|
udelay(i2c_imx->disable_delay);
|
|
}
|
|
}
|
|
|
|
|
|
- if (!i2c_imx->stopped) {
|
|
|
|
|
|
+ if (!i2c_imx->stopped)
|
|
i2c_imx_bus_busy(i2c_imx, 0);
|
|
i2c_imx_bus_busy(i2c_imx, 0);
|
|
- i2c_imx->stopped = 1;
|
|
|
|
- }
|
|
|
|
|
|
|
|
/* Disable I2C controller */
|
|
/* Disable I2C controller */
|
|
temp = i2c_imx->hwdata->i2cr_ien_opcode ^ I2CR_IEN,
|
|
temp = i2c_imx->hwdata->i2cr_ien_opcode ^ I2CR_IEN,
|
|
@@ -725,7 +726,6 @@ static int i2c_imx_dma_read(struct imx_i2c_struct *i2c_imx,
|
|
temp &= ~(I2CR_MSTA | I2CR_MTX);
|
|
temp &= ~(I2CR_MSTA | I2CR_MTX);
|
|
imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
|
|
imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
|
|
i2c_imx_bus_busy(i2c_imx, 0);
|
|
i2c_imx_bus_busy(i2c_imx, 0);
|
|
- i2c_imx->stopped = 1;
|
|
|
|
} else {
|
|
} else {
|
|
/*
|
|
/*
|
|
* For i2c master receiver repeat restart operation like:
|
|
* For i2c master receiver repeat restart operation like:
|
|
@@ -851,7 +851,6 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs, bo
|
|
temp &= ~(I2CR_MSTA | I2CR_MTX);
|
|
temp &= ~(I2CR_MSTA | I2CR_MTX);
|
|
imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
|
|
imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
|
|
i2c_imx_bus_busy(i2c_imx, 0);
|
|
i2c_imx_bus_busy(i2c_imx, 0);
|
|
- i2c_imx->stopped = 1;
|
|
|
|
} else {
|
|
} else {
|
|
/*
|
|
/*
|
|
* For i2c master receiver repeat restart operation like:
|
|
* For i2c master receiver repeat restart operation like:
|