V4L/DVB (6626): CXUSB: support only-read i2c requests
authorChris Pascoe <c.pascoe@itee.uq.edu.au>
Mon, 19 Nov 2007 06:01:22 +0000 (03:01 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Fri, 25 Jan 2008 21:02:20 +0000 (19:02 -0200)
Any i2c read request that was not immediately preceded by a write request was
incorrectly taking the write path.  Add the capability to handle individual
read requests.

Signed-off-by: Chris Pascoe <c.pascoe@itee.uq.edu.au>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/dvb/dvb-usb/cxusb.c

index 86fbd6c73ea93c834bc661a2705ad049efbb894d..016a3780b7146f8f7b07ca943bfdc446944954ba 100644 (file)
@@ -98,8 +98,21 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
                                break;
                        }
 
-               /* read request */
-               if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
+               if (msg[i].flags & I2C_M_RD) {
+                       /* read only */
+                       u8 obuf[3], ibuf[1+msg[i].len];
+                       obuf[0] = 0;
+                       obuf[1] = msg[i].len;
+                       obuf[2] = msg[i].addr;
+                       if (cxusb_ctrl_msg(d, CMD_I2C_READ,
+                                          obuf, 3,
+                                          ibuf, 1+msg[i].len) < 0) {
+                               warn("i2c read failed");
+                               break;
+                       }
+                       memcpy(msg[i].buf, &ibuf[1], msg[i].len);
+               } else if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
+                       /* write then read */
                        u8 obuf[3+msg[i].len], ibuf[1+msg[i+1].len];
                        obuf[0] = msg[i].len;
                        obuf[1] = msg[i+1].len;
@@ -117,7 +130,8 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
                        memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
 
                        i++;
-               } else { /* write */
+               } else {
+                       /* write only */
                        u8 obuf[2+msg[i].len], ibuf;
                        obuf[0] = msg[i].addr;
                        obuf[1] = msg[i].len;