[media] em28xx-i2c: Add a read after I2C write
authorMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 9 Jul 2011 22:36:11 +0000 (19:36 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 27 Jul 2011 20:55:49 +0000 (17:55 -0300)
All I2C logs we got for em28xx does that. With Terratec H5, at
400MHz speed, it seems that this is required, to avoid having
troubles at the I2C bus.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/em28xx/em28xx-i2c.c

index 548d2df391ca726b853c28fa44e52cf19d824225..36f5a9bc8b765b56129dd6368d88146d938edb72 100644 (file)
@@ -181,16 +181,25 @@ static int em2800_i2c_recv_bytes(struct em28xx *dev, unsigned char addr,
 
 /*
  * em28xx_i2c_send_bytes()
- * untested for more than 4 bytes
  */
 static int em28xx_i2c_send_bytes(void *data, unsigned char addr, char *buf,
                                 short len, int stop)
 {
        int wrcount = 0;
        struct em28xx *dev = (struct em28xx *)data;
+       int write_timeout, ret;
 
        wrcount = dev->em28xx_write_regs_req(dev, stop ? 2 : 3, addr, buf, len);
 
+       /* Seems to be required after a write */
+       for (write_timeout = EM2800_I2C_WRITE_TIMEOUT; write_timeout > 0;
+            write_timeout -= 5) {
+               ret = dev->em28xx_read_reg(dev, 0x05);
+               if (!ret)
+                       break;
+               msleep(5);
+       }
+
        return wrcount;
 }