diff options
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-ctrl.c | 21 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-ctrl.h | 7 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h | 2 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw.c | 26 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw.h | 4 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-v4l2.c | 14 |
6 files changed, 71 insertions, 3 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-ctrl.c b/drivers/media/video/pvrusb2/pvrusb2-ctrl.c index d644afec5a5c..e4484f95ea9e 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-ctrl.c +++ b/drivers/media/video/pvrusb2/pvrusb2-ctrl.c | |||
@@ -214,6 +214,27 @@ int pvr2_ctrl_get_valname(struct pvr2_ctrl *cptr,int val, | |||
214 | } | 214 | } |
215 | 215 | ||
216 | 216 | ||
217 | /* Return V4L ID for this control or zero if none */ | ||
218 | int pvr2_ctrl_get_v4lid(struct pvr2_ctrl *cptr) | ||
219 | { | ||
220 | if (!cptr) return 0; | ||
221 | return cptr->info->v4l_id; | ||
222 | } | ||
223 | |||
224 | |||
225 | unsigned int pvr2_ctrl_get_v4lflags(struct pvr2_ctrl *cptr) | ||
226 | { | ||
227 | unsigned int flags = 0; | ||
228 | |||
229 | if (cptr->info->get_v4lflags) { | ||
230 | flags = cptr->info->get_v4lflags(cptr); | ||
231 | } | ||
232 | |||
233 | |||
234 | return flags; | ||
235 | } | ||
236 | |||
237 | |||
217 | /* Return true if control is writable */ | 238 | /* Return true if control is writable */ |
218 | int pvr2_ctrl_is_writable(struct pvr2_ctrl *cptr) | 239 | int pvr2_ctrl_is_writable(struct pvr2_ctrl *cptr) |
219 | { | 240 | { |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-ctrl.h b/drivers/media/video/pvrusb2/pvrusb2-ctrl.h index bf4cf65441fb..c1680053cd64 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-ctrl.h +++ b/drivers/media/video/pvrusb2/pvrusb2-ctrl.h | |||
@@ -71,6 +71,13 @@ int pvr2_ctrl_get_valname(struct pvr2_ctrl *,int,char *,unsigned int, | |||
71 | /* Return true if control is writable */ | 71 | /* Return true if control is writable */ |
72 | int pvr2_ctrl_is_writable(struct pvr2_ctrl *); | 72 | int pvr2_ctrl_is_writable(struct pvr2_ctrl *); |
73 | 73 | ||
74 | /* Return V4L flags value for control (or zero if there is no v4l control | ||
75 | actually under this control) */ | ||
76 | unsigned int pvr2_ctrl_get_v4lflags(struct pvr2_ctrl *); | ||
77 | |||
78 | /* Return V4L ID for this control or zero if none */ | ||
79 | int pvr2_ctrl_get_v4lid(struct pvr2_ctrl *); | ||
80 | |||
74 | /* Return true if control has custom symbolic representation */ | 81 | /* Return true if control has custom symbolic representation */ |
75 | int pvr2_ctrl_has_custom_symbols(struct pvr2_ctrl *); | 82 | int pvr2_ctrl_has_custom_symbols(struct pvr2_ctrl *); |
76 | 83 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h index 4fd5ca2f6fc9..3887190079d1 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h | |||
@@ -94,6 +94,7 @@ typedef int (*pvr2_ctlf_val_to_sym)(struct pvr2_ctrl *,int msk,int val, | |||
94 | typedef int (*pvr2_ctlf_sym_to_val)(struct pvr2_ctrl *, | 94 | typedef int (*pvr2_ctlf_sym_to_val)(struct pvr2_ctrl *, |
95 | const char *,unsigned int, | 95 | const char *,unsigned int, |
96 | int *mskp,int *valp); | 96 | int *mskp,int *valp); |
97 | typedef unsigned int (*pvr2_ctlf_get_v4lflags)(struct pvr2_ctrl *); | ||
97 | 98 | ||
98 | /* This structure describes a specific control. A table of these is set up | 99 | /* This structure describes a specific control. A table of these is set up |
99 | in pvrusb2-hdw.c. */ | 100 | in pvrusb2-hdw.c. */ |
@@ -111,6 +112,7 @@ struct pvr2_ctl_info { | |||
111 | pvr2_ctlf_sym_to_val sym_to_val; /* Custom convert symbol->value */ | 112 | pvr2_ctlf_sym_to_val sym_to_val; /* Custom convert symbol->value */ |
112 | pvr2_ctlf_is_dirty is_dirty; /* Return true if dirty */ | 113 | pvr2_ctlf_is_dirty is_dirty; /* Return true if dirty */ |
113 | pvr2_ctlf_clear_dirty clear_dirty; /* Clear dirty state */ | 114 | pvr2_ctlf_clear_dirty clear_dirty; /* Clear dirty state */ |
115 | pvr2_ctlf_get_v4lflags get_v4lflags;/* Retrieve v4l flags */ | ||
114 | 116 | ||
115 | /* Control's type (int, enum, bitmask) */ | 117 | /* Control's type (int, enum, bitmask) */ |
116 | enum pvr2_ctl_type type; | 118 | enum pvr2_ctl_type type; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index 7d46bc10179a..f461830c64c9 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -1988,7 +1988,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw, | |||
1988 | } | 1988 | } |
1989 | 1989 | ||
1990 | 1990 | ||
1991 | /* Given an ID, retrieve the control structure associated with it. */ | 1991 | /* Given a V4L ID, retrieve the control structure associated with it. */ |
1992 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id) | 1992 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id) |
1993 | { | 1993 | { |
1994 | struct pvr2_ctrl *cptr; | 1994 | struct pvr2_ctrl *cptr; |
@@ -2005,6 +2005,30 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id | |||
2005 | } | 2005 | } |
2006 | 2006 | ||
2007 | 2007 | ||
2008 | /* Given a V4L ID for its immediate predecessor, retrieve the control | ||
2009 | structure associated with it. */ | ||
2010 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw, | ||
2011 | unsigned int ctl_id) | ||
2012 | { | ||
2013 | struct pvr2_ctrl *cptr,*cp2; | ||
2014 | unsigned int idx; | ||
2015 | int i; | ||
2016 | |||
2017 | /* This could be made a lot more efficient, but for now... */ | ||
2018 | cp2 = 0; | ||
2019 | for (idx = 0; idx < hdw->control_cnt; idx++) { | ||
2020 | cptr = hdw->controls + idx; | ||
2021 | i = cptr->info->v4l_id; | ||
2022 | if (!i) continue; | ||
2023 | if (i <= ctl_id) continue; | ||
2024 | if (cp2 && (cp2->info->v4l_id < i)) continue; | ||
2025 | cp2 = cptr; | ||
2026 | } | ||
2027 | return cp2; | ||
2028 | return 0; | ||
2029 | } | ||
2030 | |||
2031 | |||
2008 | static const char *get_ctrl_typename(enum pvr2_ctl_type tp) | 2032 | static const char *get_ctrl_typename(enum pvr2_ctl_type tp) |
2009 | { | 2033 | { |
2010 | switch (tp) { | 2034 | switch (tp) { |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.h b/drivers/media/video/pvrusb2/pvrusb2-hdw.h index e9adef93e60a..779c27ea188e 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.h +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.h | |||
@@ -153,6 +153,10 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *,unsigned int); | |||
153 | /* Retrieve a control handle given its V4L ID (if any) */ | 153 | /* Retrieve a control handle given its V4L ID (if any) */ |
154 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *,unsigned int ctl_id); | 154 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *,unsigned int ctl_id); |
155 | 155 | ||
156 | /* Retrieve a control handle given its immediate predecessor V4L ID (if any) */ | ||
157 | struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *, | ||
158 | unsigned int ctl_id); | ||
159 | |||
156 | /* Commit all control changes made up to this point */ | 160 | /* Commit all control changes made up to this point */ |
157 | int pvr2_hdw_commit_ctl(struct pvr2_hdw *); | 161 | int pvr2_hdw_commit_ctl(struct pvr2_hdw *); |
158 | 162 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c index 72f28a8e1fe3..9fefcdf8ffab 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c +++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c | |||
@@ -520,12 +520,19 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, | |||
520 | ret = 0; | 520 | ret = 0; |
521 | cptr = pvr2_hdw_get_ctrl_v4l(hdw,vc->id); | 521 | cptr = pvr2_hdw_get_ctrl_v4l(hdw,vc->id); |
522 | if (!cptr) { | 522 | if (!cptr) { |
523 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, | ||
524 | "QUERYCTRL id=0x%x not implemented here", | ||
525 | vc->id); | ||
523 | ret = -EINVAL; | 526 | ret = -EINVAL; |
524 | break; | 527 | break; |
525 | } | 528 | } |
526 | 529 | ||
527 | strlcpy(vc->name,pvr2_ctrl_get_name(cptr),sizeof(vc->name)); | 530 | pvr2_trace(PVR2_TRACE_V4LIOCTL, |
528 | vc->flags = 0; | 531 | "QUERYCTRL id=0x%x mapping name=%s (%s)", |
532 | vc->id,pvr2_ctrl_get_name(cptr), | ||
533 | pvr2_ctrl_get_desc(cptr)); | ||
534 | strlcpy(vc->name,pvr2_ctrl_get_desc(cptr),sizeof(vc->name)); | ||
535 | vc->flags = pvr2_ctrl_get_v4lflags(cptr); | ||
529 | vc->default_value = pvr2_ctrl_get_def(cptr); | 536 | vc->default_value = pvr2_ctrl_get_def(cptr); |
530 | switch (pvr2_ctrl_get_type(cptr)) { | 537 | switch (pvr2_ctrl_get_type(cptr)) { |
531 | case pvr2_ctl_enum: | 538 | case pvr2_ctl_enum: |
@@ -547,6 +554,9 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, | |||
547 | vc->step = 1; | 554 | vc->step = 1; |
548 | break; | 555 | break; |
549 | default: | 556 | default: |
557 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, | ||
558 | "QUERYCTRL id=0x%x name=%s not mappable", | ||
559 | vc->id,pvr2_ctrl_get_name(cptr)); | ||
550 | ret = -EINVAL; | 560 | ret = -EINVAL; |
551 | break; | 561 | break; |
552 | } | 562 | } |