i2c: meson: don't create separate token chain just for the stop command
authorHeiner Kallweit <hkallweit1@gmail.com>
Sat, 25 Mar 2017 13:11:08 +0000 (14:11 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Thu, 30 Mar 2017 15:31:15 +0000 (17:31 +0200)
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@gmail.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-meson.c

index 76aefd9..3b3be0c 100644 (file)
@@ -55,7 +55,6 @@ enum {
        STATE_IDLE,
        STATE_READ,
        STATE_WRITE,
-       STATE_STOP,
 };
 
 /**
@@ -208,19 +207,9 @@ static void meson_i2c_prepare_xfer(struct meson_i2c *i2c)
 
        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;
+       if (i2c->last && i2c->pos + i2c->count >= i2c->msg->len)
                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)
@@ -265,7 +254,8 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id)
                }
 
                if (i2c->pos >= i2c->msg->len) {
-                       meson_i2c_stop(i2c);
+                       i2c->state = STATE_IDLE;
+                       complete(&i2c->done);
                        break;
                }
 
@@ -275,16 +265,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: