Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2dd151ab authored by Alexander Shishkin's avatar Alexander Shishkin Committed by Ben Dooks
Browse files

omap: i2c: make errata 1.153 workaround a separate function



This is to avoid insanely long lines and levels of indentation.

Signed-off-by: default avatarAlexander Shishkin <virtuoso@slind.org>
Cc: Nishant Menon <nm@ti.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
parent 20c9d2c4
Loading
Loading
Loading
Loading
+24 −19
Original line number Diff line number Diff line
@@ -756,6 +756,27 @@ omap_i2c_rev1_isr(int this_irq, void *dev_id)
#define omap_i2c_rev1_isr		NULL
#endif

/*
 * OMAP3430 Errata 1.153: When an XRDY/XDR is hit, wait for XUDF before writing
 * data to DATA_REG. Otherwise some data bytes can be lost while transferring
 * them from the memory to the I2C interface.
 */
static int errata_omap3_1p153(struct omap_i2c_dev *dev, u16 *stat, int *err)
{
	while (!(*stat & OMAP_I2C_STAT_XUDF)) {
		if (*stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
			omap_i2c_ack_stat(dev, *stat & (OMAP_I2C_STAT_XRDY |
							OMAP_I2C_STAT_XDR));
			*err |= OMAP_I2C_STAT_XUDF;
			return -ETIMEDOUT;
		}
		cpu_relax();
		*stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
	}

	return 0;
}

static irqreturn_t
omap_i2c_isr(int this_irq, void *dev_id)
{
@@ -885,25 +906,9 @@ complete:
					break;
				}

				/*
				 * OMAP3430 Errata 1.153: When an XRDY/XDR
				 * is hit, wait for XUDF before writing data
				 * to DATA_REG. Otherwise some data bytes can
				 * be lost while transferring them from the
				 * memory to the I2C interface.
				 */

				if (dev->rev <= OMAP_I2C_REV_ON_3430) {
						while (!(stat & OMAP_I2C_STAT_XUDF)) {
							if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
								omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
								err |= OMAP_I2C_STAT_XUDF;
				if ((dev->rev <= OMAP_I2C_REV_ON_3430) &&
				    errata_omap3_1p153(dev, &stat, &err))
					goto complete;
							}
							cpu_relax();
							stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
						}
				}

				omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w);
			}