mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
V4L/DVB (4240): Various V4L control enhancements in pvrusb2
Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
332139635a
commit
a761f4311b
6 changed files with 71 additions and 3 deletions
|
@ -214,6 +214,27 @@ int pvr2_ctrl_get_valname(struct pvr2_ctrl *cptr,int val,
|
|||
}
|
||||
|
||||
|
||||
/* Return V4L ID for this control or zero if none */
|
||||
int pvr2_ctrl_get_v4lid(struct pvr2_ctrl *cptr)
|
||||
{
|
||||
if (!cptr) return 0;
|
||||
return cptr->info->v4l_id;
|
||||
}
|
||||
|
||||
|
||||
unsigned int pvr2_ctrl_get_v4lflags(struct pvr2_ctrl *cptr)
|
||||
{
|
||||
unsigned int flags = 0;
|
||||
|
||||
if (cptr->info->get_v4lflags) {
|
||||
flags = cptr->info->get_v4lflags(cptr);
|
||||
}
|
||||
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
||||
/* Return true if control is writable */
|
||||
int pvr2_ctrl_is_writable(struct pvr2_ctrl *cptr)
|
||||
{
|
||||
|
|
|
@ -71,6 +71,13 @@ int pvr2_ctrl_get_valname(struct pvr2_ctrl *,int,char *,unsigned int,
|
|||
/* Return true if control is writable */
|
||||
int pvr2_ctrl_is_writable(struct pvr2_ctrl *);
|
||||
|
||||
/* Return V4L flags value for control (or zero if there is no v4l control
|
||||
actually under this control) */
|
||||
unsigned int pvr2_ctrl_get_v4lflags(struct pvr2_ctrl *);
|
||||
|
||||
/* Return V4L ID for this control or zero if none */
|
||||
int pvr2_ctrl_get_v4lid(struct pvr2_ctrl *);
|
||||
|
||||
/* Return true if control has custom symbolic representation */
|
||||
int pvr2_ctrl_has_custom_symbols(struct pvr2_ctrl *);
|
||||
|
||||
|
|
|
@ -94,6 +94,7 @@ typedef int (*pvr2_ctlf_val_to_sym)(struct pvr2_ctrl *,int msk,int val,
|
|||
typedef int (*pvr2_ctlf_sym_to_val)(struct pvr2_ctrl *,
|
||||
const char *,unsigned int,
|
||||
int *mskp,int *valp);
|
||||
typedef unsigned int (*pvr2_ctlf_get_v4lflags)(struct pvr2_ctrl *);
|
||||
|
||||
/* This structure describes a specific control. A table of these is set up
|
||||
in pvrusb2-hdw.c. */
|
||||
|
@ -111,6 +112,7 @@ struct pvr2_ctl_info {
|
|||
pvr2_ctlf_sym_to_val sym_to_val; /* Custom convert symbol->value */
|
||||
pvr2_ctlf_is_dirty is_dirty; /* Return true if dirty */
|
||||
pvr2_ctlf_clear_dirty clear_dirty; /* Clear dirty state */
|
||||
pvr2_ctlf_get_v4lflags get_v4lflags;/* Retrieve v4l flags */
|
||||
|
||||
/* Control's type (int, enum, bitmask) */
|
||||
enum pvr2_ctl_type type;
|
||||
|
|
|
@ -1988,7 +1988,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
|
|||
}
|
||||
|
||||
|
||||
/* Given an ID, retrieve the control structure associated with it. */
|
||||
/* Given a V4L ID, retrieve the control structure associated with it. */
|
||||
struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id)
|
||||
{
|
||||
struct pvr2_ctrl *cptr;
|
||||
|
@ -2005,6 +2005,30 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id
|
|||
}
|
||||
|
||||
|
||||
/* Given a V4L ID for its immediate predecessor, retrieve the control
|
||||
structure associated with it. */
|
||||
struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
|
||||
unsigned int ctl_id)
|
||||
{
|
||||
struct pvr2_ctrl *cptr,*cp2;
|
||||
unsigned int idx;
|
||||
int i;
|
||||
|
||||
/* This could be made a lot more efficient, but for now... */
|
||||
cp2 = 0;
|
||||
for (idx = 0; idx < hdw->control_cnt; idx++) {
|
||||
cptr = hdw->controls + idx;
|
||||
i = cptr->info->v4l_id;
|
||||
if (!i) continue;
|
||||
if (i <= ctl_id) continue;
|
||||
if (cp2 && (cp2->info->v4l_id < i)) continue;
|
||||
cp2 = cptr;
|
||||
}
|
||||
return cp2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
|
||||
{
|
||||
switch (tp) {
|
||||
|
|
|
@ -153,6 +153,10 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *,unsigned int);
|
|||
/* Retrieve a control handle given its V4L ID (if any) */
|
||||
struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *,unsigned int ctl_id);
|
||||
|
||||
/* Retrieve a control handle given its immediate predecessor V4L ID (if any) */
|
||||
struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *,
|
||||
unsigned int ctl_id);
|
||||
|
||||
/* Commit all control changes made up to this point */
|
||||
int pvr2_hdw_commit_ctl(struct pvr2_hdw *);
|
||||
|
||||
|
|
|
@ -520,12 +520,19 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
|
|||
ret = 0;
|
||||
cptr = pvr2_hdw_get_ctrl_v4l(hdw,vc->id);
|
||||
if (!cptr) {
|
||||
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
||||
"QUERYCTRL id=0x%x not implemented here",
|
||||
vc->id);
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
strlcpy(vc->name,pvr2_ctrl_get_name(cptr),sizeof(vc->name));
|
||||
vc->flags = 0;
|
||||
pvr2_trace(PVR2_TRACE_V4LIOCTL,
|
||||
"QUERYCTRL id=0x%x mapping name=%s (%s)",
|
||||
vc->id,pvr2_ctrl_get_name(cptr),
|
||||
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);
|
||||
switch (pvr2_ctrl_get_type(cptr)) {
|
||||
case pvr2_ctl_enum:
|
||||
|
@ -547,6 +554,9 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
|
|||
vc->step = 1;
|
||||
break;
|
||||
default:
|
||||
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
||||
"QUERYCTRL id=0x%x name=%s not mappable",
|
||||
vc->id,pvr2_ctrl_get_name(cptr));
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue