aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-ctrl.c5
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-v4l2.c73
2 files changed, 76 insertions, 2 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-ctrl.c b/drivers/media/video/pvrusb2/pvrusb2-ctrl.c
index e4484f95ea9e..d5df9fbeba2f 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-ctrl.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-ctrl.c
@@ -230,6 +230,11 @@ unsigned int pvr2_ctrl_get_v4lflags(struct pvr2_ctrl *cptr)
230 flags = cptr->info->get_v4lflags(cptr); 230 flags = cptr->info->get_v4lflags(cptr);
231 } 231 }
232 232
233 if (cptr->info->set_value) {
234 flags &= ~V4L2_CTRL_FLAG_READ_ONLY;
235 } else {
236 flags |= V4L2_CTRL_FLAG_READ_ONLY;
237 }
233 238
234 return flags; 239 return flags;
235} 240}
diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
index 9fefcdf8ffab..5e8fd8630110 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
@@ -518,7 +518,13 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
518 struct pvr2_ctrl *cptr; 518 struct pvr2_ctrl *cptr;
519 struct v4l2_queryctrl *vc = (struct v4l2_queryctrl *)arg; 519 struct v4l2_queryctrl *vc = (struct v4l2_queryctrl *)arg;
520 ret = 0; 520 ret = 0;
521 cptr = pvr2_hdw_get_ctrl_v4l(hdw,vc->id); 521 if (vc->id & V4L2_CTRL_FLAG_NEXT_CTRL) {
522 cptr = pvr2_hdw_get_ctrl_nextv4l(
523 hdw,(vc->id & ~V4L2_CTRL_FLAG_NEXT_CTRL));
524 if (cptr) vc->id = pvr2_ctrl_get_v4lid(cptr);
525 } else {
526 cptr = pvr2_hdw_get_ctrl_v4l(hdw,vc->id);
527 }
522 if (!cptr) { 528 if (!cptr) {
523 pvr2_trace(PVR2_TRACE_ERROR_LEGS, 529 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
524 "QUERYCTRL id=0x%x not implemented here", 530 "QUERYCTRL id=0x%x not implemented here",
@@ -542,7 +548,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
542 vc->step = 1; 548 vc->step = 1;
543 break; 549 break;
544 case pvr2_ctl_bool: 550 case pvr2_ctl_bool:
545 vc->type = V4L2_CTRL_TYPE_INTEGER; 551 vc->type = V4L2_CTRL_TYPE_BOOLEAN;
546 vc->minimum = 0; 552 vc->minimum = 0;
547 vc->maximum = 1; 553 vc->maximum = 1;
548 vc->step = 1; 554 vc->step = 1;
@@ -593,6 +599,69 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
593 break; 599 break;
594 } 600 }
595 601
602 case VIDIOC_G_EXT_CTRLS:
603 {
604 struct v4l2_ext_controls *ctls =
605 (struct v4l2_ext_controls *)arg;
606 struct v4l2_ext_control *ctrl;
607 unsigned int idx;
608 int val;
609 for (idx = 0; idx < ctls->count; idx++) {
610 ctrl = ctls->controls + idx;
611 ret = pvr2_ctrl_get_value(
612 pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id),&val);
613 if (ret) {
614 ctls->error_idx = idx;
615 break;
616 }
617 /* Ensure that if read as a 64 bit value, the user
618 will still get a hopefully sane value */
619 ctrl->value64 = 0;
620 ctrl->value = val;
621 }
622 break;
623 }
624
625 case VIDIOC_S_EXT_CTRLS:
626 {
627 struct v4l2_ext_controls *ctls =
628 (struct v4l2_ext_controls *)arg;
629 struct v4l2_ext_control *ctrl;
630 unsigned int idx;
631 for (idx = 0; idx < ctls->count; idx++) {
632 ctrl = ctls->controls + idx;
633 ret = pvr2_ctrl_set_value(
634 pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id),
635 ctrl->value);
636 if (ret) {
637 ctls->error_idx = idx;
638 break;
639 }
640 }
641 break;
642 }
643
644 case VIDIOC_TRY_EXT_CTRLS:
645 {
646 struct v4l2_ext_controls *ctls =
647 (struct v4l2_ext_controls *)arg;
648 struct v4l2_ext_control *ctrl;
649 struct pvr2_ctrl *pctl;
650 unsigned int idx;
651 /* For the moment just validate that the requested control
652 actually exists. */
653 for (idx = 0; idx < ctls->count; idx++) {
654 ctrl = ctls->controls + idx;
655 pctl = pvr2_hdw_get_ctrl_v4l(hdw,ctrl->id);
656 if (!pctl) {
657 ret = -EINVAL;
658 ctls->error_idx = idx;
659 break;
660 }
661 }
662 break;
663 }
664
596 case VIDIOC_LOG_STATUS: 665 case VIDIOC_LOG_STATUS:
597 { 666 {
598 pvr2_hdw_trigger_module_log(hdw); 667 pvr2_hdw_trigger_module_log(hdw);