Jesse Keating 7a3296
From: Martin Rubli <martin_rubli@logitech.com>
Jesse Keating 7a3296
Date: Wed, 19 May 2010 22:51:56 +0000 (+0200)
Jesse Keating 7a3296
Subject: uvcvideo: Add support for absolute pan/tilt controls
Jesse Keating 7a3296
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=d3c2f664ec76aff14c3841c99e84cd78d7227f79
Jesse Keating 7a3296
Jesse Keating 7a3296
uvcvideo: Add support for absolute pan/tilt controls
Jesse Keating 7a3296
Jesse Keating 7a3296
Signed-off-by: Martin Rubli <martin_rubli@logitech.com>
Jesse Keating 7a3296
---
Jesse Keating 7a3296
Jesse Keating 7a3296
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
Jesse Keating 7a3296
index aa0720a..5ec2f4a 100644
Jesse Keating 7a3296
--- a/drivers/media/video/uvc/uvc_ctrl.c
Jesse Keating 7a3296
+++ b/drivers/media/video/uvc/uvc_ctrl.c
Jesse Keating 7a3296
@@ -606,6 +606,26 @@ static struct uvc_control_mapping uvc_ctrl_mappings[] = {
Jesse Keating 7a3296
 		.set		= uvc_ctrl_set_zoom,
Jesse Keating 7a3296
 	},
Jesse Keating 7a3296
 	{
Jesse Keating 7a3296
+		.id		= V4L2_CID_PAN_ABSOLUTE,
Jesse Keating 7a3296
+		.name		= "Pan (Absolute)",
Jesse Keating 7a3296
+		.entity		= UVC_GUID_UVC_CAMERA,
Jesse Keating 7a3296
+		.selector	= UVC_CT_PANTILT_ABSOLUTE_CONTROL,
Jesse Keating 7a3296
+		.size		= 32,
Jesse Keating 7a3296
+		.offset		= 0,
Jesse Keating 7a3296
+		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,
Jesse Keating 7a3296
+		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,
Jesse Keating 7a3296
+	},
Jesse Keating 7a3296
+	{
Jesse Keating 7a3296
+		.id		= V4L2_CID_TILT_ABSOLUTE,
Jesse Keating 7a3296
+		.name		= "Tilt (Absolute)",
Jesse Keating 7a3296
+		.entity		= UVC_GUID_UVC_CAMERA,
Jesse Keating 7a3296
+		.selector	= UVC_CT_PANTILT_ABSOLUTE_CONTROL,
Jesse Keating 7a3296
+		.size		= 32,
Jesse Keating 7a3296
+		.offset		= 32,
Jesse Keating 7a3296
+		.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,
Jesse Keating 7a3296
+		.data_type	= UVC_CTRL_DATA_TYPE_UNSIGNED,
Jesse Keating 7a3296
+	},
Jesse Keating 7a3296
+	{
Jesse Keating 7a3296
 		.id		= V4L2_CID_PRIVACY,
Jesse Keating 7a3296
 		.name		= "Privacy",
Jesse Keating 7a3296
 		.entity		= UVC_GUID_UVC_CAMERA,
Jesse Keating 7a3296
From: Hans de Goede <hdegoede@redhat.com>
Jesse Keating 7a3296
Date: Wed, 19 May 2010 23:15:00 +0000 (+0200)
Jesse Keating 7a3296
Subject: uvcvideo: Make button controls work properly
Jesse Keating 7a3296
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=2bd47ad4894bfaf1a97660b821cbc46439a614d6
Jesse Keating 7a3296
Jesse Keating 7a3296
uvcvideo: Make button controls work properly
Jesse Keating 7a3296
Jesse Keating 7a3296
According to the v4l2 spec, writing any value to a button control should
Jesse Keating 7a3296
result in the action belonging to the button control being triggered.
Jesse Keating 7a3296
UVC cams however want to see a 1 written, this patch fixes this by
Jesse Keating 7a3296
overriding whatever value user space passed in with -1 (0xffffffff) when
Jesse Keating 7a3296
the control is a button control.
Jesse Keating 7a3296
Jesse Keating 7a3296
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Jesse Keating 7a3296
---
Jesse Keating 7a3296
Jesse Keating 7a3296
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
Jesse Keating 7a3296
index 5ec2f4a..8bb825d 100644
Jesse Keating 7a3296
--- a/drivers/media/video/uvc/uvc_ctrl.c
Jesse Keating 7a3296
+++ b/drivers/media/video/uvc/uvc_ctrl.c
Jesse Keating 7a3296
@@ -698,6 +698,14 @@ static void uvc_set_le_value(struct uvc_control_mapping *mapping,
Jesse Keating 7a3296
 	int offset = mapping->offset;
Jesse Keating 7a3296
 	__u8 mask;
Jesse Keating 7a3296
 
Jesse Keating 7a3296
+	/* According to the v4l2 spec, writing any value to a button control
Jesse Keating 7a3296
+	 * should result in the action belonging to the button control being
Jesse Keating 7a3296
+	 * triggered. UVC devices however want to see a 1 written -> override
Jesse Keating 7a3296
+	 * value.
Jesse Keating 7a3296
+	 */
Jesse Keating 7a3296
+	if (mapping->v4l2_type == V4L2_CTRL_TYPE_BUTTON)
Jesse Keating 7a3296
+		value = -1;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
 	data += offset / 8;
Jesse Keating 7a3296
 	offset &= 7;
Jesse Keating 7a3296
 
Jesse Keating 7a3296
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Jesse Keating 7a3296
Date: Thu, 18 Feb 2010 19:38:52 +0000 (+0100)
Jesse Keating 7a3296
Subject: uvcvideo: Support menu controls in the control mapping API
Jesse Keating 7a3296
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=4930f2662e47d33e5baedac620da401a225bc3a8
Jesse Keating 7a3296
Jesse Keating 7a3296
uvcvideo: Support menu controls in the control mapping API
Jesse Keating 7a3296
Jesse Keating 7a3296
The UVCIOC_CTRL_MAP ioctl doesn't support menu entries for menu
Jesse Keating 7a3296
controls. As the uvc_xu_control_mapping structure has no reserved
Jesse Keating 7a3296
fields, this can't be fixed while keeping ABI compatibility.
Jesse Keating 7a3296
Jesse Keating 7a3296
Modify the UVCIOC_CTRL_MAP ioctl to add menu entries support, and define
Jesse Keating 7a3296
UVCIOC_CTRL_MAP_OLD that supports the old ABI without any ability to add
Jesse Keating 7a3296
menu controls.
Jesse Keating 7a3296
Jesse Keating 7a3296
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Jesse Keating 7a3296
---
Jesse Keating 7a3296
Jesse Keating 7a3296
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
Jesse Keating 7a3296
index 8bb825d..c88d72e 100644
Jesse Keating 7a3296
--- a/drivers/media/video/uvc/uvc_ctrl.c
Jesse Keating 7a3296
+++ b/drivers/media/video/uvc/uvc_ctrl.c
Jesse Keating 7a3296
@@ -1606,6 +1606,28 @@ void uvc_ctrl_cleanup_device(struct uvc_device *dev)
Jesse Keating 7a3296
 	}
Jesse Keating 7a3296
 }
Jesse Keating 7a3296
 
Jesse Keating 7a3296
+void uvc_ctrl_cleanup(void)
Jesse Keating 7a3296
+{
Jesse Keating 7a3296
+	struct uvc_control_info *info;
Jesse Keating 7a3296
+	struct uvc_control_info *ni;
Jesse Keating 7a3296
+	struct uvc_control_mapping *mapping;
Jesse Keating 7a3296
+	struct uvc_control_mapping *nm;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	list_for_each_entry_safe(info, ni, &uvc_driver.controls, list) {
Jesse Keating 7a3296
+		if (!(info->flags & UVC_CONTROL_EXTENSION))
Jesse Keating 7a3296
+			continue;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+		list_for_each_entry_safe(mapping, nm, &info->mappings, list) {
Jesse Keating 7a3296
+			list_del(&mapping->list);
Jesse Keating 7a3296
+			kfree(mapping->menu_info);
Jesse Keating 7a3296
+			kfree(mapping);
Jesse Keating 7a3296
+		}
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+		list_del(&info->list);
Jesse Keating 7a3296
+		kfree(info);
Jesse Keating 7a3296
+	}
Jesse Keating 7a3296
+}
Jesse Keating 7a3296
+
Jesse Keating 7a3296
 void uvc_ctrl_init(void)
Jesse Keating 7a3296
 {
Jesse Keating 7a3296
 	struct uvc_control_info *ctrl = uvc_ctrls;
Jesse Keating 7a3296
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
Jesse Keating 7a3296
index 838b56f..34818c1 100644
Jesse Keating 7a3296
--- a/drivers/media/video/uvc/uvc_driver.c
Jesse Keating 7a3296
+++ b/drivers/media/video/uvc/uvc_driver.c
Jesse Keating 7a3296
@@ -2261,6 +2261,7 @@ static int __init uvc_init(void)
Jesse Keating 7a3296
 static void __exit uvc_cleanup(void)
Jesse Keating 7a3296
 {
Jesse Keating 7a3296
 	usb_deregister(&uvc_driver.driver);
Jesse Keating 7a3296
+	uvc_ctrl_cleanup();
Jesse Keating 7a3296
 }
Jesse Keating 7a3296
 
Jesse Keating 7a3296
 module_init(uvc_init);
Jesse Keating 7a3296
diff --git a/drivers/media/video/uvc/uvc_v4l2.c b/drivers/media/video/uvc/uvc_v4l2.c
Jesse Keating 7a3296
index 7c9ab29..485a899 100644
Jesse Keating 7a3296
--- a/drivers/media/video/uvc/uvc_v4l2.c
Jesse Keating 7a3296
+++ b/drivers/media/video/uvc/uvc_v4l2.c
Jesse Keating 7a3296
@@ -29,6 +29,71 @@
Jesse Keating 7a3296
 #include "uvcvideo.h"
Jesse Keating 7a3296
 
Jesse Keating 7a3296
 /* ------------------------------------------------------------------------
Jesse Keating 7a3296
+ * UVC ioctls
Jesse Keating 7a3296
+ */
Jesse Keating 7a3296
+static int uvc_ioctl_ctrl_map(struct uvc_xu_control_mapping *xmap, int old)
Jesse Keating 7a3296
+{
Jesse Keating 7a3296
+	struct uvc_control_mapping *map;
Jesse Keating 7a3296
+	unsigned int size;
Jesse Keating 7a3296
+	int ret;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	map = kzalloc(sizeof *map, GFP_KERNEL);
Jesse Keating 7a3296
+	if (map == NULL)
Jesse Keating 7a3296
+		return -ENOMEM;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	map->id = xmap->id;
Jesse Keating 7a3296
+	memcpy(map->name, xmap->name, sizeof map->name);
Jesse Keating 7a3296
+	memcpy(map->entity, xmap->entity, sizeof map->entity);
Jesse Keating 7a3296
+	map->selector = xmap->selector;
Jesse Keating 7a3296
+	map->size = xmap->size;
Jesse Keating 7a3296
+	map->offset = xmap->offset;
Jesse Keating 7a3296
+	map->v4l2_type = xmap->v4l2_type;
Jesse Keating 7a3296
+	map->data_type = xmap->data_type;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	switch (xmap->v4l2_type) {
Jesse Keating 7a3296
+	case V4L2_CTRL_TYPE_INTEGER:
Jesse Keating 7a3296
+	case V4L2_CTRL_TYPE_BOOLEAN:
Jesse Keating 7a3296
+	case V4L2_CTRL_TYPE_BUTTON:
Jesse Keating 7a3296
+		break;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	case V4L2_CTRL_TYPE_MENU:
Jesse Keating 7a3296
+		if (old) {
Jesse Keating 7a3296
+			ret = -EINVAL;
Jesse Keating 7a3296
+			goto done;
Jesse Keating 7a3296
+		}
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+		size = xmap->menu_count * sizeof(*map->menu_info);
Jesse Keating 7a3296
+		map->menu_info = kmalloc(size, GFP_KERNEL);
Jesse Keating 7a3296
+		if (map->menu_info == NULL) {
Jesse Keating 7a3296
+			ret = -ENOMEM;
Jesse Keating 7a3296
+			goto done;
Jesse Keating 7a3296
+		}
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+		if (copy_from_user(map->menu_info, xmap->menu_info, size)) {
Jesse Keating 7a3296
+			ret = -EFAULT;
Jesse Keating 7a3296
+			goto done;
Jesse Keating 7a3296
+		}
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+		map->menu_count = xmap->menu_count;
Jesse Keating 7a3296
+		break;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	default:
Jesse Keating 7a3296
+		ret = -EINVAL;
Jesse Keating 7a3296
+		goto done;
Jesse Keating 7a3296
+	}
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	ret = uvc_ctrl_add_mapping(map);
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+done:
Jesse Keating 7a3296
+	if (ret < 0) {
Jesse Keating 7a3296
+		kfree(map->menu_info);
Jesse Keating 7a3296
+		kfree(map);
Jesse Keating 7a3296
+	}
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	return ret;
Jesse Keating 7a3296
+}
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+/* ------------------------------------------------------------------------
Jesse Keating 7a3296
  * V4L2 interface
Jesse Keating 7a3296
  */
Jesse Keating 7a3296
 
Jesse Keating 7a3296
@@ -974,7 +1039,8 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
Jesse Keating 7a3296
 		info->flags = xinfo->flags;
Jesse Keating 7a3296
 
Jesse Keating 7a3296
 		info->flags |= UVC_CONTROL_GET_MIN | UVC_CONTROL_GET_MAX |
Jesse Keating 7a3296
-				UVC_CONTROL_GET_RES | UVC_CONTROL_GET_DEF;
Jesse Keating 7a3296
+			       UVC_CONTROL_GET_RES | UVC_CONTROL_GET_DEF |
Jesse Keating 7a3296
+			       UVC_CONTROL_EXTENSION;
Jesse Keating 7a3296
 
Jesse Keating 7a3296
 		ret = uvc_ctrl_add_info(info);
Jesse Keating 7a3296
 		if (ret < 0)
Jesse Keating 7a3296
@@ -982,32 +1048,12 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
Jesse Keating 7a3296
 		break;
Jesse Keating 7a3296
 	}
Jesse Keating 7a3296
 
Jesse Keating 7a3296
+	case UVCIOC_CTRL_MAP_OLD:
Jesse Keating 7a3296
 	case UVCIOC_CTRL_MAP:
Jesse Keating 7a3296
-	{
Jesse Keating 7a3296
-		struct uvc_xu_control_mapping *xmap = arg;
Jesse Keating 7a3296
-		struct uvc_control_mapping *map;
Jesse Keating 7a3296
-
Jesse Keating 7a3296
 		if (!capable(CAP_SYS_ADMIN))
Jesse Keating 7a3296
 			return -EPERM;
Jesse Keating 7a3296
 
Jesse Keating 7a3296
-		map = kzalloc(sizeof *map, GFP_KERNEL);
Jesse Keating 7a3296
-		if (map == NULL)
Jesse Keating 7a3296
-			return -ENOMEM;
Jesse Keating 7a3296
-
Jesse Keating 7a3296
-		map->id = xmap->id;
Jesse Keating 7a3296
-		memcpy(map->name, xmap->name, sizeof map->name);
Jesse Keating 7a3296
-		memcpy(map->entity, xmap->entity, sizeof map->entity);
Jesse Keating 7a3296
-		map->selector = xmap->selector;
Jesse Keating 7a3296
-		map->size = xmap->size;
Jesse Keating 7a3296
-		map->offset = xmap->offset;
Jesse Keating 7a3296
-		map->v4l2_type = xmap->v4l2_type;
Jesse Keating 7a3296
-		map->data_type = xmap->data_type;
Jesse Keating 7a3296
-
Jesse Keating 7a3296
-		ret = uvc_ctrl_add_mapping(map);
Jesse Keating 7a3296
-		if (ret < 0)
Jesse Keating 7a3296
-			kfree(map);
Jesse Keating 7a3296
-		break;
Jesse Keating 7a3296
-	}
Jesse Keating 7a3296
+		return uvc_ioctl_ctrl_map(arg, cmd == UVCIOC_CTRL_MAP_OLD);
Jesse Keating 7a3296
 
Jesse Keating 7a3296
 	case UVCIOC_CTRL_GET:
Jesse Keating 7a3296
 		return uvc_xu_ctrl_query(chain, arg, 0);
Jesse Keating 7a3296
diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h
Jesse Keating 7a3296
index d1f8840..14f77e4 100644
Jesse Keating 7a3296
--- a/drivers/media/video/uvc/uvcvideo.h
Jesse Keating 7a3296
+++ b/drivers/media/video/uvc/uvcvideo.h
Jesse Keating 7a3296
@@ -27,6 +27,8 @@
Jesse Keating 7a3296
 #define UVC_CONTROL_RESTORE	(1 << 6)
Jesse Keating 7a3296
 /* Control can be updated by the camera. */
Jesse Keating 7a3296
 #define UVC_CONTROL_AUTO_UPDATE	(1 << 7)
Jesse Keating 7a3296
+/* Control is an extension unit control. */
Jesse Keating 7a3296
+#define UVC_CONTROL_EXTENSION	(1 << 8)
Jesse Keating 7a3296
 
Jesse Keating 7a3296
 #define UVC_CONTROL_GET_RANGE	(UVC_CONTROL_GET_CUR | UVC_CONTROL_GET_MIN | \
Jesse Keating 7a3296
 				 UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES | \
Jesse Keating 7a3296
@@ -40,6 +42,15 @@ struct uvc_xu_control_info {
Jesse Keating 7a3296
 	__u32 flags;
Jesse Keating 7a3296
 };
Jesse Keating 7a3296
 
Jesse Keating 7a3296
+struct uvc_menu_info {
Jesse Keating 7a3296
+	__u32 value;
Jesse Keating 7a3296
+	__u8 name[32];
Jesse Keating 7a3296
+};
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+struct uvc_xu_control_mapping_old {
Jesse Keating 7a3296
+	__u8 reserved[64];
Jesse Keating 7a3296
+};
Jesse Keating 7a3296
+
Jesse Keating 7a3296
 struct uvc_xu_control_mapping {
Jesse Keating 7a3296
 	__u32 id;
Jesse Keating 7a3296
 	__u8 name[32];
Jesse Keating 7a3296
@@ -50,6 +61,11 @@ struct uvc_xu_control_mapping {
Jesse Keating 7a3296
 	__u8 offset;
Jesse Keating 7a3296
 	enum v4l2_ctrl_type v4l2_type;
Jesse Keating 7a3296
 	__u32 data_type;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	struct uvc_menu_info __user *menu_info;
Jesse Keating 7a3296
+	__u32 menu_count;
Jesse Keating 7a3296
+
Jesse Keating 7a3296
+	__u32 reserved[4];
Jesse Keating 7a3296
 };
Jesse Keating 7a3296
 
Jesse Keating 7a3296
 struct uvc_xu_control {
Jesse Keating 7a3296
@@ -60,6 +76,7 @@ struct uvc_xu_control {
Jesse Keating 7a3296
 };
Jesse Keating 7a3296
 
Jesse Keating 7a3296
 #define UVCIOC_CTRL_ADD		_IOW('U', 1, struct uvc_xu_control_info)
Jesse Keating 7a3296
+#define UVCIOC_CTRL_MAP_OLD	_IOWR('U', 2, struct uvc_xu_control_mapping_old)
Jesse Keating 7a3296
 #define UVCIOC_CTRL_MAP		_IOWR('U', 2, struct uvc_xu_control_mapping)
Jesse Keating 7a3296
 #define UVCIOC_CTRL_GET		_IOWR('U', 3, struct uvc_xu_control)
Jesse Keating 7a3296
 #define UVCIOC_CTRL_SET		_IOW('U', 4, struct uvc_xu_control)
Jesse Keating 7a3296
@@ -198,11 +215,6 @@ struct uvc_streaming_control {
Jesse Keating 7a3296
 	__u8  bMaxVersion;
Jesse Keating 7a3296
 };
Jesse Keating 7a3296
 
Jesse Keating 7a3296
-struct uvc_menu_info {
Jesse Keating 7a3296
-	__u32 value;
Jesse Keating 7a3296
-	__u8 name[32];
Jesse Keating 7a3296
-};
Jesse Keating 7a3296
-
Jesse Keating 7a3296
 struct uvc_control_info {
Jesse Keating 7a3296
 	struct list_head list;
Jesse Keating 7a3296
 	struct list_head mappings;
Jesse Keating 7a3296
@@ -625,6 +637,7 @@ extern int uvc_ctrl_init_device(struct uvc_device *dev);
Jesse Keating 7a3296
 extern void uvc_ctrl_cleanup_device(struct uvc_device *dev);
Jesse Keating 7a3296
 extern int uvc_ctrl_resume_device(struct uvc_device *dev);
Jesse Keating 7a3296
 extern void uvc_ctrl_init(void);
Jesse Keating 7a3296
+extern void uvc_ctrl_cleanup(void);
Jesse Keating 7a3296
 
Jesse Keating 7a3296
 extern int uvc_ctrl_begin(struct uvc_video_chain *chain);
Jesse Keating 7a3296
 extern int __uvc_ctrl_commit(struct uvc_video_chain *chain, int rollback);
Jesse Keating 7a3296
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Jesse Keating 7a3296
Date: Fri, 25 Jun 2010 07:58:43 +0000 (+0200)
Jesse Keating 7a3296
Subject: uvcvideo: Add support for Manta MM-353 Plako
Jesse Keating 7a3296
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=352e661e1f347390a86cf34bc5e41adbdd1caa41
Jesse Keating 7a3296
Jesse Keating 7a3296
uvcvideo: Add support for Manta MM-353 Plako
Jesse Keating 7a3296
Jesse Keating 7a3296
The camera requires the PROBE_MINMAX quirk. Add a corresponding entry
Jesse Keating 7a3296
in the device IDs list
Jesse Keating 7a3296
Jesse Keating 7a3296
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Jesse Keating 7a3296
---
Jesse Keating 7a3296
Jesse Keating 7a3296
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
Jesse Keating 7a3296
index 34818c1..1a89384 100644
Jesse Keating 7a3296
--- a/drivers/media/video/uvc/uvc_driver.c
Jesse Keating 7a3296
+++ b/drivers/media/video/uvc/uvc_driver.c
Jesse Keating 7a3296
@@ -2174,6 +2174,15 @@ static struct usb_device_id uvc_ids[] = {
Jesse Keating 7a3296
 	  .bInterfaceSubClass	= 1,
Jesse Keating 7a3296
 	  .bInterfaceProtocol	= 0,
Jesse Keating 7a3296
 	  .driver_info		= UVC_QUIRK_PROBE_EXTRAFIELDS },
Jesse Keating 7a3296
+	/* Manta MM-353 Plako */
Jesse Keating 7a3296
+	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
Jesse Keating 7a3296
+				| USB_DEVICE_ID_MATCH_INT_INFO,
Jesse Keating 7a3296
+	  .idVendor		= 0x18ec,
Jesse Keating 7a3296
+	  .idProduct		= 0x3188,
Jesse Keating 7a3296
+	  .bInterfaceClass	= USB_CLASS_VIDEO,
Jesse Keating 7a3296
+	  .bInterfaceSubClass	= 1,
Jesse Keating 7a3296
+	  .bInterfaceProtocol	= 0,
Jesse Keating 7a3296
+	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
Jesse Keating 7a3296
 	/* FSC WebCam V30S */
Jesse Keating 7a3296
 	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
Jesse Keating 7a3296
 				| USB_DEVICE_ID_MATCH_INT_INFO,