]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
i2c: meson: improve and simplify interrupt handler
authorHeiner Kallweit <hkallweit1@gmail.com>
Sat, 25 Mar 2017 13:14:08 +0000 (14:14 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Thu, 30 Mar 2017 15:31:29 +0000 (17:31 +0200)
The preceding changes in this patch series now allow to simplify
the interrupt handler significantly.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-meson.c

index be9f83bd92fc716b0650e4f07841b2f8d75451ae..88d15b92ec35e6293747e6ecf553f69a2b6b0cdf 100644 (file)
@@ -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;