aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorMartin Fuzzey <mfuzzey@gmail.com>2009-04-21 15:48:09 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-04-23 17:15:31 -0400
commit6b35ca0d3d586b8ecb8396821af21186e20afaf0 (patch)
tree6e4e33ca3295f9f14e6e34e163abe8803a39a3f7 /drivers/media
parentecf85e481a716cfe07406439fdc7ba9526bbfaeb (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')
-rw-r--r--drivers/media/video/pwc/pwc-ctrl.c238
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
162static 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
186static 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
180static int send_video_command(struct usb_device *udev, int index, void *buf, int buflen) 206static 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
216static 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
193static int set_video_mode_Nala(struct pwc_device *pdev, int size, int frames) 225static 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
774int pwc_restore_user(struct pwc_device *pdev) 825int 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
780int pwc_save_user(struct pwc_device *pdev) 831int 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
786int pwc_restore_factory(struct pwc_device *pdev) 837int 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
849int pwc_get_red_gain(struct pwc_device *pdev, int *value) 904int 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
875int pwc_get_blue_gain(struct pwc_device *pdev, int *value) 934int 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
926static int pwc_get_wb_speed(struct pwc_device *pdev, int *value) 990static 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
948static int pwc_get_wb_delay(struct pwc_device *pdev, int *value) 1014static 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
984static int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value) 1052static 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
1061int pwc_get_backlight(struct pwc_device *pdev, int *backlight) 1137int 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
1084int pwc_get_colour_mode(struct pwc_device *pdev, int *colour) 1163int 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
1108int pwc_get_flicker(struct pwc_device *pdev, int *flicker) 1189int 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
1132int pwc_get_dynamic_noise(struct pwc_device *pdev, int *noise) 1216int 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
1152int pwc_mpt_reset(struct pwc_device *pdev, int flags) 1239int 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
1181int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt) 1269int 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)