| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * uvc_driver.c -- USB Video Class driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2005-2010 |
|---|
| 5 | 6 | * 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 | 7 | */ |
|---|
| 13 | 8 | |
|---|
| 14 | 9 | #include <linux/atomic.h> |
|---|
| .. | .. |
|---|
| 220 | 215 | .guid = UVC_GUID_FORMAT_INZI, |
|---|
| 221 | 216 | .fcc = V4L2_PIX_FMT_INZI, |
|---|
| 222 | 217 | }, |
|---|
| 218 | + { |
|---|
| 219 | + .name = "4-bit Depth Confidence (Packed)", |
|---|
| 220 | + .guid = UVC_GUID_FORMAT_CNF4, |
|---|
| 221 | + .fcc = V4L2_PIX_FMT_CNF4, |
|---|
| 222 | + }, |
|---|
| 223 | + { |
|---|
| 224 | + .name = "HEVC", |
|---|
| 225 | + .guid = UVC_GUID_FORMAT_HEVC, |
|---|
| 226 | + .fcc = V4L2_PIX_FMT_HEVC, |
|---|
| 227 | + }, |
|---|
| 223 | 228 | }; |
|---|
| 224 | 229 | |
|---|
| 225 | 230 | /* ------------------------------------------------------------------------ |
|---|
| .. | .. |
|---|
| 254 | 259 | return NULL; |
|---|
| 255 | 260 | } |
|---|
| 256 | 261 | |
|---|
| 257 | | -static u32 uvc_colorspace(const u8 primaries) |
|---|
| 262 | +static enum v4l2_colorspace uvc_colorspace(const u8 primaries) |
|---|
| 258 | 263 | { |
|---|
| 259 | | - static const u8 colorprimaries[] = { |
|---|
| 260 | | - 0, |
|---|
| 264 | + static const enum v4l2_colorspace colorprimaries[] = { |
|---|
| 265 | + V4L2_COLORSPACE_DEFAULT, /* Unspecified */ |
|---|
| 261 | 266 | V4L2_COLORSPACE_SRGB, |
|---|
| 262 | 267 | V4L2_COLORSPACE_470_SYSTEM_M, |
|---|
| 263 | 268 | V4L2_COLORSPACE_470_SYSTEM_BG, |
|---|
| .. | .. |
|---|
| 268 | 273 | if (primaries < ARRAY_SIZE(colorprimaries)) |
|---|
| 269 | 274 | return colorprimaries[primaries]; |
|---|
| 270 | 275 | |
|---|
| 271 | | - return 0; |
|---|
| 276 | + return V4L2_COLORSPACE_DEFAULT; /* Reserved */ |
|---|
| 277 | +} |
|---|
| 278 | + |
|---|
| 279 | +static enum v4l2_xfer_func uvc_xfer_func(const u8 transfer_characteristics) |
|---|
| 280 | +{ |
|---|
| 281 | + /* |
|---|
| 282 | + * V4L2 does not currently have definitions for all possible values of |
|---|
| 283 | + * UVC transfer characteristics. If v4l2_xfer_func is extended with new |
|---|
| 284 | + * values, the mapping below should be updated. |
|---|
| 285 | + * |
|---|
| 286 | + * Substitutions are taken from the mapping given for |
|---|
| 287 | + * V4L2_XFER_FUNC_DEFAULT documented in videodev2.h. |
|---|
| 288 | + */ |
|---|
| 289 | + static const enum v4l2_xfer_func xfer_funcs[] = { |
|---|
| 290 | + V4L2_XFER_FUNC_DEFAULT, /* Unspecified */ |
|---|
| 291 | + V4L2_XFER_FUNC_709, |
|---|
| 292 | + V4L2_XFER_FUNC_709, /* Substitution for BT.470-2 M */ |
|---|
| 293 | + V4L2_XFER_FUNC_709, /* Substitution for BT.470-2 B, G */ |
|---|
| 294 | + V4L2_XFER_FUNC_709, /* Substitution for SMPTE 170M */ |
|---|
| 295 | + V4L2_XFER_FUNC_SMPTE240M, |
|---|
| 296 | + V4L2_XFER_FUNC_NONE, |
|---|
| 297 | + V4L2_XFER_FUNC_SRGB, |
|---|
| 298 | + }; |
|---|
| 299 | + |
|---|
| 300 | + if (transfer_characteristics < ARRAY_SIZE(xfer_funcs)) |
|---|
| 301 | + return xfer_funcs[transfer_characteristics]; |
|---|
| 302 | + |
|---|
| 303 | + return V4L2_XFER_FUNC_DEFAULT; /* Reserved */ |
|---|
| 304 | +} |
|---|
| 305 | + |
|---|
| 306 | +static enum v4l2_ycbcr_encoding uvc_ycbcr_enc(const u8 matrix_coefficients) |
|---|
| 307 | +{ |
|---|
| 308 | + /* |
|---|
| 309 | + * V4L2 does not currently have definitions for all possible values of |
|---|
| 310 | + * UVC matrix coefficients. If v4l2_ycbcr_encoding is extended with new |
|---|
| 311 | + * values, the mapping below should be updated. |
|---|
| 312 | + * |
|---|
| 313 | + * Substitutions are taken from the mapping given for |
|---|
| 314 | + * V4L2_YCBCR_ENC_DEFAULT documented in videodev2.h. |
|---|
| 315 | + * |
|---|
| 316 | + * FCC is assumed to be close enough to 601. |
|---|
| 317 | + */ |
|---|
| 318 | + static const enum v4l2_ycbcr_encoding ycbcr_encs[] = { |
|---|
| 319 | + V4L2_YCBCR_ENC_DEFAULT, /* Unspecified */ |
|---|
| 320 | + V4L2_YCBCR_ENC_709, |
|---|
| 321 | + V4L2_YCBCR_ENC_601, /* Substitution for FCC */ |
|---|
| 322 | + V4L2_YCBCR_ENC_601, /* Substitution for BT.470-2 B, G */ |
|---|
| 323 | + V4L2_YCBCR_ENC_601, |
|---|
| 324 | + V4L2_YCBCR_ENC_SMPTE240M, |
|---|
| 325 | + }; |
|---|
| 326 | + |
|---|
| 327 | + if (matrix_coefficients < ARRAY_SIZE(ycbcr_encs)) |
|---|
| 328 | + return ycbcr_encs[matrix_coefficients]; |
|---|
| 329 | + |
|---|
| 330 | + return V4L2_YCBCR_ENC_DEFAULT; /* Reserved */ |
|---|
| 272 | 331 | } |
|---|
| 273 | 332 | |
|---|
| 274 | 333 | /* Simplify a fraction using a simple continued fraction decomposition. The |
|---|
| .. | .. |
|---|
| 290 | 349 | return; |
|---|
| 291 | 350 | |
|---|
| 292 | 351 | /* Convert the fraction to a simple continued fraction. See |
|---|
| 293 | | - * http://mathforum.org/dr.math/faq/faq.fractions.html |
|---|
| 352 | + * https://mathforum.org/dr.math/faq/faq.fractions.html |
|---|
| 294 | 353 | * Stop if the current term is bigger than or equal to the given |
|---|
| 295 | 354 | * threshold. |
|---|
| 296 | 355 | */ |
|---|
| .. | .. |
|---|
| 477 | 536 | fmtdesc = uvc_format_by_guid(&buffer[5]); |
|---|
| 478 | 537 | |
|---|
| 479 | 538 | if (fmtdesc != NULL) { |
|---|
| 480 | | - strlcpy(format->name, fmtdesc->name, |
|---|
| 539 | + strscpy(format->name, fmtdesc->name, |
|---|
| 481 | 540 | sizeof(format->name)); |
|---|
| 482 | 541 | format->fcc = fmtdesc->fcc; |
|---|
| 483 | 542 | } else { |
|---|
| .. | .. |
|---|
| 495 | 554 | */ |
|---|
| 496 | 555 | if (dev->quirks & UVC_QUIRK_FORCE_Y8) { |
|---|
| 497 | 556 | if (format->fcc == V4L2_PIX_FMT_YUYV) { |
|---|
| 498 | | - strlcpy(format->name, "Greyscale 8-bit (Y8 )", |
|---|
| 557 | + strscpy(format->name, "Greyscale 8-bit (Y8 )", |
|---|
| 499 | 558 | sizeof(format->name)); |
|---|
| 500 | 559 | format->fcc = V4L2_PIX_FMT_GREY; |
|---|
| 501 | 560 | format->bpp = 8; |
|---|
| 502 | 561 | width_multiplier = 2; |
|---|
| 562 | + } |
|---|
| 563 | + } |
|---|
| 564 | + |
|---|
| 565 | + /* Some devices report bpp that doesn't match the format. */ |
|---|
| 566 | + if (dev->quirks & UVC_QUIRK_FORCE_BPP) { |
|---|
| 567 | + const struct v4l2_format_info *info = |
|---|
| 568 | + v4l2_format_info(format->fcc); |
|---|
| 569 | + |
|---|
| 570 | + if (info) { |
|---|
| 571 | + unsigned int div = info->hdiv * info->vdiv; |
|---|
| 572 | + |
|---|
| 573 | + n = info->bpp[0] * div; |
|---|
| 574 | + for (i = 1; i < info->comp_planes; i++) |
|---|
| 575 | + n += info->bpp[i]; |
|---|
| 576 | + |
|---|
| 577 | + format->bpp = DIV_ROUND_UP(8 * n, div); |
|---|
| 503 | 578 | } |
|---|
| 504 | 579 | } |
|---|
| 505 | 580 | |
|---|
| .. | .. |
|---|
| 521 | 596 | return -EINVAL; |
|---|
| 522 | 597 | } |
|---|
| 523 | 598 | |
|---|
| 524 | | - strlcpy(format->name, "MJPEG", sizeof(format->name)); |
|---|
| 599 | + strscpy(format->name, "MJPEG", sizeof(format->name)); |
|---|
| 525 | 600 | format->fcc = V4L2_PIX_FMT_MJPEG; |
|---|
| 526 | 601 | format->flags = UVC_FMT_FLAG_COMPRESSED; |
|---|
| 527 | 602 | format->bpp = 0; |
|---|
| .. | .. |
|---|
| 539 | 614 | |
|---|
| 540 | 615 | switch (buffer[8] & 0x7f) { |
|---|
| 541 | 616 | case 0: |
|---|
| 542 | | - strlcpy(format->name, "SD-DV", sizeof(format->name)); |
|---|
| 617 | + strscpy(format->name, "SD-DV", sizeof(format->name)); |
|---|
| 543 | 618 | break; |
|---|
| 544 | 619 | case 1: |
|---|
| 545 | | - strlcpy(format->name, "SDL-DV", sizeof(format->name)); |
|---|
| 620 | + strscpy(format->name, "SDL-DV", sizeof(format->name)); |
|---|
| 546 | 621 | break; |
|---|
| 547 | 622 | case 2: |
|---|
| 548 | | - strlcpy(format->name, "HD-DV", sizeof(format->name)); |
|---|
| 623 | + strscpy(format->name, "HD-DV", sizeof(format->name)); |
|---|
| 549 | 624 | break; |
|---|
| 550 | 625 | default: |
|---|
| 551 | 626 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " |
|---|
| .. | .. |
|---|
| 694 | 769 | } |
|---|
| 695 | 770 | |
|---|
| 696 | 771 | format->colorspace = uvc_colorspace(buffer[3]); |
|---|
| 772 | + format->xfer_func = uvc_xfer_func(buffer[4]); |
|---|
| 773 | + format->ycbcr_enc = uvc_ycbcr_enc(buffer[5]); |
|---|
| 697 | 774 | |
|---|
| 698 | 775 | buflen -= buffer[0]; |
|---|
| 699 | 776 | buffer += buffer[0]; |
|---|
| .. | .. |
|---|
| 1517 | 1594 | return -EINVAL; |
|---|
| 1518 | 1595 | } |
|---|
| 1519 | 1596 | |
|---|
| 1597 | + /* |
|---|
| 1598 | + * Some devices reference an output terminal as the |
|---|
| 1599 | + * source of extension units. This is incorrect, as |
|---|
| 1600 | + * output terminals only have an input pin, and thus |
|---|
| 1601 | + * can't be connected to any entity in the forward |
|---|
| 1602 | + * direction. The resulting topology would cause issues |
|---|
| 1603 | + * when registering the media controller graph. To |
|---|
| 1604 | + * avoid this problem, connect the extension unit to |
|---|
| 1605 | + * the source of the output terminal instead. |
|---|
| 1606 | + */ |
|---|
| 1607 | + if (UVC_ENTITY_IS_OTERM(entity)) { |
|---|
| 1608 | + struct uvc_entity *source; |
|---|
| 1609 | + |
|---|
| 1610 | + source = uvc_entity_by_id(chain->dev, |
|---|
| 1611 | + entity->baSourceID[0]); |
|---|
| 1612 | + if (!source) { |
|---|
| 1613 | + uvc_trace(UVC_TRACE_DESCR, |
|---|
| 1614 | + "Can't connect extension unit %u in chain\n", |
|---|
| 1615 | + forward->id); |
|---|
| 1616 | + break; |
|---|
| 1617 | + } |
|---|
| 1618 | + |
|---|
| 1619 | + forward->baSourceID[0] = source->id; |
|---|
| 1620 | + } |
|---|
| 1621 | + |
|---|
| 1520 | 1622 | list_add_tail(&forward->chain, &chain->entities); |
|---|
| 1521 | 1623 | if (uvc_trace_param & UVC_TRACE_PROBE) { |
|---|
| 1522 | 1624 | if (!found) |
|---|
| .. | .. |
|---|
| 1535 | 1637 | uvc_trace(UVC_TRACE_DESCR, "Unsupported input " |
|---|
| 1536 | 1638 | "terminal %u.\n", forward->id); |
|---|
| 1537 | 1639 | return -EINVAL; |
|---|
| 1640 | + } |
|---|
| 1641 | + |
|---|
| 1642 | + if (UVC_ENTITY_IS_OTERM(entity)) { |
|---|
| 1643 | + uvc_trace(UVC_TRACE_DESCR, |
|---|
| 1644 | + "Unsupported connection between output terminals %u and %u\n", |
|---|
| 1645 | + entity->id, forward->id); |
|---|
| 1646 | + break; |
|---|
| 1538 | 1647 | } |
|---|
| 1539 | 1648 | |
|---|
| 1540 | 1649 | list_add_tail(&forward->chain, &chain->entities); |
|---|
| .. | .. |
|---|
| 1999 | 2108 | break; |
|---|
| 2000 | 2109 | } |
|---|
| 2001 | 2110 | |
|---|
| 2002 | | - strlcpy(vdev->name, dev->name, sizeof(vdev->name)); |
|---|
| 2111 | + strscpy(vdev->name, dev->name, sizeof(vdev->name)); |
|---|
| 2003 | 2112 | |
|---|
| 2004 | 2113 | /* |
|---|
| 2005 | 2114 | * Set the driver data before calling video_register_device, otherwise |
|---|
| .. | .. |
|---|
| 2007 | 2116 | */ |
|---|
| 2008 | 2117 | video_set_drvdata(vdev, stream); |
|---|
| 2009 | 2118 | |
|---|
| 2010 | | - ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); |
|---|
| 2119 | + ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); |
|---|
| 2011 | 2120 | if (ret < 0) { |
|---|
| 2012 | 2121 | uvc_printk(KERN_ERR, "Failed to register %s device (%d).\n", |
|---|
| 2013 | 2122 | v4l2_type_names[type], ret); |
|---|
| .. | .. |
|---|
| 2094 | 2203 | |
|---|
| 2095 | 2204 | #ifdef CONFIG_MEDIA_CONTROLLER |
|---|
| 2096 | 2205 | ret = uvc_mc_register_entities(chain); |
|---|
| 2097 | | - if (ret < 0) { |
|---|
| 2098 | | - uvc_printk(KERN_INFO, "Failed to register entites " |
|---|
| 2099 | | - "(%d).\n", ret); |
|---|
| 2100 | | - } |
|---|
| 2206 | + if (ret < 0) |
|---|
| 2207 | + uvc_printk(KERN_INFO, |
|---|
| 2208 | + "Failed to register entities (%d).\n", ret); |
|---|
| 2101 | 2209 | #endif |
|---|
| 2102 | 2210 | } |
|---|
| 2103 | 2211 | |
|---|
| .. | .. |
|---|
| 2148 | 2256 | ? dev->info->quirks : uvc_quirks_param; |
|---|
| 2149 | 2257 | |
|---|
| 2150 | 2258 | if (udev->product != NULL) |
|---|
| 2151 | | - strlcpy(dev->name, udev->product, sizeof(dev->name)); |
|---|
| 2259 | + strscpy(dev->name, udev->product, sizeof(dev->name)); |
|---|
| 2152 | 2260 | else |
|---|
| 2153 | 2261 | snprintf(dev->name, sizeof(dev->name), |
|---|
| 2154 | 2262 | "UVC Camera (%04x:%04x)", |
|---|
| .. | .. |
|---|
| 2412 | 2520 | .quirks = UVC_QUIRK_FORCE_Y8, |
|---|
| 2413 | 2521 | }; |
|---|
| 2414 | 2522 | |
|---|
| 2415 | | -#define UVC_QUIRK_INFO(q) (kernel_ulong_t)&(struct uvc_device_info){.quirks = q} |
|---|
| 2523 | +#define UVC_INFO_QUIRK(q) (kernel_ulong_t)&(struct uvc_device_info){.quirks = q} |
|---|
| 2524 | +#define UVC_INFO_META(m) (kernel_ulong_t)&(struct uvc_device_info) \ |
|---|
| 2525 | + {.meta_format = m} |
|---|
| 2416 | 2526 | |
|---|
| 2417 | 2527 | /* |
|---|
| 2418 | 2528 | * The Logitech cameras listed below have their interface class set to |
|---|
| .. | .. |
|---|
| 2521 | 2631 | .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 2522 | 2632 | .bInterfaceSubClass = 1, |
|---|
| 2523 | 2633 | .bInterfaceProtocol = 0, |
|---|
| 2524 | | - .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_RESTORE_CTRLS_ON_INIT) }, |
|---|
| 2634 | + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_RESTORE_CTRLS_ON_INIT) }, |
|---|
| 2525 | 2635 | /* Chicony CNF7129 (Asus EEE 100HE) */ |
|---|
| 2526 | 2636 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| 2527 | 2637 | | USB_DEVICE_ID_MATCH_INT_INFO, |
|---|
| .. | .. |
|---|
| 2530 | 2640 | .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 2531 | 2641 | .bInterfaceSubClass = 1, |
|---|
| 2532 | 2642 | .bInterfaceProtocol = 0, |
|---|
| 2533 | | - .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_RESTRICT_FRAME_RATE) }, |
|---|
| 2643 | + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_RESTRICT_FRAME_RATE) }, |
|---|
| 2534 | 2644 | /* Alcor Micro AU3820 (Future Boy PC USB Webcam) */ |
|---|
| 2535 | 2645 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| 2536 | 2646 | | USB_DEVICE_ID_MATCH_INT_INFO, |
|---|
| .. | .. |
|---|
| 2593 | 2703 | .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 2594 | 2704 | .bInterfaceSubClass = 1, |
|---|
| 2595 | 2705 | .bInterfaceProtocol = 0, |
|---|
| 2596 | | - .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_MINMAX |
|---|
| 2706 | + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_PROBE_MINMAX |
|---|
| 2597 | 2707 | | UVC_QUIRK_BUILTIN_ISIGHT) }, |
|---|
| 2598 | 2708 | /* Apple Built-In iSight via iBridge */ |
|---|
| 2599 | 2709 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| .. | .. |
|---|
| 2675 | 2785 | .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 2676 | 2786 | .bInterfaceSubClass = 1, |
|---|
| 2677 | 2787 | .bInterfaceProtocol = 0, |
|---|
| 2678 | | - .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_MINMAX |
|---|
| 2788 | + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_PROBE_MINMAX |
|---|
| 2679 | 2789 | | UVC_QUIRK_PROBE_DEF) }, |
|---|
| 2680 | 2790 | /* IMC Networks (Medion Akoya) */ |
|---|
| 2681 | 2791 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| .. | .. |
|---|
| 2775 | 2885 | .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 2776 | 2886 | .bInterfaceSubClass = 1, |
|---|
| 2777 | 2887 | .bInterfaceProtocol = 0, |
|---|
| 2778 | | - .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_MINMAX |
|---|
| 2888 | + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_PROBE_MINMAX |
|---|
| 2779 | 2889 | | UVC_QUIRK_PROBE_EXTRAFIELDS) }, |
|---|
| 2780 | 2890 | /* Aveo Technology USB 2.0 Camera (Tasco USB Microscope) */ |
|---|
| 2781 | 2891 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| .. | .. |
|---|
| 2793 | 2903 | .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 2794 | 2904 | .bInterfaceSubClass = 1, |
|---|
| 2795 | 2905 | .bInterfaceProtocol = 0, |
|---|
| 2796 | | - .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_EXTRAFIELDS) }, |
|---|
| 2906 | + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_PROBE_EXTRAFIELDS) }, |
|---|
| 2797 | 2907 | /* Manta MM-353 Plako */ |
|---|
| 2798 | 2908 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| 2799 | 2909 | | USB_DEVICE_ID_MATCH_INT_INFO, |
|---|
| .. | .. |
|---|
| 2839 | 2949 | .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 2840 | 2950 | .bInterfaceSubClass = 1, |
|---|
| 2841 | 2951 | .bInterfaceProtocol = 0, |
|---|
| 2842 | | - .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_STATUS_INTERVAL) }, |
|---|
| 2952 | + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_STATUS_INTERVAL) }, |
|---|
| 2843 | 2953 | /* MSI StarCam 370i */ |
|---|
| 2844 | 2954 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| 2845 | 2955 | | USB_DEVICE_ID_MATCH_INT_INFO, |
|---|
| .. | .. |
|---|
| 2866 | 2976 | .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 2867 | 2977 | .bInterfaceSubClass = 1, |
|---|
| 2868 | 2978 | .bInterfaceProtocol = 0, |
|---|
| 2869 | | - .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_MINMAX |
|---|
| 2979 | + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_PROBE_MINMAX |
|---|
| 2870 | 2980 | | UVC_QUIRK_IGNORE_SELECTOR_UNIT) }, |
|---|
| 2871 | 2981 | /* Oculus VR Positional Tracker DK2 */ |
|---|
| 2872 | 2982 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| .. | .. |
|---|
| 2886 | 2996 | .bInterfaceSubClass = 1, |
|---|
| 2887 | 2997 | .bInterfaceProtocol = 0, |
|---|
| 2888 | 2998 | .driver_info = (kernel_ulong_t)&uvc_quirk_force_y8 }, |
|---|
| 2999 | + /* GEO Semiconductor GC6500 */ |
|---|
| 3000 | + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| 3001 | + | USB_DEVICE_ID_MATCH_INT_INFO, |
|---|
| 3002 | + .idVendor = 0x29fe, |
|---|
| 3003 | + .idProduct = 0x4d53, |
|---|
| 3004 | + .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 3005 | + .bInterfaceSubClass = 1, |
|---|
| 3006 | + .bInterfaceProtocol = 0, |
|---|
| 3007 | + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_FORCE_BPP) }, |
|---|
| 3008 | + /* Intel RealSense D4M */ |
|---|
| 3009 | + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|---|
| 3010 | + | USB_DEVICE_ID_MATCH_INT_INFO, |
|---|
| 3011 | + .idVendor = 0x8086, |
|---|
| 3012 | + .idProduct = 0x0b03, |
|---|
| 3013 | + .bInterfaceClass = USB_CLASS_VIDEO, |
|---|
| 3014 | + .bInterfaceSubClass = 1, |
|---|
| 3015 | + .bInterfaceProtocol = 0, |
|---|
| 3016 | + .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, |
|---|
| 2889 | 3017 | /* Generic USB Video Class */ |
|---|
| 2890 | 3018 | { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_UNDEFINED) }, |
|---|
| 2891 | 3019 | { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_15) }, |
|---|