Commit d1e9b7c1 authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab

[media] V4L: Add support for integer menu controls with standard menu items

The patch modifies the helper function v4l2_ctrl_new_std_menu
to accept integer menu controls with standard menu items.
Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarArun Kumar K <arun.kk@samsung.com>
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarKamil Debski <k.debski@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent debe6267
...@@ -124,19 +124,13 @@ You add non-menu controls by calling v4l2_ctrl_new_std: ...@@ -124,19 +124,13 @@ You add non-menu controls by calling v4l2_ctrl_new_std:
const struct v4l2_ctrl_ops *ops, const struct v4l2_ctrl_ops *ops,
u32 id, s32 min, s32 max, u32 step, s32 def); 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, struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
const struct v4l2_ctrl_ops *ops, const struct v4l2_ctrl_ops *ops,
u32 id, s32 max, s32 skip_mask, s32 def); 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
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: v4l2_ctrl_new_std_menu_items:
struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items( struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(
...@@ -144,6 +138,13 @@ v4l2_ctrl_new_std_menu_items: ...@@ -144,6 +138,13 @@ v4l2_ctrl_new_std_menu_items:
const struct v4l2_ctrl_ops *ops, u32 id, s32 max, const struct v4l2_ctrl_ops *ops, u32 id, s32 max,
s32 skip_mask, s32 def, const char * const *qmenu); 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);
These functions are typically called right after the v4l2_ctrl_handler_init: These functions are typically called right after the v4l2_ctrl_handler_init:
static const s64 exp_bias_qmenu[] = { static const s64 exp_bias_qmenu[] = {
......
...@@ -552,6 +552,20 @@ const char * const *v4l2_ctrl_get_menu(u32 id) ...@@ -552,6 +552,20 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
} }
EXPORT_SYMBOL(v4l2_ctrl_get_menu); 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. */ /* Return the control name. */
const char *v4l2_ctrl_get_name(u32 id) 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, ...@@ -1712,20 +1726,28 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
const struct v4l2_ctrl_ops *ops, const struct v4l2_ctrl_ops *ops,
u32 id, s32 max, s32 mask, s32 def) 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; const char *name;
enum v4l2_ctrl_type type; enum v4l2_ctrl_type type;
unsigned int qmenu_int_len;
s32 min; s32 min;
s32 step; s32 step;
u32 flags; u32 flags;
v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &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); handler_set_err(hdl, -EINVAL);
return NULL; return NULL;
} }
return v4l2_ctrl_new(hdl, ops, id, name, type, 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); EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment