Hi Raphaël Poggi,

On 08/04/2014 05:29 PM, Bo Shen wrote:
Hi Raphaël Poggi,

On 08/04/2014 05:22 PM, Raphaël Poggi wrote:
Hi,

I have tested it on a custom board which use a sam9m10 and it
worked... Tell me more when we have found something suspicious.

I tested on sama5d3xek with qt1070 connect to i2c, and the i2c host
register successfully, however can not access qt1070, if I use i2c-gpio
driver, it works well.

I am still working on it, if any news, I will let you know.

I have re-write the interrupt function as the enclosed patch. Then, the i2c host driver works properly.

Can you help test it also on your board?

Thanks.

Best Regards,
Bo Shen

Thanks for your test.

Raphaël Poggi


Best Regards,
Bo Shen
>From 1dd3da701f15d360b5432c9d2eb6e5ca1e5368ad Mon Sep 17 00:00:00 2001
From: Bo Shen <voice.s...@atmel.com>
Date: Tue, 5 Aug 2014 14:41:31 +0800
Subject: [PATCH] I2C: at91: fix the method for interrupt

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 944a8b3..8e3afe6 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.8.5.2

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

Reply via email to