V4L/DVB (4240): Various V4L control enhancements in pvrusb2
authorMike Isely <isely@pobox.com>
Sun, 25 Jun 2006 23:04:44 +0000 (20:04 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Tue, 27 Jun 2006 03:17:28 +0000 (00:17 -0300)
Signed-off-by: Mike Isely <isely@pobox.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/pvrusb2/pvrusb2-ctrl.c
drivers/media/video/pvrusb2/pvrusb2-ctrl.h
drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
drivers/media/video/pvrusb2/pvrusb2-hdw.c
drivers/media/video/pvrusb2/pvrusb2-hdw.h
drivers/media/video/pvrusb2/pvrusb2-v4l2.c

index d644afec5a5c6262cae411adacfc9376c5d97bf8..e4484f95ea9e786682b3032330971d03de6e6179 100644 (file)
@@ -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)
 {
index bf4cf65441fb0c561762e4bf5e081bec1aa30942..c1680053cd644f10c7b2c1c0540640583e8c9302 100644 (file)
@@ -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 *);
 
index 4fd5ca2f6fc9865db2b54f845e7fee5bd8948b58..3887190079d1dd80ade8c20935eabff616a25b99 100644 (file)
@@ -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;
index 7d46bc10179aae8436a0e4d3636e2e5e7d2ea864..f461830c64c957cbb58e297d8be8ec483ca35bb3 100644 (file)
@@ -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) {
index e9adef93e60a584c191a438d4568c856c91c1660..779c27ea188e5495c97fb33fae964df0c0042f26 100644 (file)
@@ -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 *);
 
index 72f28a8e1fe3b3a88161c5fe6594107bee1c8422..9fefcdf8ffab54e50d5cf32f8557dc2bc246c0ef 100644 (file)
@@ -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;
                }