summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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: