diff options
author | Martin Fuzzey <mfuzzey@gmail.com> | 2009-04-21 15:48:09 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-04-23 17:15:31 -0400 |
commit | 6b35ca0d3d586b8ecb8396821af21186e20afaf0 (patch) | |
tree | 6e4e33ca3295f9f14e6e34e163abe8803a39a3f7 /drivers/media/video | |
parent | ecf85e481a716cfe07406439fdc7ba9526bbfaeb (diff) |
USB: pwc : do not pass stack allocated buffers to USB core.
This is causes problems on platforms that have alignment requirements
for DMA transfers.
Signed-off-by: Martin Fuzzey <mfuzzey@gmail.com>
Acked-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/media/video')
-rw-r--r-- | drivers/media/video/pwc/pwc-ctrl.c | 238 |
1 files changed, 164 insertions, 74 deletions
diff --git a/drivers/media/video/pwc/pwc-ctrl.c b/drivers/media/video/pwc/pwc-ctrl.c index f9fbe02e0f69..50b415e07eda 100644 --- a/drivers/media/video/pwc/pwc-ctrl.c +++ b/drivers/media/video/pwc/pwc-ctrl.c | |||
@@ -159,35 +159,67 @@ static void pwc_set_image_buffer_size(struct pwc_device *pdev); | |||
159 | 159 | ||
160 | /****************************************************************************/ | 160 | /****************************************************************************/ |
161 | 161 | ||
162 | static int _send_control_msg(struct pwc_device *pdev, | ||
163 | u8 request, u16 value, int index, void *buf, int buflen, int timeout) | ||
164 | { | ||
165 | int rc; | ||
166 | void *kbuf = NULL; | ||
167 | |||
168 | if (buflen) { | ||
169 | kbuf = kmalloc(buflen, GFP_KERNEL); /* not allowed on stack */ | ||
170 | if (kbuf == NULL) | ||
171 | return -ENOMEM; | ||
172 | memcpy(kbuf, buf, buflen); | ||
173 | } | ||
162 | 174 | ||
163 | #define SendControlMsg(request, value, buflen) \ | 175 | rc = usb_control_msg(pdev->udev, usb_sndctrlpipe(pdev->udev, 0), |
164 | usb_control_msg(pdev->udev, usb_sndctrlpipe(pdev->udev, 0), \ | 176 | request, |
165 | request, \ | 177 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
166 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, \ | 178 | value, |
167 | value, \ | 179 | index, |
168 | pdev->vcinterface, \ | 180 | kbuf, buflen, timeout); |
169 | &buf, buflen, 500) | ||
170 | 181 | ||
171 | #define RecvControlMsg(request, value, buflen) \ | 182 | kfree(kbuf); |
172 | usb_control_msg(pdev->udev, usb_rcvctrlpipe(pdev->udev, 0), \ | 183 | return rc; |
173 | request, \ | 184 | } |
174 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, \ | ||
175 | value, \ | ||
176 | pdev->vcinterface, \ | ||
177 | &buf, buflen, 500) | ||
178 | 185 | ||
186 | static int recv_control_msg(struct pwc_device *pdev, | ||
187 | u8 request, u16 value, void *buf, int buflen) | ||
188 | { | ||
189 | int rc; | ||
190 | void *kbuf = kmalloc(buflen, GFP_KERNEL); /* not allowed on stack */ | ||
191 | |||
192 | if (kbuf == NULL) | ||
193 | return -ENOMEM; | ||
194 | |||
195 | rc = usb_control_msg(pdev->udev, usb_rcvctrlpipe(pdev->udev, 0), | ||
196 | request, | ||
197 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
198 | value, | ||
199 | pdev->vcinterface, | ||
200 | kbuf, buflen, 500); | ||
201 | memcpy(buf, kbuf, buflen); | ||
202 | kfree(kbuf); | ||
203 | return rc; | ||
204 | } | ||
179 | 205 | ||
180 | static int send_video_command(struct usb_device *udev, int index, void *buf, int buflen) | 206 | static inline int send_video_command(struct pwc_device *pdev, |
207 | int index, void *buf, int buflen) | ||
181 | { | 208 | { |
182 | return usb_control_msg(udev, | 209 | return _send_control_msg(pdev, |
183 | usb_sndctrlpipe(udev, 0), | ||
184 | SET_EP_STREAM_CTL, | 210 | SET_EP_STREAM_CTL, |
185 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
186 | VIDEO_OUTPUT_CONTROL_FORMATTER, | 211 | VIDEO_OUTPUT_CONTROL_FORMATTER, |
187 | index, | 212 | index, |
188 | buf, buflen, 1000); | 213 | buf, buflen, 1000); |
189 | } | 214 | } |
190 | 215 | ||
216 | static inline int send_control_msg(struct pwc_device *pdev, | ||
217 | u8 request, u16 value, void *buf, int buflen) | ||
218 | { | ||
219 | return _send_control_msg(pdev, | ||
220 | request, value, pdev->vcinterface, buf, buflen, 500); | ||
221 | } | ||
222 | |||
191 | 223 | ||
192 | 224 | ||
193 | static int set_video_mode_Nala(struct pwc_device *pdev, int size, int frames) | 225 | static int set_video_mode_Nala(struct pwc_device *pdev, int size, int frames) |
@@ -224,7 +256,7 @@ static int set_video_mode_Nala(struct pwc_device *pdev, int size, int frames) | |||
224 | return -EINVAL; | 256 | return -EINVAL; |
225 | 257 | ||
226 | memcpy(buf, pEntry->mode, 3); | 258 | memcpy(buf, pEntry->mode, 3); |
227 | ret = send_video_command(pdev->udev, pdev->vendpoint, buf, 3); | 259 | ret = send_video_command(pdev, pdev->vendpoint, buf, 3); |
228 | if (ret < 0) { | 260 | if (ret < 0) { |
229 | PWC_DEBUG_MODULE("Failed to send video command... %d\n", ret); | 261 | PWC_DEBUG_MODULE("Failed to send video command... %d\n", ret); |
230 | return ret; | 262 | return ret; |
@@ -285,7 +317,7 @@ static int set_video_mode_Timon(struct pwc_device *pdev, int size, int frames, i | |||
285 | memcpy(buf, pChoose->mode, 13); | 317 | memcpy(buf, pChoose->mode, 13); |
286 | if (snapshot) | 318 | if (snapshot) |
287 | buf[0] |= 0x80; | 319 | buf[0] |= 0x80; |
288 | ret = send_video_command(pdev->udev, pdev->vendpoint, buf, 13); | 320 | ret = send_video_command(pdev, pdev->vendpoint, buf, 13); |
289 | if (ret < 0) | 321 | if (ret < 0) |
290 | return ret; | 322 | return ret; |
291 | 323 | ||
@@ -358,7 +390,7 @@ static int set_video_mode_Kiara(struct pwc_device *pdev, int size, int frames, i | |||
358 | buf[0] |= 0x80; | 390 | buf[0] |= 0x80; |
359 | 391 | ||
360 | /* Firmware bug: video endpoint is 5, but commands are sent to endpoint 4 */ | 392 | /* Firmware bug: video endpoint is 5, but commands are sent to endpoint 4 */ |
361 | ret = send_video_command(pdev->udev, 4 /* pdev->vendpoint */, buf, 12); | 393 | ret = send_video_command(pdev, 4 /* pdev->vendpoint */, buf, 12); |
362 | if (ret < 0) | 394 | if (ret < 0) |
363 | return ret; | 395 | return ret; |
364 | 396 | ||
@@ -530,7 +562,8 @@ int pwc_get_brightness(struct pwc_device *pdev) | |||
530 | char buf; | 562 | char buf; |
531 | int ret; | 563 | int ret; |
532 | 564 | ||
533 | ret = RecvControlMsg(GET_LUM_CTL, BRIGHTNESS_FORMATTER, 1); | 565 | ret = recv_control_msg(pdev, |
566 | GET_LUM_CTL, BRIGHTNESS_FORMATTER, &buf, sizeof(buf)); | ||
534 | if (ret < 0) | 567 | if (ret < 0) |
535 | return ret; | 568 | return ret; |
536 | return buf; | 569 | return buf; |
@@ -545,7 +578,8 @@ int pwc_set_brightness(struct pwc_device *pdev, int value) | |||
545 | if (value > 0xffff) | 578 | if (value > 0xffff) |
546 | value = 0xffff; | 579 | value = 0xffff; |
547 | buf = (value >> 9) & 0x7f; | 580 | buf = (value >> 9) & 0x7f; |
548 | return SendControlMsg(SET_LUM_CTL, BRIGHTNESS_FORMATTER, 1); | 581 | return send_control_msg(pdev, |
582 | SET_LUM_CTL, BRIGHTNESS_FORMATTER, &buf, sizeof(buf)); | ||
549 | } | 583 | } |
550 | 584 | ||
551 | /* CONTRAST */ | 585 | /* CONTRAST */ |
@@ -555,7 +589,8 @@ int pwc_get_contrast(struct pwc_device *pdev) | |||
555 | char buf; | 589 | char buf; |
556 | int ret; | 590 | int ret; |
557 | 591 | ||
558 | ret = RecvControlMsg(GET_LUM_CTL, CONTRAST_FORMATTER, 1); | 592 | ret = recv_control_msg(pdev, |
593 | GET_LUM_CTL, CONTRAST_FORMATTER, &buf, sizeof(buf)); | ||
559 | if (ret < 0) | 594 | if (ret < 0) |
560 | return ret; | 595 | return ret; |
561 | return buf; | 596 | return buf; |
@@ -570,7 +605,8 @@ int pwc_set_contrast(struct pwc_device *pdev, int value) | |||
570 | if (value > 0xffff) | 605 | if (value > 0xffff) |
571 | value = 0xffff; | 606 | value = 0xffff; |
572 | buf = (value >> 10) & 0x3f; | 607 | buf = (value >> 10) & 0x3f; |
573 | return SendControlMsg(SET_LUM_CTL, CONTRAST_FORMATTER, 1); | 608 | return send_control_msg(pdev, |
609 | SET_LUM_CTL, CONTRAST_FORMATTER, &buf, sizeof(buf)); | ||
574 | } | 610 | } |
575 | 611 | ||
576 | /* GAMMA */ | 612 | /* GAMMA */ |
@@ -580,7 +616,8 @@ int pwc_get_gamma(struct pwc_device *pdev) | |||
580 | char buf; | 616 | char buf; |
581 | int ret; | 617 | int ret; |
582 | 618 | ||
583 | ret = RecvControlMsg(GET_LUM_CTL, GAMMA_FORMATTER, 1); | 619 | ret = recv_control_msg(pdev, |
620 | GET_LUM_CTL, GAMMA_FORMATTER, &buf, sizeof(buf)); | ||
584 | if (ret < 0) | 621 | if (ret < 0) |
585 | return ret; | 622 | return ret; |
586 | return buf; | 623 | return buf; |
@@ -595,7 +632,8 @@ int pwc_set_gamma(struct pwc_device *pdev, int value) | |||
595 | if (value > 0xffff) | 632 | if (value > 0xffff) |
596 | value = 0xffff; | 633 | value = 0xffff; |
597 | buf = (value >> 11) & 0x1f; | 634 | buf = (value >> 11) & 0x1f; |
598 | return SendControlMsg(SET_LUM_CTL, GAMMA_FORMATTER, 1); | 635 | return send_control_msg(pdev, |
636 | SET_LUM_CTL, GAMMA_FORMATTER, &buf, sizeof(buf)); | ||
599 | } | 637 | } |
600 | 638 | ||
601 | 639 | ||
@@ -613,7 +651,8 @@ int pwc_get_saturation(struct pwc_device *pdev, int *value) | |||
613 | saturation_register = SATURATION_MODE_FORMATTER2; | 651 | saturation_register = SATURATION_MODE_FORMATTER2; |
614 | else | 652 | else |
615 | saturation_register = SATURATION_MODE_FORMATTER1; | 653 | saturation_register = SATURATION_MODE_FORMATTER1; |
616 | ret = RecvControlMsg(GET_CHROM_CTL, saturation_register, 1); | 654 | ret = recv_control_msg(pdev, |
655 | GET_CHROM_CTL, saturation_register, &buf, sizeof(buf)); | ||
617 | if (ret < 0) | 656 | if (ret < 0) |
618 | return ret; | 657 | return ret; |
619 | *value = (signed)buf; | 658 | *value = (signed)buf; |
@@ -636,7 +675,8 @@ int pwc_set_saturation(struct pwc_device *pdev, int value) | |||
636 | saturation_register = SATURATION_MODE_FORMATTER2; | 675 | saturation_register = SATURATION_MODE_FORMATTER2; |
637 | else | 676 | else |
638 | saturation_register = SATURATION_MODE_FORMATTER1; | 677 | saturation_register = SATURATION_MODE_FORMATTER1; |
639 | return SendControlMsg(SET_CHROM_CTL, saturation_register, 1); | 678 | return send_control_msg(pdev, |
679 | SET_CHROM_CTL, saturation_register, &buf, sizeof(buf)); | ||
640 | } | 680 | } |
641 | 681 | ||
642 | /* AGC */ | 682 | /* AGC */ |
@@ -651,7 +691,8 @@ int pwc_set_agc(struct pwc_device *pdev, int mode, int value) | |||
651 | else | 691 | else |
652 | buf = 0xff; /* fixed */ | 692 | buf = 0xff; /* fixed */ |
653 | 693 | ||
654 | ret = SendControlMsg(SET_LUM_CTL, AGC_MODE_FORMATTER, 1); | 694 | ret = send_control_msg(pdev, |
695 | SET_LUM_CTL, AGC_MODE_FORMATTER, &buf, sizeof(buf)); | ||
655 | 696 | ||
656 | if (!mode && ret >= 0) { | 697 | if (!mode && ret >= 0) { |
657 | if (value < 0) | 698 | if (value < 0) |
@@ -659,7 +700,8 @@ int pwc_set_agc(struct pwc_device *pdev, int mode, int value) | |||
659 | if (value > 0xffff) | 700 | if (value > 0xffff) |
660 | value = 0xffff; | 701 | value = 0xffff; |
661 | buf = (value >> 10) & 0x3F; | 702 | buf = (value >> 10) & 0x3F; |
662 | ret = SendControlMsg(SET_LUM_CTL, PRESET_AGC_FORMATTER, 1); | 703 | ret = send_control_msg(pdev, |
704 | SET_LUM_CTL, PRESET_AGC_FORMATTER, &buf, sizeof(buf)); | ||
663 | } | 705 | } |
664 | if (ret < 0) | 706 | if (ret < 0) |
665 | return ret; | 707 | return ret; |
@@ -671,12 +713,14 @@ int pwc_get_agc(struct pwc_device *pdev, int *value) | |||
671 | unsigned char buf; | 713 | unsigned char buf; |
672 | int ret; | 714 | int ret; |
673 | 715 | ||
674 | ret = RecvControlMsg(GET_LUM_CTL, AGC_MODE_FORMATTER, 1); | 716 | ret = recv_control_msg(pdev, |
717 | GET_LUM_CTL, AGC_MODE_FORMATTER, &buf, sizeof(buf)); | ||
675 | if (ret < 0) | 718 | if (ret < 0) |
676 | return ret; | 719 | return ret; |
677 | 720 | ||
678 | if (buf != 0) { /* fixed */ | 721 | if (buf != 0) { /* fixed */ |
679 | ret = RecvControlMsg(GET_LUM_CTL, PRESET_AGC_FORMATTER, 1); | 722 | ret = recv_control_msg(pdev, |
723 | GET_LUM_CTL, PRESET_AGC_FORMATTER, &buf, sizeof(buf)); | ||
680 | if (ret < 0) | 724 | if (ret < 0) |
681 | return ret; | 725 | return ret; |
682 | if (buf > 0x3F) | 726 | if (buf > 0x3F) |
@@ -684,7 +728,8 @@ int pwc_get_agc(struct pwc_device *pdev, int *value) | |||
684 | *value = (buf << 10); | 728 | *value = (buf << 10); |
685 | } | 729 | } |
686 | else { /* auto */ | 730 | else { /* auto */ |
687 | ret = RecvControlMsg(GET_STATUS_CTL, READ_AGC_FORMATTER, 1); | 731 | ret = recv_control_msg(pdev, |
732 | GET_STATUS_CTL, READ_AGC_FORMATTER, &buf, sizeof(buf)); | ||
688 | if (ret < 0) | 733 | if (ret < 0) |
689 | return ret; | 734 | return ret; |
690 | /* Gah... this value ranges from 0x00 ... 0x9F */ | 735 | /* Gah... this value ranges from 0x00 ... 0x9F */ |
@@ -707,7 +752,8 @@ int pwc_set_shutter_speed(struct pwc_device *pdev, int mode, int value) | |||
707 | else | 752 | else |
708 | buf[0] = 0xff; /* fixed */ | 753 | buf[0] = 0xff; /* fixed */ |
709 | 754 | ||
710 | ret = SendControlMsg(SET_LUM_CTL, SHUTTER_MODE_FORMATTER, 1); | 755 | ret = send_control_msg(pdev, |
756 | SET_LUM_CTL, SHUTTER_MODE_FORMATTER, &buf, sizeof(buf)); | ||
711 | 757 | ||
712 | if (!mode && ret >= 0) { | 758 | if (!mode && ret >= 0) { |
713 | if (value < 0) | 759 | if (value < 0) |
@@ -726,7 +772,9 @@ int pwc_set_shutter_speed(struct pwc_device *pdev, int mode, int value) | |||
726 | buf[0] = value >> 8; | 772 | buf[0] = value >> 8; |
727 | } | 773 | } |
728 | 774 | ||
729 | ret = SendControlMsg(SET_LUM_CTL, PRESET_SHUTTER_FORMATTER, 2); | 775 | ret = send_control_msg(pdev, |
776 | SET_LUM_CTL, PRESET_SHUTTER_FORMATTER, | ||
777 | &buf, sizeof(buf)); | ||
730 | } | 778 | } |
731 | return ret; | 779 | return ret; |
732 | } | 780 | } |
@@ -737,7 +785,8 @@ int pwc_get_shutter_speed(struct pwc_device *pdev, int *value) | |||
737 | unsigned char buf[2]; | 785 | unsigned char buf[2]; |
738 | int ret; | 786 | int ret; |
739 | 787 | ||
740 | ret = RecvControlMsg(GET_STATUS_CTL, READ_SHUTTER_FORMATTER, 2); | 788 | ret = recv_control_msg(pdev, |
789 | GET_STATUS_CTL, READ_SHUTTER_FORMATTER, &buf, sizeof(buf)); | ||
741 | if (ret < 0) | 790 | if (ret < 0) |
742 | return ret; | 791 | return ret; |
743 | *value = buf[0] + (buf[1] << 8); | 792 | *value = buf[0] + (buf[1] << 8); |
@@ -764,7 +813,9 @@ int pwc_camera_power(struct pwc_device *pdev, int power) | |||
764 | buf = 0x00; /* active */ | 813 | buf = 0x00; /* active */ |
765 | else | 814 | else |
766 | buf = 0xFF; /* power save */ | 815 | buf = 0xFF; /* power save */ |
767 | return SendControlMsg(SET_STATUS_CTL, SET_POWER_SAVE_MODE_FORMATTER, 1); | 816 | return send_control_msg(pdev, |
817 | SET_STATUS_CTL, SET_POWER_SAVE_MODE_FORMATTER, | ||
818 | &buf, sizeof(buf)); | ||
768 | } | 819 | } |
769 | 820 | ||
770 | 821 | ||
@@ -773,20 +824,20 @@ int pwc_camera_power(struct pwc_device *pdev, int power) | |||
773 | 824 | ||
774 | int pwc_restore_user(struct pwc_device *pdev) | 825 | int pwc_restore_user(struct pwc_device *pdev) |
775 | { | 826 | { |
776 | char buf; /* dummy */ | 827 | return send_control_msg(pdev, |
777 | return SendControlMsg(SET_STATUS_CTL, RESTORE_USER_DEFAULTS_FORMATTER, 0); | 828 | SET_STATUS_CTL, RESTORE_USER_DEFAULTS_FORMATTER, NULL, 0); |
778 | } | 829 | } |
779 | 830 | ||
780 | int pwc_save_user(struct pwc_device *pdev) | 831 | int pwc_save_user(struct pwc_device *pdev) |
781 | { | 832 | { |
782 | char buf; /* dummy */ | 833 | return send_control_msg(pdev, |
783 | return SendControlMsg(SET_STATUS_CTL, SAVE_USER_DEFAULTS_FORMATTER, 0); | 834 | SET_STATUS_CTL, SAVE_USER_DEFAULTS_FORMATTER, NULL, 0); |
784 | } | 835 | } |
785 | 836 | ||
786 | int pwc_restore_factory(struct pwc_device *pdev) | 837 | int pwc_restore_factory(struct pwc_device *pdev) |
787 | { | 838 | { |
788 | char buf; /* dummy */ | 839 | return send_control_msg(pdev, |
789 | return SendControlMsg(SET_STATUS_CTL, RESTORE_FACTORY_DEFAULTS_FORMATTER, 0); | 840 | SET_STATUS_CTL, RESTORE_FACTORY_DEFAULTS_FORMATTER, NULL, 0); |
790 | } | 841 | } |
791 | 842 | ||
792 | /* ************************************************* */ | 843 | /* ************************************************* */ |
@@ -814,7 +865,8 @@ int pwc_set_awb(struct pwc_device *pdev, int mode) | |||
814 | 865 | ||
815 | buf = mode & 0x07; /* just the lowest three bits */ | 866 | buf = mode & 0x07; /* just the lowest three bits */ |
816 | 867 | ||
817 | ret = SendControlMsg(SET_CHROM_CTL, WB_MODE_FORMATTER, 1); | 868 | ret = send_control_msg(pdev, |
869 | SET_CHROM_CTL, WB_MODE_FORMATTER, &buf, sizeof(buf)); | ||
818 | 870 | ||
819 | if (ret < 0) | 871 | if (ret < 0) |
820 | return ret; | 872 | return ret; |
@@ -826,7 +878,8 @@ int pwc_get_awb(struct pwc_device *pdev) | |||
826 | unsigned char buf; | 878 | unsigned char buf; |
827 | int ret; | 879 | int ret; |
828 | 880 | ||
829 | ret = RecvControlMsg(GET_CHROM_CTL, WB_MODE_FORMATTER, 1); | 881 | ret = recv_control_msg(pdev, |
882 | GET_CHROM_CTL, WB_MODE_FORMATTER, &buf, sizeof(buf)); | ||
830 | 883 | ||
831 | if (ret < 0) | 884 | if (ret < 0) |
832 | return ret; | 885 | return ret; |
@@ -843,7 +896,9 @@ int pwc_set_red_gain(struct pwc_device *pdev, int value) | |||
843 | value = 0xffff; | 896 | value = 0xffff; |
844 | /* only the msb is considered */ | 897 | /* only the msb is considered */ |
845 | buf = value >> 8; | 898 | buf = value >> 8; |
846 | return SendControlMsg(SET_CHROM_CTL, PRESET_MANUAL_RED_GAIN_FORMATTER, 1); | 899 | return send_control_msg(pdev, |
900 | SET_CHROM_CTL, PRESET_MANUAL_RED_GAIN_FORMATTER, | ||
901 | &buf, sizeof(buf)); | ||
847 | } | 902 | } |
848 | 903 | ||
849 | int pwc_get_red_gain(struct pwc_device *pdev, int *value) | 904 | int pwc_get_red_gain(struct pwc_device *pdev, int *value) |
@@ -851,7 +906,9 @@ int pwc_get_red_gain(struct pwc_device *pdev, int *value) | |||
851 | unsigned char buf; | 906 | unsigned char buf; |
852 | int ret; | 907 | int ret; |
853 | 908 | ||
854 | ret = RecvControlMsg(GET_CHROM_CTL, PRESET_MANUAL_RED_GAIN_FORMATTER, 1); | 909 | ret = recv_control_msg(pdev, |
910 | GET_CHROM_CTL, PRESET_MANUAL_RED_GAIN_FORMATTER, | ||
911 | &buf, sizeof(buf)); | ||
855 | if (ret < 0) | 912 | if (ret < 0) |
856 | return ret; | 913 | return ret; |
857 | *value = buf << 8; | 914 | *value = buf << 8; |
@@ -869,7 +926,9 @@ int pwc_set_blue_gain(struct pwc_device *pdev, int value) | |||
869 | value = 0xffff; | 926 | value = 0xffff; |
870 | /* only the msb is considered */ | 927 | /* only the msb is considered */ |
871 | buf = value >> 8; | 928 | buf = value >> 8; |
872 | return SendControlMsg(SET_CHROM_CTL, PRESET_MANUAL_BLUE_GAIN_FORMATTER, 1); | 929 | return send_control_msg(pdev, |
930 | SET_CHROM_CTL, PRESET_MANUAL_BLUE_GAIN_FORMATTER, | ||
931 | &buf, sizeof(buf)); | ||
873 | } | 932 | } |
874 | 933 | ||
875 | int pwc_get_blue_gain(struct pwc_device *pdev, int *value) | 934 | int pwc_get_blue_gain(struct pwc_device *pdev, int *value) |
@@ -877,7 +936,9 @@ int pwc_get_blue_gain(struct pwc_device *pdev, int *value) | |||
877 | unsigned char buf; | 936 | unsigned char buf; |
878 | int ret; | 937 | int ret; |
879 | 938 | ||
880 | ret = RecvControlMsg(GET_CHROM_CTL, PRESET_MANUAL_BLUE_GAIN_FORMATTER, 1); | 939 | ret = recv_control_msg(pdev, |
940 | GET_CHROM_CTL, PRESET_MANUAL_BLUE_GAIN_FORMATTER, | ||
941 | &buf, sizeof(buf)); | ||
881 | if (ret < 0) | 942 | if (ret < 0) |
882 | return ret; | 943 | return ret; |
883 | *value = buf << 8; | 944 | *value = buf << 8; |
@@ -894,7 +955,8 @@ static int pwc_read_red_gain(struct pwc_device *pdev, int *value) | |||
894 | unsigned char buf; | 955 | unsigned char buf; |
895 | int ret; | 956 | int ret; |
896 | 957 | ||
897 | ret = RecvControlMsg(GET_STATUS_CTL, READ_RED_GAIN_FORMATTER, 1); | 958 | ret = recv_control_msg(pdev, |
959 | GET_STATUS_CTL, READ_RED_GAIN_FORMATTER, &buf, sizeof(buf)); | ||
898 | if (ret < 0) | 960 | if (ret < 0) |
899 | return ret; | 961 | return ret; |
900 | *value = buf << 8; | 962 | *value = buf << 8; |
@@ -906,7 +968,8 @@ static int pwc_read_blue_gain(struct pwc_device *pdev, int *value) | |||
906 | unsigned char buf; | 968 | unsigned char buf; |
907 | int ret; | 969 | int ret; |
908 | 970 | ||
909 | ret = RecvControlMsg(GET_STATUS_CTL, READ_BLUE_GAIN_FORMATTER, 1); | 971 | ret = recv_control_msg(pdev, |
972 | GET_STATUS_CTL, READ_BLUE_GAIN_FORMATTER, &buf, sizeof(buf)); | ||
910 | if (ret < 0) | 973 | if (ret < 0) |
911 | return ret; | 974 | return ret; |
912 | *value = buf << 8; | 975 | *value = buf << 8; |
@@ -920,7 +983,8 @@ static int pwc_set_wb_speed(struct pwc_device *pdev, int speed) | |||
920 | 983 | ||
921 | /* useful range is 0x01..0x20 */ | 984 | /* useful range is 0x01..0x20 */ |
922 | buf = speed / 0x7f0; | 985 | buf = speed / 0x7f0; |
923 | return SendControlMsg(SET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, 1); | 986 | return send_control_msg(pdev, |
987 | SET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, &buf, sizeof(buf)); | ||
924 | } | 988 | } |
925 | 989 | ||
926 | static int pwc_get_wb_speed(struct pwc_device *pdev, int *value) | 990 | static int pwc_get_wb_speed(struct pwc_device *pdev, int *value) |
@@ -928,7 +992,8 @@ static int pwc_get_wb_speed(struct pwc_device *pdev, int *value) | |||
928 | unsigned char buf; | 992 | unsigned char buf; |
929 | int ret; | 993 | int ret; |
930 | 994 | ||
931 | ret = RecvControlMsg(GET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, 1); | 995 | ret = recv_control_msg(pdev, |
996 | GET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, &buf, sizeof(buf)); | ||
932 | if (ret < 0) | 997 | if (ret < 0) |
933 | return ret; | 998 | return ret; |
934 | *value = buf * 0x7f0; | 999 | *value = buf * 0x7f0; |
@@ -942,7 +1007,8 @@ static int pwc_set_wb_delay(struct pwc_device *pdev, int delay) | |||
942 | 1007 | ||
943 | /* useful range is 0x01..0x3F */ | 1008 | /* useful range is 0x01..0x3F */ |
944 | buf = (delay >> 10); | 1009 | buf = (delay >> 10); |
945 | return SendControlMsg(SET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, 1); | 1010 | return send_control_msg(pdev, |
1011 | SET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, &buf, sizeof(buf)); | ||
946 | } | 1012 | } |
947 | 1013 | ||
948 | static int pwc_get_wb_delay(struct pwc_device *pdev, int *value) | 1014 | static int pwc_get_wb_delay(struct pwc_device *pdev, int *value) |
@@ -950,7 +1016,8 @@ static int pwc_get_wb_delay(struct pwc_device *pdev, int *value) | |||
950 | unsigned char buf; | 1016 | unsigned char buf; |
951 | int ret; | 1017 | int ret; |
952 | 1018 | ||
953 | ret = RecvControlMsg(GET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, 1); | 1019 | ret = recv_control_msg(pdev, |
1020 | GET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, &buf, sizeof(buf)); | ||
954 | if (ret < 0) | 1021 | if (ret < 0) |
955 | return ret; | 1022 | return ret; |
956 | *value = buf << 10; | 1023 | *value = buf << 10; |
@@ -978,7 +1045,8 @@ int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value) | |||
978 | buf[0] = on_value; | 1045 | buf[0] = on_value; |
979 | buf[1] = off_value; | 1046 | buf[1] = off_value; |
980 | 1047 | ||
981 | return SendControlMsg(SET_STATUS_CTL, LED_FORMATTER, 2); | 1048 | return send_control_msg(pdev, |
1049 | SET_STATUS_CTL, LED_FORMATTER, &buf, sizeof(buf)); | ||
982 | } | 1050 | } |
983 | 1051 | ||
984 | static int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value) | 1052 | static int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value) |
@@ -992,7 +1060,8 @@ static int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value) | |||
992 | return 0; | 1060 | return 0; |
993 | } | 1061 | } |
994 | 1062 | ||
995 | ret = RecvControlMsg(GET_STATUS_CTL, LED_FORMATTER, 2); | 1063 | ret = recv_control_msg(pdev, |
1064 | GET_STATUS_CTL, LED_FORMATTER, &buf, sizeof(buf)); | ||
996 | if (ret < 0) | 1065 | if (ret < 0) |
997 | return ret; | 1066 | return ret; |
998 | *on_value = buf[0] * 100; | 1067 | *on_value = buf[0] * 100; |
@@ -1009,7 +1078,8 @@ int pwc_set_contour(struct pwc_device *pdev, int contour) | |||
1009 | buf = 0xff; /* auto contour on */ | 1078 | buf = 0xff; /* auto contour on */ |
1010 | else | 1079 | else |
1011 | buf = 0x0; /* auto contour off */ | 1080 | buf = 0x0; /* auto contour off */ |
1012 | ret = SendControlMsg(SET_LUM_CTL, AUTO_CONTOUR_FORMATTER, 1); | 1081 | ret = send_control_msg(pdev, |
1082 | SET_LUM_CTL, AUTO_CONTOUR_FORMATTER, &buf, sizeof(buf)); | ||
1013 | if (ret < 0) | 1083 | if (ret < 0) |
1014 | return ret; | 1084 | return ret; |
1015 | 1085 | ||
@@ -1019,7 +1089,8 @@ int pwc_set_contour(struct pwc_device *pdev, int contour) | |||
1019 | contour = 0xffff; | 1089 | contour = 0xffff; |
1020 | 1090 | ||
1021 | buf = (contour >> 10); /* contour preset is [0..3f] */ | 1091 | buf = (contour >> 10); /* contour preset is [0..3f] */ |
1022 | ret = SendControlMsg(SET_LUM_CTL, PRESET_CONTOUR_FORMATTER, 1); | 1092 | ret = send_control_msg(pdev, |
1093 | SET_LUM_CTL, PRESET_CONTOUR_FORMATTER, &buf, sizeof(buf)); | ||
1023 | if (ret < 0) | 1094 | if (ret < 0) |
1024 | return ret; | 1095 | return ret; |
1025 | return 0; | 1096 | return 0; |
@@ -1030,13 +1101,16 @@ int pwc_get_contour(struct pwc_device *pdev, int *contour) | |||
1030 | unsigned char buf; | 1101 | unsigned char buf; |
1031 | int ret; | 1102 | int ret; |
1032 | 1103 | ||
1033 | ret = RecvControlMsg(GET_LUM_CTL, AUTO_CONTOUR_FORMATTER, 1); | 1104 | ret = recv_control_msg(pdev, |
1105 | GET_LUM_CTL, AUTO_CONTOUR_FORMATTER, &buf, sizeof(buf)); | ||
1034 | if (ret < 0) | 1106 | if (ret < 0) |
1035 | return ret; | 1107 | return ret; |
1036 | 1108 | ||
1037 | if (buf == 0) { | 1109 | if (buf == 0) { |
1038 | /* auto mode off, query current preset value */ | 1110 | /* auto mode off, query current preset value */ |
1039 | ret = RecvControlMsg(GET_LUM_CTL, PRESET_CONTOUR_FORMATTER, 1); | 1111 | ret = recv_control_msg(pdev, |
1112 | GET_LUM_CTL, PRESET_CONTOUR_FORMATTER, | ||
1113 | &buf, sizeof(buf)); | ||
1040 | if (ret < 0) | 1114 | if (ret < 0) |
1041 | return ret; | 1115 | return ret; |
1042 | *contour = buf << 10; | 1116 | *contour = buf << 10; |
@@ -1055,7 +1129,9 @@ int pwc_set_backlight(struct pwc_device *pdev, int backlight) | |||
1055 | buf = 0xff; | 1129 | buf = 0xff; |
1056 | else | 1130 | else |
1057 | buf = 0x0; | 1131 | buf = 0x0; |
1058 | return SendControlMsg(SET_LUM_CTL, BACK_LIGHT_COMPENSATION_FORMATTER, 1); | 1132 | return send_control_msg(pdev, |
1133 | SET_LUM_CTL, BACK_LIGHT_COMPENSATION_FORMATTER, | ||
1134 | &buf, sizeof(buf)); | ||
1059 | } | 1135 | } |
1060 | 1136 | ||
1061 | int pwc_get_backlight(struct pwc_device *pdev, int *backlight) | 1137 | int pwc_get_backlight(struct pwc_device *pdev, int *backlight) |
@@ -1063,7 +1139,9 @@ int pwc_get_backlight(struct pwc_device *pdev, int *backlight) | |||
1063 | int ret; | 1139 | int ret; |
1064 | unsigned char buf; | 1140 | unsigned char buf; |
1065 | 1141 | ||
1066 | ret = RecvControlMsg(GET_LUM_CTL, BACK_LIGHT_COMPENSATION_FORMATTER, 1); | 1142 | ret = recv_control_msg(pdev, |
1143 | GET_LUM_CTL, BACK_LIGHT_COMPENSATION_FORMATTER, | ||
1144 | &buf, sizeof(buf)); | ||
1067 | if (ret < 0) | 1145 | if (ret < 0) |
1068 | return ret; | 1146 | return ret; |
1069 | *backlight = !!buf; | 1147 | *backlight = !!buf; |
@@ -1078,7 +1156,8 @@ int pwc_set_colour_mode(struct pwc_device *pdev, int colour) | |||
1078 | buf = 0xff; | 1156 | buf = 0xff; |
1079 | else | 1157 | else |
1080 | buf = 0x0; | 1158 | buf = 0x0; |
1081 | return SendControlMsg(SET_CHROM_CTL, COLOUR_MODE_FORMATTER, 1); | 1159 | return send_control_msg(pdev, |
1160 | SET_CHROM_CTL, COLOUR_MODE_FORMATTER, &buf, sizeof(buf)); | ||
1082 | } | 1161 | } |
1083 | 1162 | ||
1084 | int pwc_get_colour_mode(struct pwc_device *pdev, int *colour) | 1163 | int pwc_get_colour_mode(struct pwc_device *pdev, int *colour) |
@@ -1086,7 +1165,8 @@ int pwc_get_colour_mode(struct pwc_device *pdev, int *colour) | |||
1086 | int ret; | 1165 | int ret; |
1087 | unsigned char buf; | 1166 | unsigned char buf; |
1088 | 1167 | ||
1089 | ret = RecvControlMsg(GET_CHROM_CTL, COLOUR_MODE_FORMATTER, 1); | 1168 | ret = recv_control_msg(pdev, |
1169 | GET_CHROM_CTL, COLOUR_MODE_FORMATTER, &buf, sizeof(buf)); | ||
1090 | if (ret < 0) | 1170 | if (ret < 0) |
1091 | return ret; | 1171 | return ret; |
1092 | *colour = !!buf; | 1172 | *colour = !!buf; |
@@ -1102,7 +1182,8 @@ int pwc_set_flicker(struct pwc_device *pdev, int flicker) | |||
1102 | buf = 0xff; | 1182 | buf = 0xff; |
1103 | else | 1183 | else |
1104 | buf = 0x0; | 1184 | buf = 0x0; |
1105 | return SendControlMsg(SET_LUM_CTL, FLICKERLESS_MODE_FORMATTER, 1); | 1185 | return send_control_msg(pdev, |
1186 | SET_LUM_CTL, FLICKERLESS_MODE_FORMATTER, &buf, sizeof(buf)); | ||
1106 | } | 1187 | } |
1107 | 1188 | ||
1108 | int pwc_get_flicker(struct pwc_device *pdev, int *flicker) | 1189 | int pwc_get_flicker(struct pwc_device *pdev, int *flicker) |
@@ -1110,7 +1191,8 @@ int pwc_get_flicker(struct pwc_device *pdev, int *flicker) | |||
1110 | int ret; | 1191 | int ret; |
1111 | unsigned char buf; | 1192 | unsigned char buf; |
1112 | 1193 | ||
1113 | ret = RecvControlMsg(GET_LUM_CTL, FLICKERLESS_MODE_FORMATTER, 1); | 1194 | ret = recv_control_msg(pdev, |
1195 | GET_LUM_CTL, FLICKERLESS_MODE_FORMATTER, &buf, sizeof(buf)); | ||
1114 | if (ret < 0) | 1196 | if (ret < 0) |
1115 | return ret; | 1197 | return ret; |
1116 | *flicker = !!buf; | 1198 | *flicker = !!buf; |
@@ -1126,7 +1208,9 @@ int pwc_set_dynamic_noise(struct pwc_device *pdev, int noise) | |||
1126 | if (noise > 3) | 1208 | if (noise > 3) |
1127 | noise = 3; | 1209 | noise = 3; |
1128 | buf = noise; | 1210 | buf = noise; |
1129 | return SendControlMsg(SET_LUM_CTL, DYNAMIC_NOISE_CONTROL_FORMATTER, 1); | 1211 | return send_control_msg(pdev, |
1212 | SET_LUM_CTL, DYNAMIC_NOISE_CONTROL_FORMATTER, | ||
1213 | &buf, sizeof(buf)); | ||
1130 | } | 1214 | } |
1131 | 1215 | ||
1132 | int pwc_get_dynamic_noise(struct pwc_device *pdev, int *noise) | 1216 | int pwc_get_dynamic_noise(struct pwc_device *pdev, int *noise) |
@@ -1134,7 +1218,9 @@ int pwc_get_dynamic_noise(struct pwc_device *pdev, int *noise) | |||
1134 | int ret; | 1218 | int ret; |
1135 | unsigned char buf; | 1219 | unsigned char buf; |
1136 | 1220 | ||
1137 | ret = RecvControlMsg(GET_LUM_CTL, DYNAMIC_NOISE_CONTROL_FORMATTER, 1); | 1221 | ret = recv_control_msg(pdev, |
1222 | GET_LUM_CTL, DYNAMIC_NOISE_CONTROL_FORMATTER, | ||
1223 | &buf, sizeof(buf)); | ||
1138 | if (ret < 0) | 1224 | if (ret < 0) |
1139 | return ret; | 1225 | return ret; |
1140 | *noise = buf; | 1226 | *noise = buf; |
@@ -1146,7 +1232,8 @@ static int _pwc_mpt_reset(struct pwc_device *pdev, int flags) | |||
1146 | unsigned char buf; | 1232 | unsigned char buf; |
1147 | 1233 | ||
1148 | buf = flags & 0x03; // only lower two bits are currently used | 1234 | buf = flags & 0x03; // only lower two bits are currently used |
1149 | return SendControlMsg(SET_MPT_CTL, PT_RESET_CONTROL_FORMATTER, 1); | 1235 | return send_control_msg(pdev, |
1236 | SET_MPT_CTL, PT_RESET_CONTROL_FORMATTER, &buf, sizeof(buf)); | ||
1150 | } | 1237 | } |
1151 | 1238 | ||
1152 | int pwc_mpt_reset(struct pwc_device *pdev, int flags) | 1239 | int pwc_mpt_reset(struct pwc_device *pdev, int flags) |
@@ -1175,7 +1262,8 @@ static int _pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt) | |||
1175 | buf[1] = (pan >> 8) & 0xFF; | 1262 | buf[1] = (pan >> 8) & 0xFF; |
1176 | buf[2] = tilt & 0xFF; | 1263 | buf[2] = tilt & 0xFF; |
1177 | buf[3] = (tilt >> 8) & 0xFF; | 1264 | buf[3] = (tilt >> 8) & 0xFF; |
1178 | return SendControlMsg(SET_MPT_CTL, PT_RELATIVE_CONTROL_FORMATTER, 4); | 1265 | return send_control_msg(pdev, |
1266 | SET_MPT_CTL, PT_RELATIVE_CONTROL_FORMATTER, &buf, sizeof(buf)); | ||
1179 | } | 1267 | } |
1180 | 1268 | ||
1181 | int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt) | 1269 | int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt) |
@@ -1211,7 +1299,8 @@ static int pwc_mpt_get_status(struct pwc_device *pdev, struct pwc_mpt_status *st | |||
1211 | int ret; | 1299 | int ret; |
1212 | unsigned char buf[5]; | 1300 | unsigned char buf[5]; |
1213 | 1301 | ||
1214 | ret = RecvControlMsg(GET_MPT_CTL, PT_STATUS_FORMATTER, 5); | 1302 | ret = recv_control_msg(pdev, |
1303 | GET_MPT_CTL, PT_STATUS_FORMATTER, &buf, sizeof(buf)); | ||
1215 | if (ret < 0) | 1304 | if (ret < 0) |
1216 | return ret; | 1305 | return ret; |
1217 | status->status = buf[0] & 0x7; // 3 bits are used for reporting | 1306 | status->status = buf[0] & 0x7; // 3 bits are used for reporting |
@@ -1233,7 +1322,8 @@ int pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor) | |||
1233 | else | 1322 | else |
1234 | request = SENSOR_TYPE_FORMATTER2; | 1323 | request = SENSOR_TYPE_FORMATTER2; |
1235 | 1324 | ||
1236 | ret = RecvControlMsg(GET_STATUS_CTL, request, 1); | 1325 | ret = recv_control_msg(pdev, |
1326 | GET_STATUS_CTL, request, &buf, sizeof(buf)); | ||
1237 | if (ret < 0) | 1327 | if (ret < 0) |
1238 | return ret; | 1328 | return ret; |
1239 | if (pdev->type < 675) | 1329 | if (pdev->type < 675) |