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

Reply via email to