Commit 26dd1c57 authored by Mike Isely's avatar Mike Isely Committed by Mauro Carvalho Chehab

V4L/DVB (8898): pvrusb2: Be able to programmatically retrieve a control's default value

The pvrusb2 control mechanism up until now has used a constant int to
hold a control's default value.  This change makes it possible to
retrieve the control's default through some other means, e.g. as a
result of a query from lower level software.
Signed-off-by: default avatarMike Isely <isely@pobox.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 755879c6
...@@ -134,13 +134,19 @@ int pvr2_ctrl_get_min(struct pvr2_ctrl *cptr) ...@@ -134,13 +134,19 @@ int pvr2_ctrl_get_min(struct pvr2_ctrl *cptr)
/* Retrieve control's default value (any type) */ /* Retrieve control's default value (any type) */
int pvr2_ctrl_get_def(struct pvr2_ctrl *cptr) int pvr2_ctrl_get_def(struct pvr2_ctrl *cptr, int *valptr)
{ {
int ret = 0; int ret = 0;
if (!cptr) return 0; if (!cptr) return 0;
LOCK_TAKE(cptr->hdw->big_lock); do { LOCK_TAKE(cptr->hdw->big_lock); do {
if (cptr->info->type == pvr2_ctl_int) { if (cptr->info->type == pvr2_ctl_int) {
ret = cptr->info->default_value; if (cptr->info->get_def_value) {
/* Comment to keep checkpatch.pl quiet */
ret = cptr->info->get_def_value(cptr, valptr);
} else {
/* Comment to keep checkpatch.pl quiet */
*valptr = cptr->info->default_value;
}
} }
} while(0); LOCK_GIVE(cptr->hdw->big_lock); } while(0); LOCK_GIVE(cptr->hdw->big_lock);
return ret; return ret;
......
...@@ -49,7 +49,7 @@ int pvr2_ctrl_get_max(struct pvr2_ctrl *); ...@@ -49,7 +49,7 @@ int pvr2_ctrl_get_max(struct pvr2_ctrl *);
int pvr2_ctrl_get_min(struct pvr2_ctrl *); int pvr2_ctrl_get_min(struct pvr2_ctrl *);
/* Retrieve control's default value (any type) */ /* Retrieve control's default value (any type) */
int pvr2_ctrl_get_def(struct pvr2_ctrl *); int pvr2_ctrl_get_def(struct pvr2_ctrl *, int *valptr);
/* Retrieve control's enumeration count (enum only) */ /* Retrieve control's enumeration count (enum only) */
int pvr2_ctrl_get_cnt(struct pvr2_ctrl *); int pvr2_ctrl_get_cnt(struct pvr2_ctrl *);
......
...@@ -82,6 +82,7 @@ struct pvr2_ctl_info { ...@@ -82,6 +82,7 @@ struct pvr2_ctl_info {
/* Control's implementation */ /* Control's implementation */
pvr2_ctlf_get_value get_value; /* Get its value */ pvr2_ctlf_get_value get_value; /* Get its value */
pvr2_ctlf_get_value get_def_value; /* Get its default value */
pvr2_ctlf_get_value get_min_value; /* Get minimum allowed value */ pvr2_ctlf_get_value get_min_value; /* Get minimum allowed value */
pvr2_ctlf_get_value get_max_value; /* Get maximum allowed value */ pvr2_ctlf_get_value get_max_value; /* Get maximum allowed value */
pvr2_ctlf_set_value set_value; /* Set its value */ pvr2_ctlf_set_value set_value; /* Set its value */
......
...@@ -533,7 +533,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, ...@@ -533,7 +533,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
lmin = pvr2_ctrl_get_min(hcp); lmin = pvr2_ctrl_get_min(hcp);
lmax = pvr2_ctrl_get_max(hcp); lmax = pvr2_ctrl_get_max(hcp);
ldef = pvr2_ctrl_get_def(hcp); pvr2_ctrl_get_def(hcp, &ldef);
if (w == -1) { if (w == -1) {
w = ldef; w = ldef;
} else if (w < lmin) { } else if (w < lmin) {
...@@ -543,7 +543,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, ...@@ -543,7 +543,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
} }
lmin = pvr2_ctrl_get_min(vcp); lmin = pvr2_ctrl_get_min(vcp);
lmax = pvr2_ctrl_get_max(vcp); lmax = pvr2_ctrl_get_max(vcp);
ldef = pvr2_ctrl_get_def(vcp); pvr2_ctrl_get_def(vcp, &ldef);
if (h == -1) { if (h == -1) {
h = ldef; h = ldef;
} else if (h < lmin) { } else if (h < lmin) {
...@@ -604,6 +604,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, ...@@ -604,6 +604,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
case VIDIOC_QUERYCTRL: case VIDIOC_QUERYCTRL:
{ {
struct pvr2_ctrl *cptr; struct pvr2_ctrl *cptr;
int val;
struct v4l2_queryctrl *vc = (struct v4l2_queryctrl *)arg; struct v4l2_queryctrl *vc = (struct v4l2_queryctrl *)arg;
ret = 0; ret = 0;
if (vc->id & V4L2_CTRL_FLAG_NEXT_CTRL) { if (vc->id & V4L2_CTRL_FLAG_NEXT_CTRL) {
...@@ -627,7 +628,8 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, ...@@ -627,7 +628,8 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
pvr2_ctrl_get_desc(cptr)); pvr2_ctrl_get_desc(cptr));
strlcpy(vc->name,pvr2_ctrl_get_desc(cptr),sizeof(vc->name)); strlcpy(vc->name,pvr2_ctrl_get_desc(cptr),sizeof(vc->name));
vc->flags = pvr2_ctrl_get_v4lflags(cptr); vc->flags = pvr2_ctrl_get_v4lflags(cptr);
vc->default_value = pvr2_ctrl_get_def(cptr); pvr2_ctrl_get_def(cptr, &val);
vc->default_value = val;
switch (pvr2_ctrl_get_type(cptr)) { switch (pvr2_ctrl_get_type(cptr)) {
case pvr2_ctl_enum: case pvr2_ctl_enum:
vc->type = V4L2_CTRL_TYPE_MENU; vc->type = V4L2_CTRL_TYPE_MENU;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment