aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2012-05-14 14:21:25 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 17:15:43 -0400
commit4848ea77e0e8131fe928a11e15dc2d5c47862bb5 (patch)
tree5222ec81594e9c1eac8ed294a04289958edbed98 /drivers/media/video/gspca
parent74233cd7c3cd670404db90eaac20f8d6c64d6e84 (diff)
[media] gscpa_sonixb: Use usb_err for error handling
Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca')
-rw-r--r--drivers/media/video/gspca/sonixb.c161
1 files changed, 81 insertions, 80 deletions
diff --git a/drivers/media/video/gspca/sonixb.c b/drivers/media/video/gspca/sonixb.c
index e2bdf8f632f4..65fa4f2fb0b2 100644
--- a/drivers/media/video/gspca/sonixb.c
+++ b/drivers/media/video/gspca/sonixb.c
@@ -550,7 +550,12 @@ SENS(initTas5130, tas5130_sensor_init, F_GAIN,
550static void reg_r(struct gspca_dev *gspca_dev, 550static void reg_r(struct gspca_dev *gspca_dev,
551 __u16 value) 551 __u16 value)
552{ 552{
553 usb_control_msg(gspca_dev->dev, 553 int res;
554
555 if (gspca_dev->usb_err < 0)
556 return;
557
558 res = usb_control_msg(gspca_dev->dev,
554 usb_rcvctrlpipe(gspca_dev->dev, 0), 559 usb_rcvctrlpipe(gspca_dev->dev, 0),
555 0, /* request */ 560 0, /* request */
556 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, 561 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
@@ -558,6 +563,12 @@ static void reg_r(struct gspca_dev *gspca_dev,
558 0, /* index */ 563 0, /* index */
559 gspca_dev->usb_buf, 1, 564 gspca_dev->usb_buf, 1,
560 500); 565 500);
566
567 if (res < 0) {
568 dev_err(gspca_dev->v4l2_dev.dev,
569 "Error reading register %02x: %d\n", value, res);
570 gspca_dev->usb_err = res;
571 }
561} 572}
562 573
563static void reg_w(struct gspca_dev *gspca_dev, 574static void reg_w(struct gspca_dev *gspca_dev,
@@ -565,14 +576,13 @@ static void reg_w(struct gspca_dev *gspca_dev,
565 const __u8 *buffer, 576 const __u8 *buffer,
566 int len) 577 int len)
567{ 578{
568#ifdef GSPCA_DEBUG 579 int res;
569 if (len > USB_BUF_SZ) { 580
570 PDEBUG(D_ERR|D_PACK, "reg_w: buffer overflow"); 581 if (gspca_dev->usb_err < 0)
571 return; 582 return;
572 } 583
573#endif
574 memcpy(gspca_dev->usb_buf, buffer, len); 584 memcpy(gspca_dev->usb_buf, buffer, len);
575 usb_control_msg(gspca_dev->dev, 585 res = usb_control_msg(gspca_dev->dev,
576 usb_sndctrlpipe(gspca_dev->dev, 0), 586 usb_sndctrlpipe(gspca_dev->dev, 0),
577 0x08, /* request */ 587 0x08, /* request */
578 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, 588 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
@@ -580,30 +590,48 @@ static void reg_w(struct gspca_dev *gspca_dev,
580 0, /* index */ 590 0, /* index */
581 gspca_dev->usb_buf, len, 591 gspca_dev->usb_buf, len,
582 500); 592 500);
593
594 if (res < 0) {
595 dev_err(gspca_dev->v4l2_dev.dev,
596 "Error writing register %02x: %d\n", value, res);
597 gspca_dev->usb_err = res;
598 }
583} 599}
584 600
585static int i2c_w(struct gspca_dev *gspca_dev, const __u8 *buffer) 601static void i2c_w(struct gspca_dev *gspca_dev, const __u8 *buffer)
586{ 602{
587 int retry = 60; 603 int retry = 60;
588 604
605 if (gspca_dev->usb_err < 0)
606 return;
607
589 /* is i2c ready */ 608 /* is i2c ready */
590 reg_w(gspca_dev, 0x08, buffer, 8); 609 reg_w(gspca_dev, 0x08, buffer, 8);
591 while (retry--) { 610 while (retry--) {
611 if (gspca_dev->usb_err < 0)
612 return;
592 msleep(10); 613 msleep(10);
593 reg_r(gspca_dev, 0x08); 614 reg_r(gspca_dev, 0x08);
594 if (gspca_dev->usb_buf[0] & 0x04) { 615 if (gspca_dev->usb_buf[0] & 0x04) {
595 if (gspca_dev->usb_buf[0] & 0x08) 616 if (gspca_dev->usb_buf[0] & 0x08) {
596 return -1; 617 dev_err(gspca_dev->v4l2_dev.dev,
597 return 0; 618 "i2c write error\n");
619 gspca_dev->usb_err = -EIO;
620 }
621 return;
598 } 622 }
599 } 623 }
600 return -1; 624
625 dev_err(gspca_dev->v4l2_dev.dev, "i2c write timeout\n");
626 gspca_dev->usb_err = -EIO;
601} 627}
602 628
603static void i2c_w_vector(struct gspca_dev *gspca_dev, 629static void i2c_w_vector(struct gspca_dev *gspca_dev,
604 const __u8 buffer[][8], int len) 630 const __u8 buffer[][8], int len)
605{ 631{
606 for (;;) { 632 for (;;) {
633 if (gspca_dev->usb_err < 0)
634 return;
607 reg_w(gspca_dev, 0x08, *buffer, 8); 635 reg_w(gspca_dev, 0x08, *buffer, 8);
608 len -= 8; 636 len -= 8;
609 if (len <= 0) 637 if (len <= 0)
@@ -625,10 +653,9 @@ static void setbrightness(struct gspca_dev *gspca_dev)
625 /* change reg 0x06 */ 653 /* change reg 0x06 */
626 i2cOV[1] = sensor_data[sd->sensor].sensor_addr; 654 i2cOV[1] = sensor_data[sd->sensor].sensor_addr;
627 i2cOV[3] = sd->ctrls[BRIGHTNESS].val; 655 i2cOV[3] = sd->ctrls[BRIGHTNESS].val;
628 if (i2c_w(gspca_dev, i2cOV) < 0) 656 i2c_w(gspca_dev, i2cOV);
629 goto err;
630 break; 657 break;
631 } 658 }
632 case SENSOR_PAS106: 659 case SENSOR_PAS106:
633 case SENSOR_PAS202: { 660 case SENSOR_PAS202: {
634 __u8 i2cpbright[] = 661 __u8 i2cpbright[] =
@@ -650,16 +677,13 @@ static void setbrightness(struct gspca_dev *gspca_dev)
650 } else 677 } else
651 i2cpbright[4] = sd->ctrls[BRIGHTNESS].val - 127; 678 i2cpbright[4] = sd->ctrls[BRIGHTNESS].val - 127;
652 679
653 if (i2c_w(gspca_dev, i2cpbright) < 0) 680 i2c_w(gspca_dev, i2cpbright);
654 goto err; 681 i2c_w(gspca_dev, i2cpdoit);
655 if (i2c_w(gspca_dev, i2cpdoit) < 0) 682 break;
656 goto err; 683 }
684 default:
657 break; 685 break;
658 }
659 } 686 }
660 return;
661err:
662 PDEBUG(D_ERR, "i2c error brightness");
663} 687}
664 688
665static void setsensorgain(struct gspca_dev *gspca_dev) 689static void setsensorgain(struct gspca_dev *gspca_dev)
@@ -676,20 +700,18 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
676 i2c[4] = 0x3f - (gain / 4); 700 i2c[4] = 0x3f - (gain / 4);
677 i2c[5] = 0x3f - (gain / 4); 701 i2c[5] = 0x3f - (gain / 4);
678 702
679 if (i2c_w(gspca_dev, i2c) < 0) 703 i2c_w(gspca_dev, i2c);
680 goto err;
681 break; 704 break;
682 } 705 }
683 case SENSOR_TAS5110C: 706 case SENSOR_TAS5110C:
684 case SENSOR_TAS5130CXX: { 707 case SENSOR_TAS5130CXX: {
685 __u8 i2c[] = 708 __u8 i2c[] =
686 {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10}; 709 {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10};
687 710
688 i2c[4] = 255 - gain; 711 i2c[4] = 255 - gain;
689 if (i2c_w(gspca_dev, i2c) < 0) 712 i2c_w(gspca_dev, i2c);
690 goto err;
691 break; 713 break;
692 } 714 }
693 case SENSOR_TAS5110D: { 715 case SENSOR_TAS5110D: {
694 __u8 i2c[] = { 716 __u8 i2c[] = {
695 0xb0, 0x61, 0x02, 0x00, 0x10, 0x00, 0x00, 0x17 }; 717 0xb0, 0x61, 0x02, 0x00, 0x10, 0x00, 0x00, 0x17 };
@@ -703,11 +725,9 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
703 i2c[3] |= (gain & 0x04) << 3; 725 i2c[3] |= (gain & 0x04) << 3;
704 i2c[3] |= (gain & 0x02) << 5; 726 i2c[3] |= (gain & 0x02) << 5;
705 i2c[3] |= (gain & 0x01) << 7; 727 i2c[3] |= (gain & 0x01) << 7;
706 if (i2c_w(gspca_dev, i2c) < 0) 728 i2c_w(gspca_dev, i2c);
707 goto err;
708 break; 729 break;
709 } 730 }
710
711 case SENSOR_OV6650: 731 case SENSOR_OV6650:
712 gain >>= 1; 732 gain >>= 1;
713 /* fall thru */ 733 /* fall thru */
@@ -716,10 +736,9 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
716 736
717 i2c[1] = sensor_data[sd->sensor].sensor_addr; 737 i2c[1] = sensor_data[sd->sensor].sensor_addr;
718 i2c[3] = gain >> 2; 738 i2c[3] = gain >> 2;
719 if (i2c_w(gspca_dev, i2c) < 0) 739 i2c_w(gspca_dev, i2c);
720 goto err;
721 break; 740 break;
722 } 741 }
723 case SENSOR_PAS106: 742 case SENSOR_PAS106:
724 case SENSOR_PAS202: { 743 case SENSOR_PAS202: {
725 __u8 i2cpgain[] = 744 __u8 i2cpgain[] =
@@ -743,18 +762,14 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
743 i2cpcolorgain[5] = gain >> 4; 762 i2cpcolorgain[5] = gain >> 4;
744 i2cpcolorgain[6] = gain >> 4; 763 i2cpcolorgain[6] = gain >> 4;
745 764
746 if (i2c_w(gspca_dev, i2cpgain) < 0) 765 i2c_w(gspca_dev, i2cpgain);
747 goto err; 766 i2c_w(gspca_dev, i2cpcolorgain);
748 if (i2c_w(gspca_dev, i2cpcolorgain) < 0) 767 i2c_w(gspca_dev, i2cpdoit);
749 goto err; 768 break;
750 if (i2c_w(gspca_dev, i2cpdoit) < 0) 769 }
751 goto err; 770 default:
752 break; 771 break;
753 }
754 } 772 }
755 return;
756err:
757 PDEBUG(D_ERR, "i2c error gain");
758} 773}
759 774
760static void setgain(struct gspca_dev *gspca_dev) 775static void setgain(struct gspca_dev *gspca_dev)
@@ -802,10 +817,9 @@ static void setexposure(struct gspca_dev *gspca_dev)
802 817
803 i2c[3] = reg >> 8; 818 i2c[3] = reg >> 8;
804 i2c[4] = reg & 0xff; 819 i2c[4] = reg & 0xff;
805 if (i2c_w(gspca_dev, i2c) != 0) 820 i2c_w(gspca_dev, i2c);
806 goto err;
807 break; 821 break;
808 } 822 }
809 case SENSOR_TAS5110C: 823 case SENSOR_TAS5110C:
810 case SENSOR_TAS5110D: { 824 case SENSOR_TAS5110D: {
811 /* register 19's high nibble contains the sn9c10x clock divider 825 /* register 19's high nibble contains the sn9c10x clock divider
@@ -816,7 +830,7 @@ static void setexposure(struct gspca_dev *gspca_dev)
816 reg = (reg << 4) | 0x0b; 830 reg = (reg << 4) | 0x0b;
817 reg_w(gspca_dev, 0x19, &reg, 1); 831 reg_w(gspca_dev, 0x19, &reg, 1);
818 break; 832 break;
819 } 833 }
820 case SENSOR_OV6650: 834 case SENSOR_OV6650:
821 case SENSOR_OV7630: { 835 case SENSOR_OV7630: {
822 /* The ov6650 / ov7630 have 2 registers which both influence 836 /* The ov6650 / ov7630 have 2 registers which both influence
@@ -884,12 +898,11 @@ static void setexposure(struct gspca_dev *gspca_dev)
884 if (sd->reg11 == reg11) 898 if (sd->reg11 == reg11)
885 i2c[0] = 0xa0; 899 i2c[0] = 0xa0;
886 900
887 if (i2c_w(gspca_dev, i2c) == 0) 901 i2c_w(gspca_dev, i2c);
902 if (gspca_dev->usb_err == 0)
888 sd->reg11 = reg11; 903 sd->reg11 = reg11;
889 else
890 goto err;
891 break; 904 break;
892 } 905 }
893 case SENSOR_PAS202: { 906 case SENSOR_PAS202: {
894 __u8 i2cpframerate[] = 907 __u8 i2cpframerate[] =
895 {0xb0, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x16}; 908 {0xb0, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x16};
@@ -923,14 +936,11 @@ static void setexposure(struct gspca_dev *gspca_dev)
923 936
924 i2cpframerate[3] = framerate_ctrl >> 6; 937 i2cpframerate[3] = framerate_ctrl >> 6;
925 i2cpframerate[4] = framerate_ctrl & 0x3f; 938 i2cpframerate[4] = framerate_ctrl & 0x3f;
926 if (i2c_w(gspca_dev, i2cpframerate) < 0) 939 i2c_w(gspca_dev, i2cpframerate);
927 goto err; 940 i2c_w(gspca_dev, i2cpexpo);
928 if (i2c_w(gspca_dev, i2cpexpo) < 0) 941 i2c_w(gspca_dev, i2cpdoit);
929 goto err;
930 if (i2c_w(gspca_dev, i2cpdoit) < 0)
931 goto err;
932 break; 942 break;
933 } 943 }
934 case SENSOR_PAS106: { 944 case SENSOR_PAS106: {
935 __u8 i2cpframerate[] = 945 __u8 i2cpframerate[] =
936 {0xb1, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x14}; 946 {0xb1, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x14};
@@ -955,27 +965,21 @@ static void setexposure(struct gspca_dev *gspca_dev)
955 965
956 i2cpframerate[3] = framerate_ctrl >> 4; 966 i2cpframerate[3] = framerate_ctrl >> 4;
957 i2cpframerate[4] = framerate_ctrl & 0x0f; 967 i2cpframerate[4] = framerate_ctrl & 0x0f;
958 if (i2c_w(gspca_dev, i2cpframerate) < 0) 968 i2c_w(gspca_dev, i2cpframerate);
959 goto err; 969 i2c_w(gspca_dev, i2cpexpo);
960 if (i2c_w(gspca_dev, i2cpexpo) < 0) 970 i2c_w(gspca_dev, i2cpdoit);
961 goto err; 971 break;
962 if (i2c_w(gspca_dev, i2cpdoit) < 0) 972 }
963 goto err; 973 default:
964 break; 974 break;
965 }
966 } 975 }
967 return;
968err:
969 PDEBUG(D_ERR, "i2c error exposure");
970} 976}
971 977
972static void setfreq(struct gspca_dev *gspca_dev) 978static void setfreq(struct gspca_dev *gspca_dev)
973{ 979{
974 struct sd *sd = (struct sd *) gspca_dev; 980 struct sd *sd = (struct sd *) gspca_dev;
975 981
976 switch (sd->sensor) { 982 if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630) {
977 case SENSOR_OV6650:
978 case SENSOR_OV7630: {
979 /* Framerate adjust register for artificial light 50 hz flicker 983 /* Framerate adjust register for artificial light 50 hz flicker
980 compensation, for the ov6650 this is identical to ov6630 984 compensation, for the ov6650 this is identical to ov6630
981 0x2b register, see ov6630 datasheet. 985 0x2b register, see ov6630 datasheet.
@@ -993,10 +997,7 @@ static void setfreq(struct gspca_dev *gspca_dev)
993 break; 997 break;
994 } 998 }
995 i2c[1] = sensor_data[sd->sensor].sensor_addr; 999 i2c[1] = sensor_data[sd->sensor].sensor_addr;
996 if (i2c_w(gspca_dev, i2c) < 0) 1000 i2c_w(gspca_dev, i2c);
997 PDEBUG(D_ERR, "i2c error setfreq");
998 break;
999 }
1000 } 1001 }
1001} 1002}
1002 1003
@@ -1100,7 +1101,7 @@ static int sd_init(struct gspca_dev *gspca_dev)
1100 1101
1101 reg_w(gspca_dev, 0x01, &stop, 1); 1102 reg_w(gspca_dev, 0x01, &stop, 1);
1102 1103
1103 return 0; 1104 return gspca_dev->usb_err;
1104} 1105}
1105 1106
1106/* -- start the camera -- */ 1107/* -- start the camera -- */
@@ -1245,7 +1246,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
1245 sd->exp_too_high_cnt = 0; 1246 sd->exp_too_high_cnt = 0;
1246 sd->exp_too_low_cnt = 0; 1247 sd->exp_too_low_cnt = 0;
1247 atomic_set(&sd->avg_lum, -1); 1248 atomic_set(&sd->avg_lum, -1);
1248 return 0; 1249 return gspca_dev->usb_err;
1249} 1250}
1250 1251
1251static void sd_stopN(struct gspca_dev *gspca_dev) 1252static void sd_stopN(struct gspca_dev *gspca_dev)