Linux Audio

Check our new training course

Loading...
   1/*
   2 *      uvc_driver.c  --  USB Video Class driver
   3 *
   4 *      Copyright (C) 2005-2010
   5 *          Laurent Pinchart (laurent.pinchart@ideasonboard.com)
   6 *
   7 *      This program is free software; you can redistribute it and/or modify
   8 *      it under the terms of the GNU General Public License as published by
   9 *      the Free Software Foundation; either version 2 of the License, or
  10 *      (at your option) any later version.
  11 *
  12 */
  13
  14/*
  15 * This driver aims to support video input and ouput devices compliant with the
  16 * 'USB Video Class' specification.
  17 *
  18 * The driver doesn't support the deprecated v4l1 interface. It implements the
  19 * mmap capture method only, and doesn't do any image format conversion in
  20 * software. If your user-space application doesn't support YUYV or MJPEG, fix
  21 * it :-). Please note that the MJPEG data have been stripped from their
  22 * Huffman tables (DHT marker), you will need to add it back if your JPEG
  23 * codec can't handle MJPEG data.
  24 */
  25
  26#include <linux/atomic.h>
  27#include <linux/kernel.h>
  28#include <linux/list.h>
  29#include <linux/module.h>
  30#include <linux/slab.h>
  31#include <linux/usb.h>
  32#include <linux/videodev2.h>
  33#include <linux/vmalloc.h>
  34#include <linux/wait.h>
  35#include <linux/version.h>
  36#include <asm/unaligned.h>
  37
  38#include <media/v4l2-common.h>
  39
  40#include "uvcvideo.h"
  41
  42#define DRIVER_AUTHOR		"Laurent Pinchart " \
  43				"<laurent.pinchart@ideasonboard.com>"
  44#define DRIVER_DESC		"USB Video Class driver"
  45
  46unsigned int uvc_clock_param = CLOCK_MONOTONIC;
  47unsigned int uvc_no_drop_param;
  48static unsigned int uvc_quirks_param = -1;
  49unsigned int uvc_trace_param;
  50unsigned int uvc_timeout_param = UVC_CTRL_STREAMING_TIMEOUT;
  51
  52/* ------------------------------------------------------------------------
  53 * Video formats
  54 */
  55
  56static struct uvc_format_desc uvc_fmts[] = {
  57	{
  58		.name		= "YUV 4:2:2 (YUYV)",
  59		.guid		= UVC_GUID_FORMAT_YUY2,
  60		.fcc		= V4L2_PIX_FMT_YUYV,
  61	},
  62	{
  63		.name		= "YUV 4:2:2 (YUYV)",
  64		.guid		= UVC_GUID_FORMAT_YUY2_ISIGHT,
  65		.fcc		= V4L2_PIX_FMT_YUYV,
  66	},
  67	{
  68		.name		= "YUV 4:2:0 (NV12)",
  69		.guid		= UVC_GUID_FORMAT_NV12,
  70		.fcc		= V4L2_PIX_FMT_NV12,
  71	},
  72	{
  73		.name		= "MJPEG",
  74		.guid		= UVC_GUID_FORMAT_MJPEG,
  75		.fcc		= V4L2_PIX_FMT_MJPEG,
  76	},
  77	{
  78		.name		= "YVU 4:2:0 (YV12)",
  79		.guid		= UVC_GUID_FORMAT_YV12,
  80		.fcc		= V4L2_PIX_FMT_YVU420,
  81	},
  82	{
  83		.name		= "YUV 4:2:0 (I420)",
  84		.guid		= UVC_GUID_FORMAT_I420,
  85		.fcc		= V4L2_PIX_FMT_YUV420,
  86	},
  87	{
  88		.name		= "YUV 4:2:0 (M420)",
  89		.guid		= UVC_GUID_FORMAT_M420,
  90		.fcc		= V4L2_PIX_FMT_M420,
  91	},
  92	{
  93		.name		= "YUV 4:2:2 (UYVY)",
  94		.guid		= UVC_GUID_FORMAT_UYVY,
  95		.fcc		= V4L2_PIX_FMT_UYVY,
  96	},
  97	{
  98		.name		= "Greyscale (8-bit)",
  99		.guid		= UVC_GUID_FORMAT_Y800,
 100		.fcc		= V4L2_PIX_FMT_GREY,
 101	},
 102	{
 103		.name		= "Greyscale (16-bit)",
 104		.guid		= UVC_GUID_FORMAT_Y16,
 105		.fcc		= V4L2_PIX_FMT_Y16,
 106	},
 107	{
 108		.name		= "RGB Bayer",
 109		.guid		= UVC_GUID_FORMAT_BY8,
 110		.fcc		= V4L2_PIX_FMT_SBGGR8,
 111	},
 112	{
 113		.name		= "RGB565",
 114		.guid		= UVC_GUID_FORMAT_RGBP,
 115		.fcc		= V4L2_PIX_FMT_RGB565,
 116	},
 117	{
 118		.name		= "H.264",
 119		.guid		= UVC_GUID_FORMAT_H264,
 120		.fcc		= V4L2_PIX_FMT_H264,
 121	},
 122};
 123
 124/* ------------------------------------------------------------------------
 125 * Utility functions
 126 */
 127
 128struct usb_host_endpoint *uvc_find_endpoint(struct usb_host_interface *alts,
 129		__u8 epaddr)
 130{
 131	struct usb_host_endpoint *ep;
 132	unsigned int i;
 133
 134	for (i = 0; i < alts->desc.bNumEndpoints; ++i) {
 135		ep = &alts->endpoint[i];
 136		if (ep->desc.bEndpointAddress == epaddr)
 137			return ep;
 138	}
 139
 140	return NULL;
 141}
 142
 143static struct uvc_format_desc *uvc_format_by_guid(const __u8 guid[16])
 144{
 145	unsigned int len = ARRAY_SIZE(uvc_fmts);
 146	unsigned int i;
 147
 148	for (i = 0; i < len; ++i) {
 149		if (memcmp(guid, uvc_fmts[i].guid, 16) == 0)
 150			return &uvc_fmts[i];
 151	}
 152
 153	return NULL;
 154}
 155
 156static __u32 uvc_colorspace(const __u8 primaries)
 157{
 158	static const __u8 colorprimaries[] = {
 159		0,
 160		V4L2_COLORSPACE_SRGB,
 161		V4L2_COLORSPACE_470_SYSTEM_M,
 162		V4L2_COLORSPACE_470_SYSTEM_BG,
 163		V4L2_COLORSPACE_SMPTE170M,
 164		V4L2_COLORSPACE_SMPTE240M,
 165	};
 166
 167	if (primaries < ARRAY_SIZE(colorprimaries))
 168		return colorprimaries[primaries];
 169
 170	return 0;
 171}
 172
 173/* Simplify a fraction using a simple continued fraction decomposition. The
 174 * idea here is to convert fractions such as 333333/10000000 to 1/30 using
 175 * 32 bit arithmetic only. The algorithm is not perfect and relies upon two
 176 * arbitrary parameters to remove non-significative terms from the simple
 177 * continued fraction decomposition. Using 8 and 333 for n_terms and threshold
 178 * respectively seems to give nice results.
 179 */
 180void uvc_simplify_fraction(uint32_t *numerator, uint32_t *denominator,
 181		unsigned int n_terms, unsigned int threshold)
 182{
 183	uint32_t *an;
 184	uint32_t x, y, r;
 185	unsigned int i, n;
 186
 187	an = kmalloc(n_terms * sizeof *an, GFP_KERNEL);
 188	if (an == NULL)
 189		return;
 190
 191	/* Convert the fraction to a simple continued fraction. See
 192	 * http://mathforum.org/dr.math/faq/faq.fractions.html
 193	 * Stop if the current term is bigger than or equal to the given
 194	 * threshold.
 195	 */
 196	x = *numerator;
 197	y = *denominator;
 198
 199	for (n = 0; n < n_terms && y != 0; ++n) {
 200		an[n] = x / y;
 201		if (an[n] >= threshold) {
 202			if (n < 2)
 203				n++;
 204			break;
 205		}
 206
 207		r = x - an[n] * y;
 208		x = y;
 209		y = r;
 210	}
 211
 212	/* Expand the simple continued fraction back to an integer fraction. */
 213	x = 0;
 214	y = 1;
 215
 216	for (i = n; i > 0; --i) {
 217		r = y;
 218		y = an[i-1] * y + x;
 219		x = r;
 220	}
 221
 222	*numerator = y;
 223	*denominator = x;
 224	kfree(an);
 225}
 226
 227/* Convert a fraction to a frame interval in 100ns multiples. The idea here is
 228 * to compute numerator / denominator * 10000000 using 32 bit fixed point
 229 * arithmetic only.
 230 */
 231uint32_t uvc_fraction_to_interval(uint32_t numerator, uint32_t denominator)
 232{
 233	uint32_t multiplier;
 234
 235	/* Saturate the result if the operation would overflow. */
 236	if (denominator == 0 ||
 237	    numerator/denominator >= ((uint32_t)-1)/10000000)
 238		return (uint32_t)-1;
 239
 240	/* Divide both the denominator and the multiplier by two until
 241	 * numerator * multiplier doesn't overflow. If anyone knows a better
 242	 * algorithm please let me know.
 243	 */
 244	multiplier = 10000000;
 245	while (numerator > ((uint32_t)-1)/multiplier) {
 246		multiplier /= 2;
 247		denominator /= 2;
 248	}
 249
 250	return denominator ? numerator * multiplier / denominator : 0;
 251}
 252
 253/* ------------------------------------------------------------------------
 254 * Terminal and unit management
 255 */
 256
 257struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id)
 258{
 259	struct uvc_entity *entity;
 260
 261	list_for_each_entry(entity, &dev->entities, list) {
 262		if (entity->id == id)
 263			return entity;
 264	}
 265
 266	return NULL;
 267}
 268
 269static struct uvc_entity *uvc_entity_by_reference(struct uvc_device *dev,
 270	int id, struct uvc_entity *entity)
 271{
 272	unsigned int i;
 273
 274	if (entity == NULL)
 275		entity = list_entry(&dev->entities, struct uvc_entity, list);
 276
 277	list_for_each_entry_continue(entity, &dev->entities, list) {
 278		for (i = 0; i < entity->bNrInPins; ++i)
 279			if (entity->baSourceID[i] == id)
 280				return entity;
 281	}
 282
 283	return NULL;
 284}
 285
 286static struct uvc_streaming *uvc_stream_by_id(struct uvc_device *dev, int id)
 287{
 288	struct uvc_streaming *stream;
 289
 290	list_for_each_entry(stream, &dev->streams, list) {
 291		if (stream->header.bTerminalLink == id)
 292			return stream;
 293	}
 294
 295	return NULL;
 296}
 297
 298/* ------------------------------------------------------------------------
 299 * Descriptors parsing
 300 */
 301
 302static int uvc_parse_format(struct uvc_device *dev,
 303	struct uvc_streaming *streaming, struct uvc_format *format,
 304	__u32 **intervals, unsigned char *buffer, int buflen)
 305{
 306	struct usb_interface *intf = streaming->intf;
 307	struct usb_host_interface *alts = intf->cur_altsetting;
 308	struct uvc_format_desc *fmtdesc;
 309	struct uvc_frame *frame;
 310	const unsigned char *start = buffer;
 311	unsigned int interval;
 312	unsigned int i, n;
 313	__u8 ftype;
 314
 315	format->type = buffer[2];
 316	format->index = buffer[3];
 317
 318	switch (buffer[2]) {
 319	case UVC_VS_FORMAT_UNCOMPRESSED:
 320	case UVC_VS_FORMAT_FRAME_BASED:
 321		n = buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED ? 27 : 28;
 322		if (buflen < n) {
 323			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 324			       "interface %d FORMAT error\n",
 325			       dev->udev->devnum,
 326			       alts->desc.bInterfaceNumber);
 327			return -EINVAL;
 328		}
 329
 330		/* Find the format descriptor from its GUID. */
 331		fmtdesc = uvc_format_by_guid(&buffer[5]);
 332
 333		if (fmtdesc != NULL) {
 334			strlcpy(format->name, fmtdesc->name,
 335				sizeof format->name);
 336			format->fcc = fmtdesc->fcc;
 337		} else {
 338			uvc_printk(KERN_INFO, "Unknown video format %pUl\n",
 339				&buffer[5]);
 340			snprintf(format->name, sizeof(format->name), "%pUl\n",
 341				&buffer[5]);
 342			format->fcc = 0;
 343		}
 344
 345		format->bpp = buffer[21];
 346		if (buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED) {
 347			ftype = UVC_VS_FRAME_UNCOMPRESSED;
 348		} else {
 349			ftype = UVC_VS_FRAME_FRAME_BASED;
 350			if (buffer[27])
 351				format->flags = UVC_FMT_FLAG_COMPRESSED;
 352		}
 353		break;
 354
 355	case UVC_VS_FORMAT_MJPEG:
 356		if (buflen < 11) {
 357			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 358			       "interface %d FORMAT error\n",
 359			       dev->udev->devnum,
 360			       alts->desc.bInterfaceNumber);
 361			return -EINVAL;
 362		}
 363
 364		strlcpy(format->name, "MJPEG", sizeof format->name);
 365		format->fcc = V4L2_PIX_FMT_MJPEG;
 366		format->flags = UVC_FMT_FLAG_COMPRESSED;
 367		format->bpp = 0;
 368		ftype = UVC_VS_FRAME_MJPEG;
 369		break;
 370
 371	case UVC_VS_FORMAT_DV:
 372		if (buflen < 9) {
 373			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 374			       "interface %d FORMAT error\n",
 375			       dev->udev->devnum,
 376			       alts->desc.bInterfaceNumber);
 377			return -EINVAL;
 378		}
 379
 380		switch (buffer[8] & 0x7f) {
 381		case 0:
 382			strlcpy(format->name, "SD-DV", sizeof format->name);
 383			break;
 384		case 1:
 385			strlcpy(format->name, "SDL-DV", sizeof format->name);
 386			break;
 387		case 2:
 388			strlcpy(format->name, "HD-DV", sizeof format->name);
 389			break;
 390		default:
 391			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 392			       "interface %d: unknown DV format %u\n",
 393			       dev->udev->devnum,
 394			       alts->desc.bInterfaceNumber, buffer[8]);
 395			return -EINVAL;
 396		}
 397
 398		strlcat(format->name, buffer[8] & (1 << 7) ? " 60Hz" : " 50Hz",
 399			sizeof format->name);
 400
 401		format->fcc = V4L2_PIX_FMT_DV;
 402		format->flags = UVC_FMT_FLAG_COMPRESSED | UVC_FMT_FLAG_STREAM;
 403		format->bpp = 0;
 404		ftype = 0;
 405
 406		/* Create a dummy frame descriptor. */
 407		frame = &format->frame[0];
 408		memset(&format->frame[0], 0, sizeof format->frame[0]);
 409		frame->bFrameIntervalType = 1;
 410		frame->dwDefaultFrameInterval = 1;
 411		frame->dwFrameInterval = *intervals;
 412		*(*intervals)++ = 1;
 413		format->nframes = 1;
 414		break;
 415
 416	case UVC_VS_FORMAT_MPEG2TS:
 417	case UVC_VS_FORMAT_STREAM_BASED:
 418		/* Not supported yet. */
 419	default:
 420		uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 421		       "interface %d unsupported format %u\n",
 422		       dev->udev->devnum, alts->desc.bInterfaceNumber,
 423		       buffer[2]);
 424		return -EINVAL;
 425	}
 426
 427	uvc_trace(UVC_TRACE_DESCR, "Found format %s.\n", format->name);
 428
 429	buflen -= buffer[0];
 430	buffer += buffer[0];
 431
 432	/* Parse the frame descriptors. Only uncompressed, MJPEG and frame
 433	 * based formats have frame descriptors.
 434	 */
 435	while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
 436	       buffer[2] == ftype) {
 437		frame = &format->frame[format->nframes];
 438		if (ftype != UVC_VS_FRAME_FRAME_BASED)
 439			n = buflen > 25 ? buffer[25] : 0;
 440		else
 441			n = buflen > 21 ? buffer[21] : 0;
 442
 443		n = n ? n : 3;
 444
 445		if (buflen < 26 + 4*n) {
 446			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 447			       "interface %d FRAME error\n", dev->udev->devnum,
 448			       alts->desc.bInterfaceNumber);
 449			return -EINVAL;
 450		}
 451
 452		frame->bFrameIndex = buffer[3];
 453		frame->bmCapabilities = buffer[4];
 454		frame->wWidth = get_unaligned_le16(&buffer[5]);
 455		frame->wHeight = get_unaligned_le16(&buffer[7]);
 456		frame->dwMinBitRate = get_unaligned_le32(&buffer[9]);
 457		frame->dwMaxBitRate = get_unaligned_le32(&buffer[13]);
 458		if (ftype != UVC_VS_FRAME_FRAME_BASED) {
 459			frame->dwMaxVideoFrameBufferSize =
 460				get_unaligned_le32(&buffer[17]);
 461			frame->dwDefaultFrameInterval =
 462				get_unaligned_le32(&buffer[21]);
 463			frame->bFrameIntervalType = buffer[25];
 464		} else {
 465			frame->dwMaxVideoFrameBufferSize = 0;
 466			frame->dwDefaultFrameInterval =
 467				get_unaligned_le32(&buffer[17]);
 468			frame->bFrameIntervalType = buffer[21];
 469		}
 470		frame->dwFrameInterval = *intervals;
 471
 472		/* Several UVC chipsets screw up dwMaxVideoFrameBufferSize
 473		 * completely. Observed behaviours range from setting the
 474		 * value to 1.1x the actual frame size to hardwiring the
 475		 * 16 low bits to 0. This results in a higher than necessary
 476		 * memory usage as well as a wrong image size information. For
 477		 * uncompressed formats this can be fixed by computing the
 478		 * value from the frame size.
 479		 */
 480		if (!(format->flags & UVC_FMT_FLAG_COMPRESSED))
 481			frame->dwMaxVideoFrameBufferSize = format->bpp
 482				* frame->wWidth * frame->wHeight / 8;
 483
 484		/* Some bogus devices report dwMinFrameInterval equal to
 485		 * dwMaxFrameInterval and have dwFrameIntervalStep set to
 486		 * zero. Setting all null intervals to 1 fixes the problem and
 487		 * some other divisions by zero that could happen.
 488		 */
 489		for (i = 0; i < n; ++i) {
 490			interval = get_unaligned_le32(&buffer[26+4*i]);
 491			*(*intervals)++ = interval ? interval : 1;
 492		}
 493
 494		/* Make sure that the default frame interval stays between
 495		 * the boundaries.
 496		 */
 497		n -= frame->bFrameIntervalType ? 1 : 2;
 498		frame->dwDefaultFrameInterval =
 499			min(frame->dwFrameInterval[n],
 500			    max(frame->dwFrameInterval[0],
 501				frame->dwDefaultFrameInterval));
 502
 503		if (dev->quirks & UVC_QUIRK_RESTRICT_FRAME_RATE) {
 504			frame->bFrameIntervalType = 1;
 505			frame->dwFrameInterval[0] =
 506				frame->dwDefaultFrameInterval;
 507		}
 508
 509		uvc_trace(UVC_TRACE_DESCR, "- %ux%u (%u.%u fps)\n",
 510			frame->wWidth, frame->wHeight,
 511			10000000/frame->dwDefaultFrameInterval,
 512			(100000000/frame->dwDefaultFrameInterval)%10);
 513
 514		format->nframes++;
 515		buflen -= buffer[0];
 516		buffer += buffer[0];
 517	}
 518
 519	if (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
 520	    buffer[2] == UVC_VS_STILL_IMAGE_FRAME) {
 521		buflen -= buffer[0];
 522		buffer += buffer[0];
 523	}
 524
 525	if (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
 526	    buffer[2] == UVC_VS_COLORFORMAT) {
 527		if (buflen < 6) {
 528			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 529			       "interface %d COLORFORMAT error\n",
 530			       dev->udev->devnum,
 531			       alts->desc.bInterfaceNumber);
 532			return -EINVAL;
 533		}
 534
 535		format->colorspace = uvc_colorspace(buffer[3]);
 536
 537		buflen -= buffer[0];
 538		buffer += buffer[0];
 539	}
 540
 541	return buffer - start;
 542}
 543
 544static int uvc_parse_streaming(struct uvc_device *dev,
 545	struct usb_interface *intf)
 546{
 547	struct uvc_streaming *streaming = NULL;
 548	struct uvc_format *format;
 549	struct uvc_frame *frame;
 550	struct usb_host_interface *alts = &intf->altsetting[0];
 551	unsigned char *_buffer, *buffer = alts->extra;
 552	int _buflen, buflen = alts->extralen;
 553	unsigned int nformats = 0, nframes = 0, nintervals = 0;
 554	unsigned int size, i, n, p;
 555	__u32 *interval;
 556	__u16 psize;
 557	int ret = -EINVAL;
 558
 559	if (intf->cur_altsetting->desc.bInterfaceSubClass
 560		!= UVC_SC_VIDEOSTREAMING) {
 561		uvc_trace(UVC_TRACE_DESCR, "device %d interface %d isn't a "
 562			"video streaming interface\n", dev->udev->devnum,
 563			intf->altsetting[0].desc.bInterfaceNumber);
 564		return -EINVAL;
 565	}
 566
 567	if (usb_driver_claim_interface(&uvc_driver.driver, intf, dev)) {
 568		uvc_trace(UVC_TRACE_DESCR, "device %d interface %d is already "
 569			"claimed\n", dev->udev->devnum,
 570			intf->altsetting[0].desc.bInterfaceNumber);
 571		return -EINVAL;
 572	}
 573
 574	streaming = kzalloc(sizeof *streaming, GFP_KERNEL);
 575	if (streaming == NULL) {
 576		usb_driver_release_interface(&uvc_driver.driver, intf);
 577		return -EINVAL;
 578	}
 579
 580	mutex_init(&streaming->mutex);
 581	streaming->dev = dev;
 582	streaming->intf = usb_get_intf(intf);
 583	streaming->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
 584
 585	/* The Pico iMage webcam has its class-specific interface descriptors
 586	 * after the endpoint descriptors.
 587	 */
 588	if (buflen == 0) {
 589		for (i = 0; i < alts->desc.bNumEndpoints; ++i) {
 590			struct usb_host_endpoint *ep = &alts->endpoint[i];
 591
 592			if (ep->extralen == 0)
 593				continue;
 594
 595			if (ep->extralen > 2 &&
 596			    ep->extra[1] == USB_DT_CS_INTERFACE) {
 597				uvc_trace(UVC_TRACE_DESCR, "trying extra data "
 598					"from endpoint %u.\n", i);
 599				buffer = alts->endpoint[i].extra;
 600				buflen = alts->endpoint[i].extralen;
 601				break;
 602			}
 603		}
 604	}
 605
 606	/* Skip the standard interface descriptors. */
 607	while (buflen > 2 && buffer[1] != USB_DT_CS_INTERFACE) {
 608		buflen -= buffer[0];
 609		buffer += buffer[0];
 610	}
 611
 612	if (buflen <= 2) {
 613		uvc_trace(UVC_TRACE_DESCR, "no class-specific streaming "
 614			"interface descriptors found.\n");
 615		goto error;
 616	}
 617
 618	/* Parse the header descriptor. */
 619	switch (buffer[2]) {
 620	case UVC_VS_OUTPUT_HEADER:
 621		streaming->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
 622		size = 9;
 623		break;
 624
 625	case UVC_VS_INPUT_HEADER:
 626		streaming->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 627		size = 13;
 628		break;
 629
 630	default:
 631		uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface "
 632			"%d HEADER descriptor not found.\n", dev->udev->devnum,
 633			alts->desc.bInterfaceNumber);
 634		goto error;
 635	}
 636
 637	p = buflen >= 4 ? buffer[3] : 0;
 638	n = buflen >= size ? buffer[size-1] : 0;
 639
 640	if (buflen < size + p*n) {
 641		uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 642			"interface %d HEADER descriptor is invalid.\n",
 643			dev->udev->devnum, alts->desc.bInterfaceNumber);
 644		goto error;
 645	}
 646
 647	streaming->header.bNumFormats = p;
 648	streaming->header.bEndpointAddress = buffer[6];
 649	if (buffer[2] == UVC_VS_INPUT_HEADER) {
 650		streaming->header.bmInfo = buffer[7];
 651		streaming->header.bTerminalLink = buffer[8];
 652		streaming->header.bStillCaptureMethod = buffer[9];
 653		streaming->header.bTriggerSupport = buffer[10];
 654		streaming->header.bTriggerUsage = buffer[11];
 655	} else {
 656		streaming->header.bTerminalLink = buffer[7];
 657	}
 658	streaming->header.bControlSize = n;
 659
 660	streaming->header.bmaControls = kmemdup(&buffer[size], p * n,
 661						GFP_KERNEL);
 662	if (streaming->header.bmaControls == NULL) {
 663		ret = -ENOMEM;
 664		goto error;
 665	}
 666
 667	buflen -= buffer[0];
 668	buffer += buffer[0];
 669
 670	_buffer = buffer;
 671	_buflen = buflen;
 672
 673	/* Count the format and frame descriptors. */
 674	while (_buflen > 2 && _buffer[1] == USB_DT_CS_INTERFACE) {
 675		switch (_buffer[2]) {
 676		case UVC_VS_FORMAT_UNCOMPRESSED:
 677		case UVC_VS_FORMAT_MJPEG:
 678		case UVC_VS_FORMAT_FRAME_BASED:
 679			nformats++;
 680			break;
 681
 682		case UVC_VS_FORMAT_DV:
 683			/* DV format has no frame descriptor. We will create a
 684			 * dummy frame descriptor with a dummy frame interval.
 685			 */
 686			nformats++;
 687			nframes++;
 688			nintervals++;
 689			break;
 690
 691		case UVC_VS_FORMAT_MPEG2TS:
 692		case UVC_VS_FORMAT_STREAM_BASED:
 693			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 694				"interface %d FORMAT %u is not supported.\n",
 695				dev->udev->devnum,
 696				alts->desc.bInterfaceNumber, _buffer[2]);
 697			break;
 698
 699		case UVC_VS_FRAME_UNCOMPRESSED:
 700		case UVC_VS_FRAME_MJPEG:
 701			nframes++;
 702			if (_buflen > 25)
 703				nintervals += _buffer[25] ? _buffer[25] : 3;
 704			break;
 705
 706		case UVC_VS_FRAME_FRAME_BASED:
 707			nframes++;
 708			if (_buflen > 21)
 709				nintervals += _buffer[21] ? _buffer[21] : 3;
 710			break;
 711		}
 712
 713		_buflen -= _buffer[0];
 714		_buffer += _buffer[0];
 715	}
 716
 717	if (nformats == 0) {
 718		uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface "
 719			"%d has no supported formats defined.\n",
 720			dev->udev->devnum, alts->desc.bInterfaceNumber);
 721		goto error;
 722	}
 723
 724	size = nformats * sizeof *format + nframes * sizeof *frame
 725	     + nintervals * sizeof *interval;
 726	format = kzalloc(size, GFP_KERNEL);
 727	if (format == NULL) {
 728		ret = -ENOMEM;
 729		goto error;
 730	}
 731
 732	frame = (struct uvc_frame *)&format[nformats];
 733	interval = (__u32 *)&frame[nframes];
 734
 735	streaming->format = format;
 736	streaming->nformats = nformats;
 737
 738	/* Parse the format descriptors. */
 739	while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE) {
 740		switch (buffer[2]) {
 741		case UVC_VS_FORMAT_UNCOMPRESSED:
 742		case UVC_VS_FORMAT_MJPEG:
 743		case UVC_VS_FORMAT_DV:
 744		case UVC_VS_FORMAT_FRAME_BASED:
 745			format->frame = frame;
 746			ret = uvc_parse_format(dev, streaming, format,
 747				&interval, buffer, buflen);
 748			if (ret < 0)
 749				goto error;
 750
 751			frame += format->nframes;
 752			format++;
 753
 754			buflen -= ret;
 755			buffer += ret;
 756			continue;
 757
 758		default:
 759			break;
 760		}
 761
 762		buflen -= buffer[0];
 763		buffer += buffer[0];
 764	}
 765
 766	if (buflen)
 767		uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface "
 768			"%d has %u bytes of trailing descriptor garbage.\n",
 769			dev->udev->devnum, alts->desc.bInterfaceNumber, buflen);
 770
 771	/* Parse the alternate settings to find the maximum bandwidth. */
 772	for (i = 0; i < intf->num_altsetting; ++i) {
 773		struct usb_host_endpoint *ep;
 774		alts = &intf->altsetting[i];
 775		ep = uvc_find_endpoint(alts,
 776				streaming->header.bEndpointAddress);
 777		if (ep == NULL)
 778			continue;
 779
 780		psize = le16_to_cpu(ep->desc.wMaxPacketSize);
 781		psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3));
 782		if (psize > streaming->maxpsize)
 783			streaming->maxpsize = psize;
 784	}
 785
 786	list_add_tail(&streaming->list, &dev->streams);
 787	return 0;
 788
 789error:
 790	usb_driver_release_interface(&uvc_driver.driver, intf);
 791	usb_put_intf(intf);
 792	kfree(streaming->format);
 793	kfree(streaming->header.bmaControls);
 794	kfree(streaming);
 795	return ret;
 796}
 797
 798static struct uvc_entity *uvc_alloc_entity(u16 type, u8 id,
 799		unsigned int num_pads, unsigned int extra_size)
 800{
 801	struct uvc_entity *entity;
 802	unsigned int num_inputs;
 803	unsigned int size;
 804	unsigned int i;
 805
 806	extra_size = ALIGN(extra_size, sizeof(*entity->pads));
 807	num_inputs = (type & UVC_TERM_OUTPUT) ? num_pads : num_pads - 1;
 808	size = sizeof(*entity) + extra_size + sizeof(*entity->pads) * num_pads
 809	     + num_inputs;
 810	entity = kzalloc(size, GFP_KERNEL);
 811	if (entity == NULL)
 812		return NULL;
 813
 814	entity->id = id;
 815	entity->type = type;
 816
 817	entity->num_links = 0;
 818	entity->num_pads = num_pads;
 819	entity->pads = ((void *)(entity + 1)) + extra_size;
 820
 821	for (i = 0; i < num_inputs; ++i)
 822		entity->pads[i].flags = MEDIA_PAD_FL_SINK;
 823	if (!UVC_ENTITY_IS_OTERM(entity))
 824		entity->pads[num_pads-1].flags = MEDIA_PAD_FL_SOURCE;
 825
 826	entity->bNrInPins = num_inputs;
 827	entity->baSourceID = (__u8 *)(&entity->pads[num_pads]);
 828
 829	return entity;
 830}
 831
 832/* Parse vendor-specific extensions. */
 833static int uvc_parse_vendor_control(struct uvc_device *dev,
 834	const unsigned char *buffer, int buflen)
 835{
 836	struct usb_device *udev = dev->udev;
 837	struct usb_host_interface *alts = dev->intf->cur_altsetting;
 838	struct uvc_entity *unit;
 839	unsigned int n, p;
 840	int handled = 0;
 841
 842	switch (le16_to_cpu(dev->udev->descriptor.idVendor)) {
 843	case 0x046d:		/* Logitech */
 844		if (buffer[1] != 0x41 || buffer[2] != 0x01)
 845			break;
 846
 847		/* Logitech implements several vendor specific functions
 848		 * through vendor specific extension units (LXU).
 849		 *
 850		 * The LXU descriptors are similar to XU descriptors
 851		 * (see "USB Device Video Class for Video Devices", section
 852		 * 3.7.2.6 "Extension Unit Descriptor") with the following
 853		 * differences:
 854		 *
 855		 * ----------------------------------------------------------
 856		 * 0		bLength		1	 Number
 857		 *	Size of this descriptor, in bytes: 24+p+n*2
 858		 * ----------------------------------------------------------
 859		 * 23+p+n	bmControlsType	N	Bitmap
 860		 * 	Individual bits in the set are defined:
 861		 * 	0: Absolute
 862		 * 	1: Relative
 863		 *
 864		 * 	This bitset is mapped exactly the same as bmControls.
 865		 * ----------------------------------------------------------
 866		 * 23+p+n*2	bReserved	1	Boolean
 867		 * ----------------------------------------------------------
 868		 * 24+p+n*2	iExtension	1	Index
 869		 *	Index of a string descriptor that describes this
 870		 *	extension unit.
 871		 * ----------------------------------------------------------
 872		 */
 873		p = buflen >= 22 ? buffer[21] : 0;
 874		n = buflen >= 25 + p ? buffer[22+p] : 0;
 875
 876		if (buflen < 25 + p + 2*n) {
 877			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
 878				"interface %d EXTENSION_UNIT error\n",
 879				udev->devnum, alts->desc.bInterfaceNumber);
 880			break;
 881		}
 882
 883		unit = uvc_alloc_entity(UVC_VC_EXTENSION_UNIT, buffer[3],
 884					p + 1, 2*n);
 885		if (unit == NULL)
 886			return -ENOMEM;
 887
 888		memcpy(unit->extension.guidExtensionCode, &buffer[4], 16);
 889		unit->extension.bNumControls = buffer[20];
 890		memcpy(unit->baSourceID, &buffer[22], p);
 891		unit->extension.bControlSize = buffer[22+p];
 892		unit->extension.bmControls = (__u8 *)unit + sizeof(*unit);
 893		unit->extension.bmControlsType = (__u8 *)unit + sizeof(*unit)
 894					       + n;
 895		memcpy(unit->extension.bmControls, &buffer[23+p], 2*n);
 896
 897		if (buffer[24+p+2*n] != 0)
 898			usb_string(udev, buffer[24+p+2*n], unit->name,
 899				   sizeof unit->name);
 900		else
 901			sprintf(unit->name, "Extension %u", buffer[3]);
 902
 903		list_add_tail(&unit->list, &dev->entities);
 904		handled = 1;
 905		break;
 906	}
 907
 908	return handled;
 909}
 910
 911static int uvc_parse_standard_control(struct uvc_device *dev,
 912	const unsigned char *buffer, int buflen)
 913{
 914	struct usb_device *udev = dev->udev;
 915	struct uvc_entity *unit, *term;
 916	struct usb_interface *intf;
 917	struct usb_host_interface *alts = dev->intf->cur_altsetting;
 918	unsigned int i, n, p, len;
 919	__u16 type;
 920
 921	switch (buffer[2]) {
 922	case UVC_VC_HEADER:
 923		n = buflen >= 12 ? buffer[11] : 0;
 924
 925		if (buflen < 12 || buflen < 12 + n) {
 926			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
 927				"interface %d HEADER error\n", udev->devnum,
 928				alts->desc.bInterfaceNumber);
 929			return -EINVAL;
 930		}
 931
 932		dev->uvc_version = get_unaligned_le16(&buffer[3]);
 933		dev->clock_frequency = get_unaligned_le32(&buffer[7]);
 934
 935		/* Parse all USB Video Streaming interfaces. */
 936		for (i = 0; i < n; ++i) {
 937			intf = usb_ifnum_to_if(udev, buffer[12+i]);
 938			if (intf == NULL) {
 939				uvc_trace(UVC_TRACE_DESCR, "device %d "
 940					"interface %d doesn't exists\n",
 941					udev->devnum, i);
 942				continue;
 943			}
 944
 945			uvc_parse_streaming(dev, intf);
 946		}
 947		break;
 948
 949	case UVC_VC_INPUT_TERMINAL:
 950		if (buflen < 8) {
 951			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
 952				"interface %d INPUT_TERMINAL error\n",
 953				udev->devnum, alts->desc.bInterfaceNumber);
 954			return -EINVAL;
 955		}
 956
 957		/* Make sure the terminal type MSB is not null, otherwise it
 958		 * could be confused with a unit.
 959		 */
 960		type = get_unaligned_le16(&buffer[4]);
 961		if ((type & 0xff00) == 0) {
 962			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
 963				"interface %d INPUT_TERMINAL %d has invalid "
 964				"type 0x%04x, skipping\n", udev->devnum,
 965				alts->desc.bInterfaceNumber,
 966				buffer[3], type);
 967			return 0;
 968		}
 969
 970		n = 0;
 971		p = 0;
 972		len = 8;
 973
 974		if (type == UVC_ITT_CAMERA) {
 975			n = buflen >= 15 ? buffer[14] : 0;
 976			len = 15;
 977
 978		} else if (type == UVC_ITT_MEDIA_TRANSPORT_INPUT) {
 979			n = buflen >= 9 ? buffer[8] : 0;
 980			p = buflen >= 10 + n ? buffer[9+n] : 0;
 981			len = 10;
 982		}
 983
 984		if (buflen < len + n + p) {
 985			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
 986				"interface %d INPUT_TERMINAL error\n",
 987				udev->devnum, alts->desc.bInterfaceNumber);
 988			return -EINVAL;
 989		}
 990
 991		term = uvc_alloc_entity(type | UVC_TERM_INPUT, buffer[3],
 992					1, n + p);
 993		if (term == NULL)
 994			return -ENOMEM;
 995
 996		if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA) {
 997			term->camera.bControlSize = n;
 998			term->camera.bmControls = (__u8 *)term + sizeof *term;
 999			term->camera.wObjectiveFocalLengthMin =
1000				get_unaligned_le16(&buffer[8]);
1001			term->camera.wObjectiveFocalLengthMax =
1002				get_unaligned_le16(&buffer[10]);
1003			term->camera.wOcularFocalLength =
1004				get_unaligned_le16(&buffer[12]);
1005			memcpy(term->camera.bmControls, &buffer[15], n);
1006		} else if (UVC_ENTITY_TYPE(term) ==
1007			   UVC_ITT_MEDIA_TRANSPORT_INPUT) {
1008			term->media.bControlSize = n;
1009			term->media.bmControls = (__u8 *)term + sizeof *term;
1010			term->media.bTransportModeSize = p;
1011			term->media.bmTransportModes = (__u8 *)term
1012						     + sizeof *term + n;
1013			memcpy(term->media.bmControls, &buffer[9], n);
1014			memcpy(term->media.bmTransportModes, &buffer[10+n], p);
1015		}
1016
1017		if (buffer[7] != 0)
1018			usb_string(udev, buffer[7], term->name,
1019				   sizeof term->name);
1020		else if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA)
1021			sprintf(term->name, "Camera %u", buffer[3]);
1022		else if (UVC_ENTITY_TYPE(term) == UVC_ITT_MEDIA_TRANSPORT_INPUT)
1023			sprintf(term->name, "Media %u", buffer[3]);
1024		else
1025			sprintf(term->name, "Input %u", buffer[3]);
1026
1027		list_add_tail(&term->list, &dev->entities);
1028		break;
1029
1030	case UVC_VC_OUTPUT_TERMINAL:
1031		if (buflen < 9) {
1032			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
1033				"interface %d OUTPUT_TERMINAL error\n",
1034				udev->devnum, alts->desc.bInterfaceNumber);
1035			return -EINVAL;
1036		}
1037
1038		/* Make sure the terminal type MSB is not null, otherwise it
1039		 * could be confused with a unit.
1040		 */
1041		type = get_unaligned_le16(&buffer[4]);
1042		if ((type & 0xff00) == 0) {
1043			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
1044				"interface %d OUTPUT_TERMINAL %d has invalid "
1045				"type 0x%04x, skipping\n", udev->devnum,
1046				alts->desc.bInterfaceNumber, buffer[3], type);
1047			return 0;
1048		}
1049
1050		term = uvc_alloc_entity(type | UVC_TERM_OUTPUT, buffer[3],
1051					1, 0);
1052		if (term == NULL)
1053			return -ENOMEM;
1054
1055		memcpy(term->baSourceID, &buffer[7], 1);
1056
1057		if (buffer[8] != 0)
1058			usb_string(udev, buffer[8], term->name,
1059				   sizeof term->name);
1060		else
1061			sprintf(term->name, "Output %u", buffer[3]);
1062
1063		list_add_tail(&term->list, &dev->entities);
1064		break;
1065
1066	case UVC_VC_SELECTOR_UNIT:
1067		p = buflen >= 5 ? buffer[4] : 0;
1068
1069		if (buflen < 5 || buflen < 6 + p) {
1070			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
1071				"interface %d SELECTOR_UNIT error\n",
1072				udev->devnum, alts->desc.bInterfaceNumber);
1073			return -EINVAL;
1074		}
1075
1076		unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, 0);
1077		if (unit == NULL)
1078			return -ENOMEM;
1079
1080		memcpy(unit->baSourceID, &buffer[5], p);
1081
1082		if (buffer[5+p] != 0)
1083			usb_string(udev, buffer[5+p], unit->name,
1084				   sizeof unit->name);
1085		else
1086			sprintf(unit->name, "Selector %u", buffer[3]);
1087
1088		list_add_tail(&unit->list, &dev->entities);
1089		break;
1090
1091	case UVC_VC_PROCESSING_UNIT:
1092		n = buflen >= 8 ? buffer[7] : 0;
1093		p = dev->uvc_version >= 0x0110 ? 10 : 9;
1094
1095		if (buflen < p + n) {
1096			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
1097				"interface %d PROCESSING_UNIT error\n",
1098				udev->devnum, alts->desc.bInterfaceNumber);
1099			return -EINVAL;
1100		}
1101
1102		unit = uvc_alloc_entity(buffer[2], buffer[3], 2, n);
1103		if (unit == NULL)
1104			return -ENOMEM;
1105
1106		memcpy(unit->baSourceID, &buffer[4], 1);
1107		unit->processing.wMaxMultiplier =
1108			get_unaligned_le16(&buffer[5]);
1109		unit->processing.bControlSize = buffer[7];
1110		unit->processing.bmControls = (__u8 *)unit + sizeof *unit;
1111		memcpy(unit->processing.bmControls, &buffer[8], n);
1112		if (dev->uvc_version >= 0x0110)
1113			unit->processing.bmVideoStandards = buffer[9+n];
1114
1115		if (buffer[8+n] != 0)
1116			usb_string(udev, buffer[8+n], unit->name,
1117				   sizeof unit->name);
1118		else
1119			sprintf(unit->name, "Processing %u", buffer[3]);
1120
1121		list_add_tail(&unit->list, &dev->entities);
1122		break;
1123
1124	case UVC_VC_EXTENSION_UNIT:
1125		p = buflen >= 22 ? buffer[21] : 0;
1126		n = buflen >= 24 + p ? buffer[22+p] : 0;
1127
1128		if (buflen < 24 + p + n) {
1129			uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
1130				"interface %d EXTENSION_UNIT error\n",
1131				udev->devnum, alts->desc.bInterfaceNumber);
1132			return -EINVAL;
1133		}
1134
1135		unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, n);
1136		if (unit == NULL)
1137			return -ENOMEM;
1138
1139		memcpy(unit->extension.guidExtensionCode, &buffer[4], 16);
1140		unit->extension.bNumControls = buffer[20];
1141		memcpy(unit->baSourceID, &buffer[22], p);
1142		unit->extension.bControlSize = buffer[22+p];
1143		unit->extension.bmControls = (__u8 *)unit + sizeof *unit;
1144		memcpy(unit->extension.bmControls, &buffer[23+p], n);
1145
1146		if (buffer[23+p+n] != 0)
1147			usb_string(udev, buffer[23+p+n], unit->name,
1148				   sizeof unit->name);
1149		else
1150			sprintf(unit->name, "Extension %u", buffer[3]);
1151
1152		list_add_tail(&unit->list, &dev->entities);
1153		break;
1154
1155	default:
1156		uvc_trace(UVC_TRACE_DESCR, "Found an unknown CS_INTERFACE "
1157			"descriptor (%u)\n", buffer[2]);
1158		break;
1159	}
1160
1161	return 0;
1162}
1163
1164static int uvc_parse_control(struct uvc_device *dev)
1165{
1166	struct usb_host_interface *alts = dev->intf->cur_altsetting;
1167	unsigned char *buffer = alts->extra;
1168	int buflen = alts->extralen;
1169	int ret;
1170
1171	/* Parse the default alternate setting only, as the UVC specification
1172	 * defines a single alternate setting, the default alternate setting
1173	 * zero.
1174	 */
1175
1176	while (buflen > 2) {
1177		if (uvc_parse_vendor_control(dev, buffer, buflen) ||
1178		    buffer[1] != USB_DT_CS_INTERFACE)
1179			goto next_descriptor;
1180
1181		if ((ret = uvc_parse_standard_control(dev, buffer, buflen)) < 0)
1182			return ret;
1183
1184next_descriptor:
1185		buflen -= buffer[0];
1186		buffer += buffer[0];
1187	}
1188
1189	/* Check if the optional status endpoint is present. Built-in iSight
1190	 * webcams have an interrupt endpoint but spit proprietary data that
1191	 * don't conform to the UVC status endpoint messages. Don't try to
1192	 * handle the interrupt endpoint for those cameras.
1193	 */
1194	if (alts->desc.bNumEndpoints == 1 &&
1195	    !(dev->quirks & UVC_QUIRK_BUILTIN_ISIGHT)) {
1196		struct usb_host_endpoint *ep = &alts->endpoint[0];
1197		struct usb_endpoint_descriptor *desc = &ep->desc;
1198
1199		if (usb_endpoint_is_int_in(desc) &&
1200		    le16_to_cpu(desc->wMaxPacketSize) >= 8 &&
1201		    desc->bInterval != 0) {
1202			uvc_trace(UVC_TRACE_DESCR, "Found a Status endpoint "
1203				"(addr %02x).\n", desc->bEndpointAddress);
1204			dev->int_ep = ep;
1205		}
1206	}
1207
1208	return 0;
1209}
1210
1211/* ------------------------------------------------------------------------
1212 * UVC device scan
1213 */
1214
1215/*
1216 * Scan the UVC descriptors to locate a chain starting at an Output Terminal
1217 * and containing the following units:
1218 *
1219 * - one or more Output Terminals (USB Streaming or Display)
1220 * - zero or one Processing Unit
1221 * - zero, one or more single-input Selector Units
1222 * - zero or one multiple-input Selector Units, provided all inputs are
1223 *   connected to input terminals
1224 * - zero, one or mode single-input Extension Units
1225 * - one or more Input Terminals (Camera, External or USB Streaming)
1226 *
1227 * The terminal and units must match on of the following structures:
1228 *
1229 * ITT_*(0) -> +---------+    +---------+    +---------+ -> TT_STREAMING(0)
1230 * ...         | SU{0,1} | -> | PU{0,1} | -> | XU{0,n} |    ...
1231 * ITT_*(n) -> +---------+    +---------+    +---------+ -> TT_STREAMING(n)
1232 *
1233 *                 +---------+    +---------+ -> OTT_*(0)
1234 * TT_STREAMING -> | PU{0,1} | -> | XU{0,n} |    ...
1235 *                 +---------+    +---------+ -> OTT_*(n)
1236 *
1237 * The Processing Unit and Extension Units can be in any order. Additional
1238 * Extension Units connected to the main chain as single-unit branches are
1239 * also supported. Single-input Selector Units are ignored.
1240 */
1241static int uvc_scan_chain_entity(struct uvc_video_chain *chain,
1242	struct uvc_entity *entity)
1243{
1244	switch (UVC_ENTITY_TYPE(entity)) {
1245	case UVC_VC_EXTENSION_UNIT:
1246		if (uvc_trace_param & UVC_TRACE_PROBE)
1247			printk(" <- XU %d", entity->id);
1248
1249		if (entity->bNrInPins != 1) {
1250			uvc_trace(UVC_TRACE_DESCR, "Extension unit %d has more "
1251				"than 1 input pin.\n", entity->id);
1252			return -1;
1253		}
1254
1255		break;
1256
1257	case UVC_VC_PROCESSING_UNIT:
1258		if (uvc_trace_param & UVC_TRACE_PROBE)
1259			printk(" <- PU %d", entity->id);
1260
1261		if (chain->processing != NULL) {
1262			uvc_trace(UVC_TRACE_DESCR, "Found multiple "
1263				"Processing Units in chain.\n");
1264			return -1;
1265		}
1266
1267		chain->processing = entity;
1268		break;
1269
1270	case UVC_VC_SELECTOR_UNIT:
1271		if (uvc_trace_param & UVC_TRACE_PROBE)
1272			printk(" <- SU %d", entity->id);
1273
1274		/* Single-input selector units are ignored. */
1275		if (entity->bNrInPins == 1)
1276			break;
1277
1278		if (chain->selector != NULL) {
1279			uvc_trace(UVC_TRACE_DESCR, "Found multiple Selector "
1280				"Units in chain.\n");
1281			return -1;
1282		}
1283
1284		chain->selector = entity;
1285		break;
1286
1287	case UVC_ITT_VENDOR_SPECIFIC:
1288	case UVC_ITT_CAMERA:
1289	case UVC_ITT_MEDIA_TRANSPORT_INPUT:
1290		if (uvc_trace_param & UVC_TRACE_PROBE)
1291			printk(" <- IT %d\n", entity->id);
1292
1293		break;
1294
1295	case UVC_OTT_VENDOR_SPECIFIC:
1296	case UVC_OTT_DISPLAY:
1297	case UVC_OTT_MEDIA_TRANSPORT_OUTPUT:
1298		if (uvc_trace_param & UVC_TRACE_PROBE)
1299			printk(" OT %d", entity->id);
1300
1301		break;
1302
1303	case UVC_TT_STREAMING:
1304		if (UVC_ENTITY_IS_ITERM(entity)) {
1305			if (uvc_trace_param & UVC_TRACE_PROBE)
1306				printk(" <- IT %d\n", entity->id);
1307		} else {
1308			if (uvc_trace_param & UVC_TRACE_PROBE)
1309				printk(" OT %d", entity->id);
1310		}
1311
1312		break;
1313
1314	default:
1315		uvc_trace(UVC_TRACE_DESCR, "Unsupported entity type "
1316			"0x%04x found in chain.\n", UVC_ENTITY_TYPE(entity));
1317		return -1;
1318	}
1319
1320	list_add_tail(&entity->chain, &chain->entities);
1321	return 0;
1322}
1323
1324static int uvc_scan_chain_forward(struct uvc_video_chain *chain,
1325	struct uvc_entity *entity, struct uvc_entity *prev)
1326{
1327	struct uvc_entity *forward;
1328	int found;
1329
1330	/* Forward scan */
1331	forward = NULL;
1332	found = 0;
1333
1334	while (1) {
1335		forward = uvc_entity_by_reference(chain->dev, entity->id,
1336			forward);
1337		if (forward == NULL)
1338			break;
1339		if (forward == prev)
1340			continue;
1341
1342		switch (UVC_ENTITY_TYPE(forward)) {
1343		case UVC_VC_EXTENSION_UNIT:
1344			if (forward->bNrInPins != 1) {
1345				uvc_trace(UVC_TRACE_DESCR, "Extension unit %d "
1346					  "has more than 1 input pin.\n",
1347					  entity->id);
1348				return -EINVAL;
1349			}
1350
1351			list_add_tail(&forward->chain, &chain->entities);
1352			if (uvc_trace_param & UVC_TRACE_PROBE) {
1353				if (!found)
1354					printk(" (->");
1355
1356				printk(" XU %d", forward->id);
1357				found = 1;
1358			}
1359			break;
1360
1361		case UVC_OTT_VENDOR_SPECIFIC:
1362		case UVC_OTT_DISPLAY:
1363		case UVC_OTT_MEDIA_TRANSPORT_OUTPUT:
1364		case UVC_TT_STREAMING:
1365			if (UVC_ENTITY_IS_ITERM(forward)) {
1366				uvc_trace(UVC_TRACE_DESCR, "Unsupported input "
1367					"terminal %u.\n", forward->id);
1368				return -EINVAL;
1369			}
1370
1371			list_add_tail(&forward->chain, &chain->entities);
1372			if (uvc_trace_param & UVC_TRACE_PROBE) {
1373				if (!found)
1374					printk(" (->");
1375
1376				printk(" OT %d", forward->id);
1377				found = 1;
1378			}
1379			break;
1380		}
1381	}
1382	if (found)
1383		printk(")");
1384
1385	return 0;
1386}
1387
1388static int uvc_scan_chain_backward(struct uvc_video_chain *chain,
1389	struct uvc_entity **_entity)
1390{
1391	struct uvc_entity *entity = *_entity;
1392	struct uvc_entity *term;
1393	int id = -EINVAL, i;
1394
1395	switch (UVC_ENTITY_TYPE(entity)) {
1396	case UVC_VC_EXTENSION_UNIT:
1397	case UVC_VC_PROCESSING_UNIT:
1398		id = entity->baSourceID[0];
1399		break;
1400
1401	case UVC_VC_SELECTOR_UNIT:
1402		/* Single-input selector units are ignored. */
1403		if (entity->bNrInPins == 1) {
1404			id = entity->baSourceID[0];
1405			break;
1406		}
1407
1408		if (uvc_trace_param & UVC_TRACE_PROBE)
1409			printk(" <- IT");
1410
1411		chain->selector = entity;
1412		for (i = 0; i < entity->bNrInPins; ++i) {
1413			id = entity->baSourceID[i];
1414			term = uvc_entity_by_id(chain->dev, id);
1415			if (term == NULL || !UVC_ENTITY_IS_ITERM(term)) {
1416				uvc_trace(UVC_TRACE_DESCR, "Selector unit %d "
1417					"input %d isn't connected to an "
1418					"input terminal\n", entity->id, i);
1419				return -1;
1420			}
1421
1422			if (uvc_trace_param & UVC_TRACE_PROBE)
1423				printk(" %d", term->id);
1424
1425			list_add_tail(&term->chain, &chain->entities);
1426			uvc_scan_chain_forward(chain, term, entity);
1427		}
1428
1429		if (uvc_trace_param & UVC_TRACE_PROBE)
1430			printk("\n");
1431
1432		id = 0;
1433		break;
1434
1435	case UVC_ITT_VENDOR_SPECIFIC:
1436	case UVC_ITT_CAMERA:
1437	case UVC_ITT_MEDIA_TRANSPORT_INPUT:
1438	case UVC_OTT_VENDOR_SPECIFIC:
1439	case UVC_OTT_DISPLAY:
1440	case UVC_OTT_MEDIA_TRANSPORT_OUTPUT:
1441	case UVC_TT_STREAMING:
1442		id = UVC_ENTITY_IS_OTERM(entity) ? entity->baSourceID[0] : 0;
1443		break;
1444	}
1445
1446	if (id <= 0) {
1447		*_entity = NULL;
1448		return id;
1449	}
1450
1451	entity = uvc_entity_by_id(chain->dev, id);
1452	if (entity == NULL) {
1453		uvc_trace(UVC_TRACE_DESCR, "Found reference to "
1454			"unknown entity %d.\n", id);
1455		return -EINVAL;
1456	}
1457
1458	*_entity = entity;
1459	return 0;
1460}
1461
1462static int uvc_scan_chain(struct uvc_video_chain *chain,
1463			  struct uvc_entity *term)
1464{
1465	struct uvc_entity *entity, *prev;
1466
1467	uvc_trace(UVC_TRACE_PROBE, "Scanning UVC chain:");
1468
1469	entity = term;
1470	prev = NULL;
1471
1472	while (entity != NULL) {
1473		/* Entity must not be part of an existing chain */
1474		if (entity->chain.next || entity->chain.prev) {
1475			uvc_trace(UVC_TRACE_DESCR, "Found reference to "
1476				"entity %d already in chain.\n", entity->id);
1477			return -EINVAL;
1478		}
1479
1480		/* Process entity */
1481		if (uvc_scan_chain_entity(chain, entity) < 0)
1482			return -EINVAL;
1483
1484		/* Forward scan */
1485		if (uvc_scan_chain_forward(chain, entity, prev) < 0)
1486			return -EINVAL;
1487
1488		/* Backward scan */
1489		prev = entity;
1490		if (uvc_scan_chain_backward(chain, &entity) < 0)
1491			return -EINVAL;
1492	}
1493
1494	return 0;
1495}
1496
1497static unsigned int uvc_print_terms(struct list_head *terms, u16 dir,
1498		char *buffer)
1499{
1500	struct uvc_entity *term;
1501	unsigned int nterms = 0;
1502	char *p = buffer;
1503
1504	list_for_each_entry(term, terms, chain) {
1505		if (!UVC_ENTITY_IS_TERM(term) ||
1506		    UVC_TERM_DIRECTION(term) != dir)
1507			continue;
1508
1509		if (nterms)
1510			p += sprintf(p, ",");
1511		if (++nterms >= 4) {
1512			p += sprintf(p, "...");
1513			break;
1514		}
1515		p += sprintf(p, "%u", term->id);
1516	}
1517
1518	return p - buffer;
1519}
1520
1521static const char *uvc_print_chain(struct uvc_video_chain *chain)
1522{
1523	static char buffer[43];
1524	char *p = buffer;
1525
1526	p += uvc_print_terms(&chain->entities, UVC_TERM_INPUT, p);
1527	p += sprintf(p, " -> ");
1528	uvc_print_terms(&chain->entities, UVC_TERM_OUTPUT, p);
1529
1530	return buffer;
1531}
1532
1533/*
1534 * Scan the device for video chains and register video devices.
1535 *
1536 * Chains are scanned starting at their output terminals and walked backwards.
1537 */
1538static int uvc_scan_device(struct uvc_device *dev)
1539{
1540	struct uvc_video_chain *chain;
1541	struct uvc_entity *term;
1542
1543	list_for_each_entry(term, &dev->entities, list) {
1544		if (!UVC_ENTITY_IS_OTERM(term))
1545			continue;
1546
1547		/* If the terminal is already included in a chain, skip it.
1548		 * This can happen for chains that have multiple output
1549		 * terminals, where all output terminals beside the first one
1550		 * will be inserted in the chain in forward scans.
1551		 */
1552		if (term->chain.next || term->chain.prev)
1553			continue;
1554
1555		chain = kzalloc(sizeof(*chain), GFP_KERNEL);
1556		if (chain == NULL)
1557			return -ENOMEM;
1558
1559		INIT_LIST_HEAD(&chain->entities);
1560		mutex_init(&chain->ctrl_mutex);
1561		chain->dev = dev;
1562
1563		if (uvc_scan_chain(chain, term) < 0) {
1564			kfree(chain);
1565			continue;
1566		}
1567
1568		uvc_trace(UVC_TRACE_PROBE, "Found a valid video chain (%s).\n",
1569			  uvc_print_chain(chain));
1570
1571		list_add_tail(&chain->list, &dev->chains);
1572	}
1573
1574	if (list_empty(&dev->chains)) {
1575		uvc_printk(KERN_INFO, "No valid video chain found.\n");
1576		return -1;
1577	}
1578
1579	return 0;
1580}
1581
1582/* ------------------------------------------------------------------------
1583 * Video device registration and unregistration
1584 */
1585
1586/*
1587 * Delete the UVC device.
1588 *
1589 * Called by the kernel when the last reference to the uvc_device structure
1590 * is released.
1591 *
1592 * As this function is called after or during disconnect(), all URBs have
1593 * already been canceled by the USB core. There is no need to kill the
1594 * interrupt URB manually.
1595 */
1596static void uvc_delete(struct uvc_device *dev)
1597{
1598	struct list_head *p, *n;
1599
1600	usb_put_intf(dev->intf);
1601	usb_put_dev(dev->udev);
1602
1603	uvc_status_cleanup(dev);
1604	uvc_ctrl_cleanup_device(dev);
1605
1606	if (dev->vdev.dev)
1607		v4l2_device_unregister(&dev->vdev);
1608#ifdef CONFIG_MEDIA_CONTROLLER
1609	if (media_devnode_is_registered(&dev->mdev.devnode))
1610		media_device_unregister(&dev->mdev);
1611#endif
1612
1613	list_for_each_safe(p, n, &dev->chains) {
1614		struct uvc_video_chain *chain;
1615		chain = list_entry(p, struct uvc_video_chain, list);
1616		kfree(chain);
1617	}
1618
1619	list_for_each_safe(p, n, &dev->entities) {
1620		struct uvc_entity *entity;
1621		entity = list_entry(p, struct uvc_entity, list);
1622#ifdef CONFIG_MEDIA_CONTROLLER
1623		uvc_mc_cleanup_entity(entity);
1624#endif
1625		if (entity->vdev) {
1626			video_device_release(entity->vdev);
1627			entity->vdev = NULL;
1628		}
1629		kfree(entity);
1630	}
1631
1632	list_for_each_safe(p, n, &dev->streams) {
1633		struct uvc_streaming *streaming;
1634		streaming = list_entry(p, struct uvc_streaming, list);
1635		usb_driver_release_interface(&uvc_driver.driver,
1636			streaming->intf);
1637		usb_put_intf(streaming->intf);
1638		kfree(streaming->format);
1639		kfree(streaming->header.bmaControls);
1640		kfree(streaming);
1641	}
1642
1643	kfree(dev);
1644}
1645
1646static void uvc_release(struct video_device *vdev)
1647{
1648	struct uvc_streaming *stream = video_get_drvdata(vdev);
1649	struct uvc_device *dev = stream->dev;
1650
1651	/* Decrement the registered streams count and delete the device when it
1652	 * reaches zero.
1653	 */
1654	if (atomic_dec_and_test(&dev->nstreams))
1655		uvc_delete(dev);
1656}
1657
1658/*
1659 * Unregister the video devices.
1660 */
1661static void uvc_unregister_video(struct uvc_device *dev)
1662{
1663	struct uvc_streaming *stream;
1664
1665	/* Unregistering all video devices might result in uvc_delete() being
1666	 * called from inside the loop if there's no open file handle. To avoid
1667	 * that, increment the stream count before iterating over the streams
1668	 * and decrement it when done.
1669	 */
1670	atomic_inc(&dev->nstreams);
1671
1672	list_for_each_entry(stream, &dev->streams, list) {
1673		if (stream->vdev == NULL)
1674			continue;
1675
1676		video_unregister_device(stream->vdev);
1677		stream->vdev = NULL;
1678
1679		uvc_debugfs_cleanup_stream(stream);
1680	}
1681
1682	/* Decrement the stream count and call uvc_delete explicitly if there
1683	 * are no stream left.
1684	 */
1685	if (atomic_dec_and_test(&dev->nstreams))
1686		uvc_delete(dev);
1687}
1688
1689static int uvc_register_video(struct uvc_device *dev,
1690		struct uvc_streaming *stream)
1691{
1692	struct video_device *vdev;
1693	int ret;
1694
1695	/* Initialize the streaming interface with default streaming
1696	 * parameters.
1697	 */
1698	ret = uvc_video_init(stream);
1699	if (ret < 0) {
1700		uvc_printk(KERN_ERR, "Failed to initialize the device "
1701			"(%d).\n", ret);
1702		return ret;
1703	}
1704
1705	uvc_debugfs_init_stream(stream);
1706
1707	/* Register the device with V4L. */
1708	vdev = video_device_alloc();
1709	if (vdev == NULL) {
1710		uvc_printk(KERN_ERR, "Failed to allocate video device (%d).\n",
1711			   ret);
1712		return -ENOMEM;
1713	}
1714
1715	/* We already hold a reference to dev->udev. The video device will be
1716	 * unregistered before the reference is released, so we don't need to
1717	 * get another one.
1718	 */
1719	vdev->v4l2_dev = &dev->vdev;
1720	vdev->fops = &uvc_fops;
1721	vdev->release = uvc_release;
1722	strlcpy(vdev->name, dev->name, sizeof vdev->name);
1723
1724	/* Set the driver data before calling video_register_device, otherwise
1725	 * uvc_v4l2_open might race us.
1726	 */
1727	stream->vdev = vdev;
1728	video_set_drvdata(vdev, stream);
1729
1730	ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
1731	if (ret < 0) {
1732		uvc_printk(KERN_ERR, "Failed to register video device (%d).\n",
1733			   ret);
1734		stream->vdev = NULL;
1735		video_device_release(vdev);
1736		return ret;
1737	}
1738
1739	atomic_inc(&dev->nstreams);
1740	return 0;
1741}
1742
1743/*
1744 * Register all video devices in all chains.
1745 */
1746static int uvc_register_terms(struct uvc_device *dev,
1747	struct uvc_video_chain *chain)
1748{
1749	struct uvc_streaming *stream;
1750	struct uvc_entity *term;
1751	int ret;
1752
1753	list_for_each_entry(term, &chain->entities, chain) {
1754		if (UVC_ENTITY_TYPE(term) != UVC_TT_STREAMING)
1755			continue;
1756
1757		stream = uvc_stream_by_id(dev, term->id);
1758		if (stream == NULL) {
1759			uvc_printk(KERN_INFO, "No streaming interface found "
1760				   "for terminal %u.", term->id);
1761			continue;
1762		}
1763
1764		stream->chain = chain;
1765		ret = uvc_register_video(dev, stream);
1766		if (ret < 0)
1767			return ret;
1768
1769		term->vdev = stream->vdev;
1770	}
1771
1772	return 0;
1773}
1774
1775static int uvc_register_chains(struct uvc_device *dev)
1776{
1777	struct uvc_video_chain *chain;
1778	int ret;
1779
1780	list_for_each_entry(chain, &dev->chains, list) {
1781		ret = uvc_register_terms(dev, chain);
1782		if (ret < 0)
1783			return ret;
1784
1785#ifdef CONFIG_MEDIA_CONTROLLER
1786		ret = uvc_mc_register_entities(chain);
1787		if (ret < 0) {
1788			uvc_printk(KERN_INFO, "Failed to register entites "
1789				"(%d).\n", ret);
1790		}
1791#endif
1792	}
1793
1794	return 0;
1795}
1796
1797/* ------------------------------------------------------------------------
1798 * USB probe, disconnect, suspend and resume
1799 */
1800
1801static int uvc_probe(struct usb_interface *intf,
1802		     const struct usb_device_id *id)
1803{
1804	struct usb_device *udev = interface_to_usbdev(intf);
1805	struct uvc_device *dev;
1806	int ret;
1807
1808	if (id->idVendor && id->idProduct)
1809		uvc_trace(UVC_TRACE_PROBE, "Probing known UVC device %s "
1810				"(%04x:%04x)\n", udev->devpath, id->idVendor,
1811				id->idProduct);
1812	else
1813		uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n",
1814				udev->devpath);
1815
1816	/* Allocate memory for the device and initialize it. */
1817	if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL)
1818		return -ENOMEM;
1819
1820	INIT_LIST_HEAD(&dev->entities);
1821	INIT_LIST_HEAD(&dev->chains);
1822	INIT_LIST_HEAD(&dev->streams);
1823	atomic_set(&dev->nstreams, 0);
1824	atomic_set(&dev->users, 0);
1825	atomic_set(&dev->nmappings, 0);
1826
1827	dev->udev = usb_get_dev(udev);
1828	dev->intf = usb_get_intf(intf);
1829	dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
1830	dev->quirks = (uvc_quirks_param == -1)
1831		    ? id->driver_info : uvc_quirks_param;
1832
1833	if (udev->product != NULL)
1834		strlcpy(dev->name, udev->product, sizeof dev->name);
1835	else
1836		snprintf(dev->name, sizeof dev->name,
1837			"UVC Camera (%04x:%04x)",
1838			le16_to_cpu(udev->descriptor.idVendor),
1839			le16_to_cpu(udev->descriptor.idProduct));
1840
1841	/* Parse the Video Class control descriptor. */
1842	if (uvc_parse_control(dev) < 0) {
1843		uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC "
1844			"descriptors.\n");
1845		goto error;
1846	}
1847
1848	uvc_printk(KERN_INFO, "Found UVC %u.%02x device %s (%04x:%04x)\n",
1849		dev->uvc_version >> 8, dev->uvc_version & 0xff,
1850		udev->product ? udev->product : "<unnamed>",
1851		le16_to_cpu(udev->descriptor.idVendor),
1852		le16_to_cpu(udev->descriptor.idProduct));
1853
1854	if (dev->quirks != id->driver_info) {
1855		uvc_printk(KERN_INFO, "Forcing device quirks to 0x%x by module "
1856			"parameter for testing purpose.\n", dev->quirks);
1857		uvc_printk(KERN_INFO, "Please report required quirks to the "
1858			"linux-uvc-devel mailing list.\n");
1859	}
1860
1861	/* Register the media and V4L2 devices. */
1862#ifdef CONFIG_MEDIA_CONTROLLER
1863	dev->mdev.dev = &intf->dev;
1864	strlcpy(dev->mdev.model, dev->name, sizeof(dev->mdev.model));
1865	if (udev->serial)
1866		strlcpy(dev->mdev.serial, udev->serial,
1867			sizeof(dev->mdev.serial));
1868	strcpy(dev->mdev.bus_info, udev->devpath);
1869	dev->mdev.hw_revision = le16_to_cpu(udev->descriptor.bcdDevice);
1870	dev->mdev.driver_version = LINUX_VERSION_CODE;
1871	if (media_device_register(&dev->mdev) < 0)
1872		goto error;
1873
1874	dev->vdev.mdev = &dev->mdev;
1875#endif
1876	if (v4l2_device_register(&intf->dev, &dev->vdev) < 0)
1877		goto error;
1878
1879	/* Initialize controls. */
1880	if (uvc_ctrl_init_device(dev) < 0)
1881		goto error;
1882
1883	/* Scan the device for video chains. */
1884	if (uvc_scan_device(dev) < 0)
1885		goto error;
1886
1887	/* Register video device nodes. */
1888	if (uvc_register_chains(dev) < 0)
1889		goto error;
1890
1891	/* Save our data pointer in the interface data. */
1892	usb_set_intfdata(intf, dev);
1893
1894	/* Initialize the interrupt URB. */
1895	if ((ret = uvc_status_init(dev)) < 0) {
1896		uvc_printk(KERN_INFO, "Unable to initialize the status "
1897			"endpoint (%d), status interrupt will not be "
1898			"supported.\n", ret);
1899	}
1900
1901	uvc_trace(UVC_TRACE_PROBE, "UVC device initialized.\n");
1902	usb_enable_autosuspend(udev);
1903	return 0;
1904
1905error:
1906	uvc_unregister_video(dev);
1907	return -ENODEV;
1908}
1909
1910static void uvc_disconnect(struct usb_interface *intf)
1911{
1912	struct uvc_device *dev = usb_get_intfdata(intf);
1913
1914	/* Set the USB interface data to NULL. This can be done outside the
1915	 * lock, as there's no other reader.
1916	 */
1917	usb_set_intfdata(intf, NULL);
1918
1919	if (intf->cur_altsetting->desc.bInterfaceSubClass ==
1920	    UVC_SC_VIDEOSTREAMING)
1921		return;
1922
1923	dev->state |= UVC_DEV_DISCONNECTED;
1924
1925	uvc_unregister_video(dev);
1926}
1927
1928static int uvc_suspend(struct usb_interface *intf, pm_message_t message)
1929{
1930	struct uvc_device *dev = usb_get_intfdata(intf);
1931	struct uvc_streaming *stream;
1932
1933	uvc_trace(UVC_TRACE_SUSPEND, "Suspending interface %u\n",
1934		intf->cur_altsetting->desc.bInterfaceNumber);
1935
1936	/* Controls are cached on the fly so they don't need to be saved. */
1937	if (intf->cur_altsetting->desc.bInterfaceSubClass ==
1938	    UVC_SC_VIDEOCONTROL)
1939		return uvc_status_suspend(dev);
1940
1941	list_for_each_entry(stream, &dev->streams, list) {
1942		if (stream->intf == intf)
1943			return uvc_video_suspend(stream);
1944	}
1945
1946	uvc_trace(UVC_TRACE_SUSPEND, "Suspend: video streaming USB interface "
1947			"mismatch.\n");
1948	return -EINVAL;
1949}
1950
1951static int __uvc_resume(struct usb_interface *intf, int reset)
1952{
1953	struct uvc_device *dev = usb_get_intfdata(intf);
1954	struct uvc_streaming *stream;
1955
1956	uvc_trace(UVC_TRACE_SUSPEND, "Resuming interface %u\n",
1957		intf->cur_altsetting->desc.bInterfaceNumber);
1958
1959	if (intf->cur_altsetting->desc.bInterfaceSubClass ==
1960	    UVC_SC_VIDEOCONTROL) {
1961		if (reset) {
1962			int ret = uvc_ctrl_resume_device(dev);
1963
1964			if (ret < 0)
1965				return ret;
1966		}
1967
1968		return uvc_status_resume(dev);
1969	}
1970
1971	list_for_each_entry(stream, &dev->streams, list) {
1972		if (stream->intf == intf)
1973			return uvc_video_resume(stream, reset);
1974	}
1975
1976	uvc_trace(UVC_TRACE_SUSPEND, "Resume: video streaming USB interface "
1977			"mismatch.\n");
1978	return -EINVAL;
1979}
1980
1981static int uvc_resume(struct usb_interface *intf)
1982{
1983	return __uvc_resume(intf, 0);
1984}
1985
1986static int uvc_reset_resume(struct usb_interface *intf)
1987{
1988	return __uvc_resume(intf, 1);
1989}
1990
1991/* ------------------------------------------------------------------------
1992 * Module parameters
1993 */
1994
1995static int uvc_clock_param_get(char *buffer, struct kernel_param *kp)
1996{
1997	if (uvc_clock_param == CLOCK_MONOTONIC)
1998		return sprintf(buffer, "CLOCK_MONOTONIC");
1999	else
2000		return sprintf(buffer, "CLOCK_REALTIME");
2001}
2002
2003static int uvc_clock_param_set(const char *val, struct kernel_param *kp)
2004{
2005	if (strncasecmp(val, "clock_", strlen("clock_")) == 0)
2006		val += strlen("clock_");
2007
2008	if (strcasecmp(val, "monotonic") == 0)
2009		uvc_clock_param = CLOCK_MONOTONIC;
2010	else if (strcasecmp(val, "realtime") == 0)
2011		uvc_clock_param = CLOCK_REALTIME;
2012	else
2013		return -EINVAL;
2014
2015	return 0;
2016}
2017
2018module_param_call(clock, uvc_clock_param_set, uvc_clock_param_get,
2019		  &uvc_clock_param, S_IRUGO|S_IWUSR);
2020MODULE_PARM_DESC(clock, "Video buffers timestamp clock");
2021module_param_named(nodrop, uvc_no_drop_param, uint, S_IRUGO|S_IWUSR);
2022MODULE_PARM_DESC(nodrop, "Don't drop incomplete frames");
2023module_param_named(quirks, uvc_quirks_param, uint, S_IRUGO|S_IWUSR);
2024MODULE_PARM_DESC(quirks, "Forced device quirks");
2025module_param_named(trace, uvc_trace_param, uint, S_IRUGO|S_IWUSR);
2026MODULE_PARM_DESC(trace, "Trace level bitmask");
2027module_param_named(timeout, uvc_timeout_param, uint, S_IRUGO|S_IWUSR);
2028MODULE_PARM_DESC(timeout, "Streaming control requests timeout");
2029
2030/* ------------------------------------------------------------------------
2031 * Driver initialization and cleanup
2032 */
2033
2034/*
2035 * The Logitech cameras listed below have their interface class set to
2036 * VENDOR_SPEC because they don't announce themselves as UVC devices, even
2037 * though they are compliant.
2038 */
2039static struct usb_device_id uvc_ids[] = {
2040	/* LogiLink Wireless Webcam */
2041	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2042				| USB_DEVICE_ID_MATCH_INT_INFO,
2043	  .idVendor		= 0x0416,
2044	  .idProduct		= 0xa91a,
2045	  .bInterfaceClass	= USB_CLASS_VIDEO,
2046	  .bInterfaceSubClass	= 1,
2047	  .bInterfaceProtocol	= 0,
2048	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
2049	/* Genius eFace 2025 */
2050	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2051				| USB_DEVICE_ID_MATCH_INT_INFO,
2052	  .idVendor		= 0x0458,
2053	  .idProduct		= 0x706e,
2054	  .bInterfaceClass	= USB_CLASS_VIDEO,
2055	  .bInterfaceSubClass	= 1,
2056	  .bInterfaceProtocol	= 0,
2057	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
2058	/* Microsoft Lifecam NX-6000 */
2059	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2060				| USB_DEVICE_ID_MATCH_INT_INFO,
2061	  .idVendor		= 0x045e,
2062	  .idProduct		= 0x00f8,
2063	  .bInterfaceClass	= USB_CLASS_VIDEO,
2064	  .bInterfaceSubClass	= 1,
2065	  .bInterfaceProtocol	= 0,
2066	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
2067	/* Microsoft Lifecam VX-7000 */
2068	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2069				| USB_DEVICE_ID_MATCH_INT_INFO,
2070	  .idVendor		= 0x045e,
2071	  .idProduct		= 0x0723,
2072	  .bInterfaceClass	= USB_CLASS_VIDEO,
2073	  .bInterfaceSubClass	= 1,
2074	  .bInterfaceProtocol	= 0,
2075	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
2076	/* Logitech Quickcam Fusion */
2077	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2078				| USB_DEVICE_ID_MATCH_INT_INFO,
2079	  .idVendor		= 0x046d,
2080	  .idProduct		= 0x08c1,
2081	  .bInterfaceClass	= USB_CLASS_VENDOR_SPEC,
2082	  .bInterfaceSubClass	= 1,
2083	  .bInterfaceProtocol	= 0 },
2084	/* Logitech Quickcam Orbit MP */
2085	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2086				| USB_DEVICE_ID_MATCH_INT_INFO,
2087	  .idVendor		= 0x046d,
2088	  .idProduct		= 0x08c2,
2089	  .bInterfaceClass	= USB_CLASS_VENDOR_SPEC,
2090	  .bInterfaceSubClass	= 1,
2091	  .bInterfaceProtocol	= 0 },
2092	/* Logitech Quickcam Pro for Notebook */
2093	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2094				| USB_DEVICE_ID_MATCH_INT_INFO,
2095	  .idVendor		= 0x046d,
2096	  .idProduct		= 0x08c3,
2097	  .bInterfaceClass	= USB_CLASS_VENDOR_SPEC,
2098	  .bInterfaceSubClass	= 1,
2099	  .bInterfaceProtocol	= 0 },
2100	/* Logitech Quickcam Pro 5000 */
2101	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2102				| USB_DEVICE_ID_MATCH_INT_INFO,
2103	  .idVendor		= 0x046d,
2104	  .idProduct		= 0x08c5,
2105	  .bInterfaceClass	= USB_CLASS_VENDOR_SPEC,
2106	  .bInterfaceSubClass	= 1,
2107	  .bInterfaceProtocol	= 0 },
2108	/* Logitech Quickcam OEM Dell Notebook */
2109	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2110				| USB_DEVICE_ID_MATCH_INT_INFO,
2111	  .idVendor		= 0x046d,
2112	  .idProduct		= 0x08c6,
2113	  .bInterfaceClass	= USB_CLASS_VENDOR_SPEC,
2114	  .bInterfaceSubClass	= 1,
2115	  .bInterfaceProtocol	= 0 },
2116	/* Logitech Quickcam OEM Cisco VT Camera II */
2117	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2118				| USB_DEVICE_ID_MATCH_INT_INFO,
2119	  .idVendor		= 0x046d,
2120	  .idProduct		= 0x08c7,
2121	  .bInterfaceClass	= USB_CLASS_VENDOR_SPEC,
2122	  .bInterfaceSubClass	= 1,
2123	  .bInterfaceProtocol	= 0 },
2124	/* Chicony CNF7129 (Asus EEE 100HE) */
2125	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2126				| USB_DEVICE_ID_MATCH_INT_INFO,
2127	  .idVendor		= 0x04f2,
2128	  .idProduct		= 0xb071,
2129	  .bInterfaceClass	= USB_CLASS_VIDEO,
2130	  .bInterfaceSubClass	= 1,
2131	  .bInterfaceProtocol	= 0,
2132	  .driver_info		= UVC_QUIRK_RESTRICT_FRAME_RATE },
2133	/* Alcor Micro AU3820 (Future Boy PC USB Webcam) */
2134	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2135				| USB_DEVICE_ID_MATCH_INT_INFO,
2136	  .idVendor		= 0x058f,
2137	  .idProduct		= 0x3820,
2138	  .bInterfaceClass	= USB_CLASS_VIDEO,
2139	  .bInterfaceSubClass	= 1,
2140	  .bInterfaceProtocol	= 0,
2141	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
2142	/* Dell XPS m1530 */
2143	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2144				| USB_DEVICE_ID_MATCH_INT_INFO,
2145	  .idVendor		= 0x05a9,
2146	  .idProduct		= 0x2640,
2147	  .bInterfaceClass	= USB_CLASS_VIDEO,
2148	  .bInterfaceSubClass	= 1,
2149	  .bInterfaceProtocol	= 0,
2150	  .driver_info 		= UVC_QUIRK_PROBE_DEF },
2151	/* Apple Built-In iSight */
2152	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2153				| USB_DEVICE_ID_MATCH_INT_INFO,
2154	  .idVendor		= 0x05ac,
2155	  .idProduct		= 0x8501,
2156	  .bInterfaceClass	= USB_CLASS_VIDEO,
2157	  .bInterfaceSubClass	= 1,
2158	  .bInterfaceProtocol	= 0,
2159	  .driver_info 		= UVC_QUIRK_PROBE_MINMAX
2160				| UVC_QUIRK_BUILTIN_ISIGHT },
2161	/* Foxlink ("HP Webcam" on HP Mini 5103) */
2162	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2163				| USB_DEVICE_ID_MATCH_INT_INFO,
2164	  .idVendor		= 0x05c8,
2165	  .idProduct		= 0x0403,
2166	  .bInterfaceClass	= USB_CLASS_VIDEO,
2167	  .bInterfaceSubClass	= 1,
2168	  .bInterfaceProtocol	= 0,
2169	  .driver_info		= UVC_QUIRK_FIX_BANDWIDTH },
2170	/* Genesys Logic USB 2.0 PC Camera */
2171	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2172				| USB_DEVICE_ID_MATCH_INT_INFO,
2173	  .idVendor		= 0x05e3,
2174	  .idProduct		= 0x0505,
2175	  .bInterfaceClass	= USB_CLASS_VIDEO,
2176	  .bInterfaceSubClass	= 1,
2177	  .bInterfaceProtocol	= 0,
2178	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2179	/* Hercules Classic Silver */
2180	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2181				| USB_DEVICE_ID_MATCH_INT_INFO,
2182	  .idVendor		= 0x06f8,
2183	  .idProduct		= 0x300c,
2184	  .bInterfaceClass	= USB_CLASS_VIDEO,
2185	  .bInterfaceSubClass	= 1,
2186	  .bInterfaceProtocol	= 0,
2187	  .driver_info		= UVC_QUIRK_FIX_BANDWIDTH },
2188	/* ViMicro Vega */
2189	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2190				| USB_DEVICE_ID_MATCH_INT_INFO,
2191	  .idVendor		= 0x0ac8,
2192	  .idProduct		= 0x332d,
2193	  .bInterfaceClass	= USB_CLASS_VIDEO,
2194	  .bInterfaceSubClass	= 1,
2195	  .bInterfaceProtocol	= 0,
2196	  .driver_info		= UVC_QUIRK_FIX_BANDWIDTH },
2197	/* ViMicro - Minoru3D */
2198	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2199				| USB_DEVICE_ID_MATCH_INT_INFO,
2200	  .idVendor		= 0x0ac8,
2201	  .idProduct		= 0x3410,
2202	  .bInterfaceClass	= USB_CLASS_VIDEO,
2203	  .bInterfaceSubClass	= 1,
2204	  .bInterfaceProtocol	= 0,
2205	  .driver_info		= UVC_QUIRK_FIX_BANDWIDTH },
2206	/* ViMicro Venus - Minoru3D */
2207	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2208				| USB_DEVICE_ID_MATCH_INT_INFO,
2209	  .idVendor		= 0x0ac8,
2210	  .idProduct		= 0x3420,
2211	  .bInterfaceClass	= USB_CLASS_VIDEO,
2212	  .bInterfaceSubClass	= 1,
2213	  .bInterfaceProtocol	= 0,
2214	  .driver_info		= UVC_QUIRK_FIX_BANDWIDTH },
2215	/* MT6227 */
2216	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2217				| USB_DEVICE_ID_MATCH_INT_INFO,
2218	  .idVendor		= 0x0e8d,
2219	  .idProduct		= 0x0004,
2220	  .bInterfaceClass	= USB_CLASS_VIDEO,
2221	  .bInterfaceSubClass	= 1,
2222	  .bInterfaceProtocol	= 0,
2223	  .driver_info		= UVC_QUIRK_PROBE_MINMAX
2224				| UVC_QUIRK_PROBE_DEF },
2225	/* IMC Networks (Medion Akoya) */
2226	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2227				| USB_DEVICE_ID_MATCH_INT_INFO,
2228	  .idVendor		= 0x13d3,
2229	  .idProduct		= 0x5103,
2230	  .bInterfaceClass	= USB_CLASS_VIDEO,
2231	  .bInterfaceSubClass	= 1,
2232	  .bInterfaceProtocol	= 0,
2233	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2234	/* JMicron USB2.0 XGA WebCam */
2235	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2236				| USB_DEVICE_ID_MATCH_INT_INFO,
2237	  .idVendor		= 0x152d,
2238	  .idProduct		= 0x0310,
2239	  .bInterfaceClass	= USB_CLASS_VIDEO,
2240	  .bInterfaceSubClass	= 1,
2241	  .bInterfaceProtocol	= 0,
2242	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
2243	/* Syntek (HP Spartan) */
2244	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2245				| USB_DEVICE_ID_MATCH_INT_INFO,
2246	  .idVendor		= 0x174f,
2247	  .idProduct		= 0x5212,
2248	  .bInterfaceClass	= USB_CLASS_VIDEO,
2249	  .bInterfaceSubClass	= 1,
2250	  .bInterfaceProtocol	= 0,
2251	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2252	/* Syntek (Samsung Q310) */
2253	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2254				| USB_DEVICE_ID_MATCH_INT_INFO,
2255	  .idVendor		= 0x174f,
2256	  .idProduct		= 0x5931,
2257	  .bInterfaceClass	= USB_CLASS_VIDEO,
2258	  .bInterfaceSubClass	= 1,
2259	  .bInterfaceProtocol	= 0,
2260	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2261	/* Syntek (Packard Bell EasyNote MX52 */
2262	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2263				| USB_DEVICE_ID_MATCH_INT_INFO,
2264	  .idVendor		= 0x174f,
2265	  .idProduct		= 0x8a12,
2266	  .bInterfaceClass	= USB_CLASS_VIDEO,
2267	  .bInterfaceSubClass	= 1,
2268	  .bInterfaceProtocol	= 0,
2269	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2270	/* Syntek (Asus F9SG) */
2271	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2272				| USB_DEVICE_ID_MATCH_INT_INFO,
2273	  .idVendor		= 0x174f,
2274	  .idProduct		= 0x8a31,
2275	  .bInterfaceClass	= USB_CLASS_VIDEO,
2276	  .bInterfaceSubClass	= 1,
2277	  .bInterfaceProtocol	= 0,
2278	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2279	/* Syntek (Asus U3S) */
2280	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2281				| USB_DEVICE_ID_MATCH_INT_INFO,
2282	  .idVendor		= 0x174f,
2283	  .idProduct		= 0x8a33,
2284	  .bInterfaceClass	= USB_CLASS_VIDEO,
2285	  .bInterfaceSubClass	= 1,
2286	  .bInterfaceProtocol	= 0,
2287	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2288	/* Syntek (JAOtech Smart Terminal) */
2289	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2290				| USB_DEVICE_ID_MATCH_INT_INFO,
2291	  .idVendor		= 0x174f,
2292	  .idProduct		= 0x8a34,
2293	  .bInterfaceClass	= USB_CLASS_VIDEO,
2294	  .bInterfaceSubClass	= 1,
2295	  .bInterfaceProtocol	= 0,
2296	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2297	/* Miricle 307K */
2298	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2299				| USB_DEVICE_ID_MATCH_INT_INFO,
2300	  .idVendor		= 0x17dc,
2301	  .idProduct		= 0x0202,
2302	  .bInterfaceClass	= USB_CLASS_VIDEO,
2303	  .bInterfaceSubClass	= 1,
2304	  .bInterfaceProtocol	= 0,
2305	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2306	/* Lenovo Thinkpad SL400/SL500 */
2307	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2308				| USB_DEVICE_ID_MATCH_INT_INFO,
2309	  .idVendor		= 0x17ef,
2310	  .idProduct		= 0x480b,
2311	  .bInterfaceClass	= USB_CLASS_VIDEO,
2312	  .bInterfaceSubClass	= 1,
2313	  .bInterfaceProtocol	= 0,
2314	  .driver_info		= UVC_QUIRK_STREAM_NO_FID },
2315	/* Aveo Technology USB 2.0 Camera */
2316	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2317				| USB_DEVICE_ID_MATCH_INT_INFO,
2318	  .idVendor		= 0x1871,
2319	  .idProduct		= 0x0306,
2320	  .bInterfaceClass	= USB_CLASS_VIDEO,
2321	  .bInterfaceSubClass	= 1,
2322	  .bInterfaceProtocol	= 0,
2323	  .driver_info		= UVC_QUIRK_PROBE_MINMAX
2324				| UVC_QUIRK_PROBE_EXTRAFIELDS },
2325	/* Ecamm Pico iMage */
2326	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2327				| USB_DEVICE_ID_MATCH_INT_INFO,
2328	  .idVendor		= 0x18cd,
2329	  .idProduct		= 0xcafe,
2330	  .bInterfaceClass	= USB_CLASS_VIDEO,
2331	  .bInterfaceSubClass	= 1,
2332	  .bInterfaceProtocol	= 0,
2333	  .driver_info		= UVC_QUIRK_PROBE_EXTRAFIELDS },
2334	/* Manta MM-353 Plako */
2335	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2336				| USB_DEVICE_ID_MATCH_INT_INFO,
2337	  .idVendor		= 0x18ec,
2338	  .idProduct		= 0x3188,
2339	  .bInterfaceClass	= USB_CLASS_VIDEO,
2340	  .bInterfaceSubClass	= 1,
2341	  .bInterfaceProtocol	= 0,
2342	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
2343	/* FSC WebCam V30S */
2344	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2345				| USB_DEVICE_ID_MATCH_INT_INFO,
2346	  .idVendor		= 0x18ec,
2347	  .idProduct		= 0x3288,
2348	  .bInterfaceClass	= USB_CLASS_VIDEO,
2349	  .bInterfaceSubClass	= 1,
2350	  .bInterfaceProtocol	= 0,
2351	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
2352	/* Arkmicro unbranded */
2353	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2354				| USB_DEVICE_ID_MATCH_INT_INFO,
2355	  .idVendor		= 0x18ec,
2356	  .idProduct		= 0x3290,
2357	  .bInterfaceClass	= USB_CLASS_VIDEO,
2358	  .bInterfaceSubClass	= 1,
2359	  .bInterfaceProtocol	= 0,
2360	  .driver_info		= UVC_QUIRK_PROBE_DEF },
2361	/* The Imaging Source USB CCD cameras */
2362	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2363				| USB_DEVICE_ID_MATCH_INT_INFO,
2364	  .idVendor		= 0x199e,
2365	  .idProduct		= 0x8102,
2366	  .bInterfaceClass	= USB_CLASS_VENDOR_SPEC,
2367	  .bInterfaceSubClass	= 1,
2368	  .bInterfaceProtocol	= 0 },
2369	/* Bodelin ProScopeHR */
2370	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2371				| USB_DEVICE_ID_MATCH_DEV_HI
2372				| USB_DEVICE_ID_MATCH_INT_INFO,
2373	  .idVendor		= 0x19ab,
2374	  .idProduct		= 0x1000,
2375	  .bcdDevice_hi		= 0x0126,
2376	  .bInterfaceClass	= USB_CLASS_VIDEO,
2377	  .bInterfaceSubClass	= 1,
2378	  .bInterfaceProtocol	= 0,
2379	  .driver_info		= UVC_QUIRK_STATUS_INTERVAL },
2380	/* MSI StarCam 370i */
2381	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2382				| USB_DEVICE_ID_MATCH_INT_INFO,
2383	  .idVendor		= 0x1b3b,
2384	  .idProduct		= 0x2951,
2385	  .bInterfaceClass	= USB_CLASS_VIDEO,
2386	  .bInterfaceSubClass	= 1,
2387	  .bInterfaceProtocol	= 0,
2388	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
2389	/* SiGma Micro USB Web Camera */
2390	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
2391				| USB_DEVICE_ID_MATCH_INT_INFO,
2392	  .idVendor		= 0x1c4f,
2393	  .idProduct		= 0x3000,
2394	  .bInterfaceClass	= USB_CLASS_VIDEO,
2395	  .bInterfaceSubClass	= 1,
2396	  .bInterfaceProtocol	= 0,
2397	  .driver_info		= UVC_QUIRK_PROBE_MINMAX
2398				| UVC_QUIRK_IGNORE_SELECTOR_UNIT },
2399	/* Generic USB Video Class */
2400	{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) },
2401	{}
2402};
2403
2404MODULE_DEVICE_TABLE(usb, uvc_ids);
2405
2406struct uvc_driver uvc_driver = {
2407	.driver = {
2408		.name		= "uvcvideo",
2409		.probe		= uvc_probe,
2410		.disconnect	= uvc_disconnect,
2411		.suspend	= uvc_suspend,
2412		.resume		= uvc_resume,
2413		.reset_resume	= uvc_reset_resume,
2414		.id_table	= uvc_ids,
2415		.supports_autosuspend = 1,
2416	},
2417};
2418
2419static int __init uvc_init(void)
2420{
2421	int ret;
2422
2423	uvc_debugfs_init();
2424
2425	ret = usb_register(&uvc_driver.driver);
2426	if (ret < 0) {
2427		uvc_debugfs_cleanup();
2428		return ret;
2429	}
2430
2431	printk(KERN_INFO DRIVER_DESC " (" DRIVER_VERSION ")\n");
2432	return 0;
2433}
2434
2435static void __exit uvc_cleanup(void)
2436{
2437	usb_deregister(&uvc_driver.driver);
2438	uvc_debugfs_cleanup();
2439}
2440
2441module_init(uvc_init);
2442module_exit(uvc_cleanup);
2443
2444MODULE_AUTHOR(DRIVER_AUTHOR);
2445MODULE_DESCRIPTION(DRIVER_DESC);
2446MODULE_LICENSE("GPL");
2447MODULE_VERSION(DRIVER_VERSION);
2448