[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: 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>
This commit is contained in:
		
					parent
					
						
							
								debe6267b7
							
						
					
				
			
			
				commit
				
					
						d1e9b7c12b
					
				
			
		
					 2 changed files with 36 additions and 13 deletions
				
			
		|  | @ -124,26 +124,27 @@ 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 | ||||||
|  | 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, | 	struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl, | ||||||
| 			const struct v4l2_ctrl_ops *ops, | 			const struct v4l2_ctrl_ops *ops, | ||||||
| 			u32 id, s32 max, s32 def, const s64 *qmenu_int); | 			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: | 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) | ||||||
| } | } | ||||||
| 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, | ||||||
| 			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); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Sylwester Nawrocki
				Sylwester Nawrocki