i2c: sh_mobile: refactor rx isr
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Wed, 16 Jan 2019 21:05:54 +0000 (22:05 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Tue, 22 Jan 2019 23:18:09 +0000 (00:18 +0100)
Remove the do_while loop which was just there to have an easy exit with
"break;" and replace it with if-else-blocks which should make the state
machine clearer.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-sh_mobile.c

index ab6969ed7eff6203402fb46856dd0dfd2853632f..dd4df961d8eb6a6b2deb94a0f7c5a9cd3679045f 100644 (file)
@@ -373,39 +373,31 @@ static int sh_mobile_i2c_isr_rx(struct sh_mobile_i2c_data *pd)
        unsigned char data;
        int real_pos;
 
-       do {
-               if (pd->pos == -1) {
-                       i2c_op(pd, OP_TX_FIRST);
-                       break;
-               }
-
-               if (pd->pos == 0) {
-                       i2c_op(pd, OP_TX_TO_RX);
-                       break;
-               }
-
-               real_pos = pd->pos - 2;
+       real_pos = pd->pos - 2;
 
-               if (pd->pos == pd->msg->len) {
-                       if (pd->stop_after_dma) {
-                               /* Simulate PIO end condition after DMA transfer */
-                               i2c_op(pd, OP_RX_STOP);
-                               pd->pos++;
-                               break;
-                       }
-
-                       if (real_pos < 0)
-                               i2c_op(pd, OP_RX_STOP);
-                       else
-                               data = i2c_op(pd, OP_RX_STOP_DATA);
-               } else if (real_pos >= 0) {
-                       data = i2c_op(pd, OP_RX);
+       if (pd->pos == -1) {
+               i2c_op(pd, OP_TX_FIRST);
+       } else if (pd->pos == 0) {
+               i2c_op(pd, OP_TX_TO_RX);
+       } else if (pd->pos == pd->msg->len) {
+               if (pd->stop_after_dma) {
+                       /* Simulate PIO end condition after DMA transfer */
+                       i2c_op(pd, OP_RX_STOP);
+                       pd->pos++;
+                       goto done;
                }
 
-               if (real_pos >= 0)
-                       pd->msg->buf[real_pos] = data;
-       } while (0);
+               if (real_pos < 0)
+                       i2c_op(pd, OP_RX_STOP);
+               else
+                       data = i2c_op(pd, OP_RX_STOP_DATA);
+       } else if (real_pos >= 0) {
+               data = i2c_op(pd, OP_RX);
+       }
 
+       if (real_pos >= 0)
+               pd->msg->buf[real_pos] = data;
+ done:
        pd->pos++;
        return pd->pos == (pd->msg->len + 2);
 }