diff options
-rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index ef73483efb84..00fd02ec1b65 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
@@ -763,17 +763,25 @@ omap_i2c_rev1_isr(int this_irq, void *dev_id) | |||
763 | */ | 763 | */ |
764 | static int errata_omap3_1p153(struct omap_i2c_dev *dev, u16 *stat, int *err) | 764 | static int errata_omap3_1p153(struct omap_i2c_dev *dev, u16 *stat, int *err) |
765 | { | 765 | { |
766 | while (!(*stat & OMAP_I2C_STAT_XUDF)) { | 766 | unsigned long timeout = 10000; |
767 | |||
768 | while (--timeout && !(*stat & OMAP_I2C_STAT_XUDF)) { | ||
767 | if (*stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { | 769 | if (*stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { |
768 | omap_i2c_ack_stat(dev, *stat & (OMAP_I2C_STAT_XRDY | | 770 | omap_i2c_ack_stat(dev, *stat & (OMAP_I2C_STAT_XRDY | |
769 | OMAP_I2C_STAT_XDR)); | 771 | OMAP_I2C_STAT_XDR)); |
770 | *err |= OMAP_I2C_STAT_XUDF; | 772 | *err |= OMAP_I2C_STAT_XUDF; |
771 | return -ETIMEDOUT; | 773 | return -ETIMEDOUT; |
772 | } | 774 | } |
775 | |||
773 | cpu_relax(); | 776 | cpu_relax(); |
774 | *stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); | 777 | *stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); |
775 | } | 778 | } |
776 | 779 | ||
780 | if (!timeout) { | ||
781 | dev_err(dev->dev, "timeout waiting on XUDF bit\n"); | ||
782 | return 0; | ||
783 | } | ||
784 | |||
777 | return 0; | 785 | return 0; |
778 | } | 786 | } |
779 | 787 | ||