1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * uvc_driver.c -- USB Video Class driver
5 * Copyright (C) 2005-2010
6 * Laurent Pinchart (laurent.pinchart@ideasonboard.com)
9 #include <linux/atomic.h>
10 #include <linux/bits.h>
11 #include <linux/gpio/consumer.h>
12 #include <linux/kernel.h>
13 #include <linux/list.h>
14 #include <linux/module.h>
15 #include <linux/slab.h>
16 #include <linux/usb.h>
17 #include <linux/usb/quirks.h>
18 #include <linux/usb/uvc.h>
19 #include <linux/videodev2.h>
20 #include <linux/vmalloc.h>
21 #include <linux/wait.h>
22 #include <linux/unaligned.h>
24 #include <media/v4l2-common.h>
25 #include <media/v4l2-ioctl.h>
29 #define DRIVER_AUTHOR "Laurent Pinchart " \
30 "<laurent.pinchart@ideasonboard.com>"
31 #define DRIVER_DESC "USB Video Class driver"
33 unsigned int uvc_clock_param
= CLOCK_MONOTONIC
;
34 unsigned int uvc_hw_timestamps_param
;
35 unsigned int uvc_no_drop_param
;
36 static unsigned int uvc_quirks_param
= -1;
37 unsigned int uvc_dbg_param
;
38 unsigned int uvc_timeout_param
= UVC_CTRL_STREAMING_TIMEOUT
;
40 /* ------------------------------------------------------------------------
44 struct usb_host_endpoint
*uvc_find_endpoint(struct usb_host_interface
*alts
,
47 struct usb_host_endpoint
*ep
;
50 for (i
= 0; i
< alts
->desc
.bNumEndpoints
; ++i
) {
51 ep
= &alts
->endpoint
[i
];
52 if (ep
->desc
.bEndpointAddress
== epaddr
)
59 static enum v4l2_colorspace
uvc_colorspace(const u8 primaries
)
61 static const enum v4l2_colorspace colorprimaries
[] = {
62 V4L2_COLORSPACE_SRGB
, /* Unspecified */
64 V4L2_COLORSPACE_470_SYSTEM_M
,
65 V4L2_COLORSPACE_470_SYSTEM_BG
,
66 V4L2_COLORSPACE_SMPTE170M
,
67 V4L2_COLORSPACE_SMPTE240M
,
70 if (primaries
< ARRAY_SIZE(colorprimaries
))
71 return colorprimaries
[primaries
];
73 return V4L2_COLORSPACE_SRGB
; /* Reserved */
76 static enum v4l2_xfer_func
uvc_xfer_func(const u8 transfer_characteristics
)
79 * V4L2 does not currently have definitions for all possible values of
80 * UVC transfer characteristics. If v4l2_xfer_func is extended with new
81 * values, the mapping below should be updated.
83 * Substitutions are taken from the mapping given for
84 * V4L2_XFER_FUNC_DEFAULT documented in videodev2.h.
86 static const enum v4l2_xfer_func xfer_funcs
[] = {
87 V4L2_XFER_FUNC_DEFAULT
, /* Unspecified */
89 V4L2_XFER_FUNC_709
, /* Substitution for BT.470-2 M */
90 V4L2_XFER_FUNC_709
, /* Substitution for BT.470-2 B, G */
91 V4L2_XFER_FUNC_709
, /* Substitution for SMPTE 170M */
92 V4L2_XFER_FUNC_SMPTE240M
,
97 if (transfer_characteristics
< ARRAY_SIZE(xfer_funcs
))
98 return xfer_funcs
[transfer_characteristics
];
100 return V4L2_XFER_FUNC_DEFAULT
; /* Reserved */
103 static enum v4l2_ycbcr_encoding
uvc_ycbcr_enc(const u8 matrix_coefficients
)
106 * V4L2 does not currently have definitions for all possible values of
107 * UVC matrix coefficients. If v4l2_ycbcr_encoding is extended with new
108 * values, the mapping below should be updated.
110 * Substitutions are taken from the mapping given for
111 * V4L2_YCBCR_ENC_DEFAULT documented in videodev2.h.
113 * FCC is assumed to be close enough to 601.
115 static const enum v4l2_ycbcr_encoding ycbcr_encs
[] = {
116 V4L2_YCBCR_ENC_DEFAULT
, /* Unspecified */
118 V4L2_YCBCR_ENC_601
, /* Substitution for FCC */
119 V4L2_YCBCR_ENC_601
, /* Substitution for BT.470-2 B, G */
121 V4L2_YCBCR_ENC_SMPTE240M
,
124 if (matrix_coefficients
< ARRAY_SIZE(ycbcr_encs
))
125 return ycbcr_encs
[matrix_coefficients
];
127 return V4L2_YCBCR_ENC_DEFAULT
; /* Reserved */
130 /* ------------------------------------------------------------------------
131 * Terminal and unit management
134 struct uvc_entity
*uvc_entity_by_id(struct uvc_device
*dev
, int id
)
136 struct uvc_entity
*entity
;
138 list_for_each_entry(entity
, &dev
->entities
, list
) {
139 if (entity
->id
== id
)
146 static struct uvc_entity
*uvc_entity_by_reference(struct uvc_device
*dev
,
147 int id
, struct uvc_entity
*entity
)
152 entity
= list_entry(&dev
->entities
, struct uvc_entity
, list
);
154 list_for_each_entry_continue(entity
, &dev
->entities
, list
) {
155 for (i
= 0; i
< entity
->bNrInPins
; ++i
)
156 if (entity
->baSourceID
[i
] == id
)
163 static struct uvc_streaming
*uvc_stream_by_id(struct uvc_device
*dev
, int id
)
165 struct uvc_streaming
*stream
;
167 list_for_each_entry(stream
, &dev
->streams
, list
) {
168 if (stream
->header
.bTerminalLink
== id
)
175 /* ------------------------------------------------------------------------
176 * Streaming Object Management
179 static void uvc_stream_delete(struct uvc_streaming
*stream
)
181 if (stream
->async_wq
)
182 destroy_workqueue(stream
->async_wq
);
184 mutex_destroy(&stream
->mutex
);
186 usb_put_intf(stream
->intf
);
188 kfree(stream
->formats
);
189 kfree(stream
->header
.bmaControls
);
193 static struct uvc_streaming
*uvc_stream_new(struct uvc_device
*dev
,
194 struct usb_interface
*intf
)
196 struct uvc_streaming
*stream
;
198 stream
= kzalloc(sizeof(*stream
), GFP_KERNEL
);
202 mutex_init(&stream
->mutex
);
205 stream
->intf
= usb_get_intf(intf
);
206 stream
->intfnum
= intf
->cur_altsetting
->desc
.bInterfaceNumber
;
208 /* Allocate a stream specific work queue for asynchronous tasks. */
209 stream
->async_wq
= alloc_workqueue("uvcvideo", WQ_UNBOUND
| WQ_HIGHPRI
,
211 if (!stream
->async_wq
) {
212 uvc_stream_delete(stream
);
219 /* ------------------------------------------------------------------------
220 * Descriptors parsing
223 static int uvc_parse_format(struct uvc_device
*dev
,
224 struct uvc_streaming
*streaming
, struct uvc_format
*format
,
225 struct uvc_frame
*frames
, u32
**intervals
, const unsigned char *buffer
,
228 struct usb_interface
*intf
= streaming
->intf
;
229 struct usb_host_interface
*alts
= intf
->cur_altsetting
;
230 const struct uvc_format_desc
*fmtdesc
;
231 struct uvc_frame
*frame
;
232 const unsigned char *start
= buffer
;
233 unsigned int width_multiplier
= 1;
234 unsigned int interval
;
238 format
->type
= buffer
[2];
239 format
->index
= buffer
[3];
240 format
->frames
= frames
;
243 case UVC_VS_FORMAT_UNCOMPRESSED
:
244 case UVC_VS_FORMAT_FRAME_BASED
:
245 n
= buffer
[2] == UVC_VS_FORMAT_UNCOMPRESSED
? 27 : 28;
248 "device %d videostreaming interface %d FORMAT error\n",
250 alts
->desc
.bInterfaceNumber
);
254 /* Find the format descriptor from its GUID. */
255 fmtdesc
= uvc_format_by_guid(&buffer
[5]);
259 * Unknown video formats are not fatal errors, the
260 * caller will skip this descriptor.
262 dev_info(&streaming
->intf
->dev
,
263 "Unknown video format %pUl\n", &buffer
[5]);
267 format
->fcc
= fmtdesc
->fcc
;
268 format
->bpp
= buffer
[21];
271 * Some devices report a format that doesn't match what they
274 if (dev
->quirks
& UVC_QUIRK_FORCE_Y8
) {
275 if (format
->fcc
== V4L2_PIX_FMT_YUYV
) {
276 format
->fcc
= V4L2_PIX_FMT_GREY
;
278 width_multiplier
= 2;
282 /* Some devices report bpp that doesn't match the format. */
283 if (dev
->quirks
& UVC_QUIRK_FORCE_BPP
) {
284 const struct v4l2_format_info
*info
=
285 v4l2_format_info(format
->fcc
);
288 unsigned int div
= info
->hdiv
* info
->vdiv
;
290 n
= info
->bpp
[0] * div
;
291 for (i
= 1; i
< info
->comp_planes
; i
++)
294 format
->bpp
= DIV_ROUND_UP(8 * n
, div
);
298 if (buffer
[2] == UVC_VS_FORMAT_UNCOMPRESSED
) {
299 ftype
= UVC_VS_FRAME_UNCOMPRESSED
;
301 ftype
= UVC_VS_FRAME_FRAME_BASED
;
303 format
->flags
= UVC_FMT_FLAG_COMPRESSED
;
307 case UVC_VS_FORMAT_MJPEG
:
310 "device %d videostreaming interface %d FORMAT error\n",
312 alts
->desc
.bInterfaceNumber
);
316 format
->fcc
= V4L2_PIX_FMT_MJPEG
;
317 format
->flags
= UVC_FMT_FLAG_COMPRESSED
;
319 ftype
= UVC_VS_FRAME_MJPEG
;
322 case UVC_VS_FORMAT_DV
:
325 "device %d videostreaming interface %d FORMAT error\n",
327 alts
->desc
.bInterfaceNumber
);
331 if ((buffer
[8] & 0x7f) > 2) {
333 "device %d videostreaming interface %d: unknown DV format %u\n",
335 alts
->desc
.bInterfaceNumber
, buffer
[8]);
339 format
->fcc
= V4L2_PIX_FMT_DV
;
340 format
->flags
= UVC_FMT_FLAG_COMPRESSED
| UVC_FMT_FLAG_STREAM
;
344 /* Create a dummy frame descriptor. */
346 memset(frame
, 0, sizeof(*frame
));
347 frame
->bFrameIntervalType
= 1;
348 frame
->dwDefaultFrameInterval
= 1;
349 frame
->dwFrameInterval
= *intervals
;
354 case UVC_VS_FORMAT_MPEG2TS
:
355 case UVC_VS_FORMAT_STREAM_BASED
:
356 /* Not supported yet. */
359 "device %d videostreaming interface %d unsupported format %u\n",
360 dev
->udev
->devnum
, alts
->desc
.bInterfaceNumber
,
365 uvc_dbg(dev
, DESCR
, "Found format %p4cc", &format
->fcc
);
371 * Parse the frame descriptors. Only uncompressed, MJPEG and frame
372 * based formats have frame descriptors.
374 while (ftype
&& buflen
> 2 && buffer
[1] == USB_DT_CS_INTERFACE
&&
375 buffer
[2] == ftype
) {
376 unsigned int maxIntervalIndex
;
378 frame
= &frames
[format
->nframes
];
379 if (ftype
!= UVC_VS_FRAME_FRAME_BASED
)
380 n
= buflen
> 25 ? buffer
[25] : 0;
382 n
= buflen
> 21 ? buffer
[21] : 0;
386 if (buflen
< 26 + 4*n
) {
388 "device %d videostreaming interface %d FRAME error\n",
390 alts
->desc
.bInterfaceNumber
);
394 frame
->bFrameIndex
= buffer
[3];
395 frame
->bmCapabilities
= buffer
[4];
396 frame
->wWidth
= get_unaligned_le16(&buffer
[5])
398 frame
->wHeight
= get_unaligned_le16(&buffer
[7]);
399 frame
->dwMinBitRate
= get_unaligned_le32(&buffer
[9]);
400 frame
->dwMaxBitRate
= get_unaligned_le32(&buffer
[13]);
401 if (ftype
!= UVC_VS_FRAME_FRAME_BASED
) {
402 frame
->dwMaxVideoFrameBufferSize
=
403 get_unaligned_le32(&buffer
[17]);
404 frame
->dwDefaultFrameInterval
=
405 get_unaligned_le32(&buffer
[21]);
406 frame
->bFrameIntervalType
= buffer
[25];
408 frame
->dwMaxVideoFrameBufferSize
= 0;
409 frame
->dwDefaultFrameInterval
=
410 get_unaligned_le32(&buffer
[17]);
411 frame
->bFrameIntervalType
= buffer
[21];
415 * Copy the frame intervals.
417 * Some bogus devices report dwMinFrameInterval equal to
418 * dwMaxFrameInterval and have dwFrameIntervalStep set to
419 * zero. Setting all null intervals to 1 fixes the problem and
420 * some other divisions by zero that could happen.
422 frame
->dwFrameInterval
= *intervals
;
424 for (i
= 0; i
< n
; ++i
) {
425 interval
= get_unaligned_le32(&buffer
[26+4*i
]);
426 (*intervals
)[i
] = interval
? interval
: 1;
430 * Apply more fixes, quirks and workarounds to handle incorrect
431 * or broken descriptors.
435 * Several UVC chipsets screw up dwMaxVideoFrameBufferSize
436 * completely. Observed behaviours range from setting the
437 * value to 1.1x the actual frame size to hardwiring the
438 * 16 low bits to 0. This results in a higher than necessary
439 * memory usage as well as a wrong image size information. For
440 * uncompressed formats this can be fixed by computing the
441 * value from the frame size.
443 if (!(format
->flags
& UVC_FMT_FLAG_COMPRESSED
))
444 frame
->dwMaxVideoFrameBufferSize
= format
->bpp
445 * frame
->wWidth
* frame
->wHeight
/ 8;
448 * Clamp the default frame interval to the boundaries. A zero
449 * bFrameIntervalType value indicates a continuous frame
450 * interval range, with dwFrameInterval[0] storing the minimum
451 * value and dwFrameInterval[1] storing the maximum value.
453 maxIntervalIndex
= frame
->bFrameIntervalType
? n
- 1 : 1;
454 frame
->dwDefaultFrameInterval
=
455 clamp(frame
->dwDefaultFrameInterval
,
456 frame
->dwFrameInterval
[0],
457 frame
->dwFrameInterval
[maxIntervalIndex
]);
460 * Some devices report frame intervals that are not functional.
461 * If the corresponding quirk is set, restrict operation to the
462 * first interval only.
464 if (dev
->quirks
& UVC_QUIRK_RESTRICT_FRAME_RATE
) {
465 frame
->bFrameIntervalType
= 1;
466 (*intervals
)[0] = frame
->dwDefaultFrameInterval
;
469 uvc_dbg(dev
, DESCR
, "- %ux%u (%u.%u fps)\n",
470 frame
->wWidth
, frame
->wHeight
,
471 10000000 / frame
->dwDefaultFrameInterval
,
472 (100000000 / frame
->dwDefaultFrameInterval
) % 10);
481 if (buflen
> 2 && buffer
[1] == USB_DT_CS_INTERFACE
&&
482 buffer
[2] == UVC_VS_STILL_IMAGE_FRAME
) {
487 if (buflen
> 2 && buffer
[1] == USB_DT_CS_INTERFACE
&&
488 buffer
[2] == UVC_VS_COLORFORMAT
) {
491 "device %d videostreaming interface %d COLORFORMAT error\n",
493 alts
->desc
.bInterfaceNumber
);
497 format
->colorspace
= uvc_colorspace(buffer
[3]);
498 format
->xfer_func
= uvc_xfer_func(buffer
[4]);
499 format
->ycbcr_enc
= uvc_ycbcr_enc(buffer
[5]);
504 format
->colorspace
= V4L2_COLORSPACE_SRGB
;
507 return buffer
- start
;
510 static int uvc_parse_streaming(struct uvc_device
*dev
,
511 struct usb_interface
*intf
)
513 struct uvc_streaming
*streaming
= NULL
;
514 struct uvc_format
*format
;
515 struct uvc_frame
*frame
;
516 struct usb_host_interface
*alts
= &intf
->altsetting
[0];
517 const unsigned char *_buffer
, *buffer
= alts
->extra
;
518 int _buflen
, buflen
= alts
->extralen
;
519 unsigned int nformats
= 0, nframes
= 0, nintervals
= 0;
520 unsigned int size
, i
, n
, p
;
525 if (intf
->cur_altsetting
->desc
.bInterfaceSubClass
526 != UVC_SC_VIDEOSTREAMING
) {
528 "device %d interface %d isn't a video streaming interface\n",
530 intf
->altsetting
[0].desc
.bInterfaceNumber
);
534 if (usb_driver_claim_interface(&uvc_driver
.driver
, intf
, dev
)) {
536 "device %d interface %d is already claimed\n",
538 intf
->altsetting
[0].desc
.bInterfaceNumber
);
542 streaming
= uvc_stream_new(dev
, intf
);
543 if (streaming
== NULL
) {
544 usb_driver_release_interface(&uvc_driver
.driver
, intf
);
549 * The Pico iMage webcam has its class-specific interface descriptors
550 * after the endpoint descriptors.
553 for (i
= 0; i
< alts
->desc
.bNumEndpoints
; ++i
) {
554 struct usb_host_endpoint
*ep
= &alts
->endpoint
[i
];
556 if (ep
->extralen
== 0)
559 if (ep
->extralen
> 2 &&
560 ep
->extra
[1] == USB_DT_CS_INTERFACE
) {
562 "trying extra data from endpoint %u\n",
564 buffer
= alts
->endpoint
[i
].extra
;
565 buflen
= alts
->endpoint
[i
].extralen
;
571 /* Skip the standard interface descriptors. */
572 while (buflen
> 2 && buffer
[1] != USB_DT_CS_INTERFACE
) {
579 "no class-specific streaming interface descriptors found\n");
583 /* Parse the header descriptor. */
585 case UVC_VS_OUTPUT_HEADER
:
586 streaming
->type
= V4L2_BUF_TYPE_VIDEO_OUTPUT
;
590 case UVC_VS_INPUT_HEADER
:
591 streaming
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
597 "device %d videostreaming interface %d HEADER descriptor not found\n",
598 dev
->udev
->devnum
, alts
->desc
.bInterfaceNumber
);
602 p
= buflen
>= 4 ? buffer
[3] : 0;
603 n
= buflen
>= size
? buffer
[size
-1] : 0;
605 if (buflen
< size
+ p
*n
) {
607 "device %d videostreaming interface %d HEADER descriptor is invalid\n",
608 dev
->udev
->devnum
, alts
->desc
.bInterfaceNumber
);
612 streaming
->header
.bNumFormats
= p
;
613 streaming
->header
.bEndpointAddress
= buffer
[6];
614 if (buffer
[2] == UVC_VS_INPUT_HEADER
) {
615 streaming
->header
.bmInfo
= buffer
[7];
616 streaming
->header
.bTerminalLink
= buffer
[8];
617 streaming
->header
.bStillCaptureMethod
= buffer
[9];
618 streaming
->header
.bTriggerSupport
= buffer
[10];
619 streaming
->header
.bTriggerUsage
= buffer
[11];
621 streaming
->header
.bTerminalLink
= buffer
[7];
623 streaming
->header
.bControlSize
= n
;
625 streaming
->header
.bmaControls
= kmemdup(&buffer
[size
], p
* n
,
627 if (streaming
->header
.bmaControls
== NULL
) {
638 /* Count the format and frame descriptors. */
639 while (_buflen
> 2 && _buffer
[1] == USB_DT_CS_INTERFACE
) {
640 switch (_buffer
[2]) {
641 case UVC_VS_FORMAT_UNCOMPRESSED
:
642 case UVC_VS_FORMAT_MJPEG
:
643 case UVC_VS_FORMAT_FRAME_BASED
:
647 case UVC_VS_FORMAT_DV
:
649 * DV format has no frame descriptor. We will create a
650 * dummy frame descriptor with a dummy frame interval.
657 case UVC_VS_FORMAT_MPEG2TS
:
658 case UVC_VS_FORMAT_STREAM_BASED
:
660 "device %d videostreaming interface %d FORMAT %u is not supported\n",
662 alts
->desc
.bInterfaceNumber
, _buffer
[2]);
665 case UVC_VS_FRAME_UNCOMPRESSED
:
666 case UVC_VS_FRAME_MJPEG
:
669 nintervals
+= _buffer
[25] ? _buffer
[25] : 3;
672 case UVC_VS_FRAME_FRAME_BASED
:
675 nintervals
+= _buffer
[21] ? _buffer
[21] : 3;
679 _buflen
-= _buffer
[0];
680 _buffer
+= _buffer
[0];
685 "device %d videostreaming interface %d has no supported formats defined\n",
686 dev
->udev
->devnum
, alts
->desc
.bInterfaceNumber
);
691 * Allocate memory for the formats, the frames and the intervals,
692 * plus any required padding to guarantee that everything has the
695 size
= nformats
* sizeof(*format
);
696 size
= ALIGN(size
, __alignof__(*frame
)) + nframes
* sizeof(*frame
);
697 size
= ALIGN(size
, __alignof__(*interval
))
698 + nintervals
* sizeof(*interval
);
700 format
= kzalloc(size
, GFP_KERNEL
);
706 frame
= (void *)format
+ nformats
* sizeof(*format
);
707 frame
= PTR_ALIGN(frame
, __alignof__(*frame
));
708 interval
= (void *)frame
+ nframes
* sizeof(*frame
);
709 interval
= PTR_ALIGN(interval
, __alignof__(*interval
));
711 streaming
->formats
= format
;
712 streaming
->nformats
= 0;
714 /* Parse the format descriptors. */
715 while (buflen
> 2 && buffer
[1] == USB_DT_CS_INTERFACE
) {
717 case UVC_VS_FORMAT_UNCOMPRESSED
:
718 case UVC_VS_FORMAT_MJPEG
:
719 case UVC_VS_FORMAT_DV
:
720 case UVC_VS_FORMAT_FRAME_BASED
:
721 ret
= uvc_parse_format(dev
, streaming
, format
, frame
,
722 &interval
, buffer
, buflen
);
728 streaming
->nformats
++;
729 frame
+= format
->nframes
;
746 "device %d videostreaming interface %d has %u bytes of trailing descriptor garbage\n",
747 dev
->udev
->devnum
, alts
->desc
.bInterfaceNumber
, buflen
);
749 /* Parse the alternate settings to find the maximum bandwidth. */
750 for (i
= 0; i
< intf
->num_altsetting
; ++i
) {
751 struct usb_host_endpoint
*ep
;
753 alts
= &intf
->altsetting
[i
];
754 ep
= uvc_find_endpoint(alts
,
755 streaming
->header
.bEndpointAddress
);
758 psize
= uvc_endpoint_max_bpi(dev
->udev
, ep
);
759 if (psize
> streaming
->maxpsize
)
760 streaming
->maxpsize
= psize
;
763 list_add_tail(&streaming
->list
, &dev
->streams
);
767 usb_driver_release_interface(&uvc_driver
.driver
, intf
);
768 uvc_stream_delete(streaming
);
772 static const u8 uvc_camera_guid
[16] = UVC_GUID_UVC_CAMERA
;
773 static const u8 uvc_gpio_guid
[16] = UVC_GUID_EXT_GPIO_CONTROLLER
;
774 static const u8 uvc_media_transport_input_guid
[16] =
775 UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT
;
776 static const u8 uvc_processing_guid
[16] = UVC_GUID_UVC_PROCESSING
;
778 static struct uvc_entity
*uvc_alloc_new_entity(struct uvc_device
*dev
, u16 type
,
779 u16 id
, unsigned int num_pads
,
780 unsigned int extra_size
)
782 struct uvc_entity
*entity
;
783 unsigned int num_inputs
;
787 /* Per UVC 1.1+ spec 3.7.2, the ID should be non-zero. */
789 dev_err(&dev
->udev
->dev
, "Found Unit with invalid ID 0.\n");
790 return ERR_PTR(-EINVAL
);
793 /* Per UVC 1.1+ spec 3.7.2, the ID is unique. */
794 if (uvc_entity_by_id(dev
, id
)) {
795 dev_err(&dev
->udev
->dev
, "Found multiple Units with ID %u\n", id
);
796 return ERR_PTR(-EINVAL
);
799 extra_size
= roundup(extra_size
, sizeof(*entity
->pads
));
801 num_inputs
= type
& UVC_TERM_OUTPUT
? num_pads
: num_pads
- 1;
804 size
= sizeof(*entity
) + extra_size
+ sizeof(*entity
->pads
) * num_pads
806 entity
= kzalloc(size
, GFP_KERNEL
);
808 return ERR_PTR(-ENOMEM
);
814 * Set the GUID for standard entity types. For extension units, the GUID
815 * is initialized by the caller.
818 case UVC_EXT_GPIO_UNIT
:
819 memcpy(entity
->guid
, uvc_gpio_guid
, 16);
822 memcpy(entity
->guid
, uvc_camera_guid
, 16);
824 case UVC_ITT_MEDIA_TRANSPORT_INPUT
:
825 memcpy(entity
->guid
, uvc_media_transport_input_guid
, 16);
827 case UVC_VC_PROCESSING_UNIT
:
828 memcpy(entity
->guid
, uvc_processing_guid
, 16);
832 entity
->num_links
= 0;
833 entity
->num_pads
= num_pads
;
834 entity
->pads
= ((void *)(entity
+ 1)) + extra_size
;
836 for (i
= 0; i
< num_inputs
; ++i
)
837 entity
->pads
[i
].flags
= MEDIA_PAD_FL_SINK
;
838 if (!UVC_ENTITY_IS_OTERM(entity
) && num_pads
)
839 entity
->pads
[num_pads
-1].flags
= MEDIA_PAD_FL_SOURCE
;
841 entity
->bNrInPins
= num_inputs
;
842 entity
->baSourceID
= (u8
*)(&entity
->pads
[num_pads
]);
847 static void uvc_entity_set_name(struct uvc_device
*dev
, struct uvc_entity
*entity
,
848 const char *type_name
, u8 string_id
)
853 * First attempt to read the entity name from the device. If the entity
854 * has no associated string, or if reading the string fails (most
855 * likely due to a buggy firmware), fall back to default names based on
859 ret
= usb_string(dev
->udev
, string_id
, entity
->name
,
860 sizeof(entity
->name
));
865 sprintf(entity
->name
, "%s %u", type_name
, entity
->id
);
868 /* Parse vendor-specific extensions. */
869 static int uvc_parse_vendor_control(struct uvc_device
*dev
,
870 const unsigned char *buffer
, int buflen
)
872 struct usb_device
*udev
= dev
->udev
;
873 struct usb_host_interface
*alts
= dev
->intf
->cur_altsetting
;
874 struct uvc_entity
*unit
;
878 switch (le16_to_cpu(dev
->udev
->descriptor
.idVendor
)) {
879 case 0x046d: /* Logitech */
880 if (buffer
[1] != 0x41 || buffer
[2] != 0x01)
884 * Logitech implements several vendor specific functions
885 * through vendor specific extension units (LXU).
887 * The LXU descriptors are similar to XU descriptors
888 * (see "USB Device Video Class for Video Devices", section
889 * 3.7.2.6 "Extension Unit Descriptor") with the following
892 * ----------------------------------------------------------
894 * Size of this descriptor, in bytes: 24+p+n*2
895 * ----------------------------------------------------------
896 * 23+p+n bmControlsType N Bitmap
897 * Individual bits in the set are defined:
901 * This bitset is mapped exactly the same as bmControls.
902 * ----------------------------------------------------------
903 * 23+p+n*2 bReserved 1 Boolean
904 * ----------------------------------------------------------
905 * 24+p+n*2 iExtension 1 Index
906 * Index of a string descriptor that describes this
908 * ----------------------------------------------------------
910 p
= buflen
>= 22 ? buffer
[21] : 0;
911 n
= buflen
>= 25 + p
? buffer
[22+p
] : 0;
913 if (buflen
< 25 + p
+ 2*n
) {
915 "device %d videocontrol interface %d EXTENSION_UNIT error\n",
916 udev
->devnum
, alts
->desc
.bInterfaceNumber
);
920 unit
= uvc_alloc_new_entity(dev
, UVC_VC_EXTENSION_UNIT
,
921 buffer
[3], p
+ 1, 2 * n
);
923 return PTR_ERR(unit
);
925 memcpy(unit
->guid
, &buffer
[4], 16);
926 unit
->extension
.bNumControls
= buffer
[20];
927 memcpy(unit
->baSourceID
, &buffer
[22], p
);
928 unit
->extension
.bControlSize
= buffer
[22+p
];
929 unit
->extension
.bmControls
= (u8
*)unit
+ sizeof(*unit
);
930 unit
->extension
.bmControlsType
= (u8
*)unit
+ sizeof(*unit
)
932 memcpy(unit
->extension
.bmControls
, &buffer
[23+p
], 2*n
);
934 uvc_entity_set_name(dev
, unit
, "Extension", buffer
[24+p
+2*n
]);
936 list_add_tail(&unit
->list
, &dev
->entities
);
944 static int uvc_parse_standard_control(struct uvc_device
*dev
,
945 const unsigned char *buffer
, int buflen
)
947 struct usb_device
*udev
= dev
->udev
;
948 struct uvc_entity
*unit
, *term
;
949 struct usb_interface
*intf
;
950 struct usb_host_interface
*alts
= dev
->intf
->cur_altsetting
;
951 unsigned int i
, n
, p
, len
;
952 const char *type_name
;
957 n
= buflen
>= 12 ? buffer
[11] : 0;
959 if (buflen
< 12 + n
) {
961 "device %d videocontrol interface %d HEADER error\n",
962 udev
->devnum
, alts
->desc
.bInterfaceNumber
);
966 dev
->uvc_version
= get_unaligned_le16(&buffer
[3]);
967 dev
->clock_frequency
= get_unaligned_le32(&buffer
[7]);
969 /* Parse all USB Video Streaming interfaces. */
970 for (i
= 0; i
< n
; ++i
) {
971 intf
= usb_ifnum_to_if(udev
, buffer
[12+i
]);
974 "device %d interface %d doesn't exists\n",
979 uvc_parse_streaming(dev
, intf
);
983 case UVC_VC_INPUT_TERMINAL
:
986 "device %d videocontrol interface %d INPUT_TERMINAL error\n",
987 udev
->devnum
, alts
->desc
.bInterfaceNumber
);
992 * Reject invalid terminal types that would cause issues:
994 * - The high byte must be non-zero, otherwise it would be
995 * confused with a unit.
997 * - Bit 15 must be 0, as we use it internally as a terminal
1000 * Other unknown types are accepted.
1002 type
= get_unaligned_le16(&buffer
[4]);
1003 if ((type
& 0x7f00) == 0 || (type
& 0x8000) != 0) {
1005 "device %d videocontrol interface %d INPUT_TERMINAL %d has invalid type 0x%04x, skipping\n",
1006 udev
->devnum
, alts
->desc
.bInterfaceNumber
,
1015 if (type
== UVC_ITT_CAMERA
) {
1016 n
= buflen
>= 15 ? buffer
[14] : 0;
1019 } else if (type
== UVC_ITT_MEDIA_TRANSPORT_INPUT
) {
1020 n
= buflen
>= 9 ? buffer
[8] : 0;
1021 p
= buflen
>= 10 + n
? buffer
[9+n
] : 0;
1025 if (buflen
< len
+ n
+ p
) {
1027 "device %d videocontrol interface %d INPUT_TERMINAL error\n",
1028 udev
->devnum
, alts
->desc
.bInterfaceNumber
);
1032 term
= uvc_alloc_new_entity(dev
, type
| UVC_TERM_INPUT
,
1033 buffer
[3], 1, n
+ p
);
1035 return PTR_ERR(term
);
1037 if (UVC_ENTITY_TYPE(term
) == UVC_ITT_CAMERA
) {
1038 term
->camera
.bControlSize
= n
;
1039 term
->camera
.bmControls
= (u8
*)term
+ sizeof(*term
);
1040 term
->camera
.wObjectiveFocalLengthMin
=
1041 get_unaligned_le16(&buffer
[8]);
1042 term
->camera
.wObjectiveFocalLengthMax
=
1043 get_unaligned_le16(&buffer
[10]);
1044 term
->camera
.wOcularFocalLength
=
1045 get_unaligned_le16(&buffer
[12]);
1046 memcpy(term
->camera
.bmControls
, &buffer
[15], n
);
1047 } else if (UVC_ENTITY_TYPE(term
) ==
1048 UVC_ITT_MEDIA_TRANSPORT_INPUT
) {
1049 term
->media
.bControlSize
= n
;
1050 term
->media
.bmControls
= (u8
*)term
+ sizeof(*term
);
1051 term
->media
.bTransportModeSize
= p
;
1052 term
->media
.bmTransportModes
= (u8
*)term
1053 + sizeof(*term
) + n
;
1054 memcpy(term
->media
.bmControls
, &buffer
[9], n
);
1055 memcpy(term
->media
.bmTransportModes
, &buffer
[10+n
], p
);
1058 if (UVC_ENTITY_TYPE(term
) == UVC_ITT_CAMERA
)
1059 type_name
= "Camera";
1060 else if (UVC_ENTITY_TYPE(term
) == UVC_ITT_MEDIA_TRANSPORT_INPUT
)
1061 type_name
= "Media";
1063 type_name
= "Input";
1065 uvc_entity_set_name(dev
, term
, type_name
, buffer
[7]);
1067 list_add_tail(&term
->list
, &dev
->entities
);
1070 case UVC_VC_OUTPUT_TERMINAL
:
1073 "device %d videocontrol interface %d OUTPUT_TERMINAL error\n",
1074 udev
->devnum
, alts
->desc
.bInterfaceNumber
);
1079 * Make sure the terminal type MSB is not null, otherwise it
1080 * could be confused with a unit.
1082 type
= get_unaligned_le16(&buffer
[4]);
1083 if ((type
& 0xff00) == 0) {
1085 "device %d videocontrol interface %d OUTPUT_TERMINAL %d has invalid type 0x%04x, skipping\n",
1086 udev
->devnum
, alts
->desc
.bInterfaceNumber
,
1091 term
= uvc_alloc_new_entity(dev
, type
| UVC_TERM_OUTPUT
,
1094 return PTR_ERR(term
);
1096 memcpy(term
->baSourceID
, &buffer
[7], 1);
1098 uvc_entity_set_name(dev
, term
, "Output", buffer
[8]);
1100 list_add_tail(&term
->list
, &dev
->entities
);
1103 case UVC_VC_SELECTOR_UNIT
:
1104 p
= buflen
>= 5 ? buffer
[4] : 0;
1106 if (buflen
< 5 || buflen
< 6 + p
) {
1108 "device %d videocontrol interface %d SELECTOR_UNIT error\n",
1109 udev
->devnum
, alts
->desc
.bInterfaceNumber
);
1113 unit
= uvc_alloc_new_entity(dev
, buffer
[2], buffer
[3],
1116 return PTR_ERR(unit
);
1118 memcpy(unit
->baSourceID
, &buffer
[5], p
);
1120 uvc_entity_set_name(dev
, unit
, "Selector", buffer
[5+p
]);
1122 list_add_tail(&unit
->list
, &dev
->entities
);
1125 case UVC_VC_PROCESSING_UNIT
:
1126 n
= buflen
>= 8 ? buffer
[7] : 0;
1127 p
= dev
->uvc_version
>= 0x0110 ? 10 : 9;
1129 if (buflen
< p
+ n
) {
1131 "device %d videocontrol interface %d PROCESSING_UNIT error\n",
1132 udev
->devnum
, alts
->desc
.bInterfaceNumber
);
1136 unit
= uvc_alloc_new_entity(dev
, buffer
[2], buffer
[3], 2, n
);
1138 return PTR_ERR(unit
);
1140 memcpy(unit
->baSourceID
, &buffer
[4], 1);
1141 unit
->processing
.wMaxMultiplier
=
1142 get_unaligned_le16(&buffer
[5]);
1143 unit
->processing
.bControlSize
= buffer
[7];
1144 unit
->processing
.bmControls
= (u8
*)unit
+ sizeof(*unit
);
1145 memcpy(unit
->processing
.bmControls
, &buffer
[8], n
);
1146 if (dev
->uvc_version
>= 0x0110)
1147 unit
->processing
.bmVideoStandards
= buffer
[9+n
];
1149 uvc_entity_set_name(dev
, unit
, "Processing", buffer
[8+n
]);
1151 list_add_tail(&unit
->list
, &dev
->entities
);
1154 case UVC_VC_EXTENSION_UNIT
:
1155 p
= buflen
>= 22 ? buffer
[21] : 0;
1156 n
= buflen
>= 24 + p
? buffer
[22+p
] : 0;
1158 if (buflen
< 24 + p
+ n
) {
1160 "device %d videocontrol interface %d EXTENSION_UNIT error\n",
1161 udev
->devnum
, alts
->desc
.bInterfaceNumber
);
1165 unit
= uvc_alloc_new_entity(dev
, buffer
[2], buffer
[3],
1168 return PTR_ERR(unit
);
1170 memcpy(unit
->guid
, &buffer
[4], 16);
1171 unit
->extension
.bNumControls
= buffer
[20];
1172 memcpy(unit
->baSourceID
, &buffer
[22], p
);
1173 unit
->extension
.bControlSize
= buffer
[22+p
];
1174 unit
->extension
.bmControls
= (u8
*)unit
+ sizeof(*unit
);
1175 memcpy(unit
->extension
.bmControls
, &buffer
[23+p
], n
);
1177 uvc_entity_set_name(dev
, unit
, "Extension", buffer
[23+p
+n
]);
1179 list_add_tail(&unit
->list
, &dev
->entities
);
1184 "Found an unknown CS_INTERFACE descriptor (%u)\n",
1192 static int uvc_parse_control(struct uvc_device
*dev
)
1194 struct usb_host_interface
*alts
= dev
->intf
->cur_altsetting
;
1195 const unsigned char *buffer
= alts
->extra
;
1196 int buflen
= alts
->extralen
;
1200 * Parse the default alternate setting only, as the UVC specification
1201 * defines a single alternate setting, the default alternate setting
1205 while (buflen
> 2) {
1206 if (uvc_parse_vendor_control(dev
, buffer
, buflen
) ||
1207 buffer
[1] != USB_DT_CS_INTERFACE
)
1208 goto next_descriptor
;
1210 ret
= uvc_parse_standard_control(dev
, buffer
, buflen
);
1215 buflen
-= buffer
[0];
1216 buffer
+= buffer
[0];
1220 * Check if the optional status endpoint is present. Built-in iSight
1221 * webcams have an interrupt endpoint but spit proprietary data that
1222 * don't conform to the UVC status endpoint messages. Don't try to
1223 * handle the interrupt endpoint for those cameras.
1225 if (alts
->desc
.bNumEndpoints
== 1 &&
1226 !(dev
->quirks
& UVC_QUIRK_BUILTIN_ISIGHT
)) {
1227 struct usb_host_endpoint
*ep
= &alts
->endpoint
[0];
1228 struct usb_endpoint_descriptor
*desc
= &ep
->desc
;
1230 if (usb_endpoint_is_int_in(desc
) &&
1231 le16_to_cpu(desc
->wMaxPacketSize
) >= 8 &&
1232 desc
->bInterval
!= 0) {
1234 "Found a Status endpoint (addr %02x)\n",
1235 desc
->bEndpointAddress
);
1243 /* -----------------------------------------------------------------------------
1247 static void uvc_gpio_event(struct uvc_device
*dev
)
1249 struct uvc_entity
*unit
= dev
->gpio_unit
;
1250 struct uvc_video_chain
*chain
;
1256 new_val
= gpiod_get_value_cansleep(unit
->gpio
.gpio_privacy
);
1258 /* GPIO entities are always on the first chain. */
1259 chain
= list_first_entry(&dev
->chains
, struct uvc_video_chain
, list
);
1260 uvc_ctrl_status_event(chain
, unit
->controls
, &new_val
);
1263 static int uvc_gpio_get_cur(struct uvc_device
*dev
, struct uvc_entity
*entity
,
1264 u8 cs
, void *data
, u16 size
)
1266 if (cs
!= UVC_CT_PRIVACY_CONTROL
|| size
< 1)
1269 *(u8
*)data
= gpiod_get_value_cansleep(entity
->gpio
.gpio_privacy
);
1274 static int uvc_gpio_get_info(struct uvc_device
*dev
, struct uvc_entity
*entity
,
1277 if (cs
!= UVC_CT_PRIVACY_CONTROL
)
1280 *caps
= UVC_CONTROL_CAP_GET
| UVC_CONTROL_CAP_AUTOUPDATE
;
1284 static irqreturn_t
uvc_gpio_irq(int irq
, void *data
)
1286 struct uvc_device
*dev
= data
;
1288 uvc_gpio_event(dev
);
1292 static int uvc_gpio_parse(struct uvc_device
*dev
)
1294 struct uvc_entity
*unit
;
1295 struct gpio_desc
*gpio_privacy
;
1298 gpio_privacy
= devm_gpiod_get_optional(&dev
->udev
->dev
, "privacy",
1300 if (IS_ERR_OR_NULL(gpio_privacy
))
1301 return PTR_ERR_OR_ZERO(gpio_privacy
);
1303 irq
= gpiod_to_irq(gpio_privacy
);
1305 return dev_err_probe(&dev
->udev
->dev
, irq
,
1306 "No IRQ for privacy GPIO\n");
1308 unit
= uvc_alloc_new_entity(dev
, UVC_EXT_GPIO_UNIT
,
1309 UVC_EXT_GPIO_UNIT_ID
, 0, 1);
1311 return PTR_ERR(unit
);
1313 unit
->gpio
.gpio_privacy
= gpio_privacy
;
1314 unit
->gpio
.irq
= irq
;
1315 unit
->gpio
.bControlSize
= 1;
1316 unit
->gpio
.bmControls
= (u8
*)unit
+ sizeof(*unit
);
1317 unit
->gpio
.bmControls
[0] = 1;
1318 unit
->get_cur
= uvc_gpio_get_cur
;
1319 unit
->get_info
= uvc_gpio_get_info
;
1320 strscpy(unit
->name
, "GPIO", sizeof(unit
->name
));
1322 list_add_tail(&unit
->list
, &dev
->entities
);
1324 dev
->gpio_unit
= unit
;
1329 static int uvc_gpio_init_irq(struct uvc_device
*dev
)
1331 struct uvc_entity
*unit
= dev
->gpio_unit
;
1333 if (!unit
|| unit
->gpio
.irq
< 0)
1336 return devm_request_threaded_irq(&dev
->udev
->dev
, unit
->gpio
.irq
, NULL
,
1338 IRQF_ONESHOT
| IRQF_TRIGGER_FALLING
|
1339 IRQF_TRIGGER_RISING
,
1340 "uvc_privacy_gpio", dev
);
1343 /* ------------------------------------------------------------------------
1348 * Scan the UVC descriptors to locate a chain starting at an Output Terminal
1349 * and containing the following units:
1351 * - one or more Output Terminals (USB Streaming or Display)
1352 * - zero or one Processing Unit
1353 * - zero, one or more single-input Selector Units
1354 * - zero or one multiple-input Selector Units, provided all inputs are
1355 * connected to input terminals
1356 * - zero, one or mode single-input Extension Units
1357 * - one or more Input Terminals (Camera, External or USB Streaming)
1359 * The terminal and units must match on of the following structures:
1361 * ITT_*(0) -> +---------+ +---------+ +---------+ -> TT_STREAMING(0)
1362 * ... | SU{0,1} | -> | PU{0,1} | -> | XU{0,n} | ...
1363 * ITT_*(n) -> +---------+ +---------+ +---------+ -> TT_STREAMING(n)
1365 * +---------+ +---------+ -> OTT_*(0)
1366 * TT_STREAMING -> | PU{0,1} | -> | XU{0,n} | ...
1367 * +---------+ +---------+ -> OTT_*(n)
1369 * The Processing Unit and Extension Units can be in any order. Additional
1370 * Extension Units connected to the main chain as single-unit branches are
1371 * also supported. Single-input Selector Units are ignored.
1373 static int uvc_scan_chain_entity(struct uvc_video_chain
*chain
,
1374 struct uvc_entity
*entity
)
1376 switch (UVC_ENTITY_TYPE(entity
)) {
1377 case UVC_VC_EXTENSION_UNIT
:
1378 uvc_dbg_cont(PROBE
, " <- XU %d", entity
->id
);
1380 if (entity
->bNrInPins
!= 1) {
1381 uvc_dbg(chain
->dev
, DESCR
,
1382 "Extension unit %d has more than 1 input pin\n",
1389 case UVC_VC_PROCESSING_UNIT
:
1390 uvc_dbg_cont(PROBE
, " <- PU %d", entity
->id
);
1392 if (chain
->processing
!= NULL
) {
1393 uvc_dbg(chain
->dev
, DESCR
,
1394 "Found multiple Processing Units in chain\n");
1398 chain
->processing
= entity
;
1401 case UVC_VC_SELECTOR_UNIT
:
1402 uvc_dbg_cont(PROBE
, " <- SU %d", entity
->id
);
1404 /* Single-input selector units are ignored. */
1405 if (entity
->bNrInPins
== 1)
1408 if (chain
->selector
!= NULL
) {
1409 uvc_dbg(chain
->dev
, DESCR
,
1410 "Found multiple Selector Units in chain\n");
1414 chain
->selector
= entity
;
1417 case UVC_ITT_VENDOR_SPECIFIC
:
1418 case UVC_ITT_CAMERA
:
1419 case UVC_ITT_MEDIA_TRANSPORT_INPUT
:
1420 uvc_dbg_cont(PROBE
, " <- IT %d\n", entity
->id
);
1424 case UVC_OTT_VENDOR_SPECIFIC
:
1425 case UVC_OTT_DISPLAY
:
1426 case UVC_OTT_MEDIA_TRANSPORT_OUTPUT
:
1427 uvc_dbg_cont(PROBE
, " OT %d", entity
->id
);
1431 case UVC_TT_STREAMING
:
1432 if (UVC_ENTITY_IS_ITERM(entity
))
1433 uvc_dbg_cont(PROBE
, " <- IT %d\n", entity
->id
);
1435 uvc_dbg_cont(PROBE
, " OT %d", entity
->id
);
1440 uvc_dbg(chain
->dev
, DESCR
,
1441 "Unsupported entity type 0x%04x found in chain\n",
1442 UVC_ENTITY_TYPE(entity
));
1446 list_add_tail(&entity
->chain
, &chain
->entities
);
1450 static int uvc_scan_chain_forward(struct uvc_video_chain
*chain
,
1451 struct uvc_entity
*entity
, struct uvc_entity
*prev
)
1453 struct uvc_entity
*forward
;
1461 forward
= uvc_entity_by_reference(chain
->dev
, entity
->id
,
1463 if (forward
== NULL
)
1465 if (forward
== prev
)
1467 if (forward
->chain
.next
|| forward
->chain
.prev
) {
1468 uvc_dbg(chain
->dev
, DESCR
,
1469 "Found reference to entity %d already in chain\n",
1474 switch (UVC_ENTITY_TYPE(forward
)) {
1475 case UVC_VC_EXTENSION_UNIT
:
1476 if (forward
->bNrInPins
!= 1) {
1477 uvc_dbg(chain
->dev
, DESCR
,
1478 "Extension unit %d has more than 1 input pin\n",
1484 * Some devices reference an output terminal as the
1485 * source of extension units. This is incorrect, as
1486 * output terminals only have an input pin, and thus
1487 * can't be connected to any entity in the forward
1488 * direction. The resulting topology would cause issues
1489 * when registering the media controller graph. To
1490 * avoid this problem, connect the extension unit to
1491 * the source of the output terminal instead.
1493 if (UVC_ENTITY_IS_OTERM(entity
)) {
1494 struct uvc_entity
*source
;
1496 source
= uvc_entity_by_id(chain
->dev
,
1497 entity
->baSourceID
[0]);
1499 uvc_dbg(chain
->dev
, DESCR
,
1500 "Can't connect extension unit %u in chain\n",
1505 forward
->baSourceID
[0] = source
->id
;
1508 list_add_tail(&forward
->chain
, &chain
->entities
);
1510 uvc_dbg_cont(PROBE
, " (->");
1512 uvc_dbg_cont(PROBE
, " XU %d", forward
->id
);
1516 case UVC_OTT_VENDOR_SPECIFIC
:
1517 case UVC_OTT_DISPLAY
:
1518 case UVC_OTT_MEDIA_TRANSPORT_OUTPUT
:
1519 case UVC_TT_STREAMING
:
1520 if (UVC_ENTITY_IS_ITERM(forward
)) {
1521 uvc_dbg(chain
->dev
, DESCR
,
1522 "Unsupported input terminal %u\n",
1527 if (UVC_ENTITY_IS_OTERM(entity
)) {
1528 uvc_dbg(chain
->dev
, DESCR
,
1529 "Unsupported connection between output terminals %u and %u\n",
1530 entity
->id
, forward
->id
);
1534 list_add_tail(&forward
->chain
, &chain
->entities
);
1536 uvc_dbg_cont(PROBE
, " (->");
1538 uvc_dbg_cont(PROBE
, " OT %d", forward
->id
);
1544 uvc_dbg_cont(PROBE
, ")");
1549 static int uvc_scan_chain_backward(struct uvc_video_chain
*chain
,
1550 struct uvc_entity
**_entity
)
1552 struct uvc_entity
*entity
= *_entity
;
1553 struct uvc_entity
*term
;
1554 int id
= -EINVAL
, i
;
1556 switch (UVC_ENTITY_TYPE(entity
)) {
1557 case UVC_VC_EXTENSION_UNIT
:
1558 case UVC_VC_PROCESSING_UNIT
:
1559 id
= entity
->baSourceID
[0];
1562 case UVC_VC_SELECTOR_UNIT
:
1563 /* Single-input selector units are ignored. */
1564 if (entity
->bNrInPins
== 1) {
1565 id
= entity
->baSourceID
[0];
1569 uvc_dbg_cont(PROBE
, " <- IT");
1571 chain
->selector
= entity
;
1572 for (i
= 0; i
< entity
->bNrInPins
; ++i
) {
1573 id
= entity
->baSourceID
[i
];
1574 term
= uvc_entity_by_id(chain
->dev
, id
);
1575 if (term
== NULL
|| !UVC_ENTITY_IS_ITERM(term
)) {
1576 uvc_dbg(chain
->dev
, DESCR
,
1577 "Selector unit %d input %d isn't connected to an input terminal\n",
1582 if (term
->chain
.next
|| term
->chain
.prev
) {
1583 uvc_dbg(chain
->dev
, DESCR
,
1584 "Found reference to entity %d already in chain\n",
1589 uvc_dbg_cont(PROBE
, " %d", term
->id
);
1591 list_add_tail(&term
->chain
, &chain
->entities
);
1592 uvc_scan_chain_forward(chain
, term
, entity
);
1595 uvc_dbg_cont(PROBE
, "\n");
1600 case UVC_ITT_VENDOR_SPECIFIC
:
1601 case UVC_ITT_CAMERA
:
1602 case UVC_ITT_MEDIA_TRANSPORT_INPUT
:
1603 case UVC_OTT_VENDOR_SPECIFIC
:
1604 case UVC_OTT_DISPLAY
:
1605 case UVC_OTT_MEDIA_TRANSPORT_OUTPUT
:
1606 case UVC_TT_STREAMING
:
1607 id
= UVC_ENTITY_IS_OTERM(entity
) ? entity
->baSourceID
[0] : 0;
1616 entity
= uvc_entity_by_id(chain
->dev
, id
);
1617 if (entity
== NULL
) {
1618 uvc_dbg(chain
->dev
, DESCR
,
1619 "Found reference to unknown entity %d\n", id
);
1627 static int uvc_scan_chain(struct uvc_video_chain
*chain
,
1628 struct uvc_entity
*term
)
1630 struct uvc_entity
*entity
, *prev
;
1632 uvc_dbg(chain
->dev
, PROBE
, "Scanning UVC chain:");
1637 while (entity
!= NULL
) {
1638 /* Entity must not be part of an existing chain */
1639 if (entity
->chain
.next
|| entity
->chain
.prev
) {
1640 uvc_dbg(chain
->dev
, DESCR
,
1641 "Found reference to entity %d already in chain\n",
1646 /* Process entity */
1647 if (uvc_scan_chain_entity(chain
, entity
) < 0)
1651 if (uvc_scan_chain_forward(chain
, entity
, prev
) < 0)
1656 if (uvc_scan_chain_backward(chain
, &entity
) < 0)
1663 static unsigned int uvc_print_terms(struct list_head
*terms
, u16 dir
,
1666 struct uvc_entity
*term
;
1667 unsigned int nterms
= 0;
1670 list_for_each_entry(term
, terms
, chain
) {
1671 if (!UVC_ENTITY_IS_TERM(term
) ||
1672 UVC_TERM_DIRECTION(term
) != dir
)
1676 p
+= sprintf(p
, ",");
1677 if (++nterms
>= 4) {
1678 p
+= sprintf(p
, "...");
1681 p
+= sprintf(p
, "%u", term
->id
);
1687 static const char *uvc_print_chain(struct uvc_video_chain
*chain
)
1689 static char buffer
[43];
1692 p
+= uvc_print_terms(&chain
->entities
, UVC_TERM_INPUT
, p
);
1693 p
+= sprintf(p
, " -> ");
1694 uvc_print_terms(&chain
->entities
, UVC_TERM_OUTPUT
, p
);
1699 static struct uvc_video_chain
*uvc_alloc_chain(struct uvc_device
*dev
)
1701 struct uvc_video_chain
*chain
;
1703 chain
= kzalloc(sizeof(*chain
), GFP_KERNEL
);
1707 INIT_LIST_HEAD(&chain
->entities
);
1708 mutex_init(&chain
->ctrl_mutex
);
1710 v4l2_prio_init(&chain
->prio
);
1716 * Fallback heuristic for devices that don't connect units and terminals in a
1719 * Some devices have invalid baSourceID references, causing uvc_scan_chain()
1720 * to fail, but if we just take the entities we can find and put them together
1721 * in the most sensible chain we can think of, turns out they do work anyway.
1722 * Note: This heuristic assumes there is a single chain.
1724 * At the time of writing, devices known to have such a broken chain are
1725 * - Acer Integrated Camera (5986:055a)
1726 * - Realtek rtl157a7 (0bda:57a7)
1728 static int uvc_scan_fallback(struct uvc_device
*dev
)
1730 struct uvc_video_chain
*chain
;
1731 struct uvc_entity
*iterm
= NULL
;
1732 struct uvc_entity
*oterm
= NULL
;
1733 struct uvc_entity
*entity
;
1734 struct uvc_entity
*prev
;
1737 * Start by locating the input and output terminals. We only support
1738 * devices with exactly one of each for now.
1740 list_for_each_entry(entity
, &dev
->entities
, list
) {
1741 if (UVC_ENTITY_IS_ITERM(entity
)) {
1747 if (UVC_ENTITY_IS_OTERM(entity
)) {
1754 if (iterm
== NULL
|| oterm
== NULL
)
1757 /* Allocate the chain and fill it. */
1758 chain
= uvc_alloc_chain(dev
);
1762 if (uvc_scan_chain_entity(chain
, oterm
) < 0)
1768 * Add all Processing and Extension Units with two pads. The order
1769 * doesn't matter much, use reverse list traversal to connect units in
1770 * UVC descriptor order as we build the chain from output to input. This
1771 * leads to units appearing in the order meant by the manufacturer for
1772 * the cameras known to require this heuristic.
1774 list_for_each_entry_reverse(entity
, &dev
->entities
, list
) {
1775 if (entity
->type
!= UVC_VC_PROCESSING_UNIT
&&
1776 entity
->type
!= UVC_VC_EXTENSION_UNIT
)
1779 if (entity
->num_pads
!= 2)
1782 if (uvc_scan_chain_entity(chain
, entity
) < 0)
1785 prev
->baSourceID
[0] = entity
->id
;
1789 if (uvc_scan_chain_entity(chain
, iterm
) < 0)
1792 prev
->baSourceID
[0] = iterm
->id
;
1794 list_add_tail(&chain
->list
, &dev
->chains
);
1796 uvc_dbg(dev
, PROBE
, "Found a video chain by fallback heuristic (%s)\n",
1797 uvc_print_chain(chain
));
1807 * Scan the device for video chains and register video devices.
1809 * Chains are scanned starting at their output terminals and walked backwards.
1811 static int uvc_scan_device(struct uvc_device
*dev
)
1813 struct uvc_video_chain
*chain
;
1814 struct uvc_entity
*term
;
1816 list_for_each_entry(term
, &dev
->entities
, list
) {
1817 if (!UVC_ENTITY_IS_OTERM(term
))
1821 * If the terminal is already included in a chain, skip it.
1822 * This can happen for chains that have multiple output
1823 * terminals, where all output terminals beside the first one
1824 * will be inserted in the chain in forward scans.
1826 if (term
->chain
.next
|| term
->chain
.prev
)
1829 chain
= uvc_alloc_chain(dev
);
1833 term
->flags
|= UVC_ENTITY_FLAG_DEFAULT
;
1835 if (uvc_scan_chain(chain
, term
) < 0) {
1840 uvc_dbg(dev
, PROBE
, "Found a valid video chain (%s)\n",
1841 uvc_print_chain(chain
));
1843 list_add_tail(&chain
->list
, &dev
->chains
);
1846 if (list_empty(&dev
->chains
))
1847 uvc_scan_fallback(dev
);
1849 if (list_empty(&dev
->chains
)) {
1850 dev_info(&dev
->udev
->dev
, "No valid video chain found.\n");
1854 /* Add GPIO entity to the first chain. */
1855 if (dev
->gpio_unit
) {
1856 chain
= list_first_entry(&dev
->chains
,
1857 struct uvc_video_chain
, list
);
1858 list_add_tail(&dev
->gpio_unit
->chain
, &chain
->entities
);
1864 /* ------------------------------------------------------------------------
1865 * Video device registration and unregistration
1869 * Delete the UVC device.
1871 * Called by the kernel when the last reference to the uvc_device structure
1874 * As this function is called after or during disconnect(), all URBs have
1875 * already been cancelled by the USB core. There is no need to kill the
1876 * interrupt URB manually.
1878 static void uvc_delete(struct kref
*kref
)
1880 struct uvc_device
*dev
= container_of(kref
, struct uvc_device
, ref
);
1881 struct list_head
*p
, *n
;
1883 uvc_status_cleanup(dev
);
1884 uvc_ctrl_cleanup_device(dev
);
1886 usb_put_intf(dev
->intf
);
1887 usb_put_dev(dev
->udev
);
1889 #ifdef CONFIG_MEDIA_CONTROLLER
1890 media_device_cleanup(&dev
->mdev
);
1893 list_for_each_safe(p
, n
, &dev
->chains
) {
1894 struct uvc_video_chain
*chain
;
1896 chain
= list_entry(p
, struct uvc_video_chain
, list
);
1900 list_for_each_safe(p
, n
, &dev
->entities
) {
1901 struct uvc_entity
*entity
;
1903 entity
= list_entry(p
, struct uvc_entity
, list
);
1904 #ifdef CONFIG_MEDIA_CONTROLLER
1905 uvc_mc_cleanup_entity(entity
);
1910 list_for_each_safe(p
, n
, &dev
->streams
) {
1911 struct uvc_streaming
*streaming
;
1913 streaming
= list_entry(p
, struct uvc_streaming
, list
);
1914 usb_driver_release_interface(&uvc_driver
.driver
,
1916 uvc_stream_delete(streaming
);
1922 static void uvc_release(struct video_device
*vdev
)
1924 struct uvc_streaming
*stream
= video_get_drvdata(vdev
);
1925 struct uvc_device
*dev
= stream
->dev
;
1927 kref_put(&dev
->ref
, uvc_delete
);
1931 * Unregister the video devices.
1933 static void uvc_unregister_video(struct uvc_device
*dev
)
1935 struct uvc_streaming
*stream
;
1937 list_for_each_entry(stream
, &dev
->streams
, list
) {
1938 /* Nothing to do here, continue. */
1939 if (!video_is_registered(&stream
->vdev
))
1943 * For stream->vdev we follow the same logic as:
1944 * vb2_video_unregister_device().
1947 /* 1. Take a reference to vdev */
1948 get_device(&stream
->vdev
.dev
);
1950 /* 2. Ensure that no new ioctls can be called. */
1951 video_unregister_device(&stream
->vdev
);
1953 /* 3. Wait for old ioctls to finish. */
1954 mutex_lock(&stream
->mutex
);
1956 /* 4. Stop streaming. */
1957 uvc_queue_release(&stream
->queue
);
1959 mutex_unlock(&stream
->mutex
);
1961 put_device(&stream
->vdev
.dev
);
1964 * For stream->meta.vdev we can directly call:
1965 * vb2_video_unregister_device().
1967 vb2_video_unregister_device(&stream
->meta
.vdev
);
1970 * Now both vdevs are not streaming and all the ioctls will
1974 uvc_debugfs_cleanup_stream(stream
);
1977 uvc_status_unregister(dev
);
1980 v4l2_device_unregister(&dev
->vdev
);
1981 #ifdef CONFIG_MEDIA_CONTROLLER
1982 if (media_devnode_is_registered(dev
->mdev
.devnode
))
1983 media_device_unregister(&dev
->mdev
);
1987 int uvc_register_video_device(struct uvc_device
*dev
,
1988 struct uvc_streaming
*stream
,
1989 struct video_device
*vdev
,
1990 struct uvc_video_queue
*queue
,
1991 enum v4l2_buf_type type
,
1992 const struct v4l2_file_operations
*fops
,
1993 const struct v4l2_ioctl_ops
*ioctl_ops
)
1997 /* Initialize the video buffers queue. */
1998 ret
= uvc_queue_init(queue
, type
, !uvc_no_drop_param
);
2002 /* Register the device with V4L. */
2005 * We already hold a reference to dev->udev. The video device will be
2006 * unregistered before the reference is released, so we don't need to
2009 vdev
->v4l2_dev
= &dev
->vdev
;
2011 vdev
->ioctl_ops
= ioctl_ops
;
2012 vdev
->release
= uvc_release
;
2013 vdev
->prio
= &stream
->chain
->prio
;
2014 if (type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
)
2015 vdev
->vfl_dir
= VFL_DIR_TX
;
2017 vdev
->vfl_dir
= VFL_DIR_RX
;
2020 case V4L2_BUF_TYPE_VIDEO_CAPTURE
:
2022 vdev
->device_caps
= V4L2_CAP_VIDEO_CAPTURE
| V4L2_CAP_STREAMING
;
2024 case V4L2_BUF_TYPE_VIDEO_OUTPUT
:
2025 vdev
->device_caps
= V4L2_CAP_VIDEO_OUTPUT
| V4L2_CAP_STREAMING
;
2027 case V4L2_BUF_TYPE_META_CAPTURE
:
2028 vdev
->device_caps
= V4L2_CAP_META_CAPTURE
| V4L2_CAP_STREAMING
;
2032 strscpy(vdev
->name
, dev
->name
, sizeof(vdev
->name
));
2035 * Set the driver data before calling video_register_device, otherwise
2036 * the file open() handler might race us.
2038 video_set_drvdata(vdev
, stream
);
2040 ret
= video_register_device(vdev
, VFL_TYPE_VIDEO
, -1);
2042 dev_err(&stream
->intf
->dev
,
2043 "Failed to register %s device (%d).\n",
2044 v4l2_type_names
[type
], ret
);
2048 kref_get(&dev
->ref
);
2052 static int uvc_register_video(struct uvc_device
*dev
,
2053 struct uvc_streaming
*stream
)
2057 /* Initialize the streaming interface with default parameters. */
2058 ret
= uvc_video_init(stream
);
2060 dev_err(&stream
->intf
->dev
,
2061 "Failed to initialize the device (%d).\n", ret
);
2065 if (stream
->type
== V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2066 stream
->chain
->caps
|= V4L2_CAP_VIDEO_CAPTURE
2067 | V4L2_CAP_META_CAPTURE
;
2069 stream
->chain
->caps
|= V4L2_CAP_VIDEO_OUTPUT
;
2071 uvc_debugfs_init_stream(stream
);
2073 /* Register the device with V4L. */
2074 return uvc_register_video_device(dev
, stream
, &stream
->vdev
,
2075 &stream
->queue
, stream
->type
,
2076 &uvc_fops
, &uvc_ioctl_ops
);
2080 * Register all video devices in all chains.
2082 static int uvc_register_terms(struct uvc_device
*dev
,
2083 struct uvc_video_chain
*chain
)
2085 struct uvc_streaming
*stream
;
2086 struct uvc_entity
*term
;
2089 list_for_each_entry(term
, &chain
->entities
, chain
) {
2090 if (UVC_ENTITY_TYPE(term
) != UVC_TT_STREAMING
)
2093 stream
= uvc_stream_by_id(dev
, term
->id
);
2094 if (stream
== NULL
) {
2095 dev_info(&dev
->udev
->dev
,
2096 "No streaming interface found for terminal %u.",
2101 stream
->chain
= chain
;
2102 ret
= uvc_register_video(dev
, stream
);
2107 * Register a metadata node, but ignore a possible failure,
2108 * complete registration of video nodes anyway.
2110 uvc_meta_register(stream
);
2112 term
->vdev
= &stream
->vdev
;
2118 static int uvc_register_chains(struct uvc_device
*dev
)
2120 struct uvc_video_chain
*chain
;
2123 list_for_each_entry(chain
, &dev
->chains
, list
) {
2124 ret
= uvc_register_terms(dev
, chain
);
2128 #ifdef CONFIG_MEDIA_CONTROLLER
2129 ret
= uvc_mc_register_entities(chain
);
2131 dev_info(&dev
->udev
->dev
,
2132 "Failed to register entities (%d).\n", ret
);
2139 /* ------------------------------------------------------------------------
2140 * USB probe, disconnect, suspend and resume
2143 static const struct uvc_device_info uvc_quirk_none
= { 0 };
2145 static int uvc_probe(struct usb_interface
*intf
,
2146 const struct usb_device_id
*id
)
2148 struct usb_device
*udev
= interface_to_usbdev(intf
);
2149 struct uvc_device
*dev
;
2150 const struct uvc_device_info
*info
=
2151 (const struct uvc_device_info
*)id
->driver_info
;
2155 /* Allocate memory for the device and initialize it. */
2156 dev
= kzalloc(sizeof(*dev
), GFP_KERNEL
);
2160 INIT_LIST_HEAD(&dev
->entities
);
2161 INIT_LIST_HEAD(&dev
->chains
);
2162 INIT_LIST_HEAD(&dev
->streams
);
2163 kref_init(&dev
->ref
);
2164 atomic_set(&dev
->nmappings
, 0);
2166 dev
->udev
= usb_get_dev(udev
);
2167 dev
->intf
= usb_get_intf(intf
);
2168 dev
->intfnum
= intf
->cur_altsetting
->desc
.bInterfaceNumber
;
2169 dev
->info
= info
? info
: &uvc_quirk_none
;
2170 dev
->quirks
= uvc_quirks_param
== -1
2171 ? dev
->info
->quirks
: uvc_quirks_param
;
2173 if (id
->idVendor
&& id
->idProduct
)
2174 uvc_dbg(dev
, PROBE
, "Probing known UVC device %s (%04x:%04x)\n",
2175 udev
->devpath
, id
->idVendor
, id
->idProduct
);
2177 uvc_dbg(dev
, PROBE
, "Probing generic UVC device %s\n",
2180 if (udev
->product
!= NULL
)
2181 strscpy(dev
->name
, udev
->product
, sizeof(dev
->name
));
2183 snprintf(dev
->name
, sizeof(dev
->name
),
2184 "UVC Camera (%04x:%04x)",
2185 le16_to_cpu(udev
->descriptor
.idVendor
),
2186 le16_to_cpu(udev
->descriptor
.idProduct
));
2189 * Add iFunction or iInterface to names when available as additional
2190 * distinguishers between interfaces. iFunction is prioritized over
2191 * iInterface which matches Windows behavior at the point of writing.
2193 if (intf
->intf_assoc
&& intf
->intf_assoc
->iFunction
!= 0)
2194 function
= intf
->intf_assoc
->iFunction
;
2196 function
= intf
->cur_altsetting
->desc
.iInterface
;
2197 if (function
!= 0) {
2200 strlcat(dev
->name
, ": ", sizeof(dev
->name
));
2201 len
= strlen(dev
->name
);
2202 usb_string(udev
, function
, dev
->name
+ len
,
2203 sizeof(dev
->name
) - len
);
2206 /* Initialize the media device. */
2207 #ifdef CONFIG_MEDIA_CONTROLLER
2208 dev
->mdev
.dev
= &intf
->dev
;
2209 strscpy(dev
->mdev
.model
, dev
->name
, sizeof(dev
->mdev
.model
));
2211 strscpy(dev
->mdev
.serial
, udev
->serial
,
2212 sizeof(dev
->mdev
.serial
));
2213 usb_make_path(udev
, dev
->mdev
.bus_info
, sizeof(dev
->mdev
.bus_info
));
2214 dev
->mdev
.hw_revision
= le16_to_cpu(udev
->descriptor
.bcdDevice
);
2215 media_device_init(&dev
->mdev
);
2217 dev
->vdev
.mdev
= &dev
->mdev
;
2220 /* Parse the Video Class control descriptor. */
2221 if (uvc_parse_control(dev
) < 0) {
2222 uvc_dbg(dev
, PROBE
, "Unable to parse UVC descriptors\n");
2226 /* Parse the associated GPIOs. */
2227 if (uvc_gpio_parse(dev
) < 0) {
2228 uvc_dbg(dev
, PROBE
, "Unable to parse UVC GPIOs\n");
2232 dev_info(&dev
->udev
->dev
, "Found UVC %u.%02x device %s (%04x:%04x)\n",
2233 dev
->uvc_version
>> 8, dev
->uvc_version
& 0xff,
2234 udev
->product
? udev
->product
: "<unnamed>",
2235 le16_to_cpu(udev
->descriptor
.idVendor
),
2236 le16_to_cpu(udev
->descriptor
.idProduct
));
2238 if (dev
->quirks
!= dev
->info
->quirks
) {
2239 dev_info(&dev
->udev
->dev
,
2240 "Forcing device quirks to 0x%x by module parameter for testing purpose.\n",
2242 dev_info(&dev
->udev
->dev
,
2243 "Please report required quirks to the linux-media mailing list.\n");
2246 if (dev
->info
->uvc_version
) {
2247 dev
->uvc_version
= dev
->info
->uvc_version
;
2248 dev_info(&dev
->udev
->dev
, "Forcing UVC version to %u.%02x\n",
2249 dev
->uvc_version
>> 8, dev
->uvc_version
& 0xff);
2252 /* Register the V4L2 device. */
2253 if (v4l2_device_register(&intf
->dev
, &dev
->vdev
) < 0)
2256 /* Scan the device for video chains. */
2257 if (uvc_scan_device(dev
) < 0)
2260 /* Initialize controls. */
2261 if (uvc_ctrl_init_device(dev
) < 0)
2264 /* Register video device nodes. */
2265 if (uvc_register_chains(dev
) < 0)
2268 #ifdef CONFIG_MEDIA_CONTROLLER
2269 /* Register the media device node */
2270 if (media_device_register(&dev
->mdev
) < 0)
2273 /* Save our data pointer in the interface data. */
2274 usb_set_intfdata(intf
, dev
);
2276 /* Initialize the interrupt URB. */
2277 ret
= uvc_status_init(dev
);
2279 dev_info(&dev
->udev
->dev
,
2280 "Unable to initialize the status endpoint (%d), status interrupt will not be supported.\n",
2284 ret
= uvc_gpio_init_irq(dev
);
2286 dev_err(&dev
->udev
->dev
,
2287 "Unable to request privacy GPIO IRQ (%d)\n", ret
);
2291 if (dev
->quirks
& UVC_QUIRK_NO_RESET_RESUME
)
2292 udev
->quirks
&= ~USB_QUIRK_RESET_RESUME
;
2294 if (!(dev
->quirks
& UVC_QUIRK_DISABLE_AUTOSUSPEND
))
2295 usb_enable_autosuspend(udev
);
2297 uvc_dbg(dev
, PROBE
, "UVC device initialized\n");
2302 uvc_unregister_video(dev
);
2303 kref_put(&dev
->ref
, uvc_delete
);
2307 static void uvc_disconnect(struct usb_interface
*intf
)
2309 struct uvc_device
*dev
= usb_get_intfdata(intf
);
2312 * Set the USB interface data to NULL. This can be done outside the
2313 * lock, as there's no other reader.
2315 usb_set_intfdata(intf
, NULL
);
2317 if (intf
->cur_altsetting
->desc
.bInterfaceSubClass
==
2318 UVC_SC_VIDEOSTREAMING
)
2321 uvc_unregister_video(dev
);
2322 kref_put(&dev
->ref
, uvc_delete
);
2325 static int uvc_suspend(struct usb_interface
*intf
, pm_message_t message
)
2327 struct uvc_device
*dev
= usb_get_intfdata(intf
);
2328 struct uvc_streaming
*stream
;
2330 uvc_dbg(dev
, SUSPEND
, "Suspending interface %u\n",
2331 intf
->cur_altsetting
->desc
.bInterfaceNumber
);
2333 /* Controls are cached on the fly so they don't need to be saved. */
2334 if (intf
->cur_altsetting
->desc
.bInterfaceSubClass
==
2335 UVC_SC_VIDEOCONTROL
) {
2336 uvc_status_suspend(dev
);
2340 list_for_each_entry(stream
, &dev
->streams
, list
) {
2341 if (stream
->intf
== intf
)
2342 return uvc_video_suspend(stream
);
2345 uvc_dbg(dev
, SUSPEND
,
2346 "Suspend: video streaming USB interface mismatch\n");
2350 static int __uvc_resume(struct usb_interface
*intf
, int reset
)
2352 struct uvc_device
*dev
= usb_get_intfdata(intf
);
2353 struct uvc_streaming
*stream
;
2356 uvc_dbg(dev
, SUSPEND
, "Resuming interface %u\n",
2357 intf
->cur_altsetting
->desc
.bInterfaceNumber
);
2359 if (intf
->cur_altsetting
->desc
.bInterfaceSubClass
==
2360 UVC_SC_VIDEOCONTROL
) {
2362 ret
= uvc_ctrl_restore_values(dev
);
2367 return uvc_status_resume(dev
);
2370 list_for_each_entry(stream
, &dev
->streams
, list
) {
2371 if (stream
->intf
== intf
) {
2372 ret
= uvc_video_resume(stream
, reset
);
2374 uvc_queue_streamoff(&stream
->queue
,
2375 stream
->queue
.queue
.type
);
2380 uvc_dbg(dev
, SUSPEND
,
2381 "Resume: video streaming USB interface mismatch\n");
2385 static int uvc_resume(struct usb_interface
*intf
)
2387 return __uvc_resume(intf
, 0);
2390 static int uvc_reset_resume(struct usb_interface
*intf
)
2392 return __uvc_resume(intf
, 1);
2395 /* ------------------------------------------------------------------------
2399 static int uvc_clock_param_get(char *buffer
, const struct kernel_param
*kp
)
2401 if (uvc_clock_param
== CLOCK_MONOTONIC
)
2402 return sprintf(buffer
, "CLOCK_MONOTONIC");
2404 return sprintf(buffer
, "CLOCK_REALTIME");
2407 static int uvc_clock_param_set(const char *val
, const struct kernel_param
*kp
)
2409 if (strncasecmp(val
, "clock_", strlen("clock_")) == 0)
2410 val
+= strlen("clock_");
2412 if (strcasecmp(val
, "monotonic") == 0)
2413 uvc_clock_param
= CLOCK_MONOTONIC
;
2414 else if (strcasecmp(val
, "realtime") == 0)
2415 uvc_clock_param
= CLOCK_REALTIME
;
2422 module_param_call(clock
, uvc_clock_param_set
, uvc_clock_param_get
,
2423 &uvc_clock_param
, 0644);
2424 MODULE_PARM_DESC(clock
, "Video buffers timestamp clock");
2425 module_param_named(hwtimestamps
, uvc_hw_timestamps_param
, uint
, 0644);
2426 MODULE_PARM_DESC(hwtimestamps
, "Use hardware timestamps");
2427 module_param_named(nodrop
, uvc_no_drop_param
, uint
, 0644);
2428 MODULE_PARM_DESC(nodrop
, "Don't drop incomplete frames");
2429 module_param_named(quirks
, uvc_quirks_param
, uint
, 0644);
2430 MODULE_PARM_DESC(quirks
, "Forced device quirks");
2431 module_param_named(trace
, uvc_dbg_param
, uint
, 0644);
2432 MODULE_PARM_DESC(trace
, "Trace level bitmask");
2433 module_param_named(timeout
, uvc_timeout_param
, uint
, 0644);
2434 MODULE_PARM_DESC(timeout
, "Streaming control requests timeout");
2436 /* ------------------------------------------------------------------------
2437 * Driver initialization and cleanup
2440 static const struct uvc_device_info uvc_quirk_probe_minmax
= {
2441 .quirks
= UVC_QUIRK_PROBE_MINMAX
,
2444 static const struct uvc_device_info uvc_quirk_fix_bandwidth
= {
2445 .quirks
= UVC_QUIRK_FIX_BANDWIDTH
,
2448 static const struct uvc_device_info uvc_quirk_probe_def
= {
2449 .quirks
= UVC_QUIRK_PROBE_DEF
,
2452 static const struct uvc_device_info uvc_quirk_stream_no_fid
= {
2453 .quirks
= UVC_QUIRK_STREAM_NO_FID
,
2456 static const struct uvc_device_info uvc_quirk_force_y8
= {
2457 .quirks
= UVC_QUIRK_FORCE_Y8
,
2460 #define UVC_INFO_QUIRK(q) (kernel_ulong_t)&(struct uvc_device_info){.quirks = q}
2461 #define UVC_INFO_META(m) (kernel_ulong_t)&(struct uvc_device_info) \
2465 * The Logitech cameras listed below have their interface class set to
2466 * VENDOR_SPEC because they don't announce themselves as UVC devices, even
2467 * though they are compliant.
2469 * Sort these by vendor/product ID.
2471 static const struct usb_device_id uvc_ids
[] = {
2472 /* Quanta ACER HD User Facing */
2473 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2474 | USB_DEVICE_ID_MATCH_INT_INFO
,
2476 .idProduct
= 0x4033,
2477 .bInterfaceClass
= USB_CLASS_VIDEO
,
2478 .bInterfaceSubClass
= 1,
2479 .bInterfaceProtocol
= UVC_PC_PROTOCOL_15
,
2480 .driver_info
= (kernel_ulong_t
)&(const struct uvc_device_info
){
2481 .uvc_version
= 0x010a,
2483 /* Quanta ACER HD User Facing */
2484 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2485 | USB_DEVICE_ID_MATCH_INT_INFO
,
2487 .idProduct
= 0x4035,
2488 .bInterfaceClass
= USB_CLASS_VIDEO
,
2489 .bInterfaceSubClass
= 1,
2490 .bInterfaceProtocol
= UVC_PC_PROTOCOL_15
,
2491 .driver_info
= (kernel_ulong_t
)&(const struct uvc_device_info
){
2492 .uvc_version
= 0x010a,
2494 /* LogiLink Wireless Webcam */
2495 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2496 | USB_DEVICE_ID_MATCH_INT_INFO
,
2498 .idProduct
= 0xa91a,
2499 .bInterfaceClass
= USB_CLASS_VIDEO
,
2500 .bInterfaceSubClass
= 1,
2501 .bInterfaceProtocol
= 0,
2502 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2503 /* Genius eFace 2025 */
2504 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2505 | USB_DEVICE_ID_MATCH_INT_INFO
,
2507 .idProduct
= 0x706e,
2508 .bInterfaceClass
= USB_CLASS_VIDEO
,
2509 .bInterfaceSubClass
= 1,
2510 .bInterfaceProtocol
= 0,
2511 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2512 /* Microsoft Lifecam NX-6000 */
2513 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2514 | USB_DEVICE_ID_MATCH_INT_INFO
,
2516 .idProduct
= 0x00f8,
2517 .bInterfaceClass
= USB_CLASS_VIDEO
,
2518 .bInterfaceSubClass
= 1,
2519 .bInterfaceProtocol
= 0,
2520 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2521 /* Microsoft Lifecam NX-3000 */
2522 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2523 | USB_DEVICE_ID_MATCH_INT_INFO
,
2525 .idProduct
= 0x0721,
2526 .bInterfaceClass
= USB_CLASS_VIDEO
,
2527 .bInterfaceSubClass
= 1,
2528 .bInterfaceProtocol
= 0,
2529 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_def
},
2530 /* Microsoft Lifecam VX-7000 */
2531 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2532 | USB_DEVICE_ID_MATCH_INT_INFO
,
2534 .idProduct
= 0x0723,
2535 .bInterfaceClass
= USB_CLASS_VIDEO
,
2536 .bInterfaceSubClass
= 1,
2537 .bInterfaceProtocol
= 0,
2538 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2539 /* Logitech, Webcam C910 */
2540 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2541 | USB_DEVICE_ID_MATCH_INT_INFO
,
2543 .idProduct
= 0x0821,
2544 .bInterfaceClass
= USB_CLASS_VIDEO
,
2545 .bInterfaceSubClass
= 1,
2546 .bInterfaceProtocol
= 0,
2547 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_WAKE_AUTOSUSPEND
)},
2548 /* Logitech, Webcam B910 */
2549 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2550 | USB_DEVICE_ID_MATCH_INT_INFO
,
2552 .idProduct
= 0x0823,
2553 .bInterfaceClass
= USB_CLASS_VIDEO
,
2554 .bInterfaceSubClass
= 1,
2555 .bInterfaceProtocol
= 0,
2556 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_WAKE_AUTOSUSPEND
)},
2557 /* Logitech Quickcam Fusion */
2558 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2559 | USB_DEVICE_ID_MATCH_INT_INFO
,
2561 .idProduct
= 0x08c1,
2562 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
2563 .bInterfaceSubClass
= 1,
2564 .bInterfaceProtocol
= 0 },
2565 /* Logitech Quickcam Orbit MP */
2566 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2567 | USB_DEVICE_ID_MATCH_INT_INFO
,
2569 .idProduct
= 0x08c2,
2570 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
2571 .bInterfaceSubClass
= 1,
2572 .bInterfaceProtocol
= 0 },
2573 /* Logitech Quickcam Pro for Notebook */
2574 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2575 | USB_DEVICE_ID_MATCH_INT_INFO
,
2577 .idProduct
= 0x08c3,
2578 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
2579 .bInterfaceSubClass
= 1,
2580 .bInterfaceProtocol
= 0 },
2581 /* Logitech Quickcam Pro 5000 */
2582 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2583 | USB_DEVICE_ID_MATCH_INT_INFO
,
2585 .idProduct
= 0x08c5,
2586 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
2587 .bInterfaceSubClass
= 1,
2588 .bInterfaceProtocol
= 0 },
2589 /* Logitech Quickcam OEM Dell Notebook */
2590 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2591 | USB_DEVICE_ID_MATCH_INT_INFO
,
2593 .idProduct
= 0x08c6,
2594 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
2595 .bInterfaceSubClass
= 1,
2596 .bInterfaceProtocol
= 0 },
2597 /* Logitech Quickcam OEM Cisco VT Camera II */
2598 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2599 | USB_DEVICE_ID_MATCH_INT_INFO
,
2601 .idProduct
= 0x08c7,
2602 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
2603 .bInterfaceSubClass
= 1,
2604 .bInterfaceProtocol
= 0 },
2605 /* Logitech HD Pro Webcam C920 */
2606 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2607 | USB_DEVICE_ID_MATCH_INT_INFO
,
2609 .idProduct
= 0x082d,
2610 .bInterfaceClass
= USB_CLASS_VIDEO
,
2611 .bInterfaceSubClass
= 1,
2612 .bInterfaceProtocol
= 0,
2613 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_RESTORE_CTRLS_ON_INIT
2614 | UVC_QUIRK_INVALID_DEVICE_SOF
) },
2615 /* Logitech HD Pro Webcam C922 */
2616 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2617 | USB_DEVICE_ID_MATCH_INT_INFO
,
2619 .idProduct
= 0x085c,
2620 .bInterfaceClass
= USB_CLASS_VIDEO
,
2621 .bInterfaceSubClass
= 1,
2622 .bInterfaceProtocol
= 0,
2623 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_INVALID_DEVICE_SOF
) },
2624 /* Logitech Rally Bar Huddle */
2625 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2626 | USB_DEVICE_ID_MATCH_INT_INFO
,
2628 .idProduct
= 0x087c,
2629 .bInterfaceClass
= USB_CLASS_VIDEO
,
2630 .bInterfaceSubClass
= 1,
2631 .bInterfaceProtocol
= 0,
2632 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_NO_RESET_RESUME
) },
2633 /* Logitech Rally Bar */
2634 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2635 | USB_DEVICE_ID_MATCH_INT_INFO
,
2637 .idProduct
= 0x089b,
2638 .bInterfaceClass
= USB_CLASS_VIDEO
,
2639 .bInterfaceSubClass
= 1,
2640 .bInterfaceProtocol
= 0,
2641 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_NO_RESET_RESUME
) },
2642 /* Logitech Rally Bar Mini */
2643 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2644 | USB_DEVICE_ID_MATCH_INT_INFO
,
2646 .idProduct
= 0x08d3,
2647 .bInterfaceClass
= USB_CLASS_VIDEO
,
2648 .bInterfaceSubClass
= 1,
2649 .bInterfaceProtocol
= 0,
2650 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_NO_RESET_RESUME
) },
2651 /* Chicony CNF7129 (Asus EEE 100HE) */
2652 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2653 | USB_DEVICE_ID_MATCH_INT_INFO
,
2655 .idProduct
= 0xb071,
2656 .bInterfaceClass
= USB_CLASS_VIDEO
,
2657 .bInterfaceSubClass
= 1,
2658 .bInterfaceProtocol
= 0,
2659 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_RESTRICT_FRAME_RATE
) },
2660 /* Alcor Micro AU3820 (Future Boy PC USB Webcam) */
2661 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2662 | USB_DEVICE_ID_MATCH_INT_INFO
,
2664 .idProduct
= 0x3820,
2665 .bInterfaceClass
= USB_CLASS_VIDEO
,
2666 .bInterfaceSubClass
= 1,
2667 .bInterfaceProtocol
= 0,
2668 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2669 /* Dell XPS m1530 */
2670 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2671 | USB_DEVICE_ID_MATCH_INT_INFO
,
2673 .idProduct
= 0x2640,
2674 .bInterfaceClass
= USB_CLASS_VIDEO
,
2675 .bInterfaceSubClass
= 1,
2676 .bInterfaceProtocol
= 0,
2677 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_def
},
2678 /* Dell SP2008WFP Monitor */
2679 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2680 | USB_DEVICE_ID_MATCH_INT_INFO
,
2682 .idProduct
= 0x2641,
2683 .bInterfaceClass
= USB_CLASS_VIDEO
,
2684 .bInterfaceSubClass
= 1,
2685 .bInterfaceProtocol
= 0,
2686 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_def
},
2687 /* Dell Alienware X51 */
2688 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2689 | USB_DEVICE_ID_MATCH_INT_INFO
,
2691 .idProduct
= 0x2643,
2692 .bInterfaceClass
= USB_CLASS_VIDEO
,
2693 .bInterfaceSubClass
= 1,
2694 .bInterfaceProtocol
= 0,
2695 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_def
},
2696 /* Dell Studio Hybrid 140g (OmniVision webcam) */
2697 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2698 | USB_DEVICE_ID_MATCH_INT_INFO
,
2700 .idProduct
= 0x264a,
2701 .bInterfaceClass
= USB_CLASS_VIDEO
,
2702 .bInterfaceSubClass
= 1,
2703 .bInterfaceProtocol
= 0,
2704 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_def
},
2705 /* Dell XPS M1330 (OmniVision OV7670 webcam) */
2706 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2707 | USB_DEVICE_ID_MATCH_INT_INFO
,
2709 .idProduct
= 0x7670,
2710 .bInterfaceClass
= USB_CLASS_VIDEO
,
2711 .bInterfaceSubClass
= 1,
2712 .bInterfaceProtocol
= 0,
2713 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_def
},
2714 /* Apple Built-In iSight */
2715 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2716 | USB_DEVICE_ID_MATCH_INT_INFO
,
2718 .idProduct
= 0x8501,
2719 .bInterfaceClass
= USB_CLASS_VIDEO
,
2720 .bInterfaceSubClass
= 1,
2721 .bInterfaceProtocol
= 0,
2722 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_PROBE_MINMAX
2723 | UVC_QUIRK_BUILTIN_ISIGHT
) },
2724 /* Apple FaceTime HD Camera (Built-In) */
2725 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2726 | USB_DEVICE_ID_MATCH_INT_INFO
,
2728 .idProduct
= 0x8514,
2729 .bInterfaceClass
= USB_CLASS_VIDEO
,
2730 .bInterfaceSubClass
= 1,
2731 .bInterfaceProtocol
= 0,
2732 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_def
},
2733 /* Apple Built-In iSight via iBridge */
2734 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2735 | USB_DEVICE_ID_MATCH_INT_INFO
,
2737 .idProduct
= 0x8600,
2738 .bInterfaceClass
= USB_CLASS_VIDEO
,
2739 .bInterfaceSubClass
= 1,
2740 .bInterfaceProtocol
= 0,
2741 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_def
},
2742 /* Foxlink ("HP Webcam" on HP Mini 5103) */
2743 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2744 | USB_DEVICE_ID_MATCH_INT_INFO
,
2746 .idProduct
= 0x0403,
2747 .bInterfaceClass
= USB_CLASS_VIDEO
,
2748 .bInterfaceSubClass
= 1,
2749 .bInterfaceProtocol
= 0,
2750 .driver_info
= (kernel_ulong_t
)&uvc_quirk_fix_bandwidth
},
2751 /* Genesys Logic USB 2.0 PC Camera */
2752 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2753 | USB_DEVICE_ID_MATCH_INT_INFO
,
2755 .idProduct
= 0x0505,
2756 .bInterfaceClass
= USB_CLASS_VIDEO
,
2757 .bInterfaceSubClass
= 1,
2758 .bInterfaceProtocol
= 0,
2759 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2760 /* Hercules Classic Silver */
2761 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2762 | USB_DEVICE_ID_MATCH_INT_INFO
,
2764 .idProduct
= 0x300c,
2765 .bInterfaceClass
= USB_CLASS_VIDEO
,
2766 .bInterfaceSubClass
= 1,
2767 .bInterfaceProtocol
= 0,
2768 .driver_info
= (kernel_ulong_t
)&uvc_quirk_fix_bandwidth
},
2770 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2771 | USB_DEVICE_ID_MATCH_INT_INFO
,
2773 .idProduct
= 0x332d,
2774 .bInterfaceClass
= USB_CLASS_VIDEO
,
2775 .bInterfaceSubClass
= 1,
2776 .bInterfaceProtocol
= 0,
2777 .driver_info
= (kernel_ulong_t
)&uvc_quirk_fix_bandwidth
},
2778 /* ViMicro - Minoru3D */
2779 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2780 | USB_DEVICE_ID_MATCH_INT_INFO
,
2782 .idProduct
= 0x3410,
2783 .bInterfaceClass
= USB_CLASS_VIDEO
,
2784 .bInterfaceSubClass
= 1,
2785 .bInterfaceProtocol
= 0,
2786 .driver_info
= (kernel_ulong_t
)&uvc_quirk_fix_bandwidth
},
2787 /* ViMicro Venus - Minoru3D */
2788 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2789 | USB_DEVICE_ID_MATCH_INT_INFO
,
2791 .idProduct
= 0x3420,
2792 .bInterfaceClass
= USB_CLASS_VIDEO
,
2793 .bInterfaceSubClass
= 1,
2794 .bInterfaceProtocol
= 0,
2795 .driver_info
= (kernel_ulong_t
)&uvc_quirk_fix_bandwidth
},
2796 /* Ophir Optronics - SPCAM 620U */
2797 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2798 | USB_DEVICE_ID_MATCH_INT_INFO
,
2800 .idProduct
= 0x0555,
2801 .bInterfaceClass
= USB_CLASS_VIDEO
,
2802 .bInterfaceSubClass
= 1,
2803 .bInterfaceProtocol
= 0,
2804 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2806 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2807 | USB_DEVICE_ID_MATCH_INT_INFO
,
2809 .idProduct
= 0x0004,
2810 .bInterfaceClass
= USB_CLASS_VIDEO
,
2811 .bInterfaceSubClass
= 1,
2812 .bInterfaceProtocol
= 0,
2813 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_PROBE_MINMAX
2814 | UVC_QUIRK_PROBE_DEF
) },
2815 /* IMC Networks (Medion Akoya) */
2816 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2817 | USB_DEVICE_ID_MATCH_INT_INFO
,
2819 .idProduct
= 0x5103,
2820 .bInterfaceClass
= USB_CLASS_VIDEO
,
2821 .bInterfaceSubClass
= 1,
2822 .bInterfaceProtocol
= 0,
2823 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2824 /* JMicron USB2.0 XGA WebCam */
2825 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2826 | USB_DEVICE_ID_MATCH_INT_INFO
,
2828 .idProduct
= 0x0310,
2829 .bInterfaceClass
= USB_CLASS_VIDEO
,
2830 .bInterfaceSubClass
= 1,
2831 .bInterfaceProtocol
= 0,
2832 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2833 /* Syntek (HP Spartan) */
2834 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2835 | USB_DEVICE_ID_MATCH_INT_INFO
,
2837 .idProduct
= 0x5212,
2838 .bInterfaceClass
= USB_CLASS_VIDEO
,
2839 .bInterfaceSubClass
= 1,
2840 .bInterfaceProtocol
= 0,
2841 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2842 /* Syntek (Samsung Q310) */
2843 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2844 | USB_DEVICE_ID_MATCH_INT_INFO
,
2846 .idProduct
= 0x5931,
2847 .bInterfaceClass
= USB_CLASS_VIDEO
,
2848 .bInterfaceSubClass
= 1,
2849 .bInterfaceProtocol
= 0,
2850 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2851 /* Syntek (Packard Bell EasyNote MX52 */
2852 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2853 | USB_DEVICE_ID_MATCH_INT_INFO
,
2855 .idProduct
= 0x8a12,
2856 .bInterfaceClass
= USB_CLASS_VIDEO
,
2857 .bInterfaceSubClass
= 1,
2858 .bInterfaceProtocol
= 0,
2859 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2860 /* Syntek (Asus F9SG) */
2861 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2862 | USB_DEVICE_ID_MATCH_INT_INFO
,
2864 .idProduct
= 0x8a31,
2865 .bInterfaceClass
= USB_CLASS_VIDEO
,
2866 .bInterfaceSubClass
= 1,
2867 .bInterfaceProtocol
= 0,
2868 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2869 /* Syntek (Asus U3S) */
2870 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2871 | USB_DEVICE_ID_MATCH_INT_INFO
,
2873 .idProduct
= 0x8a33,
2874 .bInterfaceClass
= USB_CLASS_VIDEO
,
2875 .bInterfaceSubClass
= 1,
2876 .bInterfaceProtocol
= 0,
2877 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2878 /* Syntek (JAOtech Smart Terminal) */
2879 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2880 | USB_DEVICE_ID_MATCH_INT_INFO
,
2882 .idProduct
= 0x8a34,
2883 .bInterfaceClass
= USB_CLASS_VIDEO
,
2884 .bInterfaceSubClass
= 1,
2885 .bInterfaceProtocol
= 0,
2886 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2888 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2889 | USB_DEVICE_ID_MATCH_INT_INFO
,
2891 .idProduct
= 0x0202,
2892 .bInterfaceClass
= USB_CLASS_VIDEO
,
2893 .bInterfaceSubClass
= 1,
2894 .bInterfaceProtocol
= 0,
2895 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2896 /* Lenovo Thinkpad SL400/SL500 */
2897 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2898 | USB_DEVICE_ID_MATCH_INT_INFO
,
2900 .idProduct
= 0x480b,
2901 .bInterfaceClass
= USB_CLASS_VIDEO
,
2902 .bInterfaceSubClass
= 1,
2903 .bInterfaceProtocol
= 0,
2904 .driver_info
= (kernel_ulong_t
)&uvc_quirk_stream_no_fid
},
2905 /* Aveo Technology USB 2.0 Camera */
2906 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2907 | USB_DEVICE_ID_MATCH_INT_INFO
,
2909 .idProduct
= 0x0306,
2910 .bInterfaceClass
= USB_CLASS_VIDEO
,
2911 .bInterfaceSubClass
= 1,
2912 .bInterfaceProtocol
= 0,
2913 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_PROBE_MINMAX
2914 | UVC_QUIRK_PROBE_EXTRAFIELDS
) },
2915 /* Aveo Technology USB 2.0 Camera (Tasco USB Microscope) */
2916 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2917 | USB_DEVICE_ID_MATCH_INT_INFO
,
2919 .idProduct
= 0x0516,
2920 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
2921 .bInterfaceSubClass
= 1,
2922 .bInterfaceProtocol
= 0 },
2923 /* Ecamm Pico iMage */
2924 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2925 | USB_DEVICE_ID_MATCH_INT_INFO
,
2927 .idProduct
= 0xcafe,
2928 .bInterfaceClass
= USB_CLASS_VIDEO
,
2929 .bInterfaceSubClass
= 1,
2930 .bInterfaceProtocol
= 0,
2931 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_PROBE_EXTRAFIELDS
) },
2932 /* Manta MM-353 Plako */
2933 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2934 | USB_DEVICE_ID_MATCH_INT_INFO
,
2936 .idProduct
= 0x3188,
2937 .bInterfaceClass
= USB_CLASS_VIDEO
,
2938 .bInterfaceSubClass
= 1,
2939 .bInterfaceProtocol
= 0,
2940 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2941 /* FSC WebCam V30S */
2942 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2943 | USB_DEVICE_ID_MATCH_INT_INFO
,
2945 .idProduct
= 0x3288,
2946 .bInterfaceClass
= USB_CLASS_VIDEO
,
2947 .bInterfaceSubClass
= 1,
2948 .bInterfaceProtocol
= 0,
2949 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2950 /* Arkmicro unbranded */
2951 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2952 | USB_DEVICE_ID_MATCH_INT_INFO
,
2954 .idProduct
= 0x3290,
2955 .bInterfaceClass
= USB_CLASS_VIDEO
,
2956 .bInterfaceSubClass
= 1,
2957 .bInterfaceProtocol
= 0,
2958 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_def
},
2959 /* The Imaging Source USB CCD cameras */
2960 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2961 | USB_DEVICE_ID_MATCH_INT_INFO
,
2963 .idProduct
= 0x8102,
2964 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
2965 .bInterfaceSubClass
= 1,
2966 .bInterfaceProtocol
= 0 },
2967 /* Bodelin ProScopeHR */
2968 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2969 | USB_DEVICE_ID_MATCH_DEV_HI
2970 | USB_DEVICE_ID_MATCH_INT_INFO
,
2972 .idProduct
= 0x1000,
2973 .bcdDevice_hi
= 0x0126,
2974 .bInterfaceClass
= USB_CLASS_VIDEO
,
2975 .bInterfaceSubClass
= 1,
2976 .bInterfaceProtocol
= 0,
2977 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_STATUS_INTERVAL
) },
2978 /* MSI StarCam 370i */
2979 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2980 | USB_DEVICE_ID_MATCH_INT_INFO
,
2982 .idProduct
= 0x2951,
2983 .bInterfaceClass
= USB_CLASS_VIDEO
,
2984 .bInterfaceSubClass
= 1,
2985 .bInterfaceProtocol
= 0,
2986 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2987 /* Generalplus Technology Inc. 808 Camera */
2988 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2989 | USB_DEVICE_ID_MATCH_INT_INFO
,
2991 .idProduct
= 0x2002,
2992 .bInterfaceClass
= USB_CLASS_VIDEO
,
2993 .bInterfaceSubClass
= 1,
2994 .bInterfaceProtocol
= 0,
2995 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
2996 /* Shenzhen Aoni Electronic Co.,Ltd 2K FHD camera */
2997 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
2998 | USB_DEVICE_ID_MATCH_INT_INFO
,
3000 .idProduct
= 0x0b40,
3001 .bInterfaceClass
= USB_CLASS_VIDEO
,
3002 .bInterfaceSubClass
= 1,
3003 .bInterfaceProtocol
= 0,
3004 .driver_info
= (kernel_ulong_t
)&(const struct uvc_device_info
){
3005 .uvc_version
= 0x010a,
3007 /* SiGma Micro USB Web Camera */
3008 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3009 | USB_DEVICE_ID_MATCH_INT_INFO
,
3011 .idProduct
= 0x3000,
3012 .bInterfaceClass
= USB_CLASS_VIDEO
,
3013 .bInterfaceSubClass
= 1,
3014 .bInterfaceProtocol
= 0,
3015 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_PROBE_MINMAX
3016 | UVC_QUIRK_IGNORE_SELECTOR_UNIT
) },
3017 /* NXP Semiconductors IR VIDEO */
3018 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3019 | USB_DEVICE_ID_MATCH_INT_INFO
,
3021 .idProduct
= 0x009b,
3022 .bInterfaceClass
= USB_CLASS_VIDEO
,
3023 .bInterfaceSubClass
= 1,
3024 .bInterfaceProtocol
= 0,
3025 .driver_info
= (kernel_ulong_t
)&uvc_quirk_probe_minmax
},
3026 /* Oculus VR Positional Tracker DK2 */
3027 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3028 | USB_DEVICE_ID_MATCH_INT_INFO
,
3030 .idProduct
= 0x0201,
3031 .bInterfaceClass
= USB_CLASS_VIDEO
,
3032 .bInterfaceSubClass
= 1,
3033 .bInterfaceProtocol
= 0,
3034 .driver_info
= (kernel_ulong_t
)&uvc_quirk_force_y8
},
3035 /* Oculus VR Rift Sensor */
3036 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3037 | USB_DEVICE_ID_MATCH_INT_INFO
,
3039 .idProduct
= 0x0211,
3040 .bInterfaceClass
= USB_CLASS_VENDOR_SPEC
,
3041 .bInterfaceSubClass
= 1,
3042 .bInterfaceProtocol
= 0,
3043 .driver_info
= (kernel_ulong_t
)&uvc_quirk_force_y8
},
3044 /* GEO Semiconductor GC6500 */
3045 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3046 | USB_DEVICE_ID_MATCH_INT_INFO
,
3048 .idProduct
= 0x4d53,
3049 .bInterfaceClass
= USB_CLASS_VIDEO
,
3050 .bInterfaceSubClass
= 1,
3051 .bInterfaceProtocol
= 0,
3052 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_FORCE_BPP
) },
3054 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3055 | USB_DEVICE_ID_MATCH_INT_INFO
,
3057 .idProduct
= 0x4c01,
3058 .bInterfaceClass
= USB_CLASS_VIDEO
,
3059 .bInterfaceSubClass
= 1,
3060 .bInterfaceProtocol
= 0,
3061 .driver_info
= UVC_INFO_QUIRK(UVC_QUIRK_DISABLE_AUTOSUSPEND
) },
3062 /* Intel D410/ASR depth camera */
3063 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3064 | USB_DEVICE_ID_MATCH_INT_INFO
,
3066 .idProduct
= 0x0ad2,
3067 .bInterfaceClass
= USB_CLASS_VIDEO
,
3068 .bInterfaceSubClass
= 1,
3069 .bInterfaceProtocol
= 0,
3070 .driver_info
= UVC_INFO_META(V4L2_META_FMT_D4XX
) },
3071 /* Intel D415/ASRC depth camera */
3072 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3073 | USB_DEVICE_ID_MATCH_INT_INFO
,
3075 .idProduct
= 0x0ad3,
3076 .bInterfaceClass
= USB_CLASS_VIDEO
,
3077 .bInterfaceSubClass
= 1,
3078 .bInterfaceProtocol
= 0,
3079 .driver_info
= UVC_INFO_META(V4L2_META_FMT_D4XX
) },
3080 /* Intel D430/AWG depth camera */
3081 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3082 | USB_DEVICE_ID_MATCH_INT_INFO
,
3084 .idProduct
= 0x0ad4,
3085 .bInterfaceClass
= USB_CLASS_VIDEO
,
3086 .bInterfaceSubClass
= 1,
3087 .bInterfaceProtocol
= 0,
3088 .driver_info
= UVC_INFO_META(V4L2_META_FMT_D4XX
) },
3089 /* Intel RealSense D4M */
3090 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3091 | USB_DEVICE_ID_MATCH_INT_INFO
,
3093 .idProduct
= 0x0b03,
3094 .bInterfaceClass
= USB_CLASS_VIDEO
,
3095 .bInterfaceSubClass
= 1,
3096 .bInterfaceProtocol
= 0,
3097 .driver_info
= UVC_INFO_META(V4L2_META_FMT_D4XX
) },
3098 /* Intel D435/AWGC depth camera */
3099 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3100 | USB_DEVICE_ID_MATCH_INT_INFO
,
3102 .idProduct
= 0x0b07,
3103 .bInterfaceClass
= USB_CLASS_VIDEO
,
3104 .bInterfaceSubClass
= 1,
3105 .bInterfaceProtocol
= 0,
3106 .driver_info
= UVC_INFO_META(V4L2_META_FMT_D4XX
) },
3107 /* Intel D435i depth camera */
3108 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3109 | USB_DEVICE_ID_MATCH_INT_INFO
,
3111 .idProduct
= 0x0b3a,
3112 .bInterfaceClass
= USB_CLASS_VIDEO
,
3113 .bInterfaceSubClass
= 1,
3114 .bInterfaceProtocol
= 0,
3115 .driver_info
= UVC_INFO_META(V4L2_META_FMT_D4XX
) },
3116 /* Intel D405 Depth Camera */
3117 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3118 | USB_DEVICE_ID_MATCH_INT_INFO
,
3120 .idProduct
= 0x0b5b,
3121 .bInterfaceClass
= USB_CLASS_VIDEO
,
3122 .bInterfaceSubClass
= 1,
3123 .bInterfaceProtocol
= 0,
3124 .driver_info
= UVC_INFO_META(V4L2_META_FMT_D4XX
) },
3125 /* Intel D455 Depth Camera */
3126 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3127 | USB_DEVICE_ID_MATCH_INT_INFO
,
3129 .idProduct
= 0x0b5c,
3130 .bInterfaceClass
= USB_CLASS_VIDEO
,
3131 .bInterfaceSubClass
= 1,
3132 .bInterfaceProtocol
= 0,
3133 .driver_info
= UVC_INFO_META(V4L2_META_FMT_D4XX
) },
3134 /* Intel D421 Depth Module */
3135 { .match_flags
= USB_DEVICE_ID_MATCH_DEVICE
3136 | USB_DEVICE_ID_MATCH_INT_INFO
,
3138 .idProduct
= 0x1155,
3139 .bInterfaceClass
= USB_CLASS_VIDEO
,
3140 .bInterfaceSubClass
= 1,
3141 .bInterfaceProtocol
= 0,
3142 .driver_info
= UVC_INFO_META(V4L2_META_FMT_D4XX
) },
3143 /* Generic USB Video Class */
3144 { USB_INTERFACE_INFO(USB_CLASS_VIDEO
, 1, UVC_PC_PROTOCOL_UNDEFINED
) },
3145 { USB_INTERFACE_INFO(USB_CLASS_VIDEO
, 1, UVC_PC_PROTOCOL_15
) },
3149 MODULE_DEVICE_TABLE(usb
, uvc_ids
);
3151 struct uvc_driver uvc_driver
= {
3155 .disconnect
= uvc_disconnect
,
3156 .suspend
= uvc_suspend
,
3157 .resume
= uvc_resume
,
3158 .reset_resume
= uvc_reset_resume
,
3159 .id_table
= uvc_ids
,
3160 .supports_autosuspend
= 1,
3164 static int __init
uvc_init(void)
3170 ret
= usb_register(&uvc_driver
.driver
);
3172 uvc_debugfs_cleanup();
3179 static void __exit
uvc_cleanup(void)
3181 usb_deregister(&uvc_driver
.driver
);
3182 uvc_debugfs_cleanup();
3185 module_init(uvc_init
);
3186 module_exit(uvc_cleanup
);
3188 MODULE_AUTHOR(DRIVER_AUTHOR
);
3189 MODULE_DESCRIPTION(DRIVER_DESC
);
3190 MODULE_LICENSE("GPL");
3191 MODULE_VERSION(DRIVER_VERSION
);