This reverts part of commit 8b232558f1050f016737cb38d2bf5e950bf33819. If a signal terminates a write transfer the bus would lock up and the next read or write would give "timeout waiting for bus ready."
Signed-off-by: Troy Kisky <[EMAIL PROTECTED]> --- drivers/i2c/busses/i2c-davinci.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index 1f492a9..120f466 100755 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -388,6 +388,15 @@ static inline void terminate_read(struct davinci_i2c_dev *dev) if (!dev->terminate) dev_err(dev->dev, "RDR IRQ while no data requested\n"); } +static inline void terminate_write(struct davinci_i2c_dev *dev) +{ + u16 w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); + w |= DAVINCI_I2C_MDR_RM|DAVINCI_I2C_MDR_STP; + davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); + + if (!dev->terminate) + dev_err(dev->dev, "TDR IRQ while no data to send\n"); +} /* * Interrupt service routine. This gets called whenever an I2C interrupt @@ -467,6 +476,9 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, w); + } else { + /* signal can terminate transfer */ + terminate_write(dev); } break; -- 1.5.4 _______________________________________________ Davinci-linux-open-source mailing list Davinci-linux-open-source@linux.davincidsp.com http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source