diff options
-rw-r--r-- | drivers/media/video/v4l2-common.c | 23 | ||||
-rw-r--r-- | include/media/v4l2-common.h | 2 |
2 files changed, 24 insertions, 1 deletions
diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c index da4791de7050..a523af78bdb1 100644 --- a/drivers/media/video/v4l2-common.c +++ b/drivers/media/video/v4l2-common.c | |||
@@ -643,6 +643,7 @@ int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu, struct v4l2_queryctrl *qc | |||
643 | { | 643 | { |
644 | int i; | 644 | int i; |
645 | 645 | ||
646 | qmenu->reserved = 0; | ||
646 | if (menu_items == NULL || | 647 | if (menu_items == NULL || |
647 | (qctrl && (qmenu->index < qctrl->minimum || qmenu->index > qctrl->maximum))) | 648 | (qctrl && (qmenu->index < qctrl->minimum || qmenu->index > qctrl->maximum))) |
648 | return -EINVAL; | 649 | return -EINVAL; |
@@ -650,11 +651,31 @@ int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu, struct v4l2_queryctrl *qc | |||
650 | if (menu_items[i] == NULL || menu_items[i][0] == '\0') | 651 | if (menu_items[i] == NULL || menu_items[i][0] == '\0') |
651 | return -EINVAL; | 652 | return -EINVAL; |
652 | snprintf(qmenu->name, sizeof(qmenu->name), menu_items[qmenu->index]); | 653 | snprintf(qmenu->name, sizeof(qmenu->name), menu_items[qmenu->index]); |
653 | qmenu->reserved = 0; | ||
654 | return 0; | 654 | return 0; |
655 | } | 655 | } |
656 | EXPORT_SYMBOL(v4l2_ctrl_query_menu); | 656 | EXPORT_SYMBOL(v4l2_ctrl_query_menu); |
657 | 657 | ||
658 | /* Fill in a struct v4l2_querymenu based on the specified array of valid | ||
659 | menu items (terminated by V4L2_CTRL_MENU_IDS_END). | ||
660 | Use this if there are 'holes' in the list of valid menu items. */ | ||
661 | int v4l2_ctrl_query_menu_valid_items(struct v4l2_querymenu *qmenu, const u32 *ids) | ||
662 | { | ||
663 | const char **menu_items = v4l2_ctrl_get_menu(qmenu->id); | ||
664 | |||
665 | qmenu->reserved = 0; | ||
666 | if (menu_items == NULL || ids == NULL) | ||
667 | return -EINVAL; | ||
668 | while (*ids != V4L2_CTRL_MENU_IDS_END) { | ||
669 | if (*ids++ == qmenu->index) { | ||
670 | snprintf(qmenu->name, sizeof(qmenu->name), | ||
671 | menu_items[qmenu->index]); | ||
672 | return 0; | ||
673 | } | ||
674 | } | ||
675 | return -EINVAL; | ||
676 | } | ||
677 | EXPORT_SYMBOL(v4l2_ctrl_query_menu_valid_items); | ||
678 | |||
658 | /* ctrl_classes points to an array of u32 pointers, the last element is | 679 | /* ctrl_classes points to an array of u32 pointers, the last element is |
659 | a NULL pointer. Each u32 array is a 0-terminated array of control IDs. | 680 | a NULL pointer. Each u32 array is a 0-terminated array of control IDs. |
660 | Each array must be sorted low to high and belong to the same control | 681 | Each array must be sorted low to high and belong to the same control |
diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index 8b678e0d46e3..0c195ccd45d2 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h | |||
@@ -82,6 +82,8 @@ int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 ste | |||
82 | int v4l2_ctrl_query_fill_std(struct v4l2_queryctrl *qctrl); | 82 | int v4l2_ctrl_query_fill_std(struct v4l2_queryctrl *qctrl); |
83 | int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu, | 83 | int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu, |
84 | struct v4l2_queryctrl *qctrl, const char **menu_items); | 84 | struct v4l2_queryctrl *qctrl, const char **menu_items); |
85 | #define V4L2_CTRL_MENU_IDS_END (0xffffffff) | ||
86 | int v4l2_ctrl_query_menu_valid_items(struct v4l2_querymenu *qmenu, const u32 *ids); | ||
85 | u32 v4l2_ctrl_next(const u32 * const *ctrl_classes, u32 id); | 87 | u32 v4l2_ctrl_next(const u32 * const *ctrl_classes, u32 id); |
86 | 88 | ||
87 | /* ------------------------------------------------------------------------- */ | 89 | /* ------------------------------------------------------------------------- */ |