This patch from Claudio S. Matsuoka adds a new quirk to make the Syntek 
174f:5212 work.

>From 79775881893806a3aab141b278cf4039673121d7 Mon Sep 17 00:00:00 2001
From: Claudio Matsuoka <[EMAIL PROTECTED]>
Date: Thu, 27 Dec 2007 13:10:14 -0200
Subject: [PATCH] Add quirk for Syntek 174f:5212 camera

The Syntek 174f:5212 UVC camera in HP Spartan laptops fail to synchronize
frames, add quirk to skip synchronization.

Signed-off-by: Claudio Matsuoka <[EMAIL PROTECTED]>
---
 uvc_driver.c |   12 ++++++++++++
 uvc_video.c  |   12 ++++++++----
 uvcvideo.h   |    1 +
 3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/uvc_driver.c b/uvc_driver.c
index 715b4b1..49fb900 100644
--- a/uvc_driver.c
+++ b/uvc_driver.c
@@ -1530,6 +1530,7 @@ static int uvc_probe(struct usb_interface *intf,
        dev->intf = usb_get_intf(intf);
        dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
        dev->quirks = id->driver_info;
+       dev->udev->quirks = id->driver_info;
 
        /* Parse the Video Class control descriptor */
        if (uvc_parse_control(dev) < 0) {
@@ -1653,6 +1654,17 @@ static int uvc_resume(struct usb_interface *intf)
  * though they are compliant.
  */
 static struct usb_device_id uvc_ids[] = {
+       /* Syntek (HP Spartan) */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor             = 0x174f,
+         .idProduct            = 0x5212,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = UVC_QUIRK_PROBE_MINMAX
+                               | UVC_QUIRK_DONT_SYNCHRONIZE
+       },
        /* ALi M5606 (Clevo M540SR) */
        { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
                                | USB_DEVICE_ID_MATCH_INT_INFO,
diff --git a/uvc_video.c b/uvc_video.c
index 60e1507..dde1469 100644
--- a/uvc_video.c
+++ b/uvc_video.c
@@ -266,7 +266,8 @@ done:
  * uvc_video_decode_end will never be called with a NULL buffer.
  */
 static int uvc_video_decode_start(struct uvc_video_queue *queue,
-               struct uvc_buffer *buf, const __u8 *data, int len)
+               struct uvc_buffer *buf, const __u8 *data, int len,
+               const __u32 quirks)
 {
        __u8 fid;
 
@@ -300,7 +301,8 @@ static int uvc_video_decode_start(struct uvc_video_queue 
*queue,
         * frame will always be in sync.
         */
        if (buf->state != UVC_BUF_STATE_ACTIVE) {
-               if (fid == queue->last_fid) {
+               if (~quirks & UVC_QUIRK_DONT_SYNCHRONIZE &&
+                                       fid == queue->last_fid) {
                        uvc_trace(UVC_TRACE_FRAME, "Dropping payload (out of "
                                "sync).\n");
                        return -ENODATA;
@@ -396,7 +398,8 @@ static void uvc_video_decode_isoc(struct urb *urb,
                mem = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
                do {
                        ret = uvc_video_decode_start(queue, buf, mem,
-                               urb->iso_frame_desc[i].actual_length);
+                               urb->iso_frame_desc[i].actual_length,
+                               urb->dev->quirks);
                        if (ret == -EAGAIN)
                                buf = uvc_queue_next_buffer(queue, buf);
                } while (ret == -EAGAIN);
@@ -432,7 +435,8 @@ static void uvc_video_decode_bulk(struct urb *urb,
         */
        if (queue->bulk.header_size == -1) {
                do {
-                       ret = uvc_video_decode_start(queue, buf, mem, len);
+                       ret = uvc_video_decode_start(queue, buf, mem, len,
+                                                       urb->dev->quirks);
                        if (ret == -EAGAIN)
                                buf = uvc_queue_next_buffer(queue, buf);
                } while (ret == -EAGAIN);
diff --git a/uvcvideo.h b/uvcvideo.h
index 84ef9f4..6545951 100644
--- a/uvcvideo.h
+++ b/uvcvideo.h
@@ -312,6 +312,7 @@ struct uvc_xu_control {
 #define UVC_QUIRK_PROBE_MINMAX         0x00000002
 #define UVC_QUIRK_PROBE_EXTRAFIELDS    0x00000004
 #define UVC_QUIRK_BUILTIN_ISIGHT       0x00000008
+#define UVC_QUIRK_DONT_SYNCHRONIZE     0x00000010
 
 /* Format flags */
 #define UVC_FMT_FLAG_COMPRESSED                0x00000001
-- 
1.5.2.5

--
[]'s
Herton
_______________________________________________
Linux-uvc-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/linux-uvc-devel

Reply via email to