i2c-eg20t : Support Combined R/W transfer mode
authorTomoya MORINAGA <tomoya-linux@dsn.okisemi.com>
Thu, 9 Jun 2011 02:29:29 +0000 (11:29 +0900)
committerBen Dooks <ben-linux@fluff.org>
Tue, 26 Jul 2011 23:02:28 +0000 (00:02 +0100)
Currently, Combined R/W transfer mode is not supported.
This patch enables Combined R/W transfer mode.

Signed-off-by: Tomoya MORINAGA <tomoya-linux@dsn.okisemi.com>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
drivers/i2c/busses/i2c-eg20t.c

index 8abfa4a03ce1d7610f34417d7033581c39cb3a8f..9b072fd42108601a45e80647e062ac56d82f8e17 100644 (file)
@@ -673,25 +673,26 @@ static s32 pch_i2c_xfer(struct i2c_adapter *i2c_adap,
        /* transfer not completed */
        adap->pch_i2c_xfer_in_progress = true;
 
-       pmsg = &msgs[0];
-       pmsg->flags |= adap->pch_buff_mode_en;
-       status = pmsg->flags;
-       pch_dbg(adap,
-               "After invoking I2C_MODE_SEL :flag= 0x%x\n", status);
-       /* calculate sub address length and message length */
-       /* these are applicable only for buffer mode */
-       subaddrlen = pmsg->buf[0];
-       /* calculate actual message length excluding
-        * the sub address fields */
-       msglen = (pmsg->len) - (subaddrlen + 1);
-       if (status & (I2C_M_RD)) {
-               pch_dbg(adap, "invoking pch_i2c_readbytes\n");
-               ret = pch_i2c_readbytes(i2c_adap, pmsg, (i + 1 == num),
-                                  (i == 0));
-       } else {
-               pch_dbg(adap, "invoking pch_i2c_writebytes\n");
-               ret = pch_i2c_writebytes(i2c_adap, pmsg, (i + 1 == num),
-                                   (i == 0));
+       for (i = 0; i < num; i++) {
+               pmsg = &msgs[i];
+               pmsg->flags |= adap->pch_buff_mode_en;
+               status = pmsg->flags;
+               pch_dbg(adap,
+                       "After invoking I2C_MODE_SEL :flag= 0x%x\n", status);
+               /* calculate sub address length and message length */
+               /* these are applicable only for buffer mode */
+               subaddrlen = pmsg->buf[0];
+               /* calculate actual message length excluding
+                * the sub address fields */
+               msglen = (pmsg->len) - (subaddrlen + 1);
+
+               if ((status & (I2C_M_RD)) != false) {
+                       ret = pch_i2c_readbytes(i2c_adap, pmsg, (i + 1 == num),
+                                               (i == 0));
+               } else {
+                       ret = pch_i2c_writebytes(i2c_adap, pmsg, (i + 1 == num),
+                                                (i == 0));
+               }
        }
 
        adap->pch_i2c_xfer_in_progress = false; /* transfer completed */