Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cda816d1 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Wolfram Sang
Browse files

i2c: meson: improve and simplify interrupt handler



The preceding changes in this patch series now allow to simplify
the interrupt handler significantly.

Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent 3911764c
Loading
Loading
Loading
Loading
+10 −30
Original line number Diff line number Diff line
@@ -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;
		}
	if (i2c->state == STATE_READ && i2c->count)
		meson_i2c_get_data(i2c, i2c->msg->buf + i2c->pos, i2c->count);

		meson_i2c_prepare_xfer(i2c);
		break;
	case STATE_WRITE:
	i2c->pos += i2c->count;

	if (i2c->pos >= i2c->msg->len) {
		i2c->state = STATE_IDLE;
		complete(&i2c->done);
			break;
		goto out;
	}

	/* Restart the processing */
	meson_i2c_prepare_xfer(i2c);
		break;
	}

	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;