|
@@ -242,41 +242,21 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id)
|
|
goto out;
|
|
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:
|
|
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);
|
|
spin_unlock(&i2c->lock);
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|