summaryrefslogtreecommitdiffstats
path: root/drivers/i2c
diff options
context:
space:
mode:
authorBo Shen <voice.shen@atmel.com>2014-09-24 14:57:05 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2014-09-25 08:10:56 +0200
commit791ff495fbeb4185956f62c3e2eabc5a4d698674 (patch)
treee25038e4170ee0629f92b4cb442a3e5f1fe4c096 /drivers/i2c
parenta0ca2c13f60f53149e1996e1798f04112c0b986c (diff)
downloadbarebox-791ff495fbeb4185956f62c3e2eabc5a4d698674.tar.gz
barebox-791ff495fbeb4185956f62c3e2eabc5a4d698674.tar.xz
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.shen@atmel.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-at91.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
index a2236edd3c..deb4ea4f3b 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);