|
@@ -785,7 +785,7 @@ static void __uvc_find_control(struct uvc_entity *entity, __u32 v4l2_id,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-struct uvc_control *uvc_find_control(struct uvc_video_chain *chain,
|
|
|
+static struct uvc_control *uvc_find_control(struct uvc_video_chain *chain,
|
|
|
__u32 v4l2_id, struct uvc_control_mapping **mapping)
|
|
|
{
|
|
|
struct uvc_control *ctrl = NULL;
|
|
@@ -944,6 +944,52 @@ done:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Mapping V4L2 controls to UVC controls can be straighforward if done well.
|
|
|
+ * Most of the UVC controls exist in V4L2, and can be mapped directly. Some
|
|
|
+ * must be grouped (for instance the Red Balance, Blue Balance and Do White
|
|
|
+ * Balance V4L2 controls use the White Balance Component UVC control) or
|
|
|
+ * otherwise translated. The approach we take here is to use a translation
|
|
|
+ * table for the controls that can be mapped directly, and handle the others
|
|
|
+ * manually.
|
|
|
+ */
|
|
|
+int uvc_query_v4l2_menu(struct uvc_video_chain *chain,
|
|
|
+ struct v4l2_querymenu *query_menu)
|
|
|
+{
|
|
|
+ struct uvc_menu_info *menu_info;
|
|
|
+ struct uvc_control_mapping *mapping;
|
|
|
+ struct uvc_control *ctrl;
|
|
|
+ u32 index = query_menu->index;
|
|
|
+ u32 id = query_menu->id;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ memset(query_menu, 0, sizeof(*query_menu));
|
|
|
+ query_menu->id = id;
|
|
|
+ query_menu->index = index;
|
|
|
+
|
|
|
+ ret = mutex_lock_interruptible(&chain->ctrl_mutex);
|
|
|
+ if (ret < 0)
|
|
|
+ return -ERESTARTSYS;
|
|
|
+
|
|
|
+ ctrl = uvc_find_control(chain, query_menu->id, &mapping);
|
|
|
+ if (ctrl == NULL || mapping->v4l2_type != V4L2_CTRL_TYPE_MENU) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (query_menu->index >= mapping->menu_count) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ menu_info = &mapping->menu_info[query_menu->index];
|
|
|
+ strlcpy(query_menu->name, menu_info->name, sizeof query_menu->name);
|
|
|
+
|
|
|
+done:
|
|
|
+ mutex_unlock(&chain->ctrl_mutex);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
/* --------------------------------------------------------------------------
|
|
|
* Control transactions
|