forked from luck/tmp_suning_uos_patched
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: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
755879c66b
commit
26dd1c57a0
@ -134,13 +134,19 @@ int pvr2_ctrl_get_min(struct pvr2_ctrl *cptr)
|
||||
|
||||
|
||||
/* 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;
|
||||
if (!cptr) return 0;
|
||||
LOCK_TAKE(cptr->hdw->big_lock); do {
|
||||
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);
|
||||
return ret;
|
||||
|
@ -49,7 +49,7 @@ int pvr2_ctrl_get_max(struct pvr2_ctrl *);
|
||||
int pvr2_ctrl_get_min(struct pvr2_ctrl *);
|
||||
|
||||
/* 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) */
|
||||
int pvr2_ctrl_get_cnt(struct pvr2_ctrl *);
|
||||
|
@ -82,6 +82,7 @@ struct pvr2_ctl_info {
|
||||
|
||||
/* Control's implementation */
|
||||
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_max_value; /* Get maximum allowed 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,
|
||||
|
||||
lmin = pvr2_ctrl_get_min(hcp);
|
||||
lmax = pvr2_ctrl_get_max(hcp);
|
||||
ldef = pvr2_ctrl_get_def(hcp);
|
||||
pvr2_ctrl_get_def(hcp, &ldef);
|
||||
if (w == -1) {
|
||||
w = ldef;
|
||||
} else if (w < lmin) {
|
||||
@ -543,7 +543,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
|
||||
}
|
||||
lmin = pvr2_ctrl_get_min(vcp);
|
||||
lmax = pvr2_ctrl_get_max(vcp);
|
||||
ldef = pvr2_ctrl_get_def(vcp);
|
||||
pvr2_ctrl_get_def(vcp, &ldef);
|
||||
if (h == -1) {
|
||||
h = ldef;
|
||||
} else if (h < lmin) {
|
||||
@ -604,6 +604,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
|
||||
case VIDIOC_QUERYCTRL:
|
||||
{
|
||||
struct pvr2_ctrl *cptr;
|
||||
int val;
|
||||
struct v4l2_queryctrl *vc = (struct v4l2_queryctrl *)arg;
|
||||
ret = 0;
|
||||
if (vc->id & V4L2_CTRL_FLAG_NEXT_CTRL) {
|
||||
@ -627,7 +628,8 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
|
||||
pvr2_ctrl_get_desc(cptr));
|
||||
strlcpy(vc->name,pvr2_ctrl_get_desc(cptr),sizeof(vc->name));
|
||||
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)) {
|
||||
case pvr2_ctl_enum:
|
||||
vc->type = V4L2_CTRL_TYPE_MENU;
|
||||
|
Loading…
Reference in New Issue
Block a user