Commit 429966b8 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'i2c-fixes-rc6' of git://aeryn.fluff.org.uk/bjdooks/linux

* 'i2c-fixes-rc6' of git://aeryn.fluff.org.uk/bjdooks/linux:
  i2c-stu300: I2C STU300 stability updates
  i2c-omap: Enable workaround for Errata 1.153 based on
  i2c-omap: ACK pending [R/X]DR and [R/X]RDY interrupts
  i2c-omap: Fix I2C status ACK
parents a1d12511 c37faafa
...@@ -674,7 +674,14 @@ omap_i2c_isr(int this_irq, void *dev_id) ...@@ -674,7 +674,14 @@ omap_i2c_isr(int this_irq, void *dev_id)
err = 0; err = 0;
complete: complete:
omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat); /*
* Ack the stat in one go, but [R/X]DR and [R/X]RDY should be
* acked after the data operation is complete.
* Ref: TRM SWPU114Q Figure 18-31
*/
omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat &
~(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
if (stat & OMAP_I2C_STAT_NACK) { if (stat & OMAP_I2C_STAT_NACK) {
err |= OMAP_I2C_STAT_NACK; err |= OMAP_I2C_STAT_NACK;
...@@ -687,6 +694,9 @@ omap_i2c_isr(int this_irq, void *dev_id) ...@@ -687,6 +694,9 @@ omap_i2c_isr(int this_irq, void *dev_id)
} }
if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK | if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
OMAP_I2C_STAT_AL)) { OMAP_I2C_STAT_AL)) {
omap_i2c_ack_stat(dev, stat &
(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
omap_i2c_complete_cmd(dev, err); omap_i2c_complete_cmd(dev, err);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -774,7 +784,7 @@ omap_i2c_isr(int this_irq, void *dev_id) ...@@ -774,7 +784,7 @@ omap_i2c_isr(int this_irq, void *dev_id)
* memory to the I2C interface. * memory to the I2C interface.
*/ */
if (cpu_is_omap34xx()) { if (dev->rev <= OMAP_I2C_REV_ON_3430) {
while (!(stat & OMAP_I2C_STAT_XUDF)) { while (!(stat & OMAP_I2C_STAT_XUDF)) {
if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
......
This diff is collapsed.
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