1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/kernel.h>
27#include <linux/list.h>
28#include <linux/module.h>
29#include <linux/slab.h>
30#include <linux/usb.h>
31#include <linux/videodev2.h>
32#include <linux/vmalloc.h>
33#include <linux/wait.h>
34#include <asm/atomic.h>
35#include <asm/unaligned.h>
36
37#include <media/v4l2-common.h>
38
39#include "uvcvideo.h"
40
41#define DRIVER_AUTHOR "Laurent Pinchart <laurent.pinchart@skynet.be>"
42#define DRIVER_DESC "USB Video Class driver"
43#ifndef DRIVER_VERSION
44#define DRIVER_VERSION "v0.1.0"
45#endif
46
47unsigned int uvc_clock_param = CLOCK_MONOTONIC;
48unsigned int uvc_no_drop_param;
49static unsigned int uvc_quirks_param = -1;
50unsigned int uvc_trace_param;
51unsigned int uvc_timeout_param = UVC_CTRL_STREAMING_TIMEOUT;
52
53
54
55
56
57static struct uvc_format_desc uvc_fmts[] = {
58 {
59 .name = "YUV 4:2:2 (YUYV)",
60 .guid = UVC_GUID_FORMAT_YUY2,
61 .fcc = V4L2_PIX_FMT_YUYV,
62 },
63 {
64 .name = "YUV 4:2:2 (YUYV)",
65 .guid = UVC_GUID_FORMAT_YUY2_ISIGHT,
66 .fcc = V4L2_PIX_FMT_YUYV,
67 },
68 {
69 .name = "YUV 4:2:0 (NV12)",
70 .guid = UVC_GUID_FORMAT_NV12,
71 .fcc = V4L2_PIX_FMT_NV12,
72 },
73 {
74 .name = "MJPEG",
75 .guid = UVC_GUID_FORMAT_MJPEG,
76 .fcc = V4L2_PIX_FMT_MJPEG,
77 },
78 {
79 .name = "YVU 4:2:0 (YV12)",
80 .guid = UVC_GUID_FORMAT_YV12,
81 .fcc = V4L2_PIX_FMT_YVU420,
82 },
83 {
84 .name = "YUV 4:2:0 (I420)",
85 .guid = UVC_GUID_FORMAT_I420,
86 .fcc = V4L2_PIX_FMT_YUV420,
87 },
88 {
89 .name = "YUV 4:2:2 (UYVY)",
90 .guid = UVC_GUID_FORMAT_UYVY,
91 .fcc = V4L2_PIX_FMT_UYVY,
92 },
93 {
94 .name = "Greyscale",
95 .guid = UVC_GUID_FORMAT_Y800,
96 .fcc = V4L2_PIX_FMT_GREY,
97 },
98 {
99 .name = "RGB Bayer",
100 .guid = UVC_GUID_FORMAT_BY8,
101 .fcc = V4L2_PIX_FMT_SBGGR8,
102 },
103};
104
105
106
107
108
109struct usb_host_endpoint *uvc_find_endpoint(struct usb_host_interface *alts,
110 __u8 epaddr)
111{
112 struct usb_host_endpoint *ep;
113 unsigned int i;
114
115 for (i = 0; i < alts->desc.bNumEndpoints; ++i) {
116 ep = &alts->endpoint[i];
117 if (ep->desc.bEndpointAddress == epaddr)
118 return ep;
119 }
120
121 return NULL;
122}
123
124static struct uvc_format_desc *uvc_format_by_guid(const __u8 guid[16])
125{
126 unsigned int len = ARRAY_SIZE(uvc_fmts);
127 unsigned int i;
128
129 for (i = 0; i < len; ++i) {
130 if (memcmp(guid, uvc_fmts[i].guid, 16) == 0)
131 return &uvc_fmts[i];
132 }
133
134 return NULL;
135}
136
137static __u32 uvc_colorspace(const __u8 primaries)
138{
139 static const __u8 colorprimaries[] = {
140 0,
141 V4L2_COLORSPACE_SRGB,
142 V4L2_COLORSPACE_470_SYSTEM_M,
143 V4L2_COLORSPACE_470_SYSTEM_BG,
144 V4L2_COLORSPACE_SMPTE170M,
145 V4L2_COLORSPACE_SMPTE240M,
146 };
147
148 if (primaries < ARRAY_SIZE(colorprimaries))
149 return colorprimaries[primaries];
150
151 return 0;
152}
153
154
155
156
157
158
159
160
161void uvc_simplify_fraction(uint32_t *numerator, uint32_t *denominator,
162 unsigned int n_terms, unsigned int threshold)
163{
164 uint32_t *an;
165 uint32_t x, y, r;
166 unsigned int i, n;
167
168 an = kmalloc(n_terms * sizeof *an, GFP_KERNEL);
169 if (an == NULL)
170 return;
171
172
173
174
175
176
177 x = *numerator;
178 y = *denominator;
179
180 for (n = 0; n < n_terms && y != 0; ++n) {
181 an[n] = x / y;
182 if (an[n] >= threshold) {
183 if (n < 2)
184 n++;
185 break;
186 }
187
188 r = x - an[n] * y;
189 x = y;
190 y = r;
191 }
192
193
194 x = 0;
195 y = 1;
196
197 for (i = n; i > 0; --i) {
198 r = y;
199 y = an[i-1] * y + x;
200 x = r;
201 }
202
203 *numerator = y;
204 *denominator = x;
205 kfree(an);
206}
207
208
209
210
211
212uint32_t uvc_fraction_to_interval(uint32_t numerator, uint32_t denominator)
213{
214 uint32_t multiplier;
215
216
217 if (denominator == 0 ||
218 numerator/denominator >= ((uint32_t)-1)/10000000)
219 return (uint32_t)-1;
220
221
222
223
224
225 multiplier = 10000000;
226 while (numerator > ((uint32_t)-1)/multiplier) {
227 multiplier /= 2;
228 denominator /= 2;
229 }
230
231 return denominator ? numerator * multiplier / denominator : 0;
232}
233
234
235
236
237
238static struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id)
239{
240 struct uvc_entity *entity;
241
242 list_for_each_entry(entity, &dev->entities, list) {
243 if (entity->id == id)
244 return entity;
245 }
246
247 return NULL;
248}
249
250static struct uvc_entity *uvc_entity_by_reference(struct uvc_device *dev,
251 int id, struct uvc_entity *entity)
252{
253 unsigned int i;
254
255 if (entity == NULL)
256 entity = list_entry(&dev->entities, struct uvc_entity, list);
257
258 list_for_each_entry_continue(entity, &dev->entities, list) {
259 for (i = 0; i < entity->bNrInPins; ++i)
260 if (entity->baSourceID[i] == id)
261 return entity;
262 }
263
264 return NULL;
265}
266
267static struct uvc_streaming *uvc_stream_by_id(struct uvc_device *dev, int id)
268{
269 struct uvc_streaming *stream;
270
271 list_for_each_entry(stream, &dev->streams, list) {
272 if (stream->header.bTerminalLink == id)
273 return stream;
274 }
275
276 return NULL;
277}
278
279
280
281
282
283static int uvc_parse_format(struct uvc_device *dev,
284 struct uvc_streaming *streaming, struct uvc_format *format,
285 __u32 **intervals, unsigned char *buffer, int buflen)
286{
287 struct usb_interface *intf = streaming->intf;
288 struct usb_host_interface *alts = intf->cur_altsetting;
289 struct uvc_format_desc *fmtdesc;
290 struct uvc_frame *frame;
291 const unsigned char *start = buffer;
292 unsigned int interval;
293 unsigned int i, n;
294 __u8 ftype;
295
296 format->type = buffer[2];
297 format->index = buffer[3];
298
299 switch (buffer[2]) {
300 case UVC_VS_FORMAT_UNCOMPRESSED:
301 case UVC_VS_FORMAT_FRAME_BASED:
302 n = buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED ? 27 : 28;
303 if (buflen < n) {
304 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
305 "interface %d FORMAT error\n",
306 dev->udev->devnum,
307 alts->desc.bInterfaceNumber);
308 return -EINVAL;
309 }
310
311
312 fmtdesc = uvc_format_by_guid(&buffer[5]);
313
314 if (fmtdesc != NULL) {
315 strlcpy(format->name, fmtdesc->name,
316 sizeof format->name);
317 format->fcc = fmtdesc->fcc;
318 } else {
319 uvc_printk(KERN_INFO, "Unknown video format %pUl\n",
320 &buffer[5]);
321 snprintf(format->name, sizeof(format->name), "%pUl\n",
322 &buffer[5]);
323 format->fcc = 0;
324 }
325
326 format->bpp = buffer[21];
327 if (buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED) {
328 ftype = UVC_VS_FRAME_UNCOMPRESSED;
329 } else {
330 ftype = UVC_VS_FRAME_FRAME_BASED;
331 if (buffer[27])
332 format->flags = UVC_FMT_FLAG_COMPRESSED;
333 }
334 break;
335
336 case UVC_VS_FORMAT_MJPEG:
337 if (buflen < 11) {
338 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
339 "interface %d FORMAT error\n",
340 dev->udev->devnum,
341 alts->desc.bInterfaceNumber);
342 return -EINVAL;
343 }
344
345 strlcpy(format->name, "MJPEG", sizeof format->name);
346 format->fcc = V4L2_PIX_FMT_MJPEG;
347 format->flags = UVC_FMT_FLAG_COMPRESSED;
348 format->bpp = 0;
349 ftype = UVC_VS_FRAME_MJPEG;
350 break;
351
352 case UVC_VS_FORMAT_DV:
353 if (buflen < 9) {
354 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
355 "interface %d FORMAT error\n",
356 dev->udev->devnum,
357 alts->desc.bInterfaceNumber);
358 return -EINVAL;
359 }
360
361 switch (buffer[8] & 0x7f) {
362 case 0:
363 strlcpy(format->name, "SD-DV", sizeof format->name);
364 break;
365 case 1:
366 strlcpy(format->name, "SDL-DV", sizeof format->name);
367 break;
368 case 2:
369 strlcpy(format->name, "HD-DV", sizeof format->name);
370 break;
371 default:
372 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
373 "interface %d: unknown DV format %u\n",
374 dev->udev->devnum,
375 alts->desc.bInterfaceNumber, buffer[8]);
376 return -EINVAL;
377 }
378
379 strlcat(format->name, buffer[8] & (1 << 7) ? " 60Hz" : " 50Hz",
380 sizeof format->name);
381
382 format->fcc = V4L2_PIX_FMT_DV;
383 format->flags = UVC_FMT_FLAG_COMPRESSED | UVC_FMT_FLAG_STREAM;
384 format->bpp = 0;
385 ftype = 0;
386
387
388 frame = &format->frame[0];
389 memset(&format->frame[0], 0, sizeof format->frame[0]);
390 frame->bFrameIntervalType = 1;
391 frame->dwDefaultFrameInterval = 1;
392 frame->dwFrameInterval = *intervals;
393 *(*intervals)++ = 1;
394 format->nframes = 1;
395 break;
396
397 case UVC_VS_FORMAT_MPEG2TS:
398 case UVC_VS_FORMAT_STREAM_BASED:
399
400 default:
401 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
402 "interface %d unsupported format %u\n",
403 dev->udev->devnum, alts->desc.bInterfaceNumber,
404 buffer[2]);
405 return -EINVAL;
406 }
407
408 uvc_trace(UVC_TRACE_DESCR, "Found format %s.\n", format->name);
409
410 buflen -= buffer[0];
411 buffer += buffer[0];
412
413
414
415
416 while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
417 buffer[2] == ftype) {
418 frame = &format->frame[format->nframes];
419 if (ftype != UVC_VS_FRAME_FRAME_BASED)
420 n = buflen > 25 ? buffer[25] : 0;
421 else
422 n = buflen > 21 ? buffer[21] : 0;
423
424 n = n ? n : 3;
425
426 if (buflen < 26 + 4*n) {
427 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
428 "interface %d FRAME error\n", dev->udev->devnum,
429 alts->desc.bInterfaceNumber);
430 return -EINVAL;
431 }
432
433 frame->bFrameIndex = buffer[3];
434 frame->bmCapabilities = buffer[4];
435 frame->wWidth = get_unaligned_le16(&buffer[5]);
436 frame->wHeight = get_unaligned_le16(&buffer[7]);
437 frame->dwMinBitRate = get_unaligned_le32(&buffer[9]);
438 frame->dwMaxBitRate = get_unaligned_le32(&buffer[13]);
439 if (ftype != UVC_VS_FRAME_FRAME_BASED) {
440 frame->dwMaxVideoFrameBufferSize =
441 get_unaligned_le32(&buffer[17]);
442 frame->dwDefaultFrameInterval =
443 get_unaligned_le32(&buffer[21]);
444 frame->bFrameIntervalType = buffer[25];
445 } else {
446 frame->dwMaxVideoFrameBufferSize = 0;
447 frame->dwDefaultFrameInterval =
448 get_unaligned_le32(&buffer[17]);
449 frame->bFrameIntervalType = buffer[21];
450 }
451 frame->dwFrameInterval = *intervals;
452
453
454
455
456
457
458
459
460
461 if (!(format->flags & UVC_FMT_FLAG_COMPRESSED))
462 frame->dwMaxVideoFrameBufferSize = format->bpp
463 * frame->wWidth * frame->wHeight / 8;
464
465
466
467
468
469
470 for (i = 0; i < n; ++i) {
471 interval = get_unaligned_le32(&buffer[26+4*i]);
472 *(*intervals)++ = interval ? interval : 1;
473 }
474
475
476
477
478 n -= frame->bFrameIntervalType ? 1 : 2;
479 frame->dwDefaultFrameInterval =
480 min(frame->dwFrameInterval[n],
481 max(frame->dwFrameInterval[0],
482 frame->dwDefaultFrameInterval));
483
484 uvc_trace(UVC_TRACE_DESCR, "- %ux%u (%u.%u fps)\n",
485 frame->wWidth, frame->wHeight,
486 10000000/frame->dwDefaultFrameInterval,
487 (100000000/frame->dwDefaultFrameInterval)%10);
488
489 format->nframes++;
490 buflen -= buffer[0];
491 buffer += buffer[0];
492 }
493
494 if (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
495 buffer[2] == UVC_VS_STILL_IMAGE_FRAME) {
496 buflen -= buffer[0];
497 buffer += buffer[0];
498 }
499
500 if (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
501 buffer[2] == UVC_VS_COLORFORMAT) {
502 if (buflen < 6) {
503 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
504 "interface %d COLORFORMAT error\n",
505 dev->udev->devnum,
506 alts->desc.bInterfaceNumber);
507 return -EINVAL;
508 }
509
510 format->colorspace = uvc_colorspace(buffer[3]);
511
512 buflen -= buffer[0];
513 buffer += buffer[0];
514 }
515
516 return buffer - start;
517}
518
519static int uvc_parse_streaming(struct uvc_device *dev,
520 struct usb_interface *intf)
521{
522 struct uvc_streaming *streaming = NULL;
523 struct uvc_format *format;
524 struct uvc_frame *frame;
525 struct usb_host_interface *alts = &intf->altsetting[0];
526 unsigned char *_buffer, *buffer = alts->extra;
527 int _buflen, buflen = alts->extralen;
528 unsigned int nformats = 0, nframes = 0, nintervals = 0;
529 unsigned int size, i, n, p;
530 __u32 *interval;
531 __u16 psize;
532 int ret = -EINVAL;
533
534 if (intf->cur_altsetting->desc.bInterfaceSubClass
535 != UVC_SC_VIDEOSTREAMING) {
536 uvc_trace(UVC_TRACE_DESCR, "device %d interface %d isn't a "
537 "video streaming interface\n", dev->udev->devnum,
538 intf->altsetting[0].desc.bInterfaceNumber);
539 return -EINVAL;
540 }
541
542 if (usb_driver_claim_interface(&uvc_driver.driver, intf, dev)) {
543 uvc_trace(UVC_TRACE_DESCR, "device %d interface %d is already "
544 "claimed\n", dev->udev->devnum,
545 intf->altsetting[0].desc.bInterfaceNumber);
546 return -EINVAL;
547 }
548
549 streaming = kzalloc(sizeof *streaming, GFP_KERNEL);
550 if (streaming == NULL) {
551 usb_driver_release_interface(&uvc_driver.driver, intf);
552 return -EINVAL;
553 }
554
555 mutex_init(&streaming->mutex);
556 streaming->dev = dev;
557 streaming->intf = usb_get_intf(intf);
558 streaming->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
559
560
561
562
563 if (buflen == 0) {
564 for (i = 0; i < alts->desc.bNumEndpoints; ++i) {
565 struct usb_host_endpoint *ep = &alts->endpoint[i];
566
567 if (ep->extralen == 0)
568 continue;
569
570 if (ep->extralen > 2 &&
571 ep->extra[1] == USB_DT_CS_INTERFACE) {
572 uvc_trace(UVC_TRACE_DESCR, "trying extra data "
573 "from endpoint %u.\n", i);
574 buffer = alts->endpoint[i].extra;
575 buflen = alts->endpoint[i].extralen;
576 break;
577 }
578 }
579 }
580
581
582 while (buflen > 2 && buffer[1] != USB_DT_CS_INTERFACE) {
583 buflen -= buffer[0];
584 buffer += buffer[0];
585 }
586
587 if (buflen <= 2) {
588 uvc_trace(UVC_TRACE_DESCR, "no class-specific streaming "
589 "interface descriptors found.\n");
590 goto error;
591 }
592
593
594 switch (buffer[2]) {
595 case UVC_VS_OUTPUT_HEADER:
596 streaming->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
597 size = 9;
598 break;
599
600 case UVC_VS_INPUT_HEADER:
601 streaming->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
602 size = 13;
603 break;
604
605 default:
606 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface "
607 "%d HEADER descriptor not found.\n", dev->udev->devnum,
608 alts->desc.bInterfaceNumber);
609 goto error;
610 }
611
612 p = buflen >= 4 ? buffer[3] : 0;
613 n = buflen >= size ? buffer[size-1] : 0;
614
615 if (buflen < size + p*n) {
616 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
617 "interface %d HEADER descriptor is invalid.\n",
618 dev->udev->devnum, alts->desc.bInterfaceNumber);
619 goto error;
620 }
621
622 streaming->header.bNumFormats = p;
623 streaming->header.bEndpointAddress = buffer[6];
624 if (buffer[2] == UVC_VS_INPUT_HEADER) {
625 streaming->header.bmInfo = buffer[7];
626 streaming->header.bTerminalLink = buffer[8];
627 streaming->header.bStillCaptureMethod = buffer[9];
628 streaming->header.bTriggerSupport = buffer[10];
629 streaming->header.bTriggerUsage = buffer[11];
630 } else {
631 streaming->header.bTerminalLink = buffer[7];
632 }
633 streaming->header.bControlSize = n;
634
635 streaming->header.bmaControls = kmalloc(p*n, GFP_KERNEL);
636 if (streaming->header.bmaControls == NULL) {
637 ret = -ENOMEM;
638 goto error;
639 }
640
641 memcpy(streaming->header.bmaControls, &buffer[size], p*n);
642
643 buflen -= buffer[0];
644 buffer += buffer[0];
645
646 _buffer = buffer;
647 _buflen = buflen;
648
649
650 while (_buflen > 2 && _buffer[1] == USB_DT_CS_INTERFACE) {
651 switch (_buffer[2]) {
652 case UVC_VS_FORMAT_UNCOMPRESSED:
653 case UVC_VS_FORMAT_MJPEG:
654 case UVC_VS_FORMAT_FRAME_BASED:
655 nformats++;
656 break;
657
658 case UVC_VS_FORMAT_DV:
659
660
661
662 nformats++;
663 nframes++;
664 nintervals++;
665 break;
666
667 case UVC_VS_FORMAT_MPEG2TS:
668 case UVC_VS_FORMAT_STREAM_BASED:
669 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
670 "interface %d FORMAT %u is not supported.\n",
671 dev->udev->devnum,
672 alts->desc.bInterfaceNumber, _buffer[2]);
673 break;
674
675 case UVC_VS_FRAME_UNCOMPRESSED:
676 case UVC_VS_FRAME_MJPEG:
677 nframes++;
678 if (_buflen > 25)
679 nintervals += _buffer[25] ? _buffer[25] : 3;
680 break;
681
682 case UVC_VS_FRAME_FRAME_BASED:
683 nframes++;
684 if (_buflen > 21)
685 nintervals += _buffer[21] ? _buffer[21] : 3;
686 break;
687 }
688
689 _buflen -= _buffer[0];
690 _buffer += _buffer[0];
691 }
692
693 if (nformats == 0) {
694 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface "
695 "%d has no supported formats defined.\n",
696 dev->udev->devnum, alts->desc.bInterfaceNumber);
697 goto error;
698 }
699
700 size = nformats * sizeof *format + nframes * sizeof *frame
701 + nintervals * sizeof *interval;
702 format = kzalloc(size, GFP_KERNEL);
703 if (format == NULL) {
704 ret = -ENOMEM;
705 goto error;
706 }
707
708 frame = (struct uvc_frame *)&format[nformats];
709 interval = (__u32 *)&frame[nframes];
710
711 streaming->format = format;
712 streaming->nformats = nformats;
713
714
715 while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE) {
716 switch (buffer[2]) {
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 format->frame = frame;
722 ret = uvc_parse_format(dev, streaming, format,
723 &interval, buffer, buflen);
724 if (ret < 0)
725 goto error;
726
727 frame += format->nframes;
728 format++;
729
730 buflen -= ret;
731 buffer += ret;
732 continue;
733
734 default:
735 break;
736 }
737
738 buflen -= buffer[0];
739 buffer += buffer[0];
740 }
741
742 if (buflen)
743 uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface "
744 "%d has %u bytes of trailing descriptor garbage.\n",
745 dev->udev->devnum, alts->desc.bInterfaceNumber, buflen);
746
747
748 for (i = 0; i < intf->num_altsetting; ++i) {
749 struct usb_host_endpoint *ep;
750 alts = &intf->altsetting[i];
751 ep = uvc_find_endpoint(alts,
752 streaming->header.bEndpointAddress);
753 if (ep == NULL)
754 continue;
755
756 psize = le16_to_cpu(ep->desc.wMaxPacketSize);
757 psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3));
758 if (psize > streaming->maxpsize)
759 streaming->maxpsize = psize;
760 }
761
762 list_add_tail(&streaming->list, &dev->streams);
763 return 0;
764
765error:
766 usb_driver_release_interface(&uvc_driver.driver, intf);
767 usb_put_intf(intf);
768 kfree(streaming->format);
769 kfree(streaming->header.bmaControls);
770 kfree(streaming);
771 return ret;
772}
773
774static struct uvc_entity *uvc_alloc_entity(u16 type, u8 id,
775 unsigned int num_pads, unsigned int extra_size)
776{
777 struct uvc_entity *entity;
778 unsigned int num_inputs;
779 unsigned int size;
780
781 num_inputs = (type & UVC_TERM_OUTPUT) ? num_pads : num_pads - 1;
782 size = sizeof(*entity) + extra_size + num_inputs;
783 entity = kzalloc(size, GFP_KERNEL);
784 if (entity == NULL)
785 return NULL;
786
787 entity->id = id;
788 entity->type = type;
789
790 entity->bNrInPins = num_inputs;
791 entity->baSourceID = ((__u8 *)entity) + sizeof(*entity) + extra_size;
792
793 return entity;
794}
795
796
797static int uvc_parse_vendor_control(struct uvc_device *dev,
798 const unsigned char *buffer, int buflen)
799{
800 struct usb_device *udev = dev->udev;
801 struct usb_host_interface *alts = dev->intf->cur_altsetting;
802 struct uvc_entity *unit;
803 unsigned int n, p;
804 int handled = 0;
805
806 switch (le16_to_cpu(dev->udev->descriptor.idVendor)) {
807 case 0x046d:
808 if (buffer[1] != 0x41 || buffer[2] != 0x01)
809 break;
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837 p = buflen >= 22 ? buffer[21] : 0;
838 n = buflen >= 25 + p ? buffer[22+p] : 0;
839
840 if (buflen < 25 + p + 2*n) {
841 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
842 "interface %d EXTENSION_UNIT error\n",
843 udev->devnum, alts->desc.bInterfaceNumber);
844 break;
845 }
846
847 unit = uvc_alloc_entity(UVC_VC_EXTENSION_UNIT, buffer[3],
848 p + 1, 2*n);
849 if (unit == NULL)
850 return -ENOMEM;
851
852 memcpy(unit->extension.guidExtensionCode, &buffer[4], 16);
853 unit->extension.bNumControls = buffer[20];
854 memcpy(unit->baSourceID, &buffer[22], p);
855 unit->extension.bControlSize = buffer[22+p];
856 unit->extension.bmControls = (__u8 *)unit + sizeof(*unit);
857 unit->extension.bmControlsType = (__u8 *)unit + sizeof(*unit)
858 + n;
859 memcpy(unit->extension.bmControls, &buffer[23+p], 2*n);
860
861 if (buffer[24+p+2*n] != 0)
862 usb_string(udev, buffer[24+p+2*n], unit->name,
863 sizeof unit->name);
864 else
865 sprintf(unit->name, "Extension %u", buffer[3]);
866
867 list_add_tail(&unit->list, &dev->entities);
868 handled = 1;
869 break;
870 }
871
872 return handled;
873}
874
875static int uvc_parse_standard_control(struct uvc_device *dev,
876 const unsigned char *buffer, int buflen)
877{
878 struct usb_device *udev = dev->udev;
879 struct uvc_entity *unit, *term;
880 struct usb_interface *intf;
881 struct usb_host_interface *alts = dev->intf->cur_altsetting;
882 unsigned int i, n, p, len;
883 __u16 type;
884
885 switch (buffer[2]) {
886 case UVC_VC_HEADER:
887 n = buflen >= 12 ? buffer[11] : 0;
888
889 if (buflen < 12 || buflen < 12 + n) {
890 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
891 "interface %d HEADER error\n", udev->devnum,
892 alts->desc.bInterfaceNumber);
893 return -EINVAL;
894 }
895
896 dev->uvc_version = get_unaligned_le16(&buffer[3]);
897 dev->clock_frequency = get_unaligned_le32(&buffer[7]);
898
899
900 for (i = 0; i < n; ++i) {
901 intf = usb_ifnum_to_if(udev, buffer[12+i]);
902 if (intf == NULL) {
903 uvc_trace(UVC_TRACE_DESCR, "device %d "
904 "interface %d doesn't exists\n",
905 udev->devnum, i);
906 continue;
907 }
908
909 uvc_parse_streaming(dev, intf);
910 }
911 break;
912
913 case UVC_VC_INPUT_TERMINAL:
914 if (buflen < 8) {
915 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
916 "interface %d INPUT_TERMINAL error\n",
917 udev->devnum, alts->desc.bInterfaceNumber);
918 return -EINVAL;
919 }
920
921
922
923
924 type = get_unaligned_le16(&buffer[4]);
925 if ((type & 0xff00) == 0) {
926 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
927 "interface %d INPUT_TERMINAL %d has invalid "
928 "type 0x%04x, skipping\n", udev->devnum,
929 alts->desc.bInterfaceNumber,
930 buffer[3], type);
931 return 0;
932 }
933
934 n = 0;
935 p = 0;
936 len = 8;
937
938 if (type == UVC_ITT_CAMERA) {
939 n = buflen >= 15 ? buffer[14] : 0;
940 len = 15;
941
942 } else if (type == UVC_ITT_MEDIA_TRANSPORT_INPUT) {
943 n = buflen >= 9 ? buffer[8] : 0;
944 p = buflen >= 10 + n ? buffer[9+n] : 0;
945 len = 10;
946 }
947
948 if (buflen < len + n + p) {
949 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
950 "interface %d INPUT_TERMINAL error\n",
951 udev->devnum, alts->desc.bInterfaceNumber);
952 return -EINVAL;
953 }
954
955 term = uvc_alloc_entity(type | UVC_TERM_INPUT, buffer[3],
956 1, n + p);
957 if (term == NULL)
958 return -ENOMEM;
959
960 if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA) {
961 term->camera.bControlSize = n;
962 term->camera.bmControls = (__u8 *)term + sizeof *term;
963 term->camera.wObjectiveFocalLengthMin =
964 get_unaligned_le16(&buffer[8]);
965 term->camera.wObjectiveFocalLengthMax =
966 get_unaligned_le16(&buffer[10]);
967 term->camera.wOcularFocalLength =
968 get_unaligned_le16(&buffer[12]);
969 memcpy(term->camera.bmControls, &buffer[15], n);
970 } else if (UVC_ENTITY_TYPE(term) ==
971 UVC_ITT_MEDIA_TRANSPORT_INPUT) {
972 term->media.bControlSize = n;
973 term->media.bmControls = (__u8 *)term + sizeof *term;
974 term->media.bTransportModeSize = p;
975 term->media.bmTransportModes = (__u8 *)term
976 + sizeof *term + n;
977 memcpy(term->media.bmControls, &buffer[9], n);
978 memcpy(term->media.bmTransportModes, &buffer[10+n], p);
979 }
980
981 if (buffer[7] != 0)
982 usb_string(udev, buffer[7], term->name,
983 sizeof term->name);
984 else if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA)
985 sprintf(term->name, "Camera %u", buffer[3]);
986 else if (UVC_ENTITY_TYPE(term) == UVC_ITT_MEDIA_TRANSPORT_INPUT)
987 sprintf(term->name, "Media %u", buffer[3]);
988 else
989 sprintf(term->name, "Input %u", buffer[3]);
990
991 list_add_tail(&term->list, &dev->entities);
992 break;
993
994 case UVC_VC_OUTPUT_TERMINAL:
995 if (buflen < 9) {
996 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
997 "interface %d OUTPUT_TERMINAL error\n",
998 udev->devnum, alts->desc.bInterfaceNumber);
999 return -EINVAL;
1000 }
1001
1002
1003
1004
1005 type = get_unaligned_le16(&buffer[4]);
1006 if ((type & 0xff00) == 0) {
1007 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
1008 "interface %d OUTPUT_TERMINAL %d has invalid "
1009 "type 0x%04x, skipping\n", udev->devnum,
1010 alts->desc.bInterfaceNumber, buffer[3], type);
1011 return 0;
1012 }
1013
1014 term = uvc_alloc_entity(type | UVC_TERM_OUTPUT, buffer[3],
1015 1, 0);
1016 if (term == NULL)
1017 return -ENOMEM;
1018
1019 memcpy(term->baSourceID, &buffer[7], 1);
1020
1021 if (buffer[8] != 0)
1022 usb_string(udev, buffer[8], term->name,
1023 sizeof term->name);
1024 else
1025 sprintf(term->name, "Output %u", buffer[3]);
1026
1027 list_add_tail(&term->list, &dev->entities);
1028 break;
1029
1030 case UVC_VC_SELECTOR_UNIT:
1031 p = buflen >= 5 ? buffer[4] : 0;
1032
1033 if (buflen < 5 || buflen < 6 + p) {
1034 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
1035 "interface %d SELECTOR_UNIT error\n",
1036 udev->devnum, alts->desc.bInterfaceNumber);
1037 return -EINVAL;
1038 }
1039
1040 unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, 0);
1041 if (unit == NULL)
1042 return -ENOMEM;
1043
1044 memcpy(unit->baSourceID, &buffer[5], p);
1045
1046 if (buffer[5+p] != 0)
1047 usb_string(udev, buffer[5+p], unit->name,
1048 sizeof unit->name);
1049 else
1050 sprintf(unit->name, "Selector %u", buffer[3]);
1051
1052 list_add_tail(&unit->list, &dev->entities);
1053 break;
1054
1055 case UVC_VC_PROCESSING_UNIT:
1056 n = buflen >= 8 ? buffer[7] : 0;
1057 p = dev->uvc_version >= 0x0110 ? 10 : 9;
1058
1059 if (buflen < p + n) {
1060 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
1061 "interface %d PROCESSING_UNIT error\n",
1062 udev->devnum, alts->desc.bInterfaceNumber);
1063 return -EINVAL;
1064 }
1065
1066 unit = uvc_alloc_entity(buffer[2], buffer[3], 2, n);
1067 if (unit == NULL)
1068 return -ENOMEM;
1069
1070 memcpy(unit->baSourceID, &buffer[4], 1);
1071 unit->processing.wMaxMultiplier =
1072 get_unaligned_le16(&buffer[5]);
1073 unit->processing.bControlSize = buffer[7];
1074 unit->processing.bmControls = (__u8 *)unit + sizeof *unit;
1075 memcpy(unit->processing.bmControls, &buffer[8], n);
1076 if (dev->uvc_version >= 0x0110)
1077 unit->processing.bmVideoStandards = buffer[9+n];
1078
1079 if (buffer[8+n] != 0)
1080 usb_string(udev, buffer[8+n], unit->name,
1081 sizeof unit->name);
1082 else
1083 sprintf(unit->name, "Processing %u", buffer[3]);
1084
1085 list_add_tail(&unit->list, &dev->entities);
1086 break;
1087
1088 case UVC_VC_EXTENSION_UNIT:
1089 p = buflen >= 22 ? buffer[21] : 0;
1090 n = buflen >= 24 + p ? buffer[22+p] : 0;
1091
1092 if (buflen < 24 + p + n) {
1093 uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
1094 "interface %d EXTENSION_UNIT error\n",
1095 udev->devnum, alts->desc.bInterfaceNumber);
1096 return -EINVAL;
1097 }
1098
1099 unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, n);
1100 if (unit == NULL)
1101 return -ENOMEM;
1102
1103 memcpy(unit->extension.guidExtensionCode, &buffer[4], 16);
1104 unit->extension.bNumControls = buffer[20];
1105 memcpy(unit->baSourceID, &buffer[22], p);
1106 unit->extension.bControlSize = buffer[22+p];
1107 unit->extension.bmControls = (__u8 *)unit + sizeof *unit;
1108 memcpy(unit->extension.bmControls, &buffer[23+p], n);
1109
1110 if (buffer[23+p+n] != 0)
1111 usb_string(udev, buffer[23+p+n], unit->name,
1112 sizeof unit->name);
1113 else
1114 sprintf(unit->name, "Extension %u", buffer[3]);
1115
1116 list_add_tail(&unit->list, &dev->entities);
1117 break;
1118
1119 default:
1120 uvc_trace(UVC_TRACE_DESCR, "Found an unknown CS_INTERFACE "
1121 "descriptor (%u)\n", buffer[2]);
1122 break;
1123 }
1124
1125 return 0;
1126}
1127
1128static int uvc_parse_control(struct uvc_device *dev)
1129{
1130 struct usb_host_interface *alts = dev->intf->cur_altsetting;
1131 unsigned char *buffer = alts->extra;
1132 int buflen = alts->extralen;
1133 int ret;
1134
1135
1136
1137
1138
1139
1140 while (buflen > 2) {
1141 if (uvc_parse_vendor_control(dev, buffer, buflen) ||
1142 buffer[1] != USB_DT_CS_INTERFACE)
1143 goto next_descriptor;
1144
1145 if ((ret = uvc_parse_standard_control(dev, buffer, buflen)) < 0)
1146 return ret;
1147
1148next_descriptor:
1149 buflen -= buffer[0];
1150 buffer += buffer[0];
1151 }
1152
1153
1154
1155
1156
1157
1158 if (alts->desc.bNumEndpoints == 1 &&
1159 !(dev->quirks & UVC_QUIRK_BUILTIN_ISIGHT)) {
1160 struct usb_host_endpoint *ep = &alts->endpoint[0];
1161 struct usb_endpoint_descriptor *desc = &ep->desc;
1162
1163 if (usb_endpoint_is_int_in(desc) &&
1164 le16_to_cpu(desc->wMaxPacketSize) >= 8 &&
1165 desc->bInterval != 0) {
1166 uvc_trace(UVC_TRACE_DESCR, "Found a Status endpoint "
1167 "(addr %02x).\n", desc->bEndpointAddress);
1168 dev->int_ep = ep;
1169 }
1170 }
1171
1172 return 0;
1173}
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205static int uvc_scan_chain_entity(struct uvc_video_chain *chain,
1206 struct uvc_entity *entity)
1207{
1208 switch (UVC_ENTITY_TYPE(entity)) {
1209 case UVC_VC_EXTENSION_UNIT:
1210 if (uvc_trace_param & UVC_TRACE_PROBE)
1211 printk(" <- XU %d", entity->id);
1212
1213 if (entity->bNrInPins != 1) {
1214 uvc_trace(UVC_TRACE_DESCR, "Extension unit %d has more "
1215 "than 1 input pin.\n", entity->id);
1216 return -1;
1217 }
1218
1219 break;
1220
1221 case UVC_VC_PROCESSING_UNIT:
1222 if (uvc_trace_param & UVC_TRACE_PROBE)
1223 printk(" <- PU %d", entity->id);
1224
1225 if (chain->processing != NULL) {
1226 uvc_trace(UVC_TRACE_DESCR, "Found multiple "
1227 "Processing Units in chain.\n");
1228 return -1;
1229 }
1230
1231 chain->processing = entity;
1232 break;
1233
1234 case UVC_VC_SELECTOR_UNIT:
1235 if (uvc_trace_param & UVC_TRACE_PROBE)
1236 printk(" <- SU %d", entity->id);
1237
1238
1239 if (entity->bNrInPins == 1)
1240 break;
1241
1242 if (chain->selector != NULL) {
1243 uvc_trace(UVC_TRACE_DESCR, "Found multiple Selector "
1244 "Units in chain.\n");
1245 return -1;
1246 }
1247
1248 chain->selector = entity;
1249 break;
1250
1251 case UVC_ITT_VENDOR_SPECIFIC:
1252 case UVC_ITT_CAMERA:
1253 case UVC_ITT_MEDIA_TRANSPORT_INPUT:
1254 if (uvc_trace_param & UVC_TRACE_PROBE)
1255 printk(" <- IT %d\n", entity->id);
1256
1257 break;
1258
1259 case UVC_TT_STREAMING:
1260 if (UVC_ENTITY_IS_ITERM(entity)) {
1261 if (uvc_trace_param & UVC_TRACE_PROBE)
1262 printk(" <- IT %d\n", entity->id);
1263 } else {
1264 if (uvc_trace_param & UVC_TRACE_PROBE)
1265 printk(" OT %d", entity->id);
1266 }
1267
1268 break;
1269
1270 default:
1271 uvc_trace(UVC_TRACE_DESCR, "Unsupported entity type "
1272 "0x%04x found in chain.\n", UVC_ENTITY_TYPE(entity));
1273 return -1;
1274 }
1275
1276 list_add_tail(&entity->chain, &chain->entities);
1277 return 0;
1278}
1279
1280static int uvc_scan_chain_forward(struct uvc_video_chain *chain,
1281 struct uvc_entity *entity, struct uvc_entity *prev)
1282{
1283 struct uvc_entity *forward;
1284 int found;
1285
1286
1287 forward = NULL;
1288 found = 0;
1289
1290 while (1) {
1291 forward = uvc_entity_by_reference(chain->dev, entity->id,
1292 forward);
1293 if (forward == NULL)
1294 break;
1295 if (forward == prev)
1296 continue;
1297
1298 switch (UVC_ENTITY_TYPE(forward)) {
1299 case UVC_VC_EXTENSION_UNIT:
1300 if (forward->bNrInPins != 1) {
1301 uvc_trace(UVC_TRACE_DESCR, "Extension unit %d "
1302 "has more than 1 input pin.\n",
1303 entity->id);
1304 return -EINVAL;
1305 }
1306
1307 list_add_tail(&forward->chain, &chain->entities);
1308 if (uvc_trace_param & UVC_TRACE_PROBE) {
1309 if (!found)
1310 printk(" (->");
1311
1312 printk(" XU %d", forward->id);
1313 found = 1;
1314 }
1315 break;
1316
1317 case UVC_OTT_VENDOR_SPECIFIC:
1318 case UVC_OTT_DISPLAY:
1319 case UVC_OTT_MEDIA_TRANSPORT_OUTPUT:
1320 case UVC_TT_STREAMING:
1321 if (UVC_ENTITY_IS_ITERM(forward)) {
1322 uvc_trace(UVC_TRACE_DESCR, "Unsupported input "
1323 "terminal %u.\n", forward->id);
1324 return -EINVAL;
1325 }
1326
1327 list_add_tail(&forward->chain, &chain->entities);
1328 if (uvc_trace_param & UVC_TRACE_PROBE) {
1329 if (!found)
1330 printk(" (->");
1331
1332 printk(" OT %d", forward->id);
1333 found = 1;
1334 }
1335 break;
1336 }
1337 }
1338 if (found)
1339 printk(")");
1340
1341 return 0;
1342}
1343
1344static int uvc_scan_chain_backward(struct uvc_video_chain *chain,
1345 struct uvc_entity **_entity)
1346{
1347 struct uvc_entity *entity = *_entity;
1348 struct uvc_entity *term;
1349 int id = -EINVAL, i;
1350
1351 switch (UVC_ENTITY_TYPE(entity)) {
1352 case UVC_VC_EXTENSION_UNIT:
1353 case UVC_VC_PROCESSING_UNIT:
1354 id = entity->baSourceID[0];
1355 break;
1356
1357 case UVC_VC_SELECTOR_UNIT:
1358
1359 if (entity->bNrInPins == 1) {
1360 id = entity->baSourceID[0];
1361 break;
1362 }
1363
1364 if (uvc_trace_param & UVC_TRACE_PROBE)
1365 printk(" <- IT");
1366
1367 chain->selector = entity;
1368 for (i = 0; i < entity->bNrInPins; ++i) {
1369 id = entity->baSourceID[i];
1370 term = uvc_entity_by_id(chain->dev, id);
1371 if (term == NULL || !UVC_ENTITY_IS_ITERM(term)) {
1372 uvc_trace(UVC_TRACE_DESCR, "Selector unit %d "
1373 "input %d isn't connected to an "
1374 "input terminal\n", entity->id, i);
1375 return -1;
1376 }
1377
1378 if (uvc_trace_param & UVC_TRACE_PROBE)
1379 printk(" %d", term->id);
1380
1381 list_add_tail(&term->chain, &chain->entities);
1382 uvc_scan_chain_forward(chain, term, entity);
1383 }
1384
1385 if (uvc_trace_param & UVC_TRACE_PROBE)
1386 printk("\n");
1387
1388 id = 0;
1389 break;
1390
1391 case UVC_ITT_VENDOR_SPECIFIC:
1392 case UVC_ITT_CAMERA:
1393 case UVC_ITT_MEDIA_TRANSPORT_INPUT:
1394 case UVC_OTT_VENDOR_SPECIFIC:
1395 case UVC_OTT_DISPLAY:
1396 case UVC_OTT_MEDIA_TRANSPORT_OUTPUT:
1397 case UVC_TT_STREAMING:
1398 id = UVC_ENTITY_IS_OTERM(entity) ? entity->baSourceID[0] : 0;
1399 break;
1400 }
1401
1402 if (id <= 0) {
1403 *_entity = NULL;
1404 return id;
1405 }
1406
1407 entity = uvc_entity_by_id(chain->dev, id);
1408 if (entity == NULL) {
1409 uvc_trace(UVC_TRACE_DESCR, "Found reference to "
1410 "unknown entity %d.\n", id);
1411 return -EINVAL;
1412 }
1413
1414 *_entity = entity;
1415 return 0;
1416}
1417
1418static int uvc_scan_chain(struct uvc_video_chain *chain,
1419 struct uvc_entity *term)
1420{
1421 struct uvc_entity *entity, *prev;
1422
1423 uvc_trace(UVC_TRACE_PROBE, "Scanning UVC chain:");
1424
1425 entity = term;
1426 prev = NULL;
1427
1428 while (entity != NULL) {
1429
1430 if (entity->chain.next || entity->chain.prev) {
1431 uvc_trace(UVC_TRACE_DESCR, "Found reference to "
1432 "entity %d already in chain.\n", entity->id);
1433 return -EINVAL;
1434 }
1435
1436
1437 if (uvc_scan_chain_entity(chain, entity) < 0)
1438 return -EINVAL;
1439
1440
1441 if (uvc_scan_chain_forward(chain, entity, prev) < 0)
1442 return -EINVAL;
1443
1444
1445 prev = entity;
1446 if (uvc_scan_chain_backward(chain, &entity) < 0)
1447 return -EINVAL;
1448 }
1449
1450 return 0;
1451}
1452
1453static unsigned int uvc_print_terms(struct list_head *terms, u16 dir,
1454 char *buffer)
1455{
1456 struct uvc_entity *term;
1457 unsigned int nterms = 0;
1458 char *p = buffer;
1459
1460 list_for_each_entry(term, terms, chain) {
1461 if (!UVC_ENTITY_IS_TERM(term) ||
1462 UVC_TERM_DIRECTION(term) != dir)
1463 continue;
1464
1465 if (nterms)
1466 p += sprintf(p, ",");
1467 if (++nterms >= 4) {
1468 p += sprintf(p, "...");
1469 break;
1470 }
1471 p += sprintf(p, "%u", term->id);
1472 }
1473
1474 return p - buffer;
1475}
1476
1477static const char *uvc_print_chain(struct uvc_video_chain *chain)
1478{
1479 static char buffer[43];
1480 char *p = buffer;
1481
1482 p += uvc_print_terms(&chain->entities, UVC_TERM_INPUT, p);
1483 p += sprintf(p, " -> ");
1484 uvc_print_terms(&chain->entities, UVC_TERM_OUTPUT, p);
1485
1486 return buffer;
1487}
1488
1489
1490
1491
1492
1493
1494static int uvc_scan_device(struct uvc_device *dev)
1495{
1496 struct uvc_video_chain *chain;
1497 struct uvc_entity *term;
1498
1499 list_for_each_entry(term, &dev->entities, list) {
1500 if (!UVC_ENTITY_IS_OTERM(term))
1501 continue;
1502
1503
1504
1505
1506
1507
1508 if (term->chain.next || term->chain.prev)
1509 continue;
1510
1511 chain = kzalloc(sizeof(*chain), GFP_KERNEL);
1512 if (chain == NULL)
1513 return -ENOMEM;
1514
1515 INIT_LIST_HEAD(&chain->entities);
1516 mutex_init(&chain->ctrl_mutex);
1517 chain->dev = dev;
1518
1519 if (uvc_scan_chain(chain, term) < 0) {
1520 kfree(chain);
1521 continue;
1522 }
1523
1524 uvc_trace(UVC_TRACE_PROBE, "Found a valid video chain (%s).\n",
1525 uvc_print_chain(chain));
1526
1527 list_add_tail(&chain->list, &dev->chains);
1528 }
1529
1530 if (list_empty(&dev->chains)) {
1531 uvc_printk(KERN_INFO, "No valid video chain found.\n");
1532 return -1;
1533 }
1534
1535 return 0;
1536}
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552static void uvc_delete(struct uvc_device *dev)
1553{
1554 struct list_head *p, *n;
1555
1556 usb_put_intf(dev->intf);
1557 usb_put_dev(dev->udev);
1558
1559 uvc_status_cleanup(dev);
1560 uvc_ctrl_cleanup_device(dev);
1561
1562 list_for_each_safe(p, n, &dev->chains) {
1563 struct uvc_video_chain *chain;
1564 chain = list_entry(p, struct uvc_video_chain, list);
1565 kfree(chain);
1566 }
1567
1568 list_for_each_safe(p, n, &dev->entities) {
1569 struct uvc_entity *entity;
1570 entity = list_entry(p, struct uvc_entity, list);
1571 kfree(entity);
1572 }
1573
1574 list_for_each_safe(p, n, &dev->streams) {
1575 struct uvc_streaming *streaming;
1576 streaming = list_entry(p, struct uvc_streaming, list);
1577 usb_driver_release_interface(&uvc_driver.driver,
1578 streaming->intf);
1579 usb_put_intf(streaming->intf);
1580 kfree(streaming->format);
1581 kfree(streaming->header.bmaControls);
1582 kfree(streaming);
1583 }
1584
1585 kfree(dev);
1586}
1587
1588static void uvc_release(struct video_device *vdev)
1589{
1590 struct uvc_streaming *stream = video_get_drvdata(vdev);
1591 struct uvc_device *dev = stream->dev;
1592
1593 video_device_release(vdev);
1594
1595
1596
1597
1598 if (atomic_dec_and_test(&dev->nstreams))
1599 uvc_delete(dev);
1600}
1601
1602
1603
1604
1605static void uvc_unregister_video(struct uvc_device *dev)
1606{
1607 struct uvc_streaming *stream;
1608
1609
1610
1611
1612
1613
1614 atomic_inc(&dev->nstreams);
1615
1616 list_for_each_entry(stream, &dev->streams, list) {
1617 if (stream->vdev == NULL)
1618 continue;
1619
1620 video_unregister_device(stream->vdev);
1621 stream->vdev = NULL;
1622 }
1623
1624
1625
1626
1627 if (atomic_dec_and_test(&dev->nstreams))
1628 uvc_delete(dev);
1629}
1630
1631static int uvc_register_video(struct uvc_device *dev,
1632 struct uvc_streaming *stream)
1633{
1634 struct video_device *vdev;
1635 int ret;
1636
1637
1638
1639
1640 ret = uvc_video_init(stream);
1641 if (ret < 0) {
1642 uvc_printk(KERN_ERR, "Failed to initialize the device "
1643 "(%d).\n", ret);
1644 return ret;
1645 }
1646
1647
1648 vdev = video_device_alloc();
1649 if (vdev == NULL) {
1650 uvc_printk(KERN_ERR, "Failed to allocate video device (%d).\n",
1651 ret);
1652 return -ENOMEM;
1653 }
1654
1655
1656
1657
1658
1659 vdev->parent = &dev->intf->dev;
1660 vdev->fops = &uvc_fops;
1661 vdev->release = uvc_release;
1662 strlcpy(vdev->name, dev->name, sizeof vdev->name);
1663
1664
1665
1666
1667 stream->vdev = vdev;
1668 video_set_drvdata(vdev, stream);
1669
1670 ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
1671 if (ret < 0) {
1672 uvc_printk(KERN_ERR, "Failed to register video device (%d).\n",
1673 ret);
1674 stream->vdev = NULL;
1675 video_device_release(vdev);
1676 return ret;
1677 }
1678
1679 atomic_inc(&dev->nstreams);
1680 return 0;
1681}
1682
1683
1684
1685
1686static int uvc_register_terms(struct uvc_device *dev,
1687 struct uvc_video_chain *chain)
1688{
1689 struct uvc_streaming *stream;
1690 struct uvc_entity *term;
1691 int ret;
1692
1693 list_for_each_entry(term, &chain->entities, chain) {
1694 if (UVC_ENTITY_TYPE(term) != UVC_TT_STREAMING)
1695 continue;
1696
1697 stream = uvc_stream_by_id(dev, term->id);
1698 if (stream == NULL) {
1699 uvc_printk(KERN_INFO, "No streaming interface found "
1700 "for terminal %u.", term->id);
1701 continue;
1702 }
1703
1704 stream->chain = chain;
1705 ret = uvc_register_video(dev, stream);
1706 if (ret < 0)
1707 return ret;
1708 }
1709
1710 return 0;
1711}
1712
1713static int uvc_register_chains(struct uvc_device *dev)
1714{
1715 struct uvc_video_chain *chain;
1716 int ret;
1717
1718 list_for_each_entry(chain, &dev->chains, list) {
1719 ret = uvc_register_terms(dev, chain);
1720 if (ret < 0)
1721 return ret;
1722 }
1723
1724 return 0;
1725}
1726
1727
1728
1729
1730
1731static int uvc_probe(struct usb_interface *intf,
1732 const struct usb_device_id *id)
1733{
1734 struct usb_device *udev = interface_to_usbdev(intf);
1735 struct uvc_device *dev;
1736 int ret;
1737
1738 if (id->idVendor && id->idProduct)
1739 uvc_trace(UVC_TRACE_PROBE, "Probing known UVC device %s "
1740 "(%04x:%04x)\n", udev->devpath, id->idVendor,
1741 id->idProduct);
1742 else
1743 uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n",
1744 udev->devpath);
1745
1746
1747 if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL)
1748 return -ENOMEM;
1749
1750 INIT_LIST_HEAD(&dev->entities);
1751 INIT_LIST_HEAD(&dev->chains);
1752 INIT_LIST_HEAD(&dev->streams);
1753 atomic_set(&dev->nstreams, 0);
1754 atomic_set(&dev->users, 0);
1755
1756 dev->udev = usb_get_dev(udev);
1757 dev->intf = usb_get_intf(intf);
1758 dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
1759 dev->quirks = (uvc_quirks_param == -1)
1760 ? id->driver_info : uvc_quirks_param;
1761
1762 if (udev->product != NULL)
1763 strlcpy(dev->name, udev->product, sizeof dev->name);
1764 else
1765 snprintf(dev->name, sizeof dev->name,
1766 "UVC Camera (%04x:%04x)",
1767 le16_to_cpu(udev->descriptor.idVendor),
1768 le16_to_cpu(udev->descriptor.idProduct));
1769
1770
1771 if (uvc_parse_control(dev) < 0) {
1772 uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC "
1773 "descriptors.\n");
1774 goto error;
1775 }
1776
1777 uvc_printk(KERN_INFO, "Found UVC %u.%02x device %s (%04x:%04x)\n",
1778 dev->uvc_version >> 8, dev->uvc_version & 0xff,
1779 udev->product ? udev->product : "<unnamed>",
1780 le16_to_cpu(udev->descriptor.idVendor),
1781 le16_to_cpu(udev->descriptor.idProduct));
1782
1783 if (dev->quirks != id->driver_info) {
1784 uvc_printk(KERN_INFO, "Forcing device quirks to 0x%x by module "
1785 "parameter for testing purpose.\n", dev->quirks);
1786 uvc_printk(KERN_INFO, "Please report required quirks to the "
1787 "linux-uvc-devel mailing list.\n");
1788 }
1789
1790
1791 if (uvc_ctrl_init_device(dev) < 0)
1792 goto error;
1793
1794
1795 if (uvc_scan_device(dev) < 0)
1796 goto error;
1797
1798
1799 if (uvc_register_chains(dev) < 0)
1800 goto error;
1801
1802
1803 usb_set_intfdata(intf, dev);
1804
1805
1806 if ((ret = uvc_status_init(dev)) < 0) {
1807 uvc_printk(KERN_INFO, "Unable to initialize the status "
1808 "endpoint (%d), status interrupt will not be "
1809 "supported.\n", ret);
1810 }
1811
1812 uvc_trace(UVC_TRACE_PROBE, "UVC device initialized.\n");
1813 return 0;
1814
1815error:
1816 uvc_unregister_video(dev);
1817 return -ENODEV;
1818}
1819
1820static void uvc_disconnect(struct usb_interface *intf)
1821{
1822 struct uvc_device *dev = usb_get_intfdata(intf);
1823
1824
1825
1826
1827 usb_set_intfdata(intf, NULL);
1828
1829 if (intf->cur_altsetting->desc.bInterfaceSubClass ==
1830 UVC_SC_VIDEOSTREAMING)
1831 return;
1832
1833 dev->state |= UVC_DEV_DISCONNECTED;
1834
1835 uvc_unregister_video(dev);
1836}
1837
1838static int uvc_suspend(struct usb_interface *intf, pm_message_t message)
1839{
1840 struct uvc_device *dev = usb_get_intfdata(intf);
1841 struct uvc_streaming *stream;
1842
1843 uvc_trace(UVC_TRACE_SUSPEND, "Suspending interface %u\n",
1844 intf->cur_altsetting->desc.bInterfaceNumber);
1845
1846
1847 if (intf->cur_altsetting->desc.bInterfaceSubClass ==
1848 UVC_SC_VIDEOCONTROL)
1849 return uvc_status_suspend(dev);
1850
1851 list_for_each_entry(stream, &dev->streams, list) {
1852 if (stream->intf == intf)
1853 return uvc_video_suspend(stream);
1854 }
1855
1856 uvc_trace(UVC_TRACE_SUSPEND, "Suspend: video streaming USB interface "
1857 "mismatch.\n");
1858 return -EINVAL;
1859}
1860
1861static int __uvc_resume(struct usb_interface *intf, int reset)
1862{
1863 struct uvc_device *dev = usb_get_intfdata(intf);
1864 struct uvc_streaming *stream;
1865
1866 uvc_trace(UVC_TRACE_SUSPEND, "Resuming interface %u\n",
1867 intf->cur_altsetting->desc.bInterfaceNumber);
1868
1869 if (intf->cur_altsetting->desc.bInterfaceSubClass ==
1870 UVC_SC_VIDEOCONTROL) {
1871 if (reset) {
1872 int ret = uvc_ctrl_resume_device(dev);
1873
1874 if (ret < 0)
1875 return ret;
1876 }
1877
1878 return uvc_status_resume(dev);
1879 }
1880
1881 list_for_each_entry(stream, &dev->streams, list) {
1882 if (stream->intf == intf)
1883 return uvc_video_resume(stream);
1884 }
1885
1886 uvc_trace(UVC_TRACE_SUSPEND, "Resume: video streaming USB interface "
1887 "mismatch.\n");
1888 return -EINVAL;
1889}
1890
1891static int uvc_resume(struct usb_interface *intf)
1892{
1893 return __uvc_resume(intf, 0);
1894}
1895
1896static int uvc_reset_resume(struct usb_interface *intf)
1897{
1898 return __uvc_resume(intf, 1);
1899}
1900
1901
1902
1903
1904
1905static int uvc_clock_param_get(char *buffer, struct kernel_param *kp)
1906{
1907 if (uvc_clock_param == CLOCK_MONOTONIC)
1908 return sprintf(buffer, "CLOCK_MONOTONIC");
1909 else
1910 return sprintf(buffer, "CLOCK_REALTIME");
1911}
1912
1913static int uvc_clock_param_set(const char *val, struct kernel_param *kp)
1914{
1915 if (strncasecmp(val, "clock_", strlen("clock_")) == 0)
1916 val += strlen("clock_");
1917
1918 if (strcasecmp(val, "monotonic") == 0)
1919 uvc_clock_param = CLOCK_MONOTONIC;
1920 else if (strcasecmp(val, "realtime") == 0)
1921 uvc_clock_param = CLOCK_REALTIME;
1922 else
1923 return -EINVAL;
1924
1925 return 0;
1926}
1927
1928module_param_call(clock, uvc_clock_param_set, uvc_clock_param_get,
1929 &uvc_clock_param, S_IRUGO|S_IWUSR);
1930MODULE_PARM_DESC(clock, "Video buffers timestamp clock");
1931module_param_named(nodrop, uvc_no_drop_param, uint, S_IRUGO|S_IWUSR);
1932MODULE_PARM_DESC(nodrop, "Don't drop incomplete frames");
1933module_param_named(quirks, uvc_quirks_param, uint, S_IRUGO|S_IWUSR);
1934MODULE_PARM_DESC(quirks, "Forced device quirks");
1935module_param_named(trace, uvc_trace_param, uint, S_IRUGO|S_IWUSR);
1936MODULE_PARM_DESC(trace, "Trace level bitmask");
1937module_param_named(timeout, uvc_timeout_param, uint, S_IRUGO|S_IWUSR);
1938MODULE_PARM_DESC(timeout, "Streaming control requests timeout");
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949static struct usb_device_id uvc_ids[] = {
1950
1951 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
1952 | USB_DEVICE_ID_MATCH_INT_INFO,
1953 .idVendor = 0x0458,
1954 .idProduct = 0x706e,
1955 .bInterfaceClass = USB_CLASS_VIDEO,
1956 .bInterfaceSubClass = 1,
1957 .bInterfaceProtocol = 0,
1958 .driver_info = UVC_QUIRK_PROBE_MINMAX },
1959
1960 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
1961 | USB_DEVICE_ID_MATCH_INT_INFO,
1962 .idVendor = 0x045e,
1963 .idProduct = 0x00f8,
1964 .bInterfaceClass = USB_CLASS_VIDEO,
1965 .bInterfaceSubClass = 1,
1966 .bInterfaceProtocol = 0,
1967 .driver_info = UVC_QUIRK_PROBE_MINMAX },
1968
1969 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
1970 | USB_DEVICE_ID_MATCH_INT_INFO,
1971 .idVendor = 0x045e,
1972 .idProduct = 0x0723,
1973 .bInterfaceClass = USB_CLASS_VIDEO,
1974 .bInterfaceSubClass = 1,
1975 .bInterfaceProtocol = 0,
1976 .driver_info = UVC_QUIRK_PROBE_MINMAX },
1977
1978 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
1979 | USB_DEVICE_ID_MATCH_INT_INFO,
1980 .idVendor = 0x046d,
1981 .idProduct = 0x08c1,
1982 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
1983 .bInterfaceSubClass = 1,
1984 .bInterfaceProtocol = 0 },
1985
1986 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
1987 | USB_DEVICE_ID_MATCH_INT_INFO,
1988 .idVendor = 0x046d,
1989 .idProduct = 0x08c2,
1990 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
1991 .bInterfaceSubClass = 1,
1992 .bInterfaceProtocol = 0 },
1993
1994 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
1995 | USB_DEVICE_ID_MATCH_INT_INFO,
1996 .idVendor = 0x046d,
1997 .idProduct = 0x08c3,
1998 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
1999 .bInterfaceSubClass = 1,
2000 .bInterfaceProtocol = 0 },
2001
2002 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2003 | USB_DEVICE_ID_MATCH_INT_INFO,
2004 .idVendor = 0x046d,
2005 .idProduct = 0x08c5,
2006 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
2007 .bInterfaceSubClass = 1,
2008 .bInterfaceProtocol = 0 },
2009
2010 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2011 | USB_DEVICE_ID_MATCH_INT_INFO,
2012 .idVendor = 0x046d,
2013 .idProduct = 0x08c6,
2014 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
2015 .bInterfaceSubClass = 1,
2016 .bInterfaceProtocol = 0 },
2017
2018 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2019 | USB_DEVICE_ID_MATCH_INT_INFO,
2020 .idVendor = 0x046d,
2021 .idProduct = 0x08c7,
2022 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
2023 .bInterfaceSubClass = 1,
2024 .bInterfaceProtocol = 0 },
2025
2026 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2027 | USB_DEVICE_ID_MATCH_INT_INFO,
2028 .idVendor = 0x058f,
2029 .idProduct = 0x3820,
2030 .bInterfaceClass = USB_CLASS_VIDEO,
2031 .bInterfaceSubClass = 1,
2032 .bInterfaceProtocol = 0,
2033 .driver_info = UVC_QUIRK_PROBE_MINMAX },
2034
2035 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2036 | USB_DEVICE_ID_MATCH_INT_INFO,
2037 .idVendor = 0x05ac,
2038 .idProduct = 0x8501,
2039 .bInterfaceClass = USB_CLASS_VIDEO,
2040 .bInterfaceSubClass = 1,
2041 .bInterfaceProtocol = 0,
2042 .driver_info = UVC_QUIRK_PROBE_MINMAX
2043 | UVC_QUIRK_BUILTIN_ISIGHT },
2044
2045 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2046 | USB_DEVICE_ID_MATCH_INT_INFO,
2047 .idVendor = 0x05e3,
2048 .idProduct = 0x0505,
2049 .bInterfaceClass = USB_CLASS_VIDEO,
2050 .bInterfaceSubClass = 1,
2051 .bInterfaceProtocol = 0,
2052 .driver_info = UVC_QUIRK_STREAM_NO_FID },
2053
2054 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2055 | USB_DEVICE_ID_MATCH_INT_INFO,
2056 .idVendor = 0x0ac8,
2057 .idProduct = 0x332d,
2058 .bInterfaceClass = USB_CLASS_VIDEO,
2059 .bInterfaceSubClass = 1,
2060 .bInterfaceProtocol = 0,
2061 .driver_info = UVC_QUIRK_FIX_BANDWIDTH },
2062
2063 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2064 | USB_DEVICE_ID_MATCH_INT_INFO,
2065 .idVendor = 0x0ac8,
2066 .idProduct = 0x3410,
2067 .bInterfaceClass = USB_CLASS_VIDEO,
2068 .bInterfaceSubClass = 1,
2069 .bInterfaceProtocol = 0,
2070 .driver_info = UVC_QUIRK_FIX_BANDWIDTH },
2071
2072 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2073 | USB_DEVICE_ID_MATCH_INT_INFO,
2074 .idVendor = 0x0ac8,
2075 .idProduct = 0x3420,
2076 .bInterfaceClass = USB_CLASS_VIDEO,
2077 .bInterfaceSubClass = 1,
2078 .bInterfaceProtocol = 0,
2079 .driver_info = UVC_QUIRK_FIX_BANDWIDTH },
2080
2081 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2082 | USB_DEVICE_ID_MATCH_INT_INFO,
2083 .idVendor = 0x0e8d,
2084 .idProduct = 0x0004,
2085 .bInterfaceClass = USB_CLASS_VIDEO,
2086 .bInterfaceSubClass = 1,
2087 .bInterfaceProtocol = 0,
2088 .driver_info = UVC_QUIRK_PROBE_MINMAX
2089 | UVC_QUIRK_PROBE_DEF },
2090
2091 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2092 | USB_DEVICE_ID_MATCH_INT_INFO,
2093 .idVendor = 0x174f,
2094 .idProduct = 0x5212,
2095 .bInterfaceClass = USB_CLASS_VIDEO,
2096 .bInterfaceSubClass = 1,
2097 .bInterfaceProtocol = 0,
2098 .driver_info = UVC_QUIRK_STREAM_NO_FID },
2099
2100 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2101 | USB_DEVICE_ID_MATCH_INT_INFO,
2102 .idVendor = 0x174f,
2103 .idProduct = 0x5931,
2104 .bInterfaceClass = USB_CLASS_VIDEO,
2105 .bInterfaceSubClass = 1,
2106 .bInterfaceProtocol = 0,
2107 .driver_info = UVC_QUIRK_STREAM_NO_FID },
2108
2109 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2110 | USB_DEVICE_ID_MATCH_INT_INFO,
2111 .idVendor = 0x174f,
2112 .idProduct = 0x8a31,
2113 .bInterfaceClass = USB_CLASS_VIDEO,
2114 .bInterfaceSubClass = 1,
2115 .bInterfaceProtocol = 0,
2116 .driver_info = UVC_QUIRK_STREAM_NO_FID },
2117
2118 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2119 | USB_DEVICE_ID_MATCH_INT_INFO,
2120 .idVendor = 0x174f,
2121 .idProduct = 0x8a33,
2122 .bInterfaceClass = USB_CLASS_VIDEO,
2123 .bInterfaceSubClass = 1,
2124 .bInterfaceProtocol = 0,
2125 .driver_info = UVC_QUIRK_STREAM_NO_FID },
2126
2127 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2128 | USB_DEVICE_ID_MATCH_INT_INFO,
2129 .idVendor = 0x174f,
2130 .idProduct = 0x8a34,
2131 .bInterfaceClass = USB_CLASS_VIDEO,
2132 .bInterfaceSubClass = 1,
2133 .bInterfaceProtocol = 0,
2134 .driver_info = UVC_QUIRK_STREAM_NO_FID },
2135
2136 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2137 | USB_DEVICE_ID_MATCH_INT_INFO,
2138 .idVendor = 0x17ef,
2139 .idProduct = 0x480b,
2140 .bInterfaceClass = USB_CLASS_VIDEO,
2141 .bInterfaceSubClass = 1,
2142 .bInterfaceProtocol = 0,
2143 .driver_info = UVC_QUIRK_STREAM_NO_FID },
2144
2145 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2146 | USB_DEVICE_ID_MATCH_INT_INFO,
2147 .idVendor = 0x1871,
2148 .idProduct = 0x0306,
2149 .bInterfaceClass = USB_CLASS_VIDEO,
2150 .bInterfaceSubClass = 1,
2151 .bInterfaceProtocol = 0,
2152 .driver_info = UVC_QUIRK_PROBE_MINMAX
2153 | UVC_QUIRK_PROBE_EXTRAFIELDS },
2154
2155 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2156 | USB_DEVICE_ID_MATCH_INT_INFO,
2157 .idVendor = 0x18cd,
2158 .idProduct = 0xcafe,
2159 .bInterfaceClass = USB_CLASS_VIDEO,
2160 .bInterfaceSubClass = 1,
2161 .bInterfaceProtocol = 0,
2162 .driver_info = UVC_QUIRK_PROBE_EXTRAFIELDS },
2163
2164 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2165 | USB_DEVICE_ID_MATCH_INT_INFO,
2166 .idVendor = 0x18ec,
2167 .idProduct = 0x3288,
2168 .bInterfaceClass = USB_CLASS_VIDEO,
2169 .bInterfaceSubClass = 1,
2170 .bInterfaceProtocol = 0,
2171 .driver_info = UVC_QUIRK_PROBE_MINMAX },
2172
2173 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2174 | USB_DEVICE_ID_MATCH_DEV_HI
2175 | USB_DEVICE_ID_MATCH_INT_INFO,
2176 .idVendor = 0x19ab,
2177 .idProduct = 0x1000,
2178 .bcdDevice_hi = 0x0126,
2179 .bInterfaceClass = USB_CLASS_VIDEO,
2180 .bInterfaceSubClass = 1,
2181 .bInterfaceProtocol = 0,
2182 .driver_info = UVC_QUIRK_STATUS_INTERVAL },
2183
2184 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2185 | USB_DEVICE_ID_MATCH_INT_INFO,
2186 .idVendor = 0x1b3b,
2187 .idProduct = 0x2951,
2188 .bInterfaceClass = USB_CLASS_VIDEO,
2189 .bInterfaceSubClass = 1,
2190 .bInterfaceProtocol = 0,
2191 .driver_info = UVC_QUIRK_PROBE_MINMAX },
2192
2193 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
2194 | USB_DEVICE_ID_MATCH_INT_INFO,
2195 .idVendor = 0x1c4f,
2196 .idProduct = 0x3000,
2197 .bInterfaceClass = USB_CLASS_VIDEO,
2198 .bInterfaceSubClass = 1,
2199 .bInterfaceProtocol = 0,
2200 .driver_info = UVC_QUIRK_PROBE_MINMAX
2201 | UVC_QUIRK_IGNORE_SELECTOR_UNIT },
2202
2203 { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) },
2204 {}
2205};
2206
2207MODULE_DEVICE_TABLE(usb, uvc_ids);
2208
2209struct uvc_driver uvc_driver = {
2210 .driver = {
2211 .name = "uvcvideo",
2212 .probe = uvc_probe,
2213 .disconnect = uvc_disconnect,
2214 .suspend = uvc_suspend,
2215 .resume = uvc_resume,
2216 .reset_resume = uvc_reset_resume,
2217 .id_table = uvc_ids,
2218 .supports_autosuspend = 1,
2219 },
2220};
2221
2222static int __init uvc_init(void)
2223{
2224 int result;
2225
2226 INIT_LIST_HEAD(&uvc_driver.devices);
2227 INIT_LIST_HEAD(&uvc_driver.controls);
2228 mutex_init(&uvc_driver.ctrl_mutex);
2229
2230 uvc_ctrl_init();
2231
2232 result = usb_register(&uvc_driver.driver);
2233 if (result == 0)
2234 printk(KERN_INFO DRIVER_DESC " (" DRIVER_VERSION ")\n");
2235 return result;
2236}
2237
2238static void __exit uvc_cleanup(void)
2239{
2240 usb_deregister(&uvc_driver.driver);
2241}
2242
2243module_init(uvc_init);
2244module_exit(uvc_cleanup);
2245
2246MODULE_AUTHOR(DRIVER_AUTHOR);
2247MODULE_DESCRIPTION(DRIVER_DESC);
2248MODULE_LICENSE("GPL");
2249MODULE_VERSION(DRIVER_VERSION);
2250
2251