[media] saa7164: Improvements for I2C handling
authorSteven Toth <stoth@kernellabs.com>
Mon, 23 Mar 2015 18:42:53 +0000 (15:42 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Fri, 1 May 2015 10:20:28 +0000 (07:20 -0300)
Workaround oddball I2C issues caused by using newer
SILABS devices.

Signed-off-by: Steven Toth <stoth@kernellabs.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/pci/saa7164/saa7164-api.c

index 97bbd0a..d9e21e7 100644 (file)
@@ -1385,7 +1385,8 @@ int saa7164_api_i2c_read(struct saa7164_i2c *bus, u8 addr, u32 reglen, u8 *reg,
         *       08... register address
         */
        memset(buf, 0, sizeof(buf));
-       memcpy((buf + 2 * sizeof(u32) + 0), reg, reglen);
+       if (reg)
+               memcpy((buf + 2 * sizeof(u32) + 0), reg, reglen);
        *((u32 *)(buf + 0 * sizeof(u32))) = reglen;
        *((u32 *)(buf + 1 * sizeof(u32))) = datalen;
 
@@ -1473,6 +1474,14 @@ int saa7164_api_i2c_write(struct saa7164_i2c *bus, u8 addr, u32 datalen,
         *       04-07 dest bytes to write
         *       08... register address
         */
+       if (datalen == 1) {
+               /* Workaround for issues with i2c components
+                * that issue writes with no data. IE: SI2168/2157
+                * Increase reglen by 1, strobe out an additional byte,
+                * ignored by SI2168/2157.
+                */
+               datalen++;
+       }
        *((u32 *)(buf + 0 * sizeof(u32))) = reglen;
        *((u32 *)(buf + 1 * sizeof(u32))) = datalen - reglen;
        memcpy((buf + 2 * sizeof(u32)), data, datalen);