Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2756442e authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 98fd4857
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -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;

@@ -504,16 +504,19 @@ static void i2c_w(struct gspca_dev *gspca_dev, const __u8 *buffer)
		return;

	/* is i2c ready */
	reg_w(gspca_dev, 0x08, buffer, 8);
	reg_w(gspca_dev, 0x08, buf, 8);
	while (retry--) {
		if (gspca_dev->usb_err < 0)
			return;
		msleep(10);
		msleep(1);
		reg_r(gspca_dev, 0x08);
		if (gspca_dev->usb_buf[0] & 0x04) {
			if (gspca_dev->usb_buf[0] & 0x08) {
				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;
			}
			return;
@@ -530,7 +533,7 @@ static void i2c_w_vector(struct gspca_dev *gspca_dev,
	for (;;) {
		if (gspca_dev->usb_err < 0)
			return;
		reg_w(gspca_dev, 0x08, *buffer, 8);
		i2c_w(gspca_dev, *buffer);
		len -= 8;
		if (len <= 0)
			break;