From: Bo Shen <voice.s...@atmel.com>

As the i2c-at91 driver won't work in the interrupt mode,
so need to poll the interrupts.

Signed-off-by: Bo Shen <voice.s...@atmel.com>
---
 drivers/i2c/busses/i2c-at91.c |   38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
index 651cfc7..e62f1db 100644
--- a/drivers/i2c/busses/i2c-at91.c
+++ b/drivers/i2c/busses/i2c-at91.c
@@ -174,24 +174,32 @@ static void at91_twi_read_next_byte(struct at91_twi_dev 
*dev)
 static int at91_twi_wait_completion(struct at91_twi_dev *dev)
 {
        uint64_t start = get_time_ns();
-       unsigned int status = at91_twi_read(dev, AT91_TWI_SR);
-       unsigned int irqstatus = at91_twi_read(dev, AT91_TWI_IMR);
+       unsigned int status;
+       unsigned int irqstatus;
+
+       do {
+               status = at91_twi_read(dev, AT91_TWI_SR);
+               irqstatus = at91_twi_read(dev, AT91_TWI_IMR);
+
+               if (!(status & irqstatus)) {
+                       if (is_timeout(start, AT91_I2C_TIMEOUT)) {
+                               dev_warn(&dev->adapter.dev, "timeout waiting 
for bus ready\n");
+                               return -ETIMEDOUT;
+                       } else {
+                               continue;
+                       }
+               }
 
-       if (irqstatus & AT91_TWI_RXRDY)
-               at91_twi_read_next_byte(dev);
-       else if (irqstatus & AT91_TWI_TXRDY)
-               at91_twi_write_next_byte(dev);
-       else
-               dev_warn(&dev->adapter.dev, "neither rx and tx are ready\n");
+               if (irqstatus & AT91_TWI_RXRDY)
+                       at91_twi_read_next_byte(dev);
+               else if (irqstatus & AT91_TWI_TXRDY)
+                       at91_twi_write_next_byte(dev);
+               else
+                       dev_warn(&dev->adapter.dev, "neither rx and tx are 
ready\n");
 
-       dev->transfer_status |= status;
+               dev->transfer_status |= status;
 
-       while (!(at91_twi_read(dev, AT91_TWI_SR) & AT91_TWI_TXCOMP)) {
-               if (is_timeout(start, AT91_I2C_TIMEOUT)) {
-                       dev_warn(&dev->adapter.dev, "timeout waiting for bus 
ready\n");
-                       return -ETIMEDOUT;
-               }
-       }
+       } while (!(at91_twi_read(dev, AT91_TWI_SR) & AT91_TWI_TXCOMP));
 
        at91_disable_twi_interrupts(dev);
 
-- 
1.7.9.5


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to