- Linux 2.6.34.2-rc1 - Comment out upstream merged patches: pci-pm-do-not-use-native-pcie-pme-by-default.patch linux-2.6-acpi-sleep-live-sci-live.patch (slightly different upstream patch) drm-i915-make-G4X-style-PLL-search-more-permissive.patch drm-intel-945gm-stability-fixes.patch drm-radeon-fix-shared-ddc-handling.patch drm-i915-add-reclaimable-to-page-allocations.patch drm-i915-fix-hibernate-memory-corruption.patch iwlwifi-Recover-TX-flow-stall-due-to-stuck-queue.patch iwlwifi-recover_from_tx_stall.patch mac80211-do-not-wipe-out-old-supported-rates.patch mac80211-fix-supported-rates-IE-if-AP-doesnt-give-us-its-rates.patch iwlwifi-cancel-scan-watchdog-in-iwl_bg_abort_scan.patch ata-generic-handle-new-mbp-with-mcp89.patch ata-generic-implement-ata-gen-flags.patch x86-debug-send-sigtrap-for-user-icebp.patch ethtool-fix-buffer-overflow.patch sched-fix-over-scheduling-bug.patch kbuild-fix-modpost-segfault.patch acpica-00-linux-2.6.git-0f849d2cc6863c7874889ea60a871fb71399dd3f.patch acpica-01-linux-2.6.git-a997ab332832519c2e292db13f509e4360495a5a.patch acpica-02-linux-2.6.git-e4e9a735991c80fb0fc1bd4a13a93681c3c17ce0.patch acpica-03-linux-2.6.git-fd247447c1d94a79d5cfc647430784306b3a8323.patch acpica-04-linux-2.6.git-c9a8bbb7704cbf515c0fc68970abbe4e91d68521.patch acpica-05-linux-2.6.git-ce43ace02320a3fb9614ddb27edc3a8700d68b26.patch acpica-06-linux-2.6.git-9d3c752de65dbfa6e522f1d666deb0ac152ef367.patch acpi-pm-do-not-enable-gpes-for-system-wakeup-in-advance.patch cifs-fix-malicious-redirect-problem-in-the-dns-lookup-code.patch usb-obey-the-sysfs-power-wakeup-setting.patch - Fix up virtqueue-wrappers.patch to apply after 2.6.34.2 due to: virtio_net-fix-oom-handling-on-tx.patch - Revert -stable DRM patches already in our drm-next patch: amd64-agp-probe-unknown-agp-devices-the-right-way.patch i915-fix-lock-imbalance-on-error-path.patch drm-i915-hold-the-spinlock-whilst-resetting-unpin_work-along-error-path.patch - Fix up drm-next.patch to apply after 2.6.34.2 due to: drm-i915-gen3-page-flipping-fixes.patch drm-i915-don-t-queue-flips-during-a-flip-pending-event.patch - Drop patches now upstream from linux-2.6-v4l-dvb-uvcvideo-update.patch: V4L/DVB: uvcvideo: Add support for unbranded Arkmicro 18ec:3290 webcams V4L/DVB: uvcvideo: Add support for V4L2_PIX_FMT_Y16 - Temporarily comment out ssb_check_for_sprom.patch due to ugly conflicts with: ssb-handle-netbook-devices-where-the-sprom-address-is-changed.patch
558 lines
18 KiB
Diff
558 lines
18 KiB
Diff
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Date: Sat, 13 Mar 2010 21:12:15 +0000 (-0300)
|
|
Subject: V4L/DVB: uvcvideo: Add support for Packard Bell EasyNote MX52 integrated webcam
|
|
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=513640877c336551f7a4428eaff7a4eb0f42cb9e
|
|
|
|
V4L/DVB: uvcvideo: Add support for Packard Bell EasyNote MX52 integrated webcam
|
|
|
|
The camera requires the STREAM_NO_FID quirk. Add a corresponding entry
|
|
in the device IDs list.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
|
---
|
|
|
|
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
|
|
index a192c51..43892bf 100644
|
|
--- a/drivers/media/video/uvc/uvc_driver.c
|
|
+++ b/drivers/media/video/uvc/uvc_driver.c
|
|
@@ -2104,6 +2104,15 @@ static struct usb_device_id uvc_ids[] = {
|
|
.bInterfaceSubClass = 1,
|
|
.bInterfaceProtocol = 0,
|
|
.driver_info = UVC_QUIRK_STREAM_NO_FID },
|
|
+ /* Syntek (Packard Bell EasyNote MX52 */
|
|
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
+ .idVendor = 0x174f,
|
|
+ .idProduct = 0x8a12,
|
|
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
+ .bInterfaceSubClass = 1,
|
|
+ .bInterfaceProtocol = 0,
|
|
+ .driver_info = UVC_QUIRK_STREAM_NO_FID },
|
|
/* Syntek (Asus F9SG) */
|
|
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
| USB_DEVICE_ID_MATCH_INT_INFO,
|
|
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Date: Wed, 31 Mar 2010 15:29:26 +0000 (-0300)
|
|
Subject: V4L/DVB: uvcvideo: Use POLLOUT and POLLWRNORM for output devices
|
|
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=a6eb7bc8e0eea78f96ad1b0f0195ec52b88c6a00
|
|
|
|
V4L/DVB: uvcvideo: Use POLLOUT and POLLWRNORM for output devices
|
|
|
|
The V4L2 specification requires drivers to use the write events in the
|
|
file operations poll handler for output devices. The uvcvideo driver
|
|
erroneously used read events for all devices. Fix this.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
|
---
|
|
|
|
diff --git a/drivers/media/video/uvc/uvc_queue.c b/drivers/media/video/uvc/uvc_queue.c
|
|
index 4a925a3..133c78d 100644
|
|
--- a/drivers/media/video/uvc/uvc_queue.c
|
|
+++ b/drivers/media/video/uvc/uvc_queue.c
|
|
@@ -388,8 +388,12 @@ unsigned int uvc_queue_poll(struct uvc_video_queue *queue, struct file *file,
|
|
|
|
poll_wait(file, &buf->wait, wait);
|
|
if (buf->state == UVC_BUF_STATE_DONE ||
|
|
- buf->state == UVC_BUF_STATE_ERROR)
|
|
- mask |= POLLIN | POLLRDNORM;
|
|
+ buf->state == UVC_BUF_STATE_ERROR) {
|
|
+ if (queue->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
|
+ mask |= POLLIN | POLLRDNORM;
|
|
+ else
|
|
+ mask |= POLLOUT | POLLWRNORM;
|
|
+ }
|
|
|
|
done:
|
|
mutex_unlock(&queue->mutex);
|
|
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Date: Sun, 25 Apr 2010 19:23:24 +0000 (-0300)
|
|
Subject: V4L/DVB: uvcvideo: Flag relative controls as write-only
|
|
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=4ac25db7e7f6116213f1c03039df00b18466a0dc
|
|
|
|
V4L/DVB: uvcvideo: Flag relative controls as write-only
|
|
|
|
The UVC relative controls (exposure time, iris, focus, zoom, pan/tilt)
|
|
are write-only (despite the UVC specification stating that the GET_CUR
|
|
request is mandatory). Mark the controls as such, and report the related
|
|
V4L2 controls V4L2_CTRL_FLAG_WRITE_ONLY.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
|
---
|
|
|
|
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
|
|
index 3697d72..bf2a333 100644
|
|
--- a/drivers/media/video/uvc/uvc_ctrl.c
|
|
+++ b/drivers/media/video/uvc/uvc_ctrl.c
|
|
@@ -216,8 +216,7 @@ static struct uvc_control_info uvc_ctrls[] = {
|
|
.selector = UVC_CT_EXPOSURE_TIME_RELATIVE_CONTROL,
|
|
.index = 4,
|
|
.size = 1,
|
|
- .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR
|
|
- | UVC_CONTROL_RESTORE,
|
|
+ .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_RESTORE,
|
|
},
|
|
{
|
|
.entity = UVC_GUID_UVC_CAMERA,
|
|
@@ -232,8 +231,9 @@ static struct uvc_control_info uvc_ctrls[] = {
|
|
.selector = UVC_CT_FOCUS_RELATIVE_CONTROL,
|
|
.index = 6,
|
|
.size = 2,
|
|
- .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE
|
|
- | UVC_CONTROL_AUTO_UPDATE,
|
|
+ .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_MIN
|
|
+ | UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES
|
|
+ | UVC_CONTROL_GET_DEF | UVC_CONTROL_AUTO_UPDATE,
|
|
},
|
|
{
|
|
.entity = UVC_GUID_UVC_CAMERA,
|
|
@@ -248,8 +248,7 @@ static struct uvc_control_info uvc_ctrls[] = {
|
|
.selector = UVC_CT_IRIS_RELATIVE_CONTROL,
|
|
.index = 8,
|
|
.size = 1,
|
|
- .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR
|
|
- | UVC_CONTROL_AUTO_UPDATE,
|
|
+ .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_AUTO_UPDATE,
|
|
},
|
|
{
|
|
.entity = UVC_GUID_UVC_CAMERA,
|
|
@@ -264,8 +263,9 @@ static struct uvc_control_info uvc_ctrls[] = {
|
|
.selector = UVC_CT_ZOOM_RELATIVE_CONTROL,
|
|
.index = 10,
|
|
.size = 3,
|
|
- .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE
|
|
- | UVC_CONTROL_AUTO_UPDATE,
|
|
+ .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_MIN
|
|
+ | UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES
|
|
+ | UVC_CONTROL_GET_DEF | UVC_CONTROL_AUTO_UPDATE,
|
|
},
|
|
{
|
|
.entity = UVC_GUID_UVC_CAMERA,
|
|
@@ -280,8 +280,9 @@ static struct uvc_control_info uvc_ctrls[] = {
|
|
.selector = UVC_CT_PANTILT_RELATIVE_CONTROL,
|
|
.index = 12,
|
|
.size = 4,
|
|
- .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE
|
|
- | UVC_CONTROL_AUTO_UPDATE,
|
|
+ .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_MIN
|
|
+ | UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES
|
|
+ | UVC_CONTROL_GET_DEF | UVC_CONTROL_AUTO_UPDATE,
|
|
},
|
|
{
|
|
.entity = UVC_GUID_UVC_CAMERA,
|
|
@@ -296,8 +297,9 @@ static struct uvc_control_info uvc_ctrls[] = {
|
|
.selector = UVC_CT_ROLL_RELATIVE_CONTROL,
|
|
.index = 14,
|
|
.size = 2,
|
|
- .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE
|
|
- | UVC_CONTROL_AUTO_UPDATE,
|
|
+ .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_MIN
|
|
+ | UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES
|
|
+ | UVC_CONTROL_GET_DEF | UVC_CONTROL_AUTO_UPDATE,
|
|
},
|
|
{
|
|
.entity = UVC_GUID_UVC_CAMERA,
|
|
@@ -841,6 +843,8 @@ int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
|
|
strlcpy(v4l2_ctrl->name, mapping->name, sizeof v4l2_ctrl->name);
|
|
v4l2_ctrl->flags = 0;
|
|
|
|
+ if (!(ctrl->info->flags & UVC_CONTROL_GET_CUR))
|
|
+ v4l2_ctrl->flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
|
|
if (!(ctrl->info->flags & UVC_CONTROL_SET_CUR))
|
|
v4l2_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
|
|
|
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Date: Mon, 5 Jul 2010 18:24:39 +0000 (+0200)
|
|
Subject: uvcvideo: Power line frequency control doesn't support GET_MIN/MAX/RES
|
|
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=2596b09e32b45967dbdbfe80a10fb51d9a6c6839
|
|
|
|
uvcvideo: Power line frequency control doesn't support GET_MIN/MAX/RES
|
|
|
|
Issuing a GET_MIN request on the power line frequency control times out
|
|
on at least the Apple iSight. As the UVC specification doesn't list
|
|
GET_MIN/MAX/RES as supported on that control, remove them from the
|
|
uvc_ctrls array.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
---
|
|
|
|
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
|
|
index aa0720a..27a79f0 100644
|
|
--- a/drivers/media/video/uvc/uvc_ctrl.c
|
|
+++ b/drivers/media/video/uvc/uvc_ctrl.c
|
|
@@ -122,8 +122,8 @@ static struct uvc_control_info uvc_ctrls[] = {
|
|
.selector = UVC_PU_POWER_LINE_FREQUENCY_CONTROL,
|
|
.index = 10,
|
|
.size = 1,
|
|
- .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE
|
|
- | UVC_CONTROL_RESTORE,
|
|
+ .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR
|
|
+ | UVC_CONTROL_GET_DEF | UVC_CONTROL_RESTORE,
|
|
},
|
|
{
|
|
.entity = UVC_GUID_UVC_PROCESSING,
|
|
From: Martin Rubli <martin_rubli@logitech.com>
|
|
Date: Wed, 19 May 2010 22:51:56 +0000 (+0200)
|
|
Subject: uvcvideo: Add support for absolute pan/tilt controls
|
|
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=d3c2f664ec76aff14c3841c99e84cd78d7227f79
|
|
|
|
uvcvideo: Add support for absolute pan/tilt controls
|
|
|
|
Signed-off-by: Martin Rubli <martin_rubli@logitech.com>
|
|
---
|
|
|
|
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
|
|
index aa0720a..5ec2f4a 100644
|
|
--- a/drivers/media/video/uvc/uvc_ctrl.c
|
|
+++ b/drivers/media/video/uvc/uvc_ctrl.c
|
|
@@ -606,6 +606,26 @@ static struct uvc_control_mapping uvc_ctrl_mappings[] = {
|
|
.set = uvc_ctrl_set_zoom,
|
|
},
|
|
{
|
|
+ .id = V4L2_CID_PAN_ABSOLUTE,
|
|
+ .name = "Pan (Absolute)",
|
|
+ .entity = UVC_GUID_UVC_CAMERA,
|
|
+ .selector = UVC_CT_PANTILT_ABSOLUTE_CONTROL,
|
|
+ .size = 32,
|
|
+ .offset = 0,
|
|
+ .v4l2_type = V4L2_CTRL_TYPE_INTEGER,
|
|
+ .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED,
|
|
+ },
|
|
+ {
|
|
+ .id = V4L2_CID_TILT_ABSOLUTE,
|
|
+ .name = "Tilt (Absolute)",
|
|
+ .entity = UVC_GUID_UVC_CAMERA,
|
|
+ .selector = UVC_CT_PANTILT_ABSOLUTE_CONTROL,
|
|
+ .size = 32,
|
|
+ .offset = 32,
|
|
+ .v4l2_type = V4L2_CTRL_TYPE_INTEGER,
|
|
+ .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED,
|
|
+ },
|
|
+ {
|
|
.id = V4L2_CID_PRIVACY,
|
|
.name = "Privacy",
|
|
.entity = UVC_GUID_UVC_CAMERA,
|
|
From: Hans de Goede <hdegoede@redhat.com>
|
|
Date: Wed, 19 May 2010 23:15:00 +0000 (+0200)
|
|
Subject: uvcvideo: Make button controls work properly
|
|
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=2bd47ad4894bfaf1a97660b821cbc46439a614d6
|
|
|
|
uvcvideo: Make button controls work properly
|
|
|
|
According to the v4l2 spec, writing any value to a button control should
|
|
result in the action belonging to the button control being triggered.
|
|
UVC cams however want to see a 1 written, this patch fixes this by
|
|
overriding whatever value user space passed in with -1 (0xffffffff) when
|
|
the control is a button control.
|
|
|
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
|
---
|
|
|
|
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
|
|
index 5ec2f4a..8bb825d 100644
|
|
--- a/drivers/media/video/uvc/uvc_ctrl.c
|
|
+++ b/drivers/media/video/uvc/uvc_ctrl.c
|
|
@@ -698,6 +698,14 @@ static void uvc_set_le_value(struct uvc_control_mapping *mapping,
|
|
int offset = mapping->offset;
|
|
__u8 mask;
|
|
|
|
+ /* According to the v4l2 spec, writing any value to a button control
|
|
+ * should result in the action belonging to the button control being
|
|
+ * triggered. UVC devices however want to see a 1 written -> override
|
|
+ * value.
|
|
+ */
|
|
+ if (mapping->v4l2_type == V4L2_CTRL_TYPE_BUTTON)
|
|
+ value = -1;
|
|
+
|
|
data += offset / 8;
|
|
offset &= 7;
|
|
|
|
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Date: Thu, 18 Feb 2010 19:38:52 +0000 (+0100)
|
|
Subject: uvcvideo: Support menu controls in the control mapping API
|
|
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=4930f2662e47d33e5baedac620da401a225bc3a8
|
|
|
|
uvcvideo: Support menu controls in the control mapping API
|
|
|
|
The UVCIOC_CTRL_MAP ioctl doesn't support menu entries for menu
|
|
controls. As the uvc_xu_control_mapping structure has no reserved
|
|
fields, this can't be fixed while keeping ABI compatibility.
|
|
|
|
Modify the UVCIOC_CTRL_MAP ioctl to add menu entries support, and define
|
|
UVCIOC_CTRL_MAP_OLD that supports the old ABI without any ability to add
|
|
menu controls.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
---
|
|
|
|
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
|
|
index 8bb825d..c88d72e 100644
|
|
--- a/drivers/media/video/uvc/uvc_ctrl.c
|
|
+++ b/drivers/media/video/uvc/uvc_ctrl.c
|
|
@@ -1606,6 +1606,28 @@ void uvc_ctrl_cleanup_device(struct uvc_device *dev)
|
|
}
|
|
}
|
|
|
|
+void uvc_ctrl_cleanup(void)
|
|
+{
|
|
+ struct uvc_control_info *info;
|
|
+ struct uvc_control_info *ni;
|
|
+ struct uvc_control_mapping *mapping;
|
|
+ struct uvc_control_mapping *nm;
|
|
+
|
|
+ list_for_each_entry_safe(info, ni, &uvc_driver.controls, list) {
|
|
+ if (!(info->flags & UVC_CONTROL_EXTENSION))
|
|
+ continue;
|
|
+
|
|
+ list_for_each_entry_safe(mapping, nm, &info->mappings, list) {
|
|
+ list_del(&mapping->list);
|
|
+ kfree(mapping->menu_info);
|
|
+ kfree(mapping);
|
|
+ }
|
|
+
|
|
+ list_del(&info->list);
|
|
+ kfree(info);
|
|
+ }
|
|
+}
|
|
+
|
|
void uvc_ctrl_init(void)
|
|
{
|
|
struct uvc_control_info *ctrl = uvc_ctrls;
|
|
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
|
|
index 838b56f..34818c1 100644
|
|
--- a/drivers/media/video/uvc/uvc_driver.c
|
|
+++ b/drivers/media/video/uvc/uvc_driver.c
|
|
@@ -2261,6 +2261,7 @@ static int __init uvc_init(void)
|
|
static void __exit uvc_cleanup(void)
|
|
{
|
|
usb_deregister(&uvc_driver.driver);
|
|
+ uvc_ctrl_cleanup();
|
|
}
|
|
|
|
module_init(uvc_init);
|
|
diff --git a/drivers/media/video/uvc/uvc_v4l2.c b/drivers/media/video/uvc/uvc_v4l2.c
|
|
index 7c9ab29..485a899 100644
|
|
--- a/drivers/media/video/uvc/uvc_v4l2.c
|
|
+++ b/drivers/media/video/uvc/uvc_v4l2.c
|
|
@@ -29,6 +29,71 @@
|
|
#include "uvcvideo.h"
|
|
|
|
/* ------------------------------------------------------------------------
|
|
+ * UVC ioctls
|
|
+ */
|
|
+static int uvc_ioctl_ctrl_map(struct uvc_xu_control_mapping *xmap, int old)
|
|
+{
|
|
+ struct uvc_control_mapping *map;
|
|
+ unsigned int size;
|
|
+ int ret;
|
|
+
|
|
+ map = kzalloc(sizeof *map, GFP_KERNEL);
|
|
+ if (map == NULL)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ map->id = xmap->id;
|
|
+ memcpy(map->name, xmap->name, sizeof map->name);
|
|
+ memcpy(map->entity, xmap->entity, sizeof map->entity);
|
|
+ map->selector = xmap->selector;
|
|
+ map->size = xmap->size;
|
|
+ map->offset = xmap->offset;
|
|
+ map->v4l2_type = xmap->v4l2_type;
|
|
+ map->data_type = xmap->data_type;
|
|
+
|
|
+ switch (xmap->v4l2_type) {
|
|
+ case V4L2_CTRL_TYPE_INTEGER:
|
|
+ case V4L2_CTRL_TYPE_BOOLEAN:
|
|
+ case V4L2_CTRL_TYPE_BUTTON:
|
|
+ break;
|
|
+
|
|
+ case V4L2_CTRL_TYPE_MENU:
|
|
+ if (old) {
|
|
+ ret = -EINVAL;
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
+ size = xmap->menu_count * sizeof(*map->menu_info);
|
|
+ map->menu_info = kmalloc(size, GFP_KERNEL);
|
|
+ if (map->menu_info == NULL) {
|
|
+ ret = -ENOMEM;
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
+ if (copy_from_user(map->menu_info, xmap->menu_info, size)) {
|
|
+ ret = -EFAULT;
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
+ map->menu_count = xmap->menu_count;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ ret = -EINVAL;
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
+ ret = uvc_ctrl_add_mapping(map);
|
|
+
|
|
+done:
|
|
+ if (ret < 0) {
|
|
+ kfree(map->menu_info);
|
|
+ kfree(map);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+/* ------------------------------------------------------------------------
|
|
* V4L2 interface
|
|
*/
|
|
|
|
@@ -974,7 +1039,8 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
|
info->flags = xinfo->flags;
|
|
|
|
info->flags |= UVC_CONTROL_GET_MIN | UVC_CONTROL_GET_MAX |
|
|
- UVC_CONTROL_GET_RES | UVC_CONTROL_GET_DEF;
|
|
+ UVC_CONTROL_GET_RES | UVC_CONTROL_GET_DEF |
|
|
+ UVC_CONTROL_EXTENSION;
|
|
|
|
ret = uvc_ctrl_add_info(info);
|
|
if (ret < 0)
|
|
@@ -982,32 +1048,12 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
|
break;
|
|
}
|
|
|
|
+ case UVCIOC_CTRL_MAP_OLD:
|
|
case UVCIOC_CTRL_MAP:
|
|
- {
|
|
- struct uvc_xu_control_mapping *xmap = arg;
|
|
- struct uvc_control_mapping *map;
|
|
-
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
return -EPERM;
|
|
|
|
- map = kzalloc(sizeof *map, GFP_KERNEL);
|
|
- if (map == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
- map->id = xmap->id;
|
|
- memcpy(map->name, xmap->name, sizeof map->name);
|
|
- memcpy(map->entity, xmap->entity, sizeof map->entity);
|
|
- map->selector = xmap->selector;
|
|
- map->size = xmap->size;
|
|
- map->offset = xmap->offset;
|
|
- map->v4l2_type = xmap->v4l2_type;
|
|
- map->data_type = xmap->data_type;
|
|
-
|
|
- ret = uvc_ctrl_add_mapping(map);
|
|
- if (ret < 0)
|
|
- kfree(map);
|
|
- break;
|
|
- }
|
|
+ return uvc_ioctl_ctrl_map(arg, cmd == UVCIOC_CTRL_MAP_OLD);
|
|
|
|
case UVCIOC_CTRL_GET:
|
|
return uvc_xu_ctrl_query(chain, arg, 0);
|
|
diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h
|
|
index d1f8840..14f77e4 100644
|
|
--- a/drivers/media/video/uvc/uvcvideo.h
|
|
+++ b/drivers/media/video/uvc/uvcvideo.h
|
|
@@ -27,6 +27,8 @@
|
|
#define UVC_CONTROL_RESTORE (1 << 6)
|
|
/* Control can be updated by the camera. */
|
|
#define UVC_CONTROL_AUTO_UPDATE (1 << 7)
|
|
+/* Control is an extension unit control. */
|
|
+#define UVC_CONTROL_EXTENSION (1 << 8)
|
|
|
|
#define UVC_CONTROL_GET_RANGE (UVC_CONTROL_GET_CUR | UVC_CONTROL_GET_MIN | \
|
|
UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES | \
|
|
@@ -40,6 +42,15 @@ struct uvc_xu_control_info {
|
|
__u32 flags;
|
|
};
|
|
|
|
+struct uvc_menu_info {
|
|
+ __u32 value;
|
|
+ __u8 name[32];
|
|
+};
|
|
+
|
|
+struct uvc_xu_control_mapping_old {
|
|
+ __u8 reserved[64];
|
|
+};
|
|
+
|
|
struct uvc_xu_control_mapping {
|
|
__u32 id;
|
|
__u8 name[32];
|
|
@@ -50,6 +61,11 @@ struct uvc_xu_control_mapping {
|
|
__u8 offset;
|
|
enum v4l2_ctrl_type v4l2_type;
|
|
__u32 data_type;
|
|
+
|
|
+ struct uvc_menu_info __user *menu_info;
|
|
+ __u32 menu_count;
|
|
+
|
|
+ __u32 reserved[4];
|
|
};
|
|
|
|
struct uvc_xu_control {
|
|
@@ -60,6 +76,7 @@ struct uvc_xu_control {
|
|
};
|
|
|
|
#define UVCIOC_CTRL_ADD _IOW('U', 1, struct uvc_xu_control_info)
|
|
+#define UVCIOC_CTRL_MAP_OLD _IOWR('U', 2, struct uvc_xu_control_mapping_old)
|
|
#define UVCIOC_CTRL_MAP _IOWR('U', 2, struct uvc_xu_control_mapping)
|
|
#define UVCIOC_CTRL_GET _IOWR('U', 3, struct uvc_xu_control)
|
|
#define UVCIOC_CTRL_SET _IOW('U', 4, struct uvc_xu_control)
|
|
@@ -198,11 +215,6 @@ struct uvc_streaming_control {
|
|
__u8 bMaxVersion;
|
|
};
|
|
|
|
-struct uvc_menu_info {
|
|
- __u32 value;
|
|
- __u8 name[32];
|
|
-};
|
|
-
|
|
struct uvc_control_info {
|
|
struct list_head list;
|
|
struct list_head mappings;
|
|
@@ -625,6 +637,7 @@ extern int uvc_ctrl_init_device(struct uvc_device *dev);
|
|
extern void uvc_ctrl_cleanup_device(struct uvc_device *dev);
|
|
extern int uvc_ctrl_resume_device(struct uvc_device *dev);
|
|
extern void uvc_ctrl_init(void);
|
|
+extern void uvc_ctrl_cleanup(void);
|
|
|
|
extern int uvc_ctrl_begin(struct uvc_video_chain *chain);
|
|
extern int __uvc_ctrl_commit(struct uvc_video_chain *chain, int rollback);
|
|
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Date: Fri, 25 Jun 2010 07:58:43 +0000 (+0200)
|
|
Subject: uvcvideo: Add support for Manta MM-353 Plako
|
|
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=352e661e1f347390a86cf34bc5e41adbdd1caa41
|
|
|
|
uvcvideo: Add support for Manta MM-353 Plako
|
|
|
|
The camera requires the PROBE_MINMAX quirk. Add a corresponding entry
|
|
in the device IDs list
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
---
|
|
|
|
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
|
|
index 34818c1..1a89384 100644
|
|
--- a/drivers/media/video/uvc/uvc_driver.c
|
|
+++ b/drivers/media/video/uvc/uvc_driver.c
|
|
@@ -2174,6 +2174,15 @@ static struct usb_device_id uvc_ids[] = {
|
|
.bInterfaceSubClass = 1,
|
|
.bInterfaceProtocol = 0,
|
|
.driver_info = UVC_QUIRK_PROBE_EXTRAFIELDS },
|
|
+ /* Manta MM-353 Plako */
|
|
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
+ .idVendor = 0x18ec,
|
|
+ .idProduct = 0x3188,
|
|
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
+ .bInterfaceSubClass = 1,
|
|
+ .bInterfaceProtocol = 0,
|
|
+ .driver_info = UVC_QUIRK_PROBE_MINMAX },
|
|
/* FSC WebCam V30S */
|
|
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
| USB_DEVICE_ID_MATCH_INT_INFO,
|