[media] af9035: I2C combined write + read transaction fix
authorAlessandro Radicati <alessandro@radicati.net>
Tue, 5 Apr 2016 22:23:43 +0000 (19:23 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Thu, 9 Jun 2016 11:44:54 +0000 (08:44 -0300)
This patch will modify the af9035 driver to use the register address
fields of the I2C read command for the combined write/read transaction
case.  Without this change, the firmware issues just a I2C read
transaction without the preceding write transaction to select the
register.

Signed-off-by: Alessandro Radicati <alessandro@radicati.net>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/usb/dvb-usb-v2/af9035.c

index 2638e3251f2a1756f93774f7b7e2a857808fe6de..09a549b494003f89b96ea05fbe7b962f1bb1b27a 100644 (file)
@@ -367,10 +367,25 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
                                memcpy(&buf[3], msg[0].buf, msg[0].len);
                        } else {
                                buf[1] = msg[0].addr << 1;
-                               buf[2] = 0x00; /* reg addr len */
                                buf[3] = 0x00; /* reg addr MSB */
                                buf[4] = 0x00; /* reg addr LSB */
-                               memcpy(&buf[5], msg[0].buf, msg[0].len);
+
+                               /* Keep prev behavior for write req len > 2*/
+                               if (msg[0].len > 2) {
+                                       buf[2] = 0x00; /* reg addr len */
+                                       memcpy(&buf[5], msg[0].buf, msg[0].len);
+
+                               /* Use reg addr fields if write req len <= 2 */
+                               } else {
+                                       req.wlen = 5;
+                                       buf[2] = msg[0].len;
+                                       if (msg[0].len == 2) {
+                                               buf[3] = msg[0].buf[0];
+                                               buf[4] = msg[0].buf[1];
+                                       } else if (msg[0].len == 1) {
+                                               buf[4] = msg[0].buf[0];
+                                       }
+                               }
                        }
                        ret = af9035_ctrl_msg(d, &req);
                }