We can directly add the stop token to the token chain including the last transfer chunk. This is more efficient than creating a separate token chain just for the stop command. And it allows us to get rid of state STATE_STOP completely. Signed-off-by: Heiner Kallweit <hkallweit1@xxxxxxxxx> --- drivers/i2c/busses/i2c-meson.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/drivers/i2c/busses/i2c-meson.c b/drivers/i2c/busses/i2c-meson.c index 58414699..b11ecfdd 100644 --- a/drivers/i2c/busses/i2c-meson.c +++ b/drivers/i2c/busses/i2c-meson.c @@ -55,7 +55,6 @@ enum { STATE_IDLE, STATE_READ, STATE_WRITE, - STATE_STOP, }; /** @@ -201,23 +200,13 @@ static void meson_i2c_prepare_xfer(struct meson_i2c *i2c) else meson_i2c_add_token(i2c, TOKEN_DATA_LAST); + if (i2c->last && i2c->pos + i2c->count >= i2c->msg->len) + meson_i2c_add_token(i2c, TOKEN_STOP); + if (write) meson_i2c_put_data(i2c, i2c->msg->buf + i2c->pos, i2c->count); } -static void meson_i2c_stop(struct meson_i2c *i2c) -{ - dev_dbg(i2c->dev, "%s: last %d\n", __func__, i2c->last); - - if (i2c->last) { - i2c->state = STATE_STOP; - meson_i2c_add_token(i2c, TOKEN_STOP); - } else { - i2c->state = STATE_IDLE; - complete(&i2c->done); - } -} - static irqreturn_t meson_i2c_irq(int irqno, void *dev_id) { struct meson_i2c *i2c = dev_id; @@ -259,7 +248,8 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id) i2c->pos += i2c->count; if (i2c->pos >= i2c->msg->len) { - meson_i2c_stop(i2c); + i2c->state = STATE_IDLE; + complete(&i2c->done); break; } @@ -269,16 +259,13 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id) i2c->pos += i2c->count; if (i2c->pos >= i2c->msg->len) { - meson_i2c_stop(i2c); + i2c->state = STATE_IDLE; + complete(&i2c->done); break; } meson_i2c_prepare_xfer(i2c); break; - case STATE_STOP: - i2c->state = STATE_IDLE; - complete(&i2c->done); - break; } out: -- 2.12.0 -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html