diff options
-rw-r--r-- | drivers/media/video/pwc/pwc-ctrl.c | 64 | ||||
-rw-r--r-- | drivers/media/video/pwc/pwc-v4l.c | 48 | ||||
-rw-r--r-- | drivers/media/video/pwc/pwc.h | 2 |
3 files changed, 57 insertions, 57 deletions
diff --git a/drivers/media/video/pwc/pwc-ctrl.c b/drivers/media/video/pwc/pwc-ctrl.c index b42c239de9cf..def9120b607d 100644 --- a/drivers/media/video/pwc/pwc-ctrl.c +++ b/drivers/media/video/pwc/pwc-ctrl.c | |||
@@ -597,54 +597,6 @@ void pwc_camera_power(struct pwc_device *pdev, int power) | |||
597 | power ? "on" : "off", r); | 597 | power ? "on" : "off", r); |
598 | } | 598 | } |
599 | 599 | ||
600 | static int pwc_set_wb_speed(struct pwc_device *pdev, int speed) | ||
601 | { | ||
602 | unsigned char buf; | ||
603 | |||
604 | /* useful range is 0x01..0x20 */ | ||
605 | buf = speed / 0x7f0; | ||
606 | return send_control_msg(pdev, | ||
607 | SET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, &buf, sizeof(buf)); | ||
608 | } | ||
609 | |||
610 | static int pwc_get_wb_speed(struct pwc_device *pdev, int *value) | ||
611 | { | ||
612 | unsigned char buf; | ||
613 | int ret; | ||
614 | |||
615 | ret = recv_control_msg(pdev, | ||
616 | GET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, &buf, sizeof(buf)); | ||
617 | if (ret < 0) | ||
618 | return ret; | ||
619 | *value = buf * 0x7f0; | ||
620 | return 0; | ||
621 | } | ||
622 | |||
623 | |||
624 | static int pwc_set_wb_delay(struct pwc_device *pdev, int delay) | ||
625 | { | ||
626 | unsigned char buf; | ||
627 | |||
628 | /* useful range is 0x01..0x3F */ | ||
629 | buf = (delay >> 10); | ||
630 | return send_control_msg(pdev, | ||
631 | SET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, &buf, sizeof(buf)); | ||
632 | } | ||
633 | |||
634 | static int pwc_get_wb_delay(struct pwc_device *pdev, int *value) | ||
635 | { | ||
636 | unsigned char buf; | ||
637 | int ret; | ||
638 | |||
639 | ret = recv_control_msg(pdev, | ||
640 | GET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, &buf, sizeof(buf)); | ||
641 | if (ret < 0) | ||
642 | return ret; | ||
643 | *value = buf << 10; | ||
644 | return 0; | ||
645 | } | ||
646 | |||
647 | |||
648 | int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value) | 600 | int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value) |
649 | { | 601 | { |
650 | unsigned char buf[2]; | 602 | unsigned char buf[2]; |
@@ -963,10 +915,12 @@ long pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) | |||
963 | ARG_DEF(struct pwc_wb_speed, wbs) | 915 | ARG_DEF(struct pwc_wb_speed, wbs) |
964 | 916 | ||
965 | if (ARGR(wbs).control_speed > 0) { | 917 | if (ARGR(wbs).control_speed > 0) { |
966 | ret = pwc_set_wb_speed(pdev, ARGR(wbs).control_speed); | 918 | ret = pwc_ioctl_s_ctrl(pdev->awb_speed, |
919 | ARGR(wbs).control_speed); | ||
967 | } | 920 | } |
968 | if (ARGR(wbs).control_delay > 0) { | 921 | if (ret == 0 && ARGR(wbs).control_delay > 0) { |
969 | ret = pwc_set_wb_delay(pdev, ARGR(wbs).control_delay); | 922 | ret = pwc_ioctl_s_ctrl(pdev->awb_delay, |
923 | ARGR(wbs).control_delay); | ||
970 | } | 924 | } |
971 | break; | 925 | break; |
972 | } | 926 | } |
@@ -975,12 +929,8 @@ long pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg) | |||
975 | { | 929 | { |
976 | ARG_DEF(struct pwc_wb_speed, wbs) | 930 | ARG_DEF(struct pwc_wb_speed, wbs) |
977 | 931 | ||
978 | ret = pwc_get_wb_speed(pdev, &ARGR(wbs).control_speed); | 932 | ARGR(wbs).control_speed = v4l2_ctrl_g_ctrl(pdev->awb_speed); |
979 | if (ret < 0) | 933 | ARGR(wbs).control_delay = v4l2_ctrl_g_ctrl(pdev->awb_delay); |
980 | break; | ||
981 | ret = pwc_get_wb_delay(pdev, &ARGR(wbs).control_delay); | ||
982 | if (ret < 0) | ||
983 | break; | ||
984 | ARG_OUT(wbs) | 934 | ARG_OUT(wbs) |
985 | break; | 935 | break; |
986 | } | 936 | } |
diff --git a/drivers/media/video/pwc/pwc-v4l.c b/drivers/media/video/pwc/pwc-v4l.c index a10ff6b64acf..1303641c70c1 100644 --- a/drivers/media/video/pwc/pwc-v4l.c +++ b/drivers/media/video/pwc/pwc-v4l.c | |||
@@ -49,6 +49,7 @@ static const struct v4l2_ctrl_ops pwc_ctrl_ops = { | |||
49 | 49 | ||
50 | enum { awb_indoor, awb_outdoor, awb_fl, awb_manual, awb_auto }; | 50 | enum { awb_indoor, awb_outdoor, awb_fl, awb_manual, awb_auto }; |
51 | enum { custom_autocontour, custom_contour, custom_noise_reduction, | 51 | enum { custom_autocontour, custom_contour, custom_noise_reduction, |
52 | custom_awb_speed, custom_awb_delay, | ||
52 | custom_save_user, custom_restore_user, custom_restore_factory }; | 53 | custom_save_user, custom_restore_user, custom_restore_factory }; |
53 | 54 | ||
54 | const char * const pwc_auto_whitebal_qmenu[] = { | 55 | const char * const pwc_auto_whitebal_qmenu[] = { |
@@ -138,6 +139,26 @@ static const struct v4l2_ctrl_config pwc_restore_factory_cfg = { | |||
138 | .name = "Restore Factory Settings", | 139 | .name = "Restore Factory Settings", |
139 | }; | 140 | }; |
140 | 141 | ||
142 | static const struct v4l2_ctrl_config pwc_awb_speed_cfg = { | ||
143 | .ops = &pwc_ctrl_ops, | ||
144 | .id = PWC_CID_CUSTOM(awb_speed), | ||
145 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
146 | .name = "Auto White Balance Speed", | ||
147 | .min = 1, | ||
148 | .max = 32, | ||
149 | .step = 1, | ||
150 | }; | ||
151 | |||
152 | static const struct v4l2_ctrl_config pwc_awb_delay_cfg = { | ||
153 | .ops = &pwc_ctrl_ops, | ||
154 | .id = PWC_CID_CUSTOM(awb_delay), | ||
155 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
156 | .name = "Auto White Balance Delay", | ||
157 | .min = 0, | ||
158 | .max = 63, | ||
159 | .step = 1, | ||
160 | }; | ||
161 | |||
141 | int pwc_init_controls(struct pwc_device *pdev) | 162 | int pwc_init_controls(struct pwc_device *pdev) |
142 | { | 163 | { |
143 | struct v4l2_ctrl_handler *hdl; | 164 | struct v4l2_ctrl_handler *hdl; |
@@ -338,6 +359,23 @@ int pwc_init_controls(struct pwc_device *pdev) | |||
338 | if (pdev->restore_factory) | 359 | if (pdev->restore_factory) |
339 | pdev->restore_factory->flags |= V4L2_CTRL_FLAG_UPDATE; | 360 | pdev->restore_factory->flags |= V4L2_CTRL_FLAG_UPDATE; |
340 | 361 | ||
362 | /* Auto White Balance speed & delay */ | ||
363 | r = pwc_get_u8_ctrl(pdev, GET_CHROM_CTL, | ||
364 | AWB_CONTROL_SPEED_FORMATTER, &def); | ||
365 | if (r || def < 1 || def > 32) | ||
366 | def = 1; | ||
367 | cfg = pwc_awb_speed_cfg; | ||
368 | cfg.def = def; | ||
369 | pdev->awb_speed = v4l2_ctrl_new_custom(hdl, &cfg, NULL); | ||
370 | |||
371 | r = pwc_get_u8_ctrl(pdev, GET_CHROM_CTL, | ||
372 | AWB_CONTROL_DELAY_FORMATTER, &def); | ||
373 | if (r || def > 63) | ||
374 | def = 0; | ||
375 | cfg = pwc_awb_delay_cfg; | ||
376 | cfg.def = def; | ||
377 | pdev->awb_delay = v4l2_ctrl_new_custom(hdl, &cfg, NULL); | ||
378 | |||
341 | if (!(pdev->features & FEATURE_MOTOR_PANTILT)) | 379 | if (!(pdev->features & FEATURE_MOTOR_PANTILT)) |
342 | return hdl->error; | 380 | return hdl->error; |
343 | 381 | ||
@@ -891,6 +929,16 @@ static int pwc_s_ctrl(struct v4l2_ctrl *ctrl) | |||
891 | ret = pwc_button_ctrl(pdev, | 929 | ret = pwc_button_ctrl(pdev, |
892 | RESTORE_FACTORY_DEFAULTS_FORMATTER); | 930 | RESTORE_FACTORY_DEFAULTS_FORMATTER); |
893 | break; | 931 | break; |
932 | case PWC_CID_CUSTOM(awb_speed): | ||
933 | ret = pwc_set_u8_ctrl(pdev, SET_CHROM_CTL, | ||
934 | AWB_CONTROL_SPEED_FORMATTER, | ||
935 | ctrl->val); | ||
936 | break; | ||
937 | case PWC_CID_CUSTOM(awb_delay): | ||
938 | ret = pwc_set_u8_ctrl(pdev, SET_CHROM_CTL, | ||
939 | AWB_CONTROL_DELAY_FORMATTER, | ||
940 | ctrl->val); | ||
941 | break; | ||
894 | case V4L2_CID_PAN_RELATIVE: | 942 | case V4L2_CID_PAN_RELATIVE: |
895 | ret = pwc_set_motor(pdev); | 943 | ret = pwc_set_motor(pdev); |
896 | break; | 944 | break; |
diff --git a/drivers/media/video/pwc/pwc.h b/drivers/media/video/pwc/pwc.h index dd75b9dbe829..04e9524a94dd 100644 --- a/drivers/media/video/pwc/pwc.h +++ b/drivers/media/video/pwc/pwc.h | |||
@@ -332,6 +332,8 @@ struct pwc_device | |||
332 | struct v4l2_ctrl *save_user; | 332 | struct v4l2_ctrl *save_user; |
333 | struct v4l2_ctrl *restore_user; | 333 | struct v4l2_ctrl *restore_user; |
334 | struct v4l2_ctrl *restore_factory; | 334 | struct v4l2_ctrl *restore_factory; |
335 | struct v4l2_ctrl *awb_speed; | ||
336 | struct v4l2_ctrl *awb_delay; | ||
335 | struct { | 337 | struct { |
336 | /* motor control cluster */ | 338 | /* motor control cluster */ |
337 | struct v4l2_ctrl *motor_pan; | 339 | struct v4l2_ctrl *motor_pan; |