diff options
| -rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 5c508ccf4384..d258b02aef44 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -672,9 +672,10 @@ omap_i2c_isr(int this_irq, void *dev_id) | |||
| 672 | break; | 672 | break; |
| 673 | } | 673 | } |
| 674 | 674 | ||
| 675 | err = 0; | ||
| 676 | complete: | ||
| 675 | omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat); | 677 | omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat); |
| 676 | 678 | ||
| 677 | err = 0; | ||
| 678 | if (stat & OMAP_I2C_STAT_NACK) { | 679 | if (stat & OMAP_I2C_STAT_NACK) { |
| 679 | err |= OMAP_I2C_STAT_NACK; | 680 | err |= OMAP_I2C_STAT_NACK; |
| 680 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, | 681 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, |
| @@ -764,6 +765,27 @@ omap_i2c_isr(int this_irq, void *dev_id) | |||
| 764 | "data to send\n"); | 765 | "data to send\n"); |
| 765 | break; | 766 | break; |
| 766 | } | 767 | } |
| 768 | |||
| 769 | /* | ||
| 770 | * OMAP3430 Errata 1.153: When an XRDY/XDR | ||
| 771 | * is hit, wait for XUDF before writing data | ||
| 772 | * to DATA_REG. Otherwise some data bytes can | ||
| 773 | * be lost while transferring them from the | ||
| 774 | * memory to the I2C interface. | ||
| 775 | */ | ||
| 776 | |||
| 777 | if (cpu_is_omap34xx()) { | ||
| 778 | while (!(stat & OMAP_I2C_STAT_XUDF)) { | ||
| 779 | if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { | ||
| 780 | omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); | ||
| 781 | err |= OMAP_I2C_STAT_XUDF; | ||
| 782 | goto complete; | ||
| 783 | } | ||
| 784 | cpu_relax(); | ||
| 785 | stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); | ||
| 786 | } | ||
| 787 | } | ||
| 788 | |||
| 767 | omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); | 789 | omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); |
| 768 | } | 790 | } |
| 769 | omap_i2c_ack_stat(dev, | 791 | omap_i2c_ack_stat(dev, |
