aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/pwc/pwc-ctrl.c64
-rw-r--r--drivers/media/video/pwc/pwc-v4l.c48
-rw-r--r--drivers/media/video/pwc/pwc.h2
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
600static 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
610static 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
624static 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
634static 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
648int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value) 600int 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
50enum { awb_indoor, awb_outdoor, awb_fl, awb_manual, awb_auto }; 50enum { awb_indoor, awb_outdoor, awb_fl, awb_manual, awb_auto };
51enum { custom_autocontour, custom_contour, custom_noise_reduction, 51enum { 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
54const char * const pwc_auto_whitebal_qmenu[] = { 55const 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
142static 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
152static 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
141int pwc_init_controls(struct pwc_device *pdev) 162int 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;