re-factor the common parts to a separate function, so that code is easier to read and understand. No functional changes. Signed-off-by: Felipe Balbi <balbi@xxxxxx> --- drivers/i2c/busses/i2c-omap.c | 209 +++++++++++++++++------------------------ 1 file changed, 84 insertions(+), 125 deletions(-) diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index d53ec25..3d714a0c 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -795,12 +795,81 @@ static int errata_omap3_1p153(struct omap_i2c_dev *dev) return 0; } +static void omap_i2c_receive_data(struct omap_i2c_dev *dev, u8 num_bytes, + bool is_rdr) +{ + u16 w; + + while (num_bytes--) { + if (!dev->buf_len) { + dev_err(dev->dev, "%s without data", + is_rdr ? "RDR" : "RRDY"); + break; + } + + w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG); + *dev->buf++ = w; + dev->buf_len--; + + /* + * Data reg in 2430, omap3 and + * omap4 is 8 bit wide + */ + if (dev->flags & OMAP_I2C_FLAG_16BIT_DATA_REG) { + if (dev->buf_len) { + *dev->buf++ = w >> 8; + dev->buf_len--; + } + } + } +} + +static int omap_i2c_transmit_data(struct omap_i2c_dev *dev, u8 num_bytes, + bool is_xdr) +{ + u16 w; + + while (num_bytes--) { + if (!dev->buf_len) { + dev_err(dev->dev, "%s without data", + is_xdr ? "XDR" : "XRDY"); + break; + } + + w = *dev->buf++; + dev->buf_len--; + + /* + * Data reg in 2430, omap3 and + * omap4 is 8 bit wide + */ + if (dev->flags & OMAP_I2C_FLAG_16BIT_DATA_REG) { + if (dev->buf_len) { + w |= *dev->buf++ << 8; + dev->buf_len--; + } + } + + if (dev->errata & I2C_OMAP3_1P153) { + int ret; + + ret = errata_omap3_1p153(dev); + if (ret < 0) + return ret; + } + + omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); + } + + return 0; +} + static irqreturn_t omap_i2c_isr(int this_irq, void *dev_id) { struct omap_i2c_dev *dev = dev_id; u16 bits; - u16 stat, w; + u16 stat; int err, count = 0; if (pm_runtime_suspended(dev->dev)) @@ -860,31 +929,7 @@ complete: num_bytes &= 0x3f; } - while (num_bytes--) { - if (!dev->buf_len) { - dev_err(dev->dev, - "RDR IRQ while no data" - " requested\n"); - break; - } - - w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG); - *dev->buf++ = w; - dev->buf_len--; - - /* - * Data reg in 2430, omap3 and - * omap4 is 8 bit wide - */ - if (dev->flags & - OMAP_I2C_FLAG_16BIT_DATA_REG) { - if (dev->buf_len) { - *dev->buf++ = w >> 8; - dev->buf_len--; - } - } - } - + omap_i2c_receive_data(dev, num_bytes, true); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR); continue; } @@ -898,36 +943,13 @@ complete: if (dev->fifo_size) num_bytes = dev->fifo_size; - while (num_bytes--) { - if (!dev->buf_len) { - dev_err(dev->dev, - "RRDY IRQ while no data" - " requested\n"); - break; - } - - w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG); - *dev->buf++ = w; - dev->buf_len--; - - /* - * Data reg in 2430, omap3 and - * omap4 is 8 bit wide - */ - if (dev->flags & - OMAP_I2C_FLAG_16BIT_DATA_REG) { - if (dev->buf_len) { - *dev->buf++ = w >> 8; - dev->buf_len--; - } - } - } - + omap_i2c_receive_data(dev, num_bytes, false); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RRDY); continue; } if (stat & OMAP_I2C_STAT_XDR) { + int ret; u8 num_bytes = 1; if (dev->fifo_size) { @@ -936,43 +958,11 @@ complete: num_bytes &= 0x3f; } - while (num_bytes--) { - if (!dev->buf_len) { - dev_err(dev->dev, - "XDR IRQ while no " - "data to send\n"); - break; - } - - w = *dev->buf++; - dev->buf_len--; - - /* - * Data reg in 2430, omap3 and - * omap4 is 8 bit wide - */ - if (dev->flags & - OMAP_I2C_FLAG_16BIT_DATA_REG) { - if (dev->buf_len) { - w |= *dev->buf++ << 8; - dev->buf_len--; - } - } - - if (dev->errata & I2C_OMAP3_1P153) { - int ret; - - ret = errata_omap3_1p153(dev); - stat = omap_i2c_read_reg(dev, - OMAP_I2C_STAT_REG); - - if (ret < 0) { - err |= OMAP_I2C_STAT_XUDF; - goto complete; - } - } - - omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); + ret = omap_i2c_transmit_data(dev, num_bytes, true); + stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); + if (ret < 0) { + err |= OMAP_I2C_STAT_XUDF; + goto complete; } omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XDR); @@ -980,48 +970,17 @@ complete: } if (stat & OMAP_I2C_STAT_XRDY) { + int ret; u8 num_bytes = 1; if (dev->fifo_size) num_bytes = dev->fifo_size; - while (num_bytes--) { - if (!dev->buf_len) { - dev_err(dev->dev, - "XRDY IRQ while no " - "data to send\n"); - break; - } - - w = *dev->buf++; - dev->buf_len--; - - /* - * Data reg in 2430, omap3 and - * omap4 is 8 bit wide - */ - if (dev->flags & - OMAP_I2C_FLAG_16BIT_DATA_REG) { - if (dev->buf_len) { - w |= *dev->buf++ << 8; - dev->buf_len--; - } - } - - if (dev->errata & I2C_OMAP3_1P153) { - int ret; - - ret = errata_omap3_1p153(dev); - stat = omap_i2c_read_reg(dev, - OMAP_I2C_STAT_REG); - - if (ret < 0) { - err |= OMAP_I2C_STAT_XUDF; - goto complete; - } - } - - omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); + ret = omap_i2c_transmit_data(dev, num_bytes, false); + stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); + if (ret < 0) { + err |= OMAP_I2C_STAT_XUDF; + goto complete; } omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XRDY); -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html