Commit 4848ea77 authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab

[media] gscpa_sonixb: Use usb_err for error handling

Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 74233cd7
...@@ -550,7 +550,12 @@ SENS(initTas5130, tas5130_sensor_init, F_GAIN, ...@@ -550,7 +550,12 @@ SENS(initTas5130, tas5130_sensor_init, F_GAIN,
static void reg_r(struct gspca_dev *gspca_dev, static void reg_r(struct gspca_dev *gspca_dev,
__u16 value) __u16 value)
{ {
usb_control_msg(gspca_dev->dev, int res;
if (gspca_dev->usb_err < 0)
return;
res = usb_control_msg(gspca_dev->dev,
usb_rcvctrlpipe(gspca_dev->dev, 0), usb_rcvctrlpipe(gspca_dev->dev, 0),
0, /* request */ 0, /* request */
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
...@@ -558,6 +563,12 @@ static void reg_r(struct gspca_dev *gspca_dev, ...@@ -558,6 +563,12 @@ static void reg_r(struct gspca_dev *gspca_dev,
0, /* index */ 0, /* index */
gspca_dev->usb_buf, 1, gspca_dev->usb_buf, 1,
500); 500);
if (res < 0) {
dev_err(gspca_dev->v4l2_dev.dev,
"Error reading register %02x: %d\n", value, res);
gspca_dev->usb_err = res;
}
} }
static void reg_w(struct gspca_dev *gspca_dev, static void reg_w(struct gspca_dev *gspca_dev,
...@@ -565,14 +576,13 @@ static void reg_w(struct gspca_dev *gspca_dev, ...@@ -565,14 +576,13 @@ static void reg_w(struct gspca_dev *gspca_dev,
const __u8 *buffer, const __u8 *buffer,
int len) int len)
{ {
#ifdef GSPCA_DEBUG int res;
if (len > USB_BUF_SZ) {
PDEBUG(D_ERR|D_PACK, "reg_w: buffer overflow"); if (gspca_dev->usb_err < 0)
return; return;
}
#endif
memcpy(gspca_dev->usb_buf, buffer, len); memcpy(gspca_dev->usb_buf, buffer, len);
usb_control_msg(gspca_dev->dev, res = usb_control_msg(gspca_dev->dev,
usb_sndctrlpipe(gspca_dev->dev, 0), usb_sndctrlpipe(gspca_dev->dev, 0),
0x08, /* request */ 0x08, /* request */
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
...@@ -580,30 +590,48 @@ static void reg_w(struct gspca_dev *gspca_dev, ...@@ -580,30 +590,48 @@ static void reg_w(struct gspca_dev *gspca_dev,
0, /* index */ 0, /* index */
gspca_dev->usb_buf, len, gspca_dev->usb_buf, len,
500); 500);
if (res < 0) {
dev_err(gspca_dev->v4l2_dev.dev,
"Error writing register %02x: %d\n", value, res);
gspca_dev->usb_err = res;
}
} }
static int i2c_w(struct gspca_dev *gspca_dev, const __u8 *buffer) static void i2c_w(struct gspca_dev *gspca_dev, const __u8 *buffer)
{ {
int retry = 60; int retry = 60;
if (gspca_dev->usb_err < 0)
return;
/* is i2c ready */ /* is i2c ready */
reg_w(gspca_dev, 0x08, buffer, 8); reg_w(gspca_dev, 0x08, buffer, 8);
while (retry--) { while (retry--) {
if (gspca_dev->usb_err < 0)
return;
msleep(10); msleep(10);
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) {
return -1; dev_err(gspca_dev->v4l2_dev.dev,
return 0; "i2c write error\n");
gspca_dev->usb_err = -EIO;
}
return;
} }
} }
return -1;
dev_err(gspca_dev->v4l2_dev.dev, "i2c write timeout\n");
gspca_dev->usb_err = -EIO;
} }
static void i2c_w_vector(struct gspca_dev *gspca_dev, static void i2c_w_vector(struct gspca_dev *gspca_dev,
const __u8 buffer[][8], int len) const __u8 buffer[][8], int len)
{ {
for (;;) { for (;;) {
if (gspca_dev->usb_err < 0)
return;
reg_w(gspca_dev, 0x08, *buffer, 8); reg_w(gspca_dev, 0x08, *buffer, 8);
len -= 8; len -= 8;
if (len <= 0) if (len <= 0)
...@@ -625,8 +653,7 @@ static void setbrightness(struct gspca_dev *gspca_dev) ...@@ -625,8 +653,7 @@ static void setbrightness(struct gspca_dev *gspca_dev)
/* change reg 0x06 */ /* change reg 0x06 */
i2cOV[1] = sensor_data[sd->sensor].sensor_addr; i2cOV[1] = sensor_data[sd->sensor].sensor_addr;
i2cOV[3] = sd->ctrls[BRIGHTNESS].val; i2cOV[3] = sd->ctrls[BRIGHTNESS].val;
if (i2c_w(gspca_dev, i2cOV) < 0) i2c_w(gspca_dev, i2cOV);
goto err;
break; break;
} }
case SENSOR_PAS106: case SENSOR_PAS106:
...@@ -650,16 +677,13 @@ static void setbrightness(struct gspca_dev *gspca_dev) ...@@ -650,16 +677,13 @@ static void setbrightness(struct gspca_dev *gspca_dev)
} else } else
i2cpbright[4] = sd->ctrls[BRIGHTNESS].val - 127; i2cpbright[4] = sd->ctrls[BRIGHTNESS].val - 127;
if (i2c_w(gspca_dev, i2cpbright) < 0) i2c_w(gspca_dev, i2cpbright);
goto err; i2c_w(gspca_dev, i2cpdoit);
if (i2c_w(gspca_dev, i2cpdoit) < 0)
goto err;
break; break;
} }
default:
break;
} }
return;
err:
PDEBUG(D_ERR, "i2c error brightness");
} }
static void setsensorgain(struct gspca_dev *gspca_dev) static void setsensorgain(struct gspca_dev *gspca_dev)
...@@ -676,8 +700,7 @@ static void setsensorgain(struct gspca_dev *gspca_dev) ...@@ -676,8 +700,7 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
i2c[4] = 0x3f - (gain / 4); i2c[4] = 0x3f - (gain / 4);
i2c[5] = 0x3f - (gain / 4); i2c[5] = 0x3f - (gain / 4);
if (i2c_w(gspca_dev, i2c) < 0) i2c_w(gspca_dev, i2c);
goto err;
break; break;
} }
case SENSOR_TAS5110C: case SENSOR_TAS5110C:
...@@ -686,8 +709,7 @@ static void setsensorgain(struct gspca_dev *gspca_dev) ...@@ -686,8 +709,7 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
{0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10}; {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10};
i2c[4] = 255 - gain; i2c[4] = 255 - gain;
if (i2c_w(gspca_dev, i2c) < 0) i2c_w(gspca_dev, i2c);
goto err;
break; break;
} }
case SENSOR_TAS5110D: { case SENSOR_TAS5110D: {
...@@ -703,11 +725,9 @@ static void setsensorgain(struct gspca_dev *gspca_dev) ...@@ -703,11 +725,9 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
i2c[3] |= (gain & 0x04) << 3; i2c[3] |= (gain & 0x04) << 3;
i2c[3] |= (gain & 0x02) << 5; i2c[3] |= (gain & 0x02) << 5;
i2c[3] |= (gain & 0x01) << 7; i2c[3] |= (gain & 0x01) << 7;
if (i2c_w(gspca_dev, i2c) < 0) i2c_w(gspca_dev, i2c);
goto err;
break; break;
} }
case SENSOR_OV6650: case SENSOR_OV6650:
gain >>= 1; gain >>= 1;
/* fall thru */ /* fall thru */
...@@ -716,8 +736,7 @@ static void setsensorgain(struct gspca_dev *gspca_dev) ...@@ -716,8 +736,7 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
i2c[1] = sensor_data[sd->sensor].sensor_addr; i2c[1] = sensor_data[sd->sensor].sensor_addr;
i2c[3] = gain >> 2; i2c[3] = gain >> 2;
if (i2c_w(gspca_dev, i2c) < 0) i2c_w(gspca_dev, i2c);
goto err;
break; break;
} }
case SENSOR_PAS106: case SENSOR_PAS106:
...@@ -743,18 +762,14 @@ static void setsensorgain(struct gspca_dev *gspca_dev) ...@@ -743,18 +762,14 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
i2cpcolorgain[5] = gain >> 4; i2cpcolorgain[5] = gain >> 4;
i2cpcolorgain[6] = gain >> 4; i2cpcolorgain[6] = gain >> 4;
if (i2c_w(gspca_dev, i2cpgain) < 0) i2c_w(gspca_dev, i2cpgain);
goto err; i2c_w(gspca_dev, i2cpcolorgain);
if (i2c_w(gspca_dev, i2cpcolorgain) < 0) i2c_w(gspca_dev, i2cpdoit);
goto err;
if (i2c_w(gspca_dev, i2cpdoit) < 0)
goto err;
break; break;
} }
default:
break;
} }
return;
err:
PDEBUG(D_ERR, "i2c error gain");
} }
static void setgain(struct gspca_dev *gspca_dev) static void setgain(struct gspca_dev *gspca_dev)
...@@ -802,8 +817,7 @@ static void setexposure(struct gspca_dev *gspca_dev) ...@@ -802,8 +817,7 @@ static void setexposure(struct gspca_dev *gspca_dev)
i2c[3] = reg >> 8; i2c[3] = reg >> 8;
i2c[4] = reg & 0xff; i2c[4] = reg & 0xff;
if (i2c_w(gspca_dev, i2c) != 0) i2c_w(gspca_dev, i2c);
goto err;
break; break;
} }
case SENSOR_TAS5110C: case SENSOR_TAS5110C:
...@@ -884,10 +898,9 @@ static void setexposure(struct gspca_dev *gspca_dev) ...@@ -884,10 +898,9 @@ static void setexposure(struct gspca_dev *gspca_dev)
if (sd->reg11 == reg11) if (sd->reg11 == reg11)
i2c[0] = 0xa0; i2c[0] = 0xa0;
if (i2c_w(gspca_dev, i2c) == 0) i2c_w(gspca_dev, i2c);
if (gspca_dev->usb_err == 0)
sd->reg11 = reg11; sd->reg11 = reg11;
else
goto err;
break; break;
} }
case SENSOR_PAS202: { case SENSOR_PAS202: {
...@@ -923,12 +936,9 @@ static void setexposure(struct gspca_dev *gspca_dev) ...@@ -923,12 +936,9 @@ static void setexposure(struct gspca_dev *gspca_dev)
i2cpframerate[3] = framerate_ctrl >> 6; i2cpframerate[3] = framerate_ctrl >> 6;
i2cpframerate[4] = framerate_ctrl & 0x3f; i2cpframerate[4] = framerate_ctrl & 0x3f;
if (i2c_w(gspca_dev, i2cpframerate) < 0) i2c_w(gspca_dev, i2cpframerate);
goto err; i2c_w(gspca_dev, i2cpexpo);
if (i2c_w(gspca_dev, i2cpexpo) < 0) i2c_w(gspca_dev, i2cpdoit);
goto err;
if (i2c_w(gspca_dev, i2cpdoit) < 0)
goto err;
break; break;
} }
case SENSOR_PAS106: { case SENSOR_PAS106: {
...@@ -955,27 +965,21 @@ static void setexposure(struct gspca_dev *gspca_dev) ...@@ -955,27 +965,21 @@ static void setexposure(struct gspca_dev *gspca_dev)
i2cpframerate[3] = framerate_ctrl >> 4; i2cpframerate[3] = framerate_ctrl >> 4;
i2cpframerate[4] = framerate_ctrl & 0x0f; i2cpframerate[4] = framerate_ctrl & 0x0f;
if (i2c_w(gspca_dev, i2cpframerate) < 0) i2c_w(gspca_dev, i2cpframerate);
goto err; i2c_w(gspca_dev, i2cpexpo);
if (i2c_w(gspca_dev, i2cpexpo) < 0) i2c_w(gspca_dev, i2cpdoit);
goto err;
if (i2c_w(gspca_dev, i2cpdoit) < 0)
goto err;
break; break;
} }
default:
break;
} }
return;
err:
PDEBUG(D_ERR, "i2c error exposure");
} }
static void setfreq(struct gspca_dev *gspca_dev) static void setfreq(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
switch (sd->sensor) { if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630) {
case SENSOR_OV6650:
case SENSOR_OV7630: {
/* Framerate adjust register for artificial light 50 hz flicker /* Framerate adjust register for artificial light 50 hz flicker
compensation, for the ov6650 this is identical to ov6630 compensation, for the ov6650 this is identical to ov6630
0x2b register, see ov6630 datasheet. 0x2b register, see ov6630 datasheet.
...@@ -993,10 +997,7 @@ static void setfreq(struct gspca_dev *gspca_dev) ...@@ -993,10 +997,7 @@ static void setfreq(struct gspca_dev *gspca_dev)
break; break;
} }
i2c[1] = sensor_data[sd->sensor].sensor_addr; i2c[1] = sensor_data[sd->sensor].sensor_addr;
if (i2c_w(gspca_dev, i2c) < 0) i2c_w(gspca_dev, i2c);
PDEBUG(D_ERR, "i2c error setfreq");
break;
}
} }
} }
...@@ -1100,7 +1101,7 @@ static int sd_init(struct gspca_dev *gspca_dev) ...@@ -1100,7 +1101,7 @@ static int sd_init(struct gspca_dev *gspca_dev)
reg_w(gspca_dev, 0x01, &stop, 1); reg_w(gspca_dev, 0x01, &stop, 1);
return 0; return gspca_dev->usb_err;
} }
/* -- start the camera -- */ /* -- start the camera -- */
...@@ -1245,7 +1246,7 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1245,7 +1246,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
sd->exp_too_high_cnt = 0; sd->exp_too_high_cnt = 0;
sd->exp_too_low_cnt = 0; sd->exp_too_low_cnt = 0;
atomic_set(&sd->avg_lum, -1); atomic_set(&sd->avg_lum, -1);
return 0; return gspca_dev->usb_err;
} }
static void sd_stopN(struct gspca_dev *gspca_dev) static void sd_stopN(struct gspca_dev *gspca_dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment