summaryrefslogtreecommitdiff
path: root/drivers/i2c
diff options
context:
space:
mode:
authorHeiner Kallweit <hkallweit1@gmail.com>2017-03-25 16:11:08 +0300
committerWolfram Sang <wsa@the-dreams.de>2017-03-30 18:31:15 +0300
commit3f205d7b47611f82316776c9ef7317525242307b (patch)
treeec669eadd1cfb897e06dde1d2fd713aa8aefe590 /drivers/i2c
parent38ed55ca9ec2808ed7ee5183bec1f4e7187d3ea2 (diff)
downloadlinux-3f205d7b47611f82316776c9ef7317525242307b.tar.xz
i2c: meson: don't create separate token chain just for the stop command
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>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-meson.c23
1 files changed, 5 insertions, 18 deletions
diff --git a/drivers/i2c/busses/i2c-meson.c b/drivers/i2c/busses/i2c-meson.c
index 76aefd9264c2..3b3be0c8d1f1 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,
};
/**
@@ -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: