@@ -1497,6 +1497,17 @@ static const struct uvc_entity_quirk {
u8 guid[16];
u32 quirks;
} uvc_entity_quirk[] = {
+ /*
+ * Some SunPlus uvc 1.5 device firmware expects that packages with
+ * no frame data are ignored by the host.
+ * Therefore it does not clear the PTS/SCR bits in the header, and
+ * breaks the timestamp decode algorithm.
+ */
+ {
+ .guid = {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49,
+ 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x1d},
+ .quirks = UVC_QUIRK_IGNORE_EMPTY_TS,
+ },
};
static void uvc_entity_quirks(struct uvc_device *dev)
@@ -500,6 +500,14 @@ uvc_video_clock_decode(struct uvc_streaming *stream, struct uvc_buffer *buf,
if (len < header_size)
return;
+ /*
+ * Ignore the hardware timestamp on frames with no data on
+ * miss-behaving devices.
+ */
+ if (stream->dev->quirks & UVC_QUIRK_IGNORE_EMPTY_TS &&
+ len == header_size)
+ return;
+
/*
* Extract the timestamps:
*
@@ -212,6 +212,7 @@
#define UVC_QUIRK_RESTORE_CTRLS_ON_INIT 0x00000400
#define UVC_QUIRK_FORCE_Y8 0x00000800
#define UVC_QUIRK_FORCE_BPP 0x00001000
+#define UVC_QUIRK_IGNORE_EMPTY_TS 0x00002000
/* Format flags */
#define UVC_FMT_FLAG_COMPRESSED 0x00000001