|
@@ -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:
|