summaryrefslogtreecommitdiff
path: root/drivers/i2c/busses/i2c-meson.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i2c/busses/i2c-meson.c')
-rw-r--r--drivers/i2c/busses/i2c-meson.c40
1 files changed, 10 insertions, 30 deletions
diff --git a/drivers/i2c/busses/i2c-meson.c b/drivers/i2c/busses/i2c-meson.c
index be9f83bd92fc..88d15b92ec35 100644
--- a/drivers/i2c/busses/i2c-meson.c
+++ b/drivers/i2c/busses/i2c-meson.c
@@ -242,41 +242,21 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id)
goto out;
}
- switch (i2c->state) {
- case STATE_READ:
- if (i2c->count > 0) {
- meson_i2c_get_data(i2c, i2c->msg->buf + i2c->pos,
- i2c->count);
- i2c->pos += i2c->count;
- }
-
- if (i2c->pos >= i2c->msg->len) {
- i2c->state = STATE_IDLE;
- complete(&i2c->done);
- break;
- }
-
- meson_i2c_prepare_xfer(i2c);
- break;
- case STATE_WRITE:
- i2c->pos += i2c->count;
+ if (i2c->state == STATE_READ && i2c->count)
+ meson_i2c_get_data(i2c, i2c->msg->buf + i2c->pos, i2c->count);
- if (i2c->pos >= i2c->msg->len) {
- i2c->state = STATE_IDLE;
- complete(&i2c->done);
- break;
- }
+ i2c->pos += i2c->count;
- meson_i2c_prepare_xfer(i2c);
- break;
+ if (i2c->pos >= i2c->msg->len) {
+ i2c->state = STATE_IDLE;
+ complete(&i2c->done);
+ goto out;
}
+ /* Restart the processing */
+ meson_i2c_prepare_xfer(i2c);
+ meson_i2c_set_mask(i2c, REG_CTRL, REG_CTRL_START, REG_CTRL_START);
out:
- if (i2c->state != STATE_IDLE)
- /* Restart the processing */
- meson_i2c_set_mask(i2c, REG_CTRL, REG_CTRL_START,
- REG_CTRL_START);
-
spin_unlock(&i2c->lock);
return IRQ_HANDLED;