Lines Matching +full:frame +full:- +full:buffer
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * uvc_driver.c -- USB Video Class driver
5 * Copyright (C) 2005-2010
21 #include <media/v4l2-common.h>
22 #include <media/v4l2-ioctl.h>
33 static unsigned int uvc_quirks_param = -1;
37 /* ------------------------------------------------------------------------
83 .name = "Greyscale 8-bit (Y800)",
88 .name = "Greyscale 8-bit (Y8 )",
93 .name = "Greyscale 8-bit (D3DFMT_L8)",
98 .name = "IR 8-bit (L8_IR)",
103 .name = "Greyscale 10-bit (Y10 )",
108 .name = "Greyscale 12-bit (Y12 )",
113 .name = "Greyscale 16-bit (Y16 )",
168 .name = "Depth data 16-bit (Z16)",
173 .name = "Bayer 10-bit (SRGGB10P)",
178 .name = "Bayer 16-bit (SBGGR16)",
183 .name = "Bayer 16-bit (SGBRG16)",
188 .name = "Bayer 16-bit (SRGGB16)",
193 .name = "Bayer 16-bit (SGRBG16)",
198 .name = "Depth data 16-bit (Z16)",
203 .name = "Greyscale 10-bit (Y10 )",
208 .name = "IR:Depth 26-bit (INZI)",
213 .name = "4-bit Depth Confidence (Packed)",
219 /* ------------------------------------------------------------------------
229 for (i = 0; i < alts->desc.bNumEndpoints; ++i) { in uvc_find_endpoint()
230 ep = &alts->endpoint[i]; in uvc_find_endpoint()
231 if (ep->desc.bEndpointAddress == epaddr) in uvc_find_endpoint()
271 * arbitrary parameters to remove non-significative terms from the simple
302 r = x - an[n] * y; in uvc_simplify_fraction()
311 for (i = n; i > 0; --i) { in uvc_simplify_fraction()
313 y = an[i-1] * y + x; in uvc_simplify_fraction()
322 /* Convert a fraction to a frame interval in 100ns multiples. The idea here is
332 numerator/denominator >= ((u32)-1)/10000000) in uvc_fraction_to_interval()
333 return (u32)-1; in uvc_fraction_to_interval()
340 while (numerator > ((u32)-1)/multiplier) { in uvc_fraction_to_interval()
348 /* ------------------------------------------------------------------------
356 list_for_each_entry(entity, &dev->entities, list) { in uvc_entity_by_id()
357 if (entity->id == id) in uvc_entity_by_id()
370 entity = list_entry(&dev->entities, struct uvc_entity, list); in uvc_entity_by_reference()
372 list_for_each_entry_continue(entity, &dev->entities, list) { in uvc_entity_by_reference()
373 for (i = 0; i < entity->bNrInPins; ++i) in uvc_entity_by_reference()
374 if (entity->baSourceID[i] == id) in uvc_entity_by_reference()
385 list_for_each_entry(stream, &dev->streams, list) { in uvc_stream_by_id()
386 if (stream->header.bTerminalLink == id) in uvc_stream_by_id()
393 /* ------------------------------------------------------------------------
399 if (stream->async_wq) in uvc_stream_delete()
400 destroy_workqueue(stream->async_wq); in uvc_stream_delete()
402 mutex_destroy(&stream->mutex); in uvc_stream_delete()
404 usb_put_intf(stream->intf); in uvc_stream_delete()
406 kfree(stream->format); in uvc_stream_delete()
407 kfree(stream->header.bmaControls); in uvc_stream_delete()
420 mutex_init(&stream->mutex); in uvc_stream_new()
422 stream->dev = dev; in uvc_stream_new()
423 stream->intf = usb_get_intf(intf); in uvc_stream_new()
424 stream->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; in uvc_stream_new()
427 stream->async_wq = alloc_workqueue("uvcvideo", WQ_UNBOUND | WQ_HIGHPRI, in uvc_stream_new()
429 if (!stream->async_wq) { in uvc_stream_new()
437 /* ------------------------------------------------------------------------
443 u32 **intervals, unsigned char *buffer, int buflen) in uvc_parse_format() argument
445 struct usb_interface *intf = streaming->intf; in uvc_parse_format()
446 struct usb_host_interface *alts = intf->cur_altsetting; in uvc_parse_format()
448 struct uvc_frame *frame; in uvc_parse_format() local
449 const unsigned char *start = buffer; in uvc_parse_format()
455 format->type = buffer[2]; in uvc_parse_format()
456 format->index = buffer[3]; in uvc_parse_format()
458 switch (buffer[2]) { in uvc_parse_format()
461 n = buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED ? 27 : 28; in uvc_parse_format()
465 dev->udev->devnum, in uvc_parse_format()
466 alts->desc.bInterfaceNumber); in uvc_parse_format()
467 return -EINVAL; in uvc_parse_format()
471 fmtdesc = uvc_format_by_guid(&buffer[5]); in uvc_parse_format()
474 strscpy(format->name, fmtdesc->name, in uvc_parse_format()
475 sizeof(format->name)); in uvc_parse_format()
476 format->fcc = fmtdesc->fcc; in uvc_parse_format()
479 &buffer[5]); in uvc_parse_format()
480 snprintf(format->name, sizeof(format->name), "%pUl\n", in uvc_parse_format()
481 &buffer[5]); in uvc_parse_format()
482 format->fcc = 0; in uvc_parse_format()
485 format->bpp = buffer[21]; in uvc_parse_format()
490 if (dev->quirks & UVC_QUIRK_FORCE_Y8) { in uvc_parse_format()
491 if (format->fcc == V4L2_PIX_FMT_YUYV) { in uvc_parse_format()
492 strscpy(format->name, "Greyscale 8-bit (Y8 )", in uvc_parse_format()
493 sizeof(format->name)); in uvc_parse_format()
494 format->fcc = V4L2_PIX_FMT_GREY; in uvc_parse_format()
495 format->bpp = 8; in uvc_parse_format()
500 if (buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED) { in uvc_parse_format()
504 if (buffer[27]) in uvc_parse_format()
505 format->flags = UVC_FMT_FLAG_COMPRESSED; in uvc_parse_format()
513 dev->udev->devnum, in uvc_parse_format()
514 alts->desc.bInterfaceNumber); in uvc_parse_format()
515 return -EINVAL; in uvc_parse_format()
518 strscpy(format->name, "MJPEG", sizeof(format->name)); in uvc_parse_format()
519 format->fcc = V4L2_PIX_FMT_MJPEG; in uvc_parse_format()
520 format->flags = UVC_FMT_FLAG_COMPRESSED; in uvc_parse_format()
521 format->bpp = 0; in uvc_parse_format()
529 dev->udev->devnum, in uvc_parse_format()
530 alts->desc.bInterfaceNumber); in uvc_parse_format()
531 return -EINVAL; in uvc_parse_format()
534 switch (buffer[8] & 0x7f) { in uvc_parse_format()
536 strscpy(format->name, "SD-DV", sizeof(format->name)); in uvc_parse_format()
539 strscpy(format->name, "SDL-DV", sizeof(format->name)); in uvc_parse_format()
542 strscpy(format->name, "HD-DV", sizeof(format->name)); in uvc_parse_format()
547 dev->udev->devnum, in uvc_parse_format()
548 alts->desc.bInterfaceNumber, buffer[8]); in uvc_parse_format()
549 return -EINVAL; in uvc_parse_format()
552 strlcat(format->name, buffer[8] & (1 << 7) ? " 60Hz" : " 50Hz", in uvc_parse_format()
553 sizeof(format->name)); in uvc_parse_format()
555 format->fcc = V4L2_PIX_FMT_DV; in uvc_parse_format()
556 format->flags = UVC_FMT_FLAG_COMPRESSED | UVC_FMT_FLAG_STREAM; in uvc_parse_format()
557 format->bpp = 0; in uvc_parse_format()
560 /* Create a dummy frame descriptor. */ in uvc_parse_format()
561 frame = &format->frame[0]; in uvc_parse_format()
562 memset(&format->frame[0], 0, sizeof(format->frame[0])); in uvc_parse_format()
563 frame->bFrameIntervalType = 1; in uvc_parse_format()
564 frame->dwDefaultFrameInterval = 1; in uvc_parse_format()
565 frame->dwFrameInterval = *intervals; in uvc_parse_format()
567 format->nframes = 1; in uvc_parse_format()
576 dev->udev->devnum, alts->desc.bInterfaceNumber, in uvc_parse_format()
577 buffer[2]); in uvc_parse_format()
578 return -EINVAL; in uvc_parse_format()
581 uvc_trace(UVC_TRACE_DESCR, "Found format %s.\n", format->name); in uvc_parse_format()
583 buflen -= buffer[0]; in uvc_parse_format()
584 buffer += buffer[0]; in uvc_parse_format()
586 /* Parse the frame descriptors. Only uncompressed, MJPEG and frame in uvc_parse_format()
587 * based formats have frame descriptors. in uvc_parse_format()
589 while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE && in uvc_parse_format()
590 buffer[2] == ftype) { in uvc_parse_format()
591 frame = &format->frame[format->nframes]; in uvc_parse_format()
593 n = buflen > 25 ? buffer[25] : 0; in uvc_parse_format()
595 n = buflen > 21 ? buffer[21] : 0; in uvc_parse_format()
601 "interface %d FRAME error\n", dev->udev->devnum, in uvc_parse_format()
602 alts->desc.bInterfaceNumber); in uvc_parse_format()
603 return -EINVAL; in uvc_parse_format()
606 frame->bFrameIndex = buffer[3]; in uvc_parse_format()
607 frame->bmCapabilities = buffer[4]; in uvc_parse_format()
608 frame->wWidth = get_unaligned_le16(&buffer[5]) in uvc_parse_format()
610 frame->wHeight = get_unaligned_le16(&buffer[7]); in uvc_parse_format()
611 frame->dwMinBitRate = get_unaligned_le32(&buffer[9]); in uvc_parse_format()
612 frame->dwMaxBitRate = get_unaligned_le32(&buffer[13]); in uvc_parse_format()
614 frame->dwMaxVideoFrameBufferSize = in uvc_parse_format()
615 get_unaligned_le32(&buffer[17]); in uvc_parse_format()
616 frame->dwDefaultFrameInterval = in uvc_parse_format()
617 get_unaligned_le32(&buffer[21]); in uvc_parse_format()
618 frame->bFrameIntervalType = buffer[25]; in uvc_parse_format()
620 frame->dwMaxVideoFrameBufferSize = 0; in uvc_parse_format()
621 frame->dwDefaultFrameInterval = in uvc_parse_format()
622 get_unaligned_le32(&buffer[17]); in uvc_parse_format()
623 frame->bFrameIntervalType = buffer[21]; in uvc_parse_format()
625 frame->dwFrameInterval = *intervals; in uvc_parse_format()
629 * value to 1.1x the actual frame size to hardwiring the in uvc_parse_format()
633 * value from the frame size. in uvc_parse_format()
635 if (!(format->flags & UVC_FMT_FLAG_COMPRESSED)) in uvc_parse_format()
636 frame->dwMaxVideoFrameBufferSize = format->bpp in uvc_parse_format()
637 * frame->wWidth * frame->wHeight / 8; in uvc_parse_format()
645 interval = get_unaligned_le32(&buffer[26+4*i]); in uvc_parse_format()
649 /* Make sure that the default frame interval stays between in uvc_parse_format()
652 n -= frame->bFrameIntervalType ? 1 : 2; in uvc_parse_format()
653 frame->dwDefaultFrameInterval = in uvc_parse_format()
654 min(frame->dwFrameInterval[n], in uvc_parse_format()
655 max(frame->dwFrameInterval[0], in uvc_parse_format()
656 frame->dwDefaultFrameInterval)); in uvc_parse_format()
658 if (dev->quirks & UVC_QUIRK_RESTRICT_FRAME_RATE) { in uvc_parse_format()
659 frame->bFrameIntervalType = 1; in uvc_parse_format()
660 frame->dwFrameInterval[0] = in uvc_parse_format()
661 frame->dwDefaultFrameInterval; in uvc_parse_format()
664 uvc_trace(UVC_TRACE_DESCR, "- %ux%u (%u.%u fps)\n", in uvc_parse_format()
665 frame->wWidth, frame->wHeight, in uvc_parse_format()
666 10000000/frame->dwDefaultFrameInterval, in uvc_parse_format()
667 (100000000/frame->dwDefaultFrameInterval)%10); in uvc_parse_format()
669 format->nframes++; in uvc_parse_format()
670 buflen -= buffer[0]; in uvc_parse_format()
671 buffer += buffer[0]; in uvc_parse_format()
674 if (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE && in uvc_parse_format()
675 buffer[2] == UVC_VS_STILL_IMAGE_FRAME) { in uvc_parse_format()
676 buflen -= buffer[0]; in uvc_parse_format()
677 buffer += buffer[0]; in uvc_parse_format()
680 if (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE && in uvc_parse_format()
681 buffer[2] == UVC_VS_COLORFORMAT) { in uvc_parse_format()
685 dev->udev->devnum, in uvc_parse_format()
686 alts->desc.bInterfaceNumber); in uvc_parse_format()
687 return -EINVAL; in uvc_parse_format()
690 format->colorspace = uvc_colorspace(buffer[3]); in uvc_parse_format()
692 buflen -= buffer[0]; in uvc_parse_format()
693 buffer += buffer[0]; in uvc_parse_format()
696 return buffer - start; in uvc_parse_format()
704 struct uvc_frame *frame; in uvc_parse_streaming() local
705 struct usb_host_interface *alts = &intf->altsetting[0]; in uvc_parse_streaming()
706 unsigned char *_buffer, *buffer = alts->extra; in uvc_parse_streaming() local
707 int _buflen, buflen = alts->extralen; in uvc_parse_streaming()
712 int ret = -EINVAL; in uvc_parse_streaming()
714 if (intf->cur_altsetting->desc.bInterfaceSubClass in uvc_parse_streaming()
717 "video streaming interface\n", dev->udev->devnum, in uvc_parse_streaming()
718 intf->altsetting[0].desc.bInterfaceNumber); in uvc_parse_streaming()
719 return -EINVAL; in uvc_parse_streaming()
724 "claimed\n", dev->udev->devnum, in uvc_parse_streaming()
725 intf->altsetting[0].desc.bInterfaceNumber); in uvc_parse_streaming()
726 return -EINVAL; in uvc_parse_streaming()
732 return -ENOMEM; in uvc_parse_streaming()
735 /* The Pico iMage webcam has its class-specific interface descriptors in uvc_parse_streaming()
739 for (i = 0; i < alts->desc.bNumEndpoints; ++i) { in uvc_parse_streaming()
740 struct usb_host_endpoint *ep = &alts->endpoint[i]; in uvc_parse_streaming()
742 if (ep->extralen == 0) in uvc_parse_streaming()
745 if (ep->extralen > 2 && in uvc_parse_streaming()
746 ep->extra[1] == USB_DT_CS_INTERFACE) { in uvc_parse_streaming()
749 buffer = alts->endpoint[i].extra; in uvc_parse_streaming()
750 buflen = alts->endpoint[i].extralen; in uvc_parse_streaming()
757 while (buflen > 2 && buffer[1] != USB_DT_CS_INTERFACE) { in uvc_parse_streaming()
758 buflen -= buffer[0]; in uvc_parse_streaming()
759 buffer += buffer[0]; in uvc_parse_streaming()
763 uvc_trace(UVC_TRACE_DESCR, "no class-specific streaming " in uvc_parse_streaming()
769 switch (buffer[2]) { in uvc_parse_streaming()
771 streaming->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; in uvc_parse_streaming()
776 streaming->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in uvc_parse_streaming()
782 "%d HEADER descriptor not found.\n", dev->udev->devnum, in uvc_parse_streaming()
783 alts->desc.bInterfaceNumber); in uvc_parse_streaming()
787 p = buflen >= 4 ? buffer[3] : 0; in uvc_parse_streaming()
788 n = buflen >= size ? buffer[size-1] : 0; in uvc_parse_streaming()
793 dev->udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_streaming()
797 streaming->header.bNumFormats = p; in uvc_parse_streaming()
798 streaming->header.bEndpointAddress = buffer[6]; in uvc_parse_streaming()
799 if (buffer[2] == UVC_VS_INPUT_HEADER) { in uvc_parse_streaming()
800 streaming->header.bmInfo = buffer[7]; in uvc_parse_streaming()
801 streaming->header.bTerminalLink = buffer[8]; in uvc_parse_streaming()
802 streaming->header.bStillCaptureMethod = buffer[9]; in uvc_parse_streaming()
803 streaming->header.bTriggerSupport = buffer[10]; in uvc_parse_streaming()
804 streaming->header.bTriggerUsage = buffer[11]; in uvc_parse_streaming()
806 streaming->header.bTerminalLink = buffer[7]; in uvc_parse_streaming()
808 streaming->header.bControlSize = n; in uvc_parse_streaming()
810 streaming->header.bmaControls = kmemdup(&buffer[size], p * n, in uvc_parse_streaming()
812 if (streaming->header.bmaControls == NULL) { in uvc_parse_streaming()
813 ret = -ENOMEM; in uvc_parse_streaming()
817 buflen -= buffer[0]; in uvc_parse_streaming()
818 buffer += buffer[0]; in uvc_parse_streaming()
820 _buffer = buffer; in uvc_parse_streaming()
823 /* Count the format and frame descriptors. */ in uvc_parse_streaming()
833 /* DV format has no frame descriptor. We will create a in uvc_parse_streaming()
834 * dummy frame descriptor with a dummy frame interval. in uvc_parse_streaming()
845 dev->udev->devnum, in uvc_parse_streaming()
846 alts->desc.bInterfaceNumber, _buffer[2]); in uvc_parse_streaming()
863 _buflen -= _buffer[0]; in uvc_parse_streaming()
870 dev->udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_streaming()
874 size = nformats * sizeof(*format) + nframes * sizeof(*frame) in uvc_parse_streaming()
878 ret = -ENOMEM; in uvc_parse_streaming()
882 frame = (struct uvc_frame *)&format[nformats]; in uvc_parse_streaming()
883 interval = (u32 *)&frame[nframes]; in uvc_parse_streaming()
885 streaming->format = format; in uvc_parse_streaming()
886 streaming->nformats = nformats; in uvc_parse_streaming()
889 while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE) { in uvc_parse_streaming()
890 switch (buffer[2]) { in uvc_parse_streaming()
895 format->frame = frame; in uvc_parse_streaming()
897 &interval, buffer, buflen); in uvc_parse_streaming()
901 frame += format->nframes; in uvc_parse_streaming()
904 buflen -= ret; in uvc_parse_streaming()
905 buffer += ret; in uvc_parse_streaming()
912 buflen -= buffer[0]; in uvc_parse_streaming()
913 buffer += buffer[0]; in uvc_parse_streaming()
919 dev->udev->devnum, alts->desc.bInterfaceNumber, buflen); in uvc_parse_streaming()
922 for (i = 0; i < intf->num_altsetting; ++i) { in uvc_parse_streaming()
924 alts = &intf->altsetting[i]; in uvc_parse_streaming()
926 streaming->header.bEndpointAddress); in uvc_parse_streaming()
930 psize = le16_to_cpu(ep->desc.wMaxPacketSize); in uvc_parse_streaming()
932 if (psize > streaming->maxpsize) in uvc_parse_streaming()
933 streaming->maxpsize = psize; in uvc_parse_streaming()
936 list_add_tail(&streaming->list, &dev->streams); in uvc_parse_streaming()
953 extra_size = roundup(extra_size, sizeof(*entity->pads)); in uvc_alloc_entity()
954 num_inputs = (type & UVC_TERM_OUTPUT) ? num_pads : num_pads - 1; in uvc_alloc_entity()
955 size = sizeof(*entity) + extra_size + sizeof(*entity->pads) * num_pads in uvc_alloc_entity()
961 entity->id = id; in uvc_alloc_entity()
962 entity->type = type; in uvc_alloc_entity()
964 entity->num_links = 0; in uvc_alloc_entity()
965 entity->num_pads = num_pads; in uvc_alloc_entity()
966 entity->pads = ((void *)(entity + 1)) + extra_size; in uvc_alloc_entity()
969 entity->pads[i].flags = MEDIA_PAD_FL_SINK; in uvc_alloc_entity()
971 entity->pads[num_pads-1].flags = MEDIA_PAD_FL_SOURCE; in uvc_alloc_entity()
973 entity->bNrInPins = num_inputs; in uvc_alloc_entity()
974 entity->baSourceID = (u8 *)(&entity->pads[num_pads]); in uvc_alloc_entity()
979 /* Parse vendor-specific extensions. */
981 const unsigned char *buffer, int buflen) in uvc_parse_vendor_control() argument
983 struct usb_device *udev = dev->udev; in uvc_parse_vendor_control()
984 struct usb_host_interface *alts = dev->intf->cur_altsetting; in uvc_parse_vendor_control()
989 switch (le16_to_cpu(dev->udev->descriptor.idVendor)) { in uvc_parse_vendor_control()
991 if (buffer[1] != 0x41 || buffer[2] != 0x01) in uvc_parse_vendor_control()
1002 * ---------------------------------------------------------- in uvc_parse_vendor_control()
1005 * ---------------------------------------------------------- in uvc_parse_vendor_control()
1012 * ---------------------------------------------------------- in uvc_parse_vendor_control()
1014 * ---------------------------------------------------------- in uvc_parse_vendor_control()
1018 * ---------------------------------------------------------- in uvc_parse_vendor_control()
1020 p = buflen >= 22 ? buffer[21] : 0; in uvc_parse_vendor_control()
1021 n = buflen >= 25 + p ? buffer[22+p] : 0; in uvc_parse_vendor_control()
1026 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_vendor_control()
1030 unit = uvc_alloc_entity(UVC_VC_EXTENSION_UNIT, buffer[3], in uvc_parse_vendor_control()
1033 return -ENOMEM; in uvc_parse_vendor_control()
1035 memcpy(unit->extension.guidExtensionCode, &buffer[4], 16); in uvc_parse_vendor_control()
1036 unit->extension.bNumControls = buffer[20]; in uvc_parse_vendor_control()
1037 memcpy(unit->baSourceID, &buffer[22], p); in uvc_parse_vendor_control()
1038 unit->extension.bControlSize = buffer[22+p]; in uvc_parse_vendor_control()
1039 unit->extension.bmControls = (u8 *)unit + sizeof(*unit); in uvc_parse_vendor_control()
1040 unit->extension.bmControlsType = (u8 *)unit + sizeof(*unit) in uvc_parse_vendor_control()
1042 memcpy(unit->extension.bmControls, &buffer[23+p], 2*n); in uvc_parse_vendor_control()
1044 if (buffer[24+p+2*n] != 0) in uvc_parse_vendor_control()
1045 usb_string(udev, buffer[24+p+2*n], unit->name, in uvc_parse_vendor_control()
1046 sizeof(unit->name)); in uvc_parse_vendor_control()
1048 sprintf(unit->name, "Extension %u", buffer[3]); in uvc_parse_vendor_control()
1050 list_add_tail(&unit->list, &dev->entities); in uvc_parse_vendor_control()
1059 const unsigned char *buffer, int buflen) in uvc_parse_standard_control() argument
1061 struct usb_device *udev = dev->udev; in uvc_parse_standard_control()
1064 struct usb_host_interface *alts = dev->intf->cur_altsetting; in uvc_parse_standard_control()
1068 switch (buffer[2]) { in uvc_parse_standard_control()
1070 n = buflen >= 12 ? buffer[11] : 0; in uvc_parse_standard_control()
1074 "interface %d HEADER error\n", udev->devnum, in uvc_parse_standard_control()
1075 alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1076 return -EINVAL; in uvc_parse_standard_control()
1079 dev->uvc_version = get_unaligned_le16(&buffer[3]); in uvc_parse_standard_control()
1080 dev->clock_frequency = get_unaligned_le32(&buffer[7]); in uvc_parse_standard_control()
1084 intf = usb_ifnum_to_if(udev, buffer[12+i]); in uvc_parse_standard_control()
1088 udev->devnum, i); in uvc_parse_standard_control()
1100 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1101 return -EINVAL; in uvc_parse_standard_control()
1107 * - The high byte must be non-zero, otherwise it would be in uvc_parse_standard_control()
1110 * - Bit 15 must be 0, as we use it internally as a terminal in uvc_parse_standard_control()
1115 type = get_unaligned_le16(&buffer[4]); in uvc_parse_standard_control()
1119 "type 0x%04x, skipping\n", udev->devnum, in uvc_parse_standard_control()
1120 alts->desc.bInterfaceNumber, in uvc_parse_standard_control()
1121 buffer[3], type); in uvc_parse_standard_control()
1130 n = buflen >= 15 ? buffer[14] : 0; in uvc_parse_standard_control()
1134 n = buflen >= 9 ? buffer[8] : 0; in uvc_parse_standard_control()
1135 p = buflen >= 10 + n ? buffer[9+n] : 0; in uvc_parse_standard_control()
1142 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1143 return -EINVAL; in uvc_parse_standard_control()
1146 term = uvc_alloc_entity(type | UVC_TERM_INPUT, buffer[3], in uvc_parse_standard_control()
1149 return -ENOMEM; in uvc_parse_standard_control()
1152 term->camera.bControlSize = n; in uvc_parse_standard_control()
1153 term->camera.bmControls = (u8 *)term + sizeof(*term); in uvc_parse_standard_control()
1154 term->camera.wObjectiveFocalLengthMin = in uvc_parse_standard_control()
1155 get_unaligned_le16(&buffer[8]); in uvc_parse_standard_control()
1156 term->camera.wObjectiveFocalLengthMax = in uvc_parse_standard_control()
1157 get_unaligned_le16(&buffer[10]); in uvc_parse_standard_control()
1158 term->camera.wOcularFocalLength = in uvc_parse_standard_control()
1159 get_unaligned_le16(&buffer[12]); in uvc_parse_standard_control()
1160 memcpy(term->camera.bmControls, &buffer[15], n); in uvc_parse_standard_control()
1163 term->media.bControlSize = n; in uvc_parse_standard_control()
1164 term->media.bmControls = (u8 *)term + sizeof(*term); in uvc_parse_standard_control()
1165 term->media.bTransportModeSize = p; in uvc_parse_standard_control()
1166 term->media.bmTransportModes = (u8 *)term in uvc_parse_standard_control()
1168 memcpy(term->media.bmControls, &buffer[9], n); in uvc_parse_standard_control()
1169 memcpy(term->media.bmTransportModes, &buffer[10+n], p); in uvc_parse_standard_control()
1172 if (buffer[7] != 0) in uvc_parse_standard_control()
1173 usb_string(udev, buffer[7], term->name, in uvc_parse_standard_control()
1174 sizeof(term->name)); in uvc_parse_standard_control()
1176 sprintf(term->name, "Camera %u", buffer[3]); in uvc_parse_standard_control()
1178 sprintf(term->name, "Media %u", buffer[3]); in uvc_parse_standard_control()
1180 sprintf(term->name, "Input %u", buffer[3]); in uvc_parse_standard_control()
1182 list_add_tail(&term->list, &dev->entities); in uvc_parse_standard_control()
1189 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1190 return -EINVAL; in uvc_parse_standard_control()
1196 type = get_unaligned_le16(&buffer[4]); in uvc_parse_standard_control()
1200 "type 0x%04x, skipping\n", udev->devnum, in uvc_parse_standard_control()
1201 alts->desc.bInterfaceNumber, buffer[3], type); in uvc_parse_standard_control()
1205 term = uvc_alloc_entity(type | UVC_TERM_OUTPUT, buffer[3], in uvc_parse_standard_control()
1208 return -ENOMEM; in uvc_parse_standard_control()
1210 memcpy(term->baSourceID, &buffer[7], 1); in uvc_parse_standard_control()
1212 if (buffer[8] != 0) in uvc_parse_standard_control()
1213 usb_string(udev, buffer[8], term->name, in uvc_parse_standard_control()
1214 sizeof(term->name)); in uvc_parse_standard_control()
1216 sprintf(term->name, "Output %u", buffer[3]); in uvc_parse_standard_control()
1218 list_add_tail(&term->list, &dev->entities); in uvc_parse_standard_control()
1222 p = buflen >= 5 ? buffer[4] : 0; in uvc_parse_standard_control()
1227 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1228 return -EINVAL; in uvc_parse_standard_control()
1231 unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, 0); in uvc_parse_standard_control()
1233 return -ENOMEM; in uvc_parse_standard_control()
1235 memcpy(unit->baSourceID, &buffer[5], p); in uvc_parse_standard_control()
1237 if (buffer[5+p] != 0) in uvc_parse_standard_control()
1238 usb_string(udev, buffer[5+p], unit->name, in uvc_parse_standard_control()
1239 sizeof(unit->name)); in uvc_parse_standard_control()
1241 sprintf(unit->name, "Selector %u", buffer[3]); in uvc_parse_standard_control()
1243 list_add_tail(&unit->list, &dev->entities); in uvc_parse_standard_control()
1247 n = buflen >= 8 ? buffer[7] : 0; in uvc_parse_standard_control()
1248 p = dev->uvc_version >= 0x0110 ? 10 : 9; in uvc_parse_standard_control()
1253 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1254 return -EINVAL; in uvc_parse_standard_control()
1257 unit = uvc_alloc_entity(buffer[2], buffer[3], 2, n); in uvc_parse_standard_control()
1259 return -ENOMEM; in uvc_parse_standard_control()
1261 memcpy(unit->baSourceID, &buffer[4], 1); in uvc_parse_standard_control()
1262 unit->processing.wMaxMultiplier = in uvc_parse_standard_control()
1263 get_unaligned_le16(&buffer[5]); in uvc_parse_standard_control()
1264 unit->processing.bControlSize = buffer[7]; in uvc_parse_standard_control()
1265 unit->processing.bmControls = (u8 *)unit + sizeof(*unit); in uvc_parse_standard_control()
1266 memcpy(unit->processing.bmControls, &buffer[8], n); in uvc_parse_standard_control()
1267 if (dev->uvc_version >= 0x0110) in uvc_parse_standard_control()
1268 unit->processing.bmVideoStandards = buffer[9+n]; in uvc_parse_standard_control()
1270 if (buffer[8+n] != 0) in uvc_parse_standard_control()
1271 usb_string(udev, buffer[8+n], unit->name, in uvc_parse_standard_control()
1272 sizeof(unit->name)); in uvc_parse_standard_control()
1274 sprintf(unit->name, "Processing %u", buffer[3]); in uvc_parse_standard_control()
1276 list_add_tail(&unit->list, &dev->entities); in uvc_parse_standard_control()
1280 p = buflen >= 22 ? buffer[21] : 0; in uvc_parse_standard_control()
1281 n = buflen >= 24 + p ? buffer[22+p] : 0; in uvc_parse_standard_control()
1286 udev->devnum, alts->desc.bInterfaceNumber); in uvc_parse_standard_control()
1287 return -EINVAL; in uvc_parse_standard_control()
1290 unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, n); in uvc_parse_standard_control()
1292 return -ENOMEM; in uvc_parse_standard_control()
1294 memcpy(unit->extension.guidExtensionCode, &buffer[4], 16); in uvc_parse_standard_control()
1295 unit->extension.bNumControls = buffer[20]; in uvc_parse_standard_control()
1296 memcpy(unit->baSourceID, &buffer[22], p); in uvc_parse_standard_control()
1297 unit->extension.bControlSize = buffer[22+p]; in uvc_parse_standard_control()
1298 unit->extension.bmControls = (u8 *)unit + sizeof(*unit); in uvc_parse_standard_control()
1299 memcpy(unit->extension.bmControls, &buffer[23+p], n); in uvc_parse_standard_control()
1301 if (buffer[23+p+n] != 0) in uvc_parse_standard_control()
1302 usb_string(udev, buffer[23+p+n], unit->name, in uvc_parse_standard_control()
1303 sizeof(unit->name)); in uvc_parse_standard_control()
1305 sprintf(unit->name, "Extension %u", buffer[3]); in uvc_parse_standard_control()
1307 list_add_tail(&unit->list, &dev->entities); in uvc_parse_standard_control()
1312 "descriptor (%u)\n", buffer[2]); in uvc_parse_standard_control()
1321 struct usb_host_interface *alts = dev->intf->cur_altsetting; in uvc_parse_control()
1322 unsigned char *buffer = alts->extra; in uvc_parse_control() local
1323 int buflen = alts->extralen; in uvc_parse_control()
1332 if (uvc_parse_vendor_control(dev, buffer, buflen) || in uvc_parse_control()
1333 buffer[1] != USB_DT_CS_INTERFACE) in uvc_parse_control()
1336 if ((ret = uvc_parse_standard_control(dev, buffer, buflen)) < 0) in uvc_parse_control()
1340 buflen -= buffer[0]; in uvc_parse_control()
1341 buffer += buffer[0]; in uvc_parse_control()
1344 /* Check if the optional status endpoint is present. Built-in iSight in uvc_parse_control()
1349 if (alts->desc.bNumEndpoints == 1 && in uvc_parse_control()
1350 !(dev->quirks & UVC_QUIRK_BUILTIN_ISIGHT)) { in uvc_parse_control()
1351 struct usb_host_endpoint *ep = &alts->endpoint[0]; in uvc_parse_control()
1352 struct usb_endpoint_descriptor *desc = &ep->desc; in uvc_parse_control()
1355 le16_to_cpu(desc->wMaxPacketSize) >= 8 && in uvc_parse_control()
1356 desc->bInterval != 0) { in uvc_parse_control()
1358 "(addr %02x).\n", desc->bEndpointAddress); in uvc_parse_control()
1359 dev->int_ep = ep; in uvc_parse_control()
1366 /* ------------------------------------------------------------------------
1374 * - one or more Output Terminals (USB Streaming or Display)
1375 * - zero or one Processing Unit
1376 * - zero, one or more single-input Selector Units
1377 * - zero or one multiple-input Selector Units, provided all inputs are
1379 * - zero, one or mode single-input Extension Units
1380 * - one or more Input Terminals (Camera, External or USB Streaming)
1384 * ITT_*(0) -> +---------+ +---------+ +---------+ -> TT_STREAMING(0)
1385 * ... | SU{0,1} | -> | PU{0,1} | -> | XU{0,n} | ...
1386 * ITT_*(n) -> +---------+ +---------+ +---------+ -> TT_STREAMING(n)
1388 * +---------+ +---------+ -> OTT_*(0)
1389 * TT_STREAMING -> | PU{0,1} | -> | XU{0,n} | ...
1390 * +---------+ +---------+ -> OTT_*(n)
1393 * Extension Units connected to the main chain as single-unit branches are
1394 * also supported. Single-input Selector Units are ignored.
1402 printk(KERN_CONT " <- XU %d", entity->id); in uvc_scan_chain_entity()
1404 if (entity->bNrInPins != 1) { in uvc_scan_chain_entity()
1406 "than 1 input pin.\n", entity->id); in uvc_scan_chain_entity()
1407 return -1; in uvc_scan_chain_entity()
1414 printk(KERN_CONT " <- PU %d", entity->id); in uvc_scan_chain_entity()
1416 if (chain->processing != NULL) { in uvc_scan_chain_entity()
1419 return -1; in uvc_scan_chain_entity()
1422 chain->processing = entity; in uvc_scan_chain_entity()
1427 printk(KERN_CONT " <- SU %d", entity->id); in uvc_scan_chain_entity()
1429 /* Single-input selector units are ignored. */ in uvc_scan_chain_entity()
1430 if (entity->bNrInPins == 1) in uvc_scan_chain_entity()
1433 if (chain->selector != NULL) { in uvc_scan_chain_entity()
1436 return -1; in uvc_scan_chain_entity()
1439 chain->selector = entity; in uvc_scan_chain_entity()
1446 printk(KERN_CONT " <- IT %d\n", entity->id); in uvc_scan_chain_entity()
1454 printk(KERN_CONT " OT %d", entity->id); in uvc_scan_chain_entity()
1461 printk(KERN_CONT " <- IT %d\n", entity->id); in uvc_scan_chain_entity()
1464 printk(KERN_CONT " OT %d", entity->id); in uvc_scan_chain_entity()
1472 return -1; in uvc_scan_chain_entity()
1475 list_add_tail(&entity->chain, &chain->entities); in uvc_scan_chain_entity()
1490 forward = uvc_entity_by_reference(chain->dev, entity->id, in uvc_scan_chain_forward()
1499 if (forward->bNrInPins != 1) { in uvc_scan_chain_forward()
1502 entity->id); in uvc_scan_chain_forward()
1503 return -EINVAL; in uvc_scan_chain_forward()
1506 list_add_tail(&forward->chain, &chain->entities); in uvc_scan_chain_forward()
1509 printk(KERN_CONT " (->"); in uvc_scan_chain_forward()
1511 printk(KERN_CONT " XU %d", forward->id); in uvc_scan_chain_forward()
1522 "terminal %u.\n", forward->id); in uvc_scan_chain_forward()
1523 return -EINVAL; in uvc_scan_chain_forward()
1526 list_add_tail(&forward->chain, &chain->entities); in uvc_scan_chain_forward()
1529 printk(KERN_CONT " (->"); in uvc_scan_chain_forward()
1531 printk(KERN_CONT " OT %d", forward->id); in uvc_scan_chain_forward()
1548 int id = -EINVAL, i; in uvc_scan_chain_backward()
1553 id = entity->baSourceID[0]; in uvc_scan_chain_backward()
1557 /* Single-input selector units are ignored. */ in uvc_scan_chain_backward()
1558 if (entity->bNrInPins == 1) { in uvc_scan_chain_backward()
1559 id = entity->baSourceID[0]; in uvc_scan_chain_backward()
1564 printk(KERN_CONT " <- IT"); in uvc_scan_chain_backward()
1566 chain->selector = entity; in uvc_scan_chain_backward()
1567 for (i = 0; i < entity->bNrInPins; ++i) { in uvc_scan_chain_backward()
1568 id = entity->baSourceID[i]; in uvc_scan_chain_backward()
1569 term = uvc_entity_by_id(chain->dev, id); in uvc_scan_chain_backward()
1573 "input terminal\n", entity->id, i); in uvc_scan_chain_backward()
1574 return -1; in uvc_scan_chain_backward()
1578 printk(KERN_CONT " %d", term->id); in uvc_scan_chain_backward()
1580 list_add_tail(&term->chain, &chain->entities); in uvc_scan_chain_backward()
1597 id = UVC_ENTITY_IS_OTERM(entity) ? entity->baSourceID[0] : 0; in uvc_scan_chain_backward()
1606 entity = uvc_entity_by_id(chain->dev, id); in uvc_scan_chain_backward()
1610 return -EINVAL; in uvc_scan_chain_backward()
1629 if (entity->chain.next || entity->chain.prev) { in uvc_scan_chain()
1631 "entity %d already in chain.\n", entity->id); in uvc_scan_chain()
1632 return -EINVAL; in uvc_scan_chain()
1637 return -EINVAL; in uvc_scan_chain()
1641 return -EINVAL; in uvc_scan_chain()
1646 return -EINVAL; in uvc_scan_chain()
1653 char *buffer) in uvc_print_terms() argument
1657 char *p = buffer; in uvc_print_terms()
1670 p += sprintf(p, "%u", term->id); in uvc_print_terms()
1673 return p - buffer; in uvc_print_terms()
1678 static char buffer[43]; in uvc_print_chain() local
1679 char *p = buffer; in uvc_print_chain()
1681 p += uvc_print_terms(&chain->entities, UVC_TERM_INPUT, p); in uvc_print_chain()
1682 p += sprintf(p, " -> "); in uvc_print_chain()
1683 uvc_print_terms(&chain->entities, UVC_TERM_OUTPUT, p); in uvc_print_chain()
1685 return buffer; in uvc_print_chain()
1696 INIT_LIST_HEAD(&chain->entities); in uvc_alloc_chain()
1697 mutex_init(&chain->ctrl_mutex); in uvc_alloc_chain()
1698 chain->dev = dev; in uvc_alloc_chain()
1699 v4l2_prio_init(&chain->prio); in uvc_alloc_chain()
1714 * - Acer Integrated Camera (5986:055a)
1715 * - Realtek rtl157a7 (0bda:57a7)
1729 list_for_each_entry(entity, &dev->entities, list) { in uvc_scan_fallback()
1732 return -EINVAL; in uvc_scan_fallback()
1738 return -EINVAL; in uvc_scan_fallback()
1744 return -EINVAL; in uvc_scan_fallback()
1749 return -ENOMEM; in uvc_scan_fallback()
1763 list_for_each_entry_reverse(entity, &dev->entities, list) { in uvc_scan_fallback()
1764 if (entity->type != UVC_VC_PROCESSING_UNIT && in uvc_scan_fallback()
1765 entity->type != UVC_VC_EXTENSION_UNIT) in uvc_scan_fallback()
1768 if (entity->num_pads != 2) in uvc_scan_fallback()
1774 prev->baSourceID[0] = entity->id; in uvc_scan_fallback()
1781 prev->baSourceID[0] = iterm->id; in uvc_scan_fallback()
1783 list_add_tail(&chain->list, &dev->chains); in uvc_scan_fallback()
1793 return -EINVAL; in uvc_scan_fallback()
1806 list_for_each_entry(term, &dev->entities, list) { in uvc_scan_device()
1815 if (term->chain.next || term->chain.prev) in uvc_scan_device()
1820 return -ENOMEM; in uvc_scan_device()
1822 term->flags |= UVC_ENTITY_FLAG_DEFAULT; in uvc_scan_device()
1832 list_add_tail(&chain->list, &dev->chains); in uvc_scan_device()
1835 if (list_empty(&dev->chains)) in uvc_scan_device()
1838 if (list_empty(&dev->chains)) { in uvc_scan_device()
1840 return -1; in uvc_scan_device()
1846 /* ------------------------------------------------------------------------
1868 usb_put_intf(dev->intf); in uvc_delete()
1869 usb_put_dev(dev->udev); in uvc_delete()
1872 media_device_cleanup(&dev->mdev); in uvc_delete()
1875 list_for_each_safe(p, n, &dev->chains) { in uvc_delete()
1881 list_for_each_safe(p, n, &dev->entities) { in uvc_delete()
1890 list_for_each_safe(p, n, &dev->streams) { in uvc_delete()
1894 streaming->intf); in uvc_delete()
1904 struct uvc_device *dev = stream->dev; in uvc_release()
1906 kref_put(&dev->ref, uvc_delete); in uvc_release()
1916 list_for_each_entry(stream, &dev->streams, list) { in uvc_unregister_video()
1917 if (!video_is_registered(&stream->vdev)) in uvc_unregister_video()
1920 video_unregister_device(&stream->vdev); in uvc_unregister_video()
1921 video_unregister_device(&stream->meta.vdev); in uvc_unregister_video()
1928 if (dev->vdev.dev) in uvc_unregister_video()
1929 v4l2_device_unregister(&dev->vdev); in uvc_unregister_video()
1931 if (media_devnode_is_registered(dev->mdev.devnode)) in uvc_unregister_video()
1932 media_device_unregister(&dev->mdev); in uvc_unregister_video()
1954 * We already hold a reference to dev->udev. The video device will be in uvc_register_video_device()
1958 vdev->v4l2_dev = &dev->vdev; in uvc_register_video_device()
1959 vdev->fops = fops; in uvc_register_video_device()
1960 vdev->ioctl_ops = ioctl_ops; in uvc_register_video_device()
1961 vdev->release = uvc_release; in uvc_register_video_device()
1962 vdev->prio = &stream->chain->prio; in uvc_register_video_device()
1964 vdev->vfl_dir = VFL_DIR_TX; in uvc_register_video_device()
1966 vdev->vfl_dir = VFL_DIR_RX; in uvc_register_video_device()
1971 vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; in uvc_register_video_device()
1974 vdev->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; in uvc_register_video_device()
1977 vdev->device_caps = V4L2_CAP_META_CAPTURE | V4L2_CAP_STREAMING; in uvc_register_video_device()
1981 strscpy(vdev->name, dev->name, sizeof(vdev->name)); in uvc_register_video_device()
1989 ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); in uvc_register_video_device()
1996 kref_get(&dev->ref); in uvc_register_video_device()
2013 if (stream->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) in uvc_register_video()
2014 stream->chain->caps |= V4L2_CAP_VIDEO_CAPTURE in uvc_register_video()
2017 stream->chain->caps |= V4L2_CAP_VIDEO_OUTPUT; in uvc_register_video()
2022 return uvc_register_video_device(dev, stream, &stream->vdev, in uvc_register_video()
2023 &stream->queue, stream->type, in uvc_register_video()
2037 list_for_each_entry(term, &chain->entities, chain) { in uvc_register_terms()
2041 stream = uvc_stream_by_id(dev, term->id); in uvc_register_terms()
2044 "for terminal %u.", term->id); in uvc_register_terms()
2048 stream->chain = chain; in uvc_register_terms()
2058 term->vdev = &stream->vdev; in uvc_register_terms()
2069 list_for_each_entry(chain, &dev->chains, list) { in uvc_register_chains()
2085 /* ------------------------------------------------------------------------
2097 (const struct uvc_device_info *)id->driver_info; in uvc_probe()
2101 if (id->idVendor && id->idProduct) in uvc_probe()
2103 "(%04x:%04x)\n", udev->devpath, id->idVendor, in uvc_probe()
2104 id->idProduct); in uvc_probe()
2107 udev->devpath); in uvc_probe()
2112 return -ENOMEM; in uvc_probe()
2114 INIT_LIST_HEAD(&dev->entities); in uvc_probe()
2115 INIT_LIST_HEAD(&dev->chains); in uvc_probe()
2116 INIT_LIST_HEAD(&dev->streams); in uvc_probe()
2117 kref_init(&dev->ref); in uvc_probe()
2118 atomic_set(&dev->nmappings, 0); in uvc_probe()
2119 mutex_init(&dev->lock); in uvc_probe()
2121 dev->udev = usb_get_dev(udev); in uvc_probe()
2122 dev->intf = usb_get_intf(intf); in uvc_probe()
2123 dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; in uvc_probe()
2124 dev->info = info ? info : &uvc_quirk_none; in uvc_probe()
2125 dev->quirks = uvc_quirks_param == -1 in uvc_probe()
2126 ? dev->info->quirks : uvc_quirks_param; in uvc_probe()
2128 if (udev->product != NULL) in uvc_probe()
2129 strscpy(dev->name, udev->product, sizeof(dev->name)); in uvc_probe()
2131 snprintf(dev->name, sizeof(dev->name), in uvc_probe()
2133 le16_to_cpu(udev->descriptor.idVendor), in uvc_probe()
2134 le16_to_cpu(udev->descriptor.idProduct)); in uvc_probe()
2141 if (intf->intf_assoc && intf->intf_assoc->iFunction != 0) in uvc_probe()
2142 function = intf->intf_assoc->iFunction; in uvc_probe()
2144 function = intf->cur_altsetting->desc.iInterface; in uvc_probe()
2148 strlcat(dev->name, ": ", sizeof(dev->name)); in uvc_probe()
2149 len = strlen(dev->name); in uvc_probe()
2150 usb_string(udev, function, dev->name + len, in uvc_probe()
2151 sizeof(dev->name) - len); in uvc_probe()
2162 dev->uvc_version >> 8, dev->uvc_version & 0xff, in uvc_probe()
2163 udev->product ? udev->product : "<unnamed>", in uvc_probe()
2164 le16_to_cpu(udev->descriptor.idVendor), in uvc_probe()
2165 le16_to_cpu(udev->descriptor.idProduct)); in uvc_probe()
2167 if (dev->quirks != dev->info->quirks) { in uvc_probe()
2169 "parameter for testing purpose.\n", dev->quirks); in uvc_probe()
2171 "linux-uvc-devel mailing list.\n"); in uvc_probe()
2176 dev->mdev.dev = &intf->dev; in uvc_probe()
2177 strscpy(dev->mdev.model, dev->name, sizeof(dev->mdev.model)); in uvc_probe()
2178 if (udev->serial) in uvc_probe()
2179 strscpy(dev->mdev.serial, udev->serial, in uvc_probe()
2180 sizeof(dev->mdev.serial)); in uvc_probe()
2181 usb_make_path(udev, dev->mdev.bus_info, sizeof(dev->mdev.bus_info)); in uvc_probe()
2182 dev->mdev.hw_revision = le16_to_cpu(udev->descriptor.bcdDevice); in uvc_probe()
2183 media_device_init(&dev->mdev); in uvc_probe()
2185 dev->vdev.mdev = &dev->mdev; in uvc_probe()
2187 if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) in uvc_probe()
2204 if (media_device_register(&dev->mdev) < 0) in uvc_probe()
2223 kref_put(&dev->ref, uvc_delete); in uvc_probe()
2224 return -ENODEV; in uvc_probe()
2236 if (intf->cur_altsetting->desc.bInterfaceSubClass == in uvc_disconnect()
2241 kref_put(&dev->ref, uvc_delete); in uvc_disconnect()
2250 intf->cur_altsetting->desc.bInterfaceNumber); in uvc_suspend()
2253 if (intf->cur_altsetting->desc.bInterfaceSubClass == in uvc_suspend()
2255 mutex_lock(&dev->lock); in uvc_suspend()
2256 if (dev->users) in uvc_suspend()
2258 mutex_unlock(&dev->lock); in uvc_suspend()
2262 list_for_each_entry(stream, &dev->streams, list) { in uvc_suspend()
2263 if (stream->intf == intf) in uvc_suspend()
2269 return -EINVAL; in uvc_suspend()
2279 intf->cur_altsetting->desc.bInterfaceNumber); in __uvc_resume()
2281 if (intf->cur_altsetting->desc.bInterfaceSubClass == in __uvc_resume()
2289 mutex_lock(&dev->lock); in __uvc_resume()
2290 if (dev->users) in __uvc_resume()
2292 mutex_unlock(&dev->lock); in __uvc_resume()
2297 list_for_each_entry(stream, &dev->streams, list) { in __uvc_resume()
2298 if (stream->intf == intf) { in __uvc_resume()
2301 uvc_queue_streamoff(&stream->queue, in __uvc_resume()
2302 stream->queue.queue.type); in __uvc_resume()
2309 return -EINVAL; in __uvc_resume()
2322 /* ------------------------------------------------------------------------
2326 static int uvc_clock_param_get(char *buffer, const struct kernel_param *kp) in uvc_clock_param_get() argument
2329 return sprintf(buffer, "CLOCK_MONOTONIC"); in uvc_clock_param_get()
2331 return sprintf(buffer, "CLOCK_REALTIME"); in uvc_clock_param_get()
2344 return -EINVAL; in uvc_clock_param_set()
2363 /* ------------------------------------------------------------------------
2415 /* Microsoft Lifecam NX-6000 */
2424 /* Microsoft Lifecam NX-3000 */
2433 /* Microsoft Lifecam VX-7000 */
2562 /* Apple Built-In iSight */
2572 /* Apple Built-In iSight via iBridge */
2617 /* ViMicro - Minoru3D */
2626 /* ViMicro Venus - Minoru3D */
2635 /* Ophir Optronics - SPCAM 620U */
2771 /* Manta MM-353 Plako */