aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/sonixj.c
diff options
context:
space:
mode:
authorJean-François Moine <moinejf@free.fr>2010-09-25 05:12:44 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-10-20 23:06:19 -0400
commit4bf8b679029127fd84e9bfeb8710723a426e89ad (patch)
tree9d80fc17cf19b998a0f718ee0a952187f03c80f8 /drivers/media/video/gspca/sonixj.c
parentcdd15a0a1b69de00f0809bddb0a9ca66a50509ce (diff)
V4L/DVB: gspca - sonixj: Propagate USB errors to higher level
Signed-off-by: Jean-François Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/sonixj.c')
-rw-r--r--drivers/media/video/gspca/sonixj.c85
1 files changed, 67 insertions, 18 deletions
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c
index 025f9ba5c681..583c3410a2c2 100644
--- a/drivers/media/video/gspca/sonixj.c
+++ b/drivers/media/video/gspca/sonixj.c
@@ -1326,13 +1326,17 @@ static const u8 (*sensor_init[])[8] = {
1326static void reg_r(struct gspca_dev *gspca_dev, 1326static void reg_r(struct gspca_dev *gspca_dev,
1327 u16 value, int len) 1327 u16 value, int len)
1328{ 1328{
1329 int ret;
1330
1331 if (gspca_dev->usb_err < 0)
1332 return;
1329#ifdef GSPCA_DEBUG 1333#ifdef GSPCA_DEBUG
1330 if (len > USB_BUF_SZ) { 1334 if (len > USB_BUF_SZ) {
1331 err("reg_r: buffer overflow"); 1335 err("reg_r: buffer overflow");
1332 return; 1336 return;
1333 } 1337 }
1334#endif 1338#endif
1335 usb_control_msg(gspca_dev->dev, 1339 ret = usb_control_msg(gspca_dev->dev,
1336 usb_rcvctrlpipe(gspca_dev->dev, 0), 1340 usb_rcvctrlpipe(gspca_dev->dev, 0),
1337 0, 1341 0,
1338 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, 1342 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
@@ -1340,15 +1344,23 @@ static void reg_r(struct gspca_dev *gspca_dev,
1340 gspca_dev->usb_buf, len, 1344 gspca_dev->usb_buf, len,
1341 500); 1345 500);
1342 PDEBUG(D_USBI, "reg_r [%02x] -> %02x", value, gspca_dev->usb_buf[0]); 1346 PDEBUG(D_USBI, "reg_r [%02x] -> %02x", value, gspca_dev->usb_buf[0]);
1347 if (ret < 0) {
1348 err("reg_r err %d", ret);
1349 gspca_dev->usb_err = ret;
1350 }
1343} 1351}
1344 1352
1345static void reg_w1(struct gspca_dev *gspca_dev, 1353static void reg_w1(struct gspca_dev *gspca_dev,
1346 u16 value, 1354 u16 value,
1347 u8 data) 1355 u8 data)
1348{ 1356{
1357 int ret;
1358
1359 if (gspca_dev->usb_err < 0)
1360 return;
1349 PDEBUG(D_USBO, "reg_w1 [%04x] = %02x", value, data); 1361 PDEBUG(D_USBO, "reg_w1 [%04x] = %02x", value, data);
1350 gspca_dev->usb_buf[0] = data; 1362 gspca_dev->usb_buf[0] = data;
1351 usb_control_msg(gspca_dev->dev, 1363 ret = usb_control_msg(gspca_dev->dev,
1352 usb_sndctrlpipe(gspca_dev->dev, 0), 1364 usb_sndctrlpipe(gspca_dev->dev, 0),
1353 0x08, 1365 0x08,
1354 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, 1366 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
@@ -1356,12 +1368,20 @@ static void reg_w1(struct gspca_dev *gspca_dev,
1356 0, 1368 0,
1357 gspca_dev->usb_buf, 1, 1369 gspca_dev->usb_buf, 1,
1358 500); 1370 500);
1371 if (ret < 0) {
1372 err("reg_w1 err %d", ret);
1373 gspca_dev->usb_err = ret;
1374 }
1359} 1375}
1360static void reg_w(struct gspca_dev *gspca_dev, 1376static void reg_w(struct gspca_dev *gspca_dev,
1361 u16 value, 1377 u16 value,
1362 const u8 *buffer, 1378 const u8 *buffer,
1363 int len) 1379 int len)
1364{ 1380{
1381 int ret;
1382
1383 if (gspca_dev->usb_err < 0)
1384 return;
1365 PDEBUG(D_USBO, "reg_w [%04x] = %02x %02x ..", 1385 PDEBUG(D_USBO, "reg_w [%04x] = %02x %02x ..",
1366 value, buffer[0], buffer[1]); 1386 value, buffer[0], buffer[1]);
1367#ifdef GSPCA_DEBUG 1387#ifdef GSPCA_DEBUG
@@ -1371,20 +1391,27 @@ static void reg_w(struct gspca_dev *gspca_dev,
1371 } 1391 }
1372#endif 1392#endif
1373 memcpy(gspca_dev->usb_buf, buffer, len); 1393 memcpy(gspca_dev->usb_buf, buffer, len);
1374 usb_control_msg(gspca_dev->dev, 1394 ret = usb_control_msg(gspca_dev->dev,
1375 usb_sndctrlpipe(gspca_dev->dev, 0), 1395 usb_sndctrlpipe(gspca_dev->dev, 0),
1376 0x08, 1396 0x08,
1377 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, 1397 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
1378 value, 0, 1398 value, 0,
1379 gspca_dev->usb_buf, len, 1399 gspca_dev->usb_buf, len,
1380 500); 1400 500);
1401 if (ret < 0) {
1402 err("reg_w err %d", ret);
1403 gspca_dev->usb_err = ret;
1404 }
1381} 1405}
1382 1406
1383/* I2C write 1 byte */ 1407/* I2C write 1 byte */
1384static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val) 1408static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val)
1385{ 1409{
1386 struct sd *sd = (struct sd *) gspca_dev; 1410 struct sd *sd = (struct sd *) gspca_dev;
1411 int ret;
1387 1412
1413 if (gspca_dev->usb_err < 0)
1414 return;
1388 PDEBUG(D_USBO, "i2c_w1 [%02x] = %02x", reg, val); 1415 PDEBUG(D_USBO, "i2c_w1 [%02x] = %02x", reg, val);
1389 switch (sd->sensor) { 1416 switch (sd->sensor) {
1390 case SENSOR_ADCM1700: 1417 case SENSOR_ADCM1700:
@@ -1403,7 +1430,7 @@ static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val)
1403 gspca_dev->usb_buf[5] = 0; 1430 gspca_dev->usb_buf[5] = 0;
1404 gspca_dev->usb_buf[6] = 0; 1431 gspca_dev->usb_buf[6] = 0;
1405 gspca_dev->usb_buf[7] = 0x10; 1432 gspca_dev->usb_buf[7] = 0x10;
1406 usb_control_msg(gspca_dev->dev, 1433 ret = usb_control_msg(gspca_dev->dev,
1407 usb_sndctrlpipe(gspca_dev->dev, 0), 1434 usb_sndctrlpipe(gspca_dev->dev, 0),
1408 0x08, 1435 0x08,
1409 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, 1436 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
@@ -1411,16 +1438,24 @@ static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val)
1411 0, 1438 0,
1412 gspca_dev->usb_buf, 8, 1439 gspca_dev->usb_buf, 8,
1413 500); 1440 500);
1441 if (ret < 0) {
1442 err("i2c_w1 err %d", ret);
1443 gspca_dev->usb_err = ret;
1444 }
1414} 1445}
1415 1446
1416/* I2C write 8 bytes */ 1447/* I2C write 8 bytes */
1417static void i2c_w8(struct gspca_dev *gspca_dev, 1448static void i2c_w8(struct gspca_dev *gspca_dev,
1418 const u8 *buffer) 1449 const u8 *buffer)
1419{ 1450{
1451 int ret;
1452
1453 if (gspca_dev->usb_err < 0)
1454 return;
1420 PDEBUG(D_USBO, "i2c_w8 [%02x] = %02x ..", 1455 PDEBUG(D_USBO, "i2c_w8 [%02x] = %02x ..",
1421 buffer[2], buffer[3]); 1456 buffer[2], buffer[3]);
1422 memcpy(gspca_dev->usb_buf, buffer, 8); 1457 memcpy(gspca_dev->usb_buf, buffer, 8);
1423 usb_control_msg(gspca_dev->dev, 1458 ret = usb_control_msg(gspca_dev->dev,
1424 usb_sndctrlpipe(gspca_dev->dev, 0), 1459 usb_sndctrlpipe(gspca_dev->dev, 0),
1425 0x08, 1460 0x08,
1426 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, 1461 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
@@ -1428,6 +1463,10 @@ static void i2c_w8(struct gspca_dev *gspca_dev,
1428 gspca_dev->usb_buf, 8, 1463 gspca_dev->usb_buf, 8,
1429 500); 1464 500);
1430 msleep(2); 1465 msleep(2);
1466 if (ret < 0) {
1467 err("i2c_w8 err %d", ret);
1468 gspca_dev->usb_err = ret;
1469 }
1431} 1470}
1432 1471
1433/* sensor read 'len' (1..5) bytes in gspca_dev->usb_buf */ 1472/* sensor read 'len' (1..5) bytes in gspca_dev->usb_buf */
@@ -1529,6 +1568,8 @@ static void mi0360_probe(struct gspca_dev *gspca_dev)
1529 if (val != 0xffff) 1568 if (val != 0xffff)
1530 break; 1569 break;
1531 } 1570 }
1571 if (gspca_dev->usb_err < 0)
1572 return;
1532 switch (val) { 1573 switch (val) {
1533 case 0x823a: 1574 case 0x823a:
1534 PDEBUG(D_PROBE, "Sensor mt9v111"); 1575 PDEBUG(D_PROBE, "Sensor mt9v111");
@@ -1556,6 +1597,8 @@ static void ov7630_probe(struct gspca_dev *gspca_dev)
1556 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4]; 1597 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1557 reg_w1(gspca_dev, 0x01, 0x29); 1598 reg_w1(gspca_dev, 0x01, 0x29);
1558 reg_w1(gspca_dev, 0x17, 0x42); 1599 reg_w1(gspca_dev, 0x17, 0x42);
1600 if (gspca_dev->usb_err < 0)
1601 return;
1559 if (val == 0x7628) { /* soi768 */ 1602 if (val == 0x7628) { /* soi768 */
1560 sd->sensor = SENSOR_SOI768; 1603 sd->sensor = SENSOR_SOI768;
1561/*fixme: only valid for 0c45:613e?*/ 1604/*fixme: only valid for 0c45:613e?*/
@@ -1593,6 +1636,8 @@ static void ov7648_probe(struct gspca_dev *gspca_dev)
1593 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4]; 1636 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1594 reg_w1(gspca_dev, 0x01, 0x29); 1637 reg_w1(gspca_dev, 0x01, 0x29);
1595 reg_w1(gspca_dev, 0x17, 0x42); 1638 reg_w1(gspca_dev, 0x17, 0x42);
1639 if (gspca_dev->usb_err < 0)
1640 return;
1596 if (val == 0x1030) { /* po1030 */ 1641 if (val == 0x1030) { /* po1030 */
1597 PDEBUG(D_PROBE, "Sensor po1030"); 1642 PDEBUG(D_PROBE, "Sensor po1030");
1598 sd->sensor = SENSOR_PO1030; 1643 sd->sensor = SENSOR_PO1030;
@@ -1631,6 +1676,8 @@ static void po2030n_probe(struct gspca_dev *gspca_dev)
1631 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4]; 1676 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1632 reg_w1(gspca_dev, 0x01, 0x29); 1677 reg_w1(gspca_dev, 0x01, 0x29);
1633 reg_w1(gspca_dev, 0x17, 0x42); 1678 reg_w1(gspca_dev, 0x17, 0x42);
1679 if (gspca_dev->usb_err < 0)
1680 return;
1634 if (val == 0x2030) { 1681 if (val == 0x2030) {
1635 PDEBUG(D_PROBE, "Sensor po2030n"); 1682 PDEBUG(D_PROBE, "Sensor po2030n");
1636/* sd->sensor = SENSOR_PO2030N; */ 1683/* sd->sensor = SENSOR_PO2030N; */
@@ -1828,6 +1875,8 @@ static int sd_init(struct gspca_dev *gspca_dev)
1828 reg_w1(gspca_dev, 0xf1, gspca_dev->usb_buf[0]); 1875 reg_w1(gspca_dev, 0xf1, gspca_dev->usb_buf[0]);
1829 reg_r(gspca_dev, 0x00, 1); /* get sonix chip id */ 1876 reg_r(gspca_dev, 0x00, 1); /* get sonix chip id */
1830 regF1 = gspca_dev->usb_buf[0]; 1877 regF1 = gspca_dev->usb_buf[0];
1878 if (gspca_dev->usb_err < 0)
1879 return gspca_dev->usb_err;
1831 PDEBUG(D_PROBE, "Sonix chip id: %02x", regF1); 1880 PDEBUG(D_PROBE, "Sonix chip id: %02x", regF1);
1832 switch (sd->bridge) { 1881 switch (sd->bridge) {
1833 case BRIDGE_SN9C102P: 1882 case BRIDGE_SN9C102P:
@@ -1881,7 +1930,7 @@ static int sd_init(struct gspca_dev *gspca_dev)
1881 1930
1882 gspca_dev->ctrl_dis = ctrl_dis[sd->sensor]; 1931 gspca_dev->ctrl_dis = ctrl_dis[sd->sensor];
1883 1932
1884 return 0; 1933 return gspca_dev->usb_err;
1885} 1934}
1886 1935
1887static u32 setexposure(struct gspca_dev *gspca_dev, 1936static u32 setexposure(struct gspca_dev *gspca_dev,
@@ -2541,7 +2590,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
2541 setcolors(gspca_dev); 2590 setcolors(gspca_dev);
2542 setautogain(gspca_dev); 2591 setautogain(gspca_dev);
2543 setfreq(gspca_dev); 2592 setfreq(gspca_dev);
2544 return 0; 2593 return gspca_dev->usb_err;
2545} 2594}
2546 2595
2547static void sd_stopN(struct gspca_dev *gspca_dev) 2596static void sd_stopN(struct gspca_dev *gspca_dev)
@@ -2704,7 +2753,7 @@ static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
2704 sd->brightness = val; 2753 sd->brightness = val;
2705 if (gspca_dev->streaming) 2754 if (gspca_dev->streaming)
2706 setbrightness(gspca_dev); 2755 setbrightness(gspca_dev);
2707 return 0; 2756 return gspca_dev->usb_err;
2708} 2757}
2709 2758
2710static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val) 2759static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2722,7 +2771,7 @@ static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
2722 sd->contrast = val; 2771 sd->contrast = val;
2723 if (gspca_dev->streaming) 2772 if (gspca_dev->streaming)
2724 setcontrast(gspca_dev); 2773 setcontrast(gspca_dev);
2725 return 0; 2774 return gspca_dev->usb_err;
2726} 2775}
2727 2776
2728static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val) 2777static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2740,7 +2789,7 @@ static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val)
2740 sd->colors = val; 2789 sd->colors = val;
2741 if (gspca_dev->streaming) 2790 if (gspca_dev->streaming)
2742 setcolors(gspca_dev); 2791 setcolors(gspca_dev);
2743 return 0; 2792 return gspca_dev->usb_err;
2744} 2793}
2745 2794
2746static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val) 2795static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2758,7 +2807,7 @@ static int sd_setblue_balance(struct gspca_dev *gspca_dev, __s32 val)
2758 sd->blue = val; 2807 sd->blue = val;
2759 if (gspca_dev->streaming) 2808 if (gspca_dev->streaming)
2760 setredblue(gspca_dev); 2809 setredblue(gspca_dev);
2761 return 0; 2810 return gspca_dev->usb_err;
2762} 2811}
2763 2812
2764static int sd_getblue_balance(struct gspca_dev *gspca_dev, __s32 *val) 2813static int sd_getblue_balance(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2776,7 +2825,7 @@ static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val)
2776 sd->red = val; 2825 sd->red = val;
2777 if (gspca_dev->streaming) 2826 if (gspca_dev->streaming)
2778 setredblue(gspca_dev); 2827 setredblue(gspca_dev);
2779 return 0; 2828 return gspca_dev->usb_err;
2780} 2829}
2781 2830
2782static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val) 2831static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2794,7 +2843,7 @@ static int sd_setgamma(struct gspca_dev *gspca_dev, __s32 val)
2794 sd->gamma = val; 2843 sd->gamma = val;
2795 if (gspca_dev->streaming) 2844 if (gspca_dev->streaming)
2796 setgamma(gspca_dev); 2845 setgamma(gspca_dev);
2797 return 0; 2846 return gspca_dev->usb_err;
2798} 2847}
2799 2848
2800static int sd_getgamma(struct gspca_dev *gspca_dev, __s32 *val) 2849static int sd_getgamma(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2812,7 +2861,7 @@ static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
2812 sd->autogain = val; 2861 sd->autogain = val;
2813 if (gspca_dev->streaming) 2862 if (gspca_dev->streaming)
2814 setautogain(gspca_dev); 2863 setautogain(gspca_dev);
2815 return 0; 2864 return gspca_dev->usb_err;
2816} 2865}
2817 2866
2818static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val) 2867static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2830,7 +2879,7 @@ static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val)
2830 sd->sharpness = val; 2879 sd->sharpness = val;
2831 if (gspca_dev->streaming) 2880 if (gspca_dev->streaming)
2832 setsharpness(sd); 2881 setsharpness(sd);
2833 return 0; 2882 return gspca_dev->usb_err;
2834} 2883}
2835 2884
2836static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val) 2885static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2848,7 +2897,7 @@ static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)
2848 sd->vflip = val; 2897 sd->vflip = val;
2849 if (gspca_dev->streaming) 2898 if (gspca_dev->streaming)
2850 setvflip(sd); 2899 setvflip(sd);
2851 return 0; 2900 return gspca_dev->usb_err;
2852} 2901}
2853 2902
2854static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val) 2903static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2866,7 +2915,7 @@ static int sd_setinfrared(struct gspca_dev *gspca_dev, __s32 val)
2866 sd->infrared = val; 2915 sd->infrared = val;
2867 if (gspca_dev->streaming) 2916 if (gspca_dev->streaming)
2868 setinfrared(sd); 2917 setinfrared(sd);
2869 return 0; 2918 return gspca_dev->usb_err;
2870} 2919}
2871 2920
2872static int sd_getinfrared(struct gspca_dev *gspca_dev, __s32 *val) 2921static int sd_getinfrared(struct gspca_dev *gspca_dev, __s32 *val)
@@ -2884,7 +2933,7 @@ static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val)
2884 sd->freq = val; 2933 sd->freq = val;
2885 if (gspca_dev->streaming) 2934 if (gspca_dev->streaming)
2886 setfreq(gspca_dev); 2935 setfreq(gspca_dev);
2887 return 0; 2936 return gspca_dev->usb_err;
2888} 2937}
2889 2938
2890static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val) 2939static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val)