diff options
author | Hans de Goede <hdegoede@redhat.com> | 2012-05-14 14:21:25 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-07-30 17:15:43 -0400 |
commit | 4848ea77e0e8131fe928a11e15dc2d5c47862bb5 (patch) | |
tree | 5222ec81594e9c1eac8ed294a04289958edbed98 /drivers/media/video/gspca | |
parent | 74233cd7c3cd670404db90eaac20f8d6c64d6e84 (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.c | 161 |
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, | |||
550 | static void reg_r(struct gspca_dev *gspca_dev, | 550 | static 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 | ||
563 | static void reg_w(struct gspca_dev *gspca_dev, | 574 | static 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 | ||
585 | static int i2c_w(struct gspca_dev *gspca_dev, const __u8 *buffer) | 601 | static 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 | ||
603 | static void i2c_w_vector(struct gspca_dev *gspca_dev, | 629 | static 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; | ||
661 | err: | ||
662 | PDEBUG(D_ERR, "i2c error brightness"); | ||
663 | } | 687 | } |
664 | 688 | ||
665 | static void setsensorgain(struct gspca_dev *gspca_dev) | 689 | static 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; | ||
756 | err: | ||
757 | PDEBUG(D_ERR, "i2c error gain"); | ||
758 | } | 773 | } |
759 | 774 | ||
760 | static void setgain(struct gspca_dev *gspca_dev) | 775 | static 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, ®, 1); | 831 | reg_w(gspca_dev, 0x19, ®, 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; | ||
968 | err: | ||
969 | PDEBUG(D_ERR, "i2c error exposure"); | ||
970 | } | 976 | } |
971 | 977 | ||
972 | static void setfreq(struct gspca_dev *gspca_dev) | 978 | static 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 | ||
1251 | static void sd_stopN(struct gspca_dev *gspca_dev) | 1252 | static void sd_stopN(struct gspca_dev *gspca_dev) |