[media] gspca_sonixb: Properly wait between i2c writes

We must wait for the previous i2c write to complete before starting a new
one. Sofar we were getting away with this, but it seems that some parts
of the usb-subsystem has been sped up making us go to fast :)
This fixes streaming on sn9c103 based cams not working with an
"i2c_w error" error.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Hans de Goede 2012-12-21 08:08:47 -03:00 committed by Mauro Carvalho Chehab
parent 98fd485795
commit 2756442e48

View File

@ -496,7 +496,7 @@ static void reg_w(struct gspca_dev *gspca_dev,
} }
} }
static void i2c_w(struct gspca_dev *gspca_dev, const __u8 *buffer) static void i2c_w(struct gspca_dev *gspca_dev, const u8 *buf)
{ {
int retry = 60; int retry = 60;
@ -504,16 +504,19 @@ static void i2c_w(struct gspca_dev *gspca_dev, const __u8 *buffer)
return; return;
/* is i2c ready */ /* is i2c ready */
reg_w(gspca_dev, 0x08, buffer, 8); reg_w(gspca_dev, 0x08, buf, 8);
while (retry--) { while (retry--) {
if (gspca_dev->usb_err < 0) if (gspca_dev->usb_err < 0)
return; return;
msleep(10); msleep(1);
reg_r(gspca_dev, 0x08); reg_r(gspca_dev, 0x08);
if (gspca_dev->usb_buf[0] & 0x04) { if (gspca_dev->usb_buf[0] & 0x04) {
if (gspca_dev->usb_buf[0] & 0x08) { if (gspca_dev->usb_buf[0] & 0x08) {
dev_err(gspca_dev->v4l2_dev.dev, dev_err(gspca_dev->v4l2_dev.dev,
"i2c write error\n"); "i2c error writing %02x %02x %02x %02x"
" %02x %02x %02x %02x\n",
buf[0], buf[1], buf[2], buf[3],
buf[4], buf[5], buf[6], buf[7]);
gspca_dev->usb_err = -EIO; gspca_dev->usb_err = -EIO;
} }
return; return;
@ -530,7 +533,7 @@ static void i2c_w_vector(struct gspca_dev *gspca_dev,
for (;;) { for (;;) {
if (gspca_dev->usb_err < 0) if (gspca_dev->usb_err < 0)
return; return;
reg_w(gspca_dev, 0x08, *buffer, 8); i2c_w(gspca_dev, *buffer);
len -= 8; len -= 8;
if (len <= 0) if (len <= 0)
break; break;