|
@@ -532,6 +532,7 @@ static void xiic_start_recv(struct xiic_i2c *i2c)
|
|
|
{
|
|
|
u8 rx_watermark;
|
|
|
struct i2c_msg *msg = i2c->rx_msg = i2c->tx_msg;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
/* Clear and enable Rx full interrupt. */
|
|
|
xiic_irq_clr_en(i2c, XIIC_INTR_RX_FULL_MASK | XIIC_INTR_TX_ERROR_MASK);
|
|
@@ -547,6 +548,7 @@ static void xiic_start_recv(struct xiic_i2c *i2c)
|
|
|
rx_watermark = IIC_RX_FIFO_DEPTH;
|
|
|
xiic_setreg8(i2c, XIIC_RFD_REG_OFFSET, rx_watermark - 1);
|
|
|
|
|
|
+ local_irq_save(flags);
|
|
|
if (!(msg->flags & I2C_M_NOSTART))
|
|
|
/* write the address */
|
|
|
xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET,
|
|
@@ -556,6 +558,8 @@ static void xiic_start_recv(struct xiic_i2c *i2c)
|
|
|
|
|
|
xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET,
|
|
|
msg->len | ((i2c->nmsgs == 1) ? XIIC_TX_DYN_STOP_MASK : 0));
|
|
|
+ local_irq_restore(flags);
|
|
|
+
|
|
|
if (i2c->nmsgs == 1)
|
|
|
/* very last, enable bus not busy as well */
|
|
|
xiic_irq_clr_en(i2c, XIIC_INTR_BNB_MASK);
|