Commit dd42c7b7 authored by Alexander Kochetkov's avatar Alexander Kochetkov Committed by Luis Henriques

i2c: omap: fix i207 errata handling

commit ccfc8663 upstream.

commit 6d9939f6 (i2c: omap: split out [XR]DR
and [XR]RDY) changed the way how errata i207 (I2C: RDR Flag May Be Incorrectly
Set) get handled. 6d9939f6 code doesn't correspond to workaround provided by
errata.

According to errata ISR must filter out spurious RDR before data read not after.
ISR must read RXSTAT to get number of bytes available to read. Because RDR
could be set while there could no data in the receive FIFO.

Restored pre 6d9939f6 way of handling errata.

Found by code review. Real impact haven't seen.
Tested on Beagleboard XM C.
Signed-off-by: default avatarAlexander Kochetkov <al.kochet@gmail.com>
Fixes: 6d9939f6 i2c: omap: split out [XR]DR and [XR]RDY
Tested-by: default avatarFelipe Balbi <balbi@ti.com>
Reviewed-by: default avatarFelipe Balbi <balbi@ti.com>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
parent 0dc93e01
...@@ -956,11 +956,13 @@ omap_i2c_isr_thread(int this_irq, void *dev_id) ...@@ -956,11 +956,13 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
if (dev->fifo_size) if (dev->fifo_size)
num_bytes = dev->buf_len; num_bytes = dev->buf_len;
omap_i2c_receive_data(dev, num_bytes, true); if (dev->errata & I2C_OMAP_ERRATA_I207) {
if (dev->errata & I2C_OMAP_ERRATA_I207)
i2c_omap_errata_i207(dev, stat); i2c_omap_errata_i207(dev, stat);
num_bytes = (omap_i2c_read_reg(dev,
OMAP_I2C_BUFSTAT_REG) >> 8) & 0x3F;
}
omap_i2c_receive_data(dev, num_bytes, true);
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR);
continue; continue;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment