diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-omap.c')
| -rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 42c0b9108c7f..ef73483efb84 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -756,6 +756,27 @@ omap_i2c_rev1_isr(int this_irq, void *dev_id) | |||
| 756 | #define omap_i2c_rev1_isr NULL | 756 | #define omap_i2c_rev1_isr NULL |
| 757 | #endif | 757 | #endif |
| 758 | 758 | ||
| 759 | /* | ||
| 760 | * OMAP3430 Errata 1.153: When an XRDY/XDR is hit, wait for XUDF before writing | ||
| 761 | * data to DATA_REG. Otherwise some data bytes can be lost while transferring | ||
| 762 | * them from the memory to the I2C interface. | ||
| 763 | */ | ||
| 764 | static int errata_omap3_1p153(struct omap_i2c_dev *dev, u16 *stat, int *err) | ||
| 765 | { | ||
| 766 | while (!(*stat & OMAP_I2C_STAT_XUDF)) { | ||
| 767 | if (*stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { | ||
| 768 | omap_i2c_ack_stat(dev, *stat & (OMAP_I2C_STAT_XRDY | | ||
| 769 | OMAP_I2C_STAT_XDR)); | ||
| 770 | *err |= OMAP_I2C_STAT_XUDF; | ||
| 771 | return -ETIMEDOUT; | ||
| 772 | } | ||
| 773 | cpu_relax(); | ||
| 774 | *stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); | ||
| 775 | } | ||
| 776 | |||
| 777 | return 0; | ||
| 778 | } | ||
| 779 | |||
| 759 | static irqreturn_t | 780 | static irqreturn_t |
| 760 | omap_i2c_isr(int this_irq, void *dev_id) | 781 | omap_i2c_isr(int this_irq, void *dev_id) |
| 761 | { | 782 | { |
| @@ -885,25 +906,9 @@ complete: | |||
| 885 | break; | 906 | break; |
| 886 | } | 907 | } |
| 887 | 908 | ||
| 888 | /* | 909 | if ((dev->rev <= OMAP_I2C_REV_ON_3430) && |
| 889 | * OMAP3430 Errata 1.153: When an XRDY/XDR | 910 | errata_omap3_1p153(dev, &stat, &err)) |
| 890 | * is hit, wait for XUDF before writing data | 911 | goto complete; |
| 891 | * to DATA_REG. Otherwise some data bytes can | ||
| 892 | * be lost while transferring them from the | ||
| 893 | * memory to the I2C interface. | ||
| 894 | */ | ||
| 895 | |||
| 896 | if (dev->rev <= OMAP_I2C_REV_ON_3430) { | ||
| 897 | while (!(stat & OMAP_I2C_STAT_XUDF)) { | ||
| 898 | if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { | ||
| 899 | omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); | ||
| 900 | err |= OMAP_I2C_STAT_XUDF; | ||
| 901 | goto complete; | ||
| 902 | } | ||
| 903 | cpu_relax(); | ||
| 904 | stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); | ||
| 905 | } | ||
| 906 | } | ||
| 907 | 912 | ||
| 908 | omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); | 913 | omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); |
| 909 | } | 914 | } |
