diff options
Diffstat (limited to 'drivers/media/usb/uvc/uvc_ctrl.c')
-rw-r--r-- | drivers/media/usb/uvc/uvc_ctrl.c | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index 0eb82106d2ff..3e59b288b8a8 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c | |||
@@ -309,9 +309,8 @@ static struct uvc_control_info uvc_ctrls[] = { | |||
309 | .selector = UVC_CT_PANTILT_RELATIVE_CONTROL, | 309 | .selector = UVC_CT_PANTILT_RELATIVE_CONTROL, |
310 | .index = 12, | 310 | .index = 12, |
311 | .size = 4, | 311 | .size = 4, |
312 | .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_MIN | 312 | .flags = UVC_CTRL_FLAG_SET_CUR |
313 | | UVC_CTRL_FLAG_GET_MAX | UVC_CTRL_FLAG_GET_RES | 313 | | UVC_CTRL_FLAG_GET_RANGE |
314 | | UVC_CTRL_FLAG_GET_DEF | ||
315 | | UVC_CTRL_FLAG_AUTO_UPDATE, | 314 | | UVC_CTRL_FLAG_AUTO_UPDATE, |
316 | }, | 315 | }, |
317 | { | 316 | { |
@@ -391,6 +390,35 @@ static void uvc_ctrl_set_zoom(struct uvc_control_mapping *mapping, | |||
391 | data[2] = min((int)abs(value), 0xff); | 390 | data[2] = min((int)abs(value), 0xff); |
392 | } | 391 | } |
393 | 392 | ||
393 | static __s32 uvc_ctrl_get_rel_speed(struct uvc_control_mapping *mapping, | ||
394 | __u8 query, const __u8 *data) | ||
395 | { | ||
396 | unsigned int first = mapping->offset / 8; | ||
397 | __s8 rel = (__s8)data[first]; | ||
398 | |||
399 | switch (query) { | ||
400 | case UVC_GET_CUR: | ||
401 | return (rel == 0) ? 0 : (rel > 0 ? data[first+1] | ||
402 | : -data[first+1]); | ||
403 | case UVC_GET_MIN: | ||
404 | return -data[first+1]; | ||
405 | case UVC_GET_MAX: | ||
406 | case UVC_GET_RES: | ||
407 | case UVC_GET_DEF: | ||
408 | default: | ||
409 | return data[first+1]; | ||
410 | } | ||
411 | } | ||
412 | |||
413 | static void uvc_ctrl_set_rel_speed(struct uvc_control_mapping *mapping, | ||
414 | __s32 value, __u8 *data) | ||
415 | { | ||
416 | unsigned int first = mapping->offset / 8; | ||
417 | |||
418 | data[first] = value == 0 ? 0 : (value > 0) ? 1 : 0xff; | ||
419 | data[first+1] = min_t(int, abs(value), 0xff); | ||
420 | } | ||
421 | |||
394 | static struct uvc_control_mapping uvc_ctrl_mappings[] = { | 422 | static struct uvc_control_mapping uvc_ctrl_mappings[] = { |
395 | { | 423 | { |
396 | .id = V4L2_CID_BRIGHTNESS, | 424 | .id = V4L2_CID_BRIGHTNESS, |
@@ -677,6 +705,30 @@ static struct uvc_control_mapping uvc_ctrl_mappings[] = { | |||
677 | .data_type = UVC_CTRL_DATA_TYPE_SIGNED, | 705 | .data_type = UVC_CTRL_DATA_TYPE_SIGNED, |
678 | }, | 706 | }, |
679 | { | 707 | { |
708 | .id = V4L2_CID_PAN_SPEED, | ||
709 | .name = "Pan (Speed)", | ||
710 | .entity = UVC_GUID_UVC_CAMERA, | ||
711 | .selector = UVC_CT_PANTILT_RELATIVE_CONTROL, | ||
712 | .size = 16, | ||
713 | .offset = 0, | ||
714 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
715 | .data_type = UVC_CTRL_DATA_TYPE_SIGNED, | ||
716 | .get = uvc_ctrl_get_rel_speed, | ||
717 | .set = uvc_ctrl_set_rel_speed, | ||
718 | }, | ||
719 | { | ||
720 | .id = V4L2_CID_TILT_SPEED, | ||
721 | .name = "Tilt (Speed)", | ||
722 | .entity = UVC_GUID_UVC_CAMERA, | ||
723 | .selector = UVC_CT_PANTILT_RELATIVE_CONTROL, | ||
724 | .size = 16, | ||
725 | .offset = 16, | ||
726 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
727 | .data_type = UVC_CTRL_DATA_TYPE_SIGNED, | ||
728 | .get = uvc_ctrl_get_rel_speed, | ||
729 | .set = uvc_ctrl_set_rel_speed, | ||
730 | }, | ||
731 | { | ||
680 | .id = V4L2_CID_PRIVACY, | 732 | .id = V4L2_CID_PRIVACY, |
681 | .name = "Privacy", | 733 | .name = "Privacy", |
682 | .entity = UVC_GUID_UVC_CAMERA, | 734 | .entity = UVC_GUID_UVC_CAMERA, |
@@ -1795,7 +1847,7 @@ done: | |||
1795 | * - Handle restore order (Auto-Exposure Mode should be restored before | 1847 | * - Handle restore order (Auto-Exposure Mode should be restored before |
1796 | * Exposure Time). | 1848 | * Exposure Time). |
1797 | */ | 1849 | */ |
1798 | int uvc_ctrl_resume_device(struct uvc_device *dev) | 1850 | int uvc_ctrl_restore_values(struct uvc_device *dev) |
1799 | { | 1851 | { |
1800 | struct uvc_control *ctrl; | 1852 | struct uvc_control *ctrl; |
1801 | struct uvc_entity *entity; | 1853 | struct uvc_entity *entity; |