[media] V4L: Add support for integer menu controls with standard menu items
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Tue, 9 Jul 2013 04:24:40 +0000 (01:24 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Sun, 18 Aug 2013 10:12:59 +0000 (07:12 -0300)
The patch modifies the helper function v4l2_ctrl_new_std_menu
to accept integer menu controls with standard menu items.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Arun Kumar K <arun.kk@samsung.com>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Documentation/video4linux/v4l2-controls.txt
drivers/media/v4l2-core/v4l2-ctrls.c

index 676f87366025a57a7158b2e04de9605883a5a124..06cf3ac83631cc760de1ddd75776644314293eac 100644 (file)
@@ -124,26 +124,27 @@ You add non-menu controls by calling v4l2_ctrl_new_std:
                        const struct v4l2_ctrl_ops *ops,
                        u32 id, s32 min, s32 max, u32 step, s32 def);
 
-Menu controls are added by calling v4l2_ctrl_new_std_menu:
+Menu and integer menu controls are added by calling v4l2_ctrl_new_std_menu:
 
        struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
                        const struct v4l2_ctrl_ops *ops,
                        u32 id, s32 max, s32 skip_mask, s32 def);
 
-Or alternatively for integer menu controls, by calling v4l2_ctrl_new_int_menu:
+Menu controls with a driver specific menu are added by calling
+v4l2_ctrl_new_std_menu_items:
+
+       struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(
+                       struct v4l2_ctrl_handler *hdl,
+                       const struct v4l2_ctrl_ops *ops, u32 id, s32 max,
+                       s32 skip_mask, s32 def, const char * const *qmenu);
+
+Integer menu controls with a driver specific menu can be added by calling
+v4l2_ctrl_new_int_menu:
 
        struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
                        const struct v4l2_ctrl_ops *ops,
                        u32 id, s32 max, s32 def, const s64 *qmenu_int);
 
-Standard menu controls with a driver specific menu are added by calling
-v4l2_ctrl_new_std_menu_items:
-
-       struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(
-               struct v4l2_ctrl_handler *hdl,
-               const struct v4l2_ctrl_ops *ops, u32 id, s32 max,
-               s32 skip_mask, s32 def, const char * const *qmenu);
-
 These functions are typically called right after the v4l2_ctrl_handler_init:
 
        static const s64 exp_bias_qmenu[] = {
index fccd08b66d1a04e16cfc127bb672e2c0fbe18e4d..e03a2e852143d90d413ee3297a343cb6c86368c7 100644 (file)
@@ -552,6 +552,20 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
 }
 EXPORT_SYMBOL(v4l2_ctrl_get_menu);
 
+/*
+ * Returns NULL or an s64 type array containing the menu for given
+ * control ID. The total number of the menu items is returned in @len.
+ */
+const s64 const *v4l2_ctrl_get_int_menu(u32 id, u32 *len)
+{
+       switch (id) {
+       default:
+               *len = 0;
+               return NULL;
+       };
+}
+EXPORT_SYMBOL(v4l2_ctrl_get_int_menu);
+
 /* Return the control name. */
 const char *v4l2_ctrl_get_name(u32 id)
 {
@@ -1712,20 +1726,28 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
                        const struct v4l2_ctrl_ops *ops,
                        u32 id, s32 max, s32 mask, s32 def)
 {
-       const char * const *qmenu = v4l2_ctrl_get_menu(id);
+       const char * const *qmenu = NULL;
+       const s64 *qmenu_int = NULL;
        const char *name;
        enum v4l2_ctrl_type type;
+       unsigned int qmenu_int_len;
        s32 min;
        s32 step;
        u32 flags;
 
        v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
-       if (type != V4L2_CTRL_TYPE_MENU) {
+
+       if (type == V4L2_CTRL_TYPE_MENU)
+               qmenu = v4l2_ctrl_get_menu(id);
+       else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
+               qmenu_int = v4l2_ctrl_get_int_menu(id, &qmenu_int_len);
+
+       if ((!qmenu && !qmenu_int) || (qmenu_int && max > qmenu_int_len)) {
                handler_set_err(hdl, -EINVAL);
                return NULL;
        }
        return v4l2_ctrl_new(hdl, ops, id, name, type,
-                            0, max, mask, def, flags, qmenu, NULL, NULL);
+                            0, max, mask, def, flags, qmenu, qmenu_int, NULL);
 }
 EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);