Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: uvcvideo: Add extensible device information

Currently the UVC driver assigns a quirk bitmask to the .driver_info
field of struct usb_device_id. This patch instroduces a struct to store
quirks and possibly other per-device parameters in the future.

Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@intel.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

authored by

Guennadi Liakhovetski and committed by
Mauro Carvalho Chehab
3bc85817 563a01e1

+78 -49
+78 -49
drivers/media/usb/uvc/uvc_driver.c
··· 2035 2035 * USB probe, disconnect, suspend and resume 2036 2036 */ 2037 2037 2038 + struct uvc_device_info { 2039 + u32 quirks; 2040 + }; 2041 + 2038 2042 static int uvc_probe(struct usb_interface *intf, 2039 2043 const struct usb_device_id *id) 2040 2044 { 2041 2045 struct usb_device *udev = interface_to_usbdev(intf); 2042 2046 struct uvc_device *dev; 2047 + const struct uvc_device_info *info = 2048 + (const struct uvc_device_info *)id->driver_info; 2049 + u32 quirks = info ? info->quirks : 0; 2043 2050 int function; 2044 2051 int ret; 2045 2052 ··· 2073 2066 dev->intf = usb_get_intf(intf); 2074 2067 dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; 2075 2068 dev->quirks = (uvc_quirks_param == -1) 2076 - ? id->driver_info : uvc_quirks_param; 2069 + ? quirks : uvc_quirks_param; 2077 2070 2078 2071 if (udev->product != NULL) 2079 2072 strlcpy(dev->name, udev->product, sizeof dev->name); ··· 2114 2107 le16_to_cpu(udev->descriptor.idVendor), 2115 2108 le16_to_cpu(udev->descriptor.idProduct)); 2116 2109 2117 - if (dev->quirks != id->driver_info) { 2110 + if (dev->quirks != quirks) { 2118 2111 uvc_printk(KERN_INFO, "Forcing device quirks to 0x%x by module " 2119 2112 "parameter for testing purpose.\n", dev->quirks); 2120 2113 uvc_printk(KERN_INFO, "Please report required quirks to the " ··· 2312 2305 * Driver initialization and cleanup 2313 2306 */ 2314 2307 2308 + static const struct uvc_device_info uvc_quirk_probe_minmax = { 2309 + .quirks = UVC_QUIRK_PROBE_MINMAX, 2310 + }; 2311 + 2312 + static const struct uvc_device_info uvc_quirk_fix_bandwidth = { 2313 + .quirks = UVC_QUIRK_FIX_BANDWIDTH, 2314 + }; 2315 + 2316 + static const struct uvc_device_info uvc_quirk_probe_def = { 2317 + .quirks = UVC_QUIRK_PROBE_DEF, 2318 + }; 2319 + 2320 + static const struct uvc_device_info uvc_quirk_stream_no_fid = { 2321 + .quirks = UVC_QUIRK_STREAM_NO_FID, 2322 + }; 2323 + 2324 + static const struct uvc_device_info uvc_quirk_force_y8 = { 2325 + .quirks = UVC_QUIRK_FORCE_Y8, 2326 + }; 2327 + 2328 + #define UVC_QUIRK_INFO(q) (kernel_ulong_t)&(struct uvc_device_info){.quirks = q} 2329 + 2315 2330 /* 2316 2331 * The Logitech cameras listed below have their interface class set to 2317 2332 * VENDOR_SPEC because they don't announce themselves as UVC devices, even ··· 2348 2319 .bInterfaceClass = USB_CLASS_VIDEO, 2349 2320 .bInterfaceSubClass = 1, 2350 2321 .bInterfaceProtocol = 0, 2351 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2322 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2352 2323 /* Genius eFace 2025 */ 2353 2324 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2354 2325 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2357 2328 .bInterfaceClass = USB_CLASS_VIDEO, 2358 2329 .bInterfaceSubClass = 1, 2359 2330 .bInterfaceProtocol = 0, 2360 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2331 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2361 2332 /* Microsoft Lifecam NX-6000 */ 2362 2333 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2363 2334 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2366 2337 .bInterfaceClass = USB_CLASS_VIDEO, 2367 2338 .bInterfaceSubClass = 1, 2368 2339 .bInterfaceProtocol = 0, 2369 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2340 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2370 2341 /* Microsoft Lifecam NX-3000 */ 2371 2342 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2372 2343 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2375 2346 .bInterfaceClass = USB_CLASS_VIDEO, 2376 2347 .bInterfaceSubClass = 1, 2377 2348 .bInterfaceProtocol = 0, 2378 - .driver_info = UVC_QUIRK_PROBE_DEF }, 2349 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, 2379 2350 /* Microsoft Lifecam VX-7000 */ 2380 2351 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2381 2352 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2384 2355 .bInterfaceClass = USB_CLASS_VIDEO, 2385 2356 .bInterfaceSubClass = 1, 2386 2357 .bInterfaceProtocol = 0, 2387 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2358 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2388 2359 /* Logitech Quickcam Fusion */ 2389 2360 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2390 2361 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2441 2412 .bInterfaceClass = USB_CLASS_VIDEO, 2442 2413 .bInterfaceSubClass = 1, 2443 2414 .bInterfaceProtocol = 0, 2444 - .driver_info = UVC_QUIRK_RESTORE_CTRLS_ON_INIT }, 2415 + .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_RESTORE_CTRLS_ON_INIT) }, 2445 2416 /* Chicony CNF7129 (Asus EEE 100HE) */ 2446 2417 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2447 2418 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2450 2421 .bInterfaceClass = USB_CLASS_VIDEO, 2451 2422 .bInterfaceSubClass = 1, 2452 2423 .bInterfaceProtocol = 0, 2453 - .driver_info = UVC_QUIRK_RESTRICT_FRAME_RATE }, 2424 + .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_RESTRICT_FRAME_RATE) }, 2454 2425 /* Alcor Micro AU3820 (Future Boy PC USB Webcam) */ 2455 2426 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2456 2427 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2459 2430 .bInterfaceClass = USB_CLASS_VIDEO, 2460 2431 .bInterfaceSubClass = 1, 2461 2432 .bInterfaceProtocol = 0, 2462 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2433 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2463 2434 /* Dell XPS m1530 */ 2464 2435 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2465 2436 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2468 2439 .bInterfaceClass = USB_CLASS_VIDEO, 2469 2440 .bInterfaceSubClass = 1, 2470 2441 .bInterfaceProtocol = 0, 2471 - .driver_info = UVC_QUIRK_PROBE_DEF }, 2442 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, 2472 2443 /* Dell SP2008WFP Monitor */ 2473 2444 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2474 2445 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2477 2448 .bInterfaceClass = USB_CLASS_VIDEO, 2478 2449 .bInterfaceSubClass = 1, 2479 2450 .bInterfaceProtocol = 0, 2480 - .driver_info = UVC_QUIRK_PROBE_DEF }, 2451 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, 2481 2452 /* Dell Alienware X51 */ 2482 2453 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2483 2454 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2486 2457 .bInterfaceClass = USB_CLASS_VIDEO, 2487 2458 .bInterfaceSubClass = 1, 2488 2459 .bInterfaceProtocol = 0, 2489 - .driver_info = UVC_QUIRK_PROBE_DEF }, 2460 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, 2490 2461 /* Dell Studio Hybrid 140g (OmniVision webcam) */ 2491 2462 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2492 2463 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2495 2466 .bInterfaceClass = USB_CLASS_VIDEO, 2496 2467 .bInterfaceSubClass = 1, 2497 2468 .bInterfaceProtocol = 0, 2498 - .driver_info = UVC_QUIRK_PROBE_DEF }, 2469 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, 2499 2470 /* Dell XPS M1330 (OmniVision OV7670 webcam) */ 2500 2471 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2501 2472 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2504 2475 .bInterfaceClass = USB_CLASS_VIDEO, 2505 2476 .bInterfaceSubClass = 1, 2506 2477 .bInterfaceProtocol = 0, 2507 - .driver_info = UVC_QUIRK_PROBE_DEF }, 2478 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, 2508 2479 /* Apple Built-In iSight */ 2509 2480 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2510 2481 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2513 2484 .bInterfaceClass = USB_CLASS_VIDEO, 2514 2485 .bInterfaceSubClass = 1, 2515 2486 .bInterfaceProtocol = 0, 2516 - .driver_info = UVC_QUIRK_PROBE_MINMAX 2517 - | UVC_QUIRK_BUILTIN_ISIGHT }, 2487 + .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_MINMAX 2488 + | UVC_QUIRK_BUILTIN_ISIGHT) }, 2518 2489 /* Apple Built-In iSight via iBridge */ 2519 2490 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2520 2491 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2523 2494 .bInterfaceClass = USB_CLASS_VIDEO, 2524 2495 .bInterfaceSubClass = 1, 2525 2496 .bInterfaceProtocol = 0, 2526 - .driver_info = UVC_QUIRK_PROBE_DEF }, 2497 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, 2527 2498 /* Foxlink ("HP Webcam" on HP Mini 5103) */ 2528 2499 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2529 2500 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2532 2503 .bInterfaceClass = USB_CLASS_VIDEO, 2533 2504 .bInterfaceSubClass = 1, 2534 2505 .bInterfaceProtocol = 0, 2535 - .driver_info = UVC_QUIRK_FIX_BANDWIDTH }, 2506 + .driver_info = (kernel_ulong_t)&uvc_quirk_fix_bandwidth }, 2536 2507 /* Genesys Logic USB 2.0 PC Camera */ 2537 2508 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2538 2509 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2541 2512 .bInterfaceClass = USB_CLASS_VIDEO, 2542 2513 .bInterfaceSubClass = 1, 2543 2514 .bInterfaceProtocol = 0, 2544 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2515 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2545 2516 /* Hercules Classic Silver */ 2546 2517 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2547 2518 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2550 2521 .bInterfaceClass = USB_CLASS_VIDEO, 2551 2522 .bInterfaceSubClass = 1, 2552 2523 .bInterfaceProtocol = 0, 2553 - .driver_info = UVC_QUIRK_FIX_BANDWIDTH }, 2524 + .driver_info = (kernel_ulong_t)&uvc_quirk_fix_bandwidth }, 2554 2525 /* ViMicro Vega */ 2555 2526 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2556 2527 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2559 2530 .bInterfaceClass = USB_CLASS_VIDEO, 2560 2531 .bInterfaceSubClass = 1, 2561 2532 .bInterfaceProtocol = 0, 2562 - .driver_info = UVC_QUIRK_FIX_BANDWIDTH }, 2533 + .driver_info = (kernel_ulong_t)&uvc_quirk_fix_bandwidth }, 2563 2534 /* ViMicro - Minoru3D */ 2564 2535 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2565 2536 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2568 2539 .bInterfaceClass = USB_CLASS_VIDEO, 2569 2540 .bInterfaceSubClass = 1, 2570 2541 .bInterfaceProtocol = 0, 2571 - .driver_info = UVC_QUIRK_FIX_BANDWIDTH }, 2542 + .driver_info = (kernel_ulong_t)&uvc_quirk_fix_bandwidth }, 2572 2543 /* ViMicro Venus - Minoru3D */ 2573 2544 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2574 2545 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2577 2548 .bInterfaceClass = USB_CLASS_VIDEO, 2578 2549 .bInterfaceSubClass = 1, 2579 2550 .bInterfaceProtocol = 0, 2580 - .driver_info = UVC_QUIRK_FIX_BANDWIDTH }, 2551 + .driver_info = (kernel_ulong_t)&uvc_quirk_fix_bandwidth }, 2581 2552 /* Ophir Optronics - SPCAM 620U */ 2582 2553 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2583 2554 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2586 2557 .bInterfaceClass = USB_CLASS_VIDEO, 2587 2558 .bInterfaceSubClass = 1, 2588 2559 .bInterfaceProtocol = 0, 2589 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2560 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2590 2561 /* MT6227 */ 2591 2562 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2592 2563 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2595 2566 .bInterfaceClass = USB_CLASS_VIDEO, 2596 2567 .bInterfaceSubClass = 1, 2597 2568 .bInterfaceProtocol = 0, 2598 - .driver_info = UVC_QUIRK_PROBE_MINMAX 2599 - | UVC_QUIRK_PROBE_DEF }, 2569 + .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_MINMAX 2570 + | UVC_QUIRK_PROBE_DEF) }, 2600 2571 /* IMC Networks (Medion Akoya) */ 2601 2572 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2602 2573 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2605 2576 .bInterfaceClass = USB_CLASS_VIDEO, 2606 2577 .bInterfaceSubClass = 1, 2607 2578 .bInterfaceProtocol = 0, 2608 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2579 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2609 2580 /* JMicron USB2.0 XGA WebCam */ 2610 2581 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2611 2582 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2614 2585 .bInterfaceClass = USB_CLASS_VIDEO, 2615 2586 .bInterfaceSubClass = 1, 2616 2587 .bInterfaceProtocol = 0, 2617 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2588 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2618 2589 /* Syntek (HP Spartan) */ 2619 2590 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2620 2591 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2623 2594 .bInterfaceClass = USB_CLASS_VIDEO, 2624 2595 .bInterfaceSubClass = 1, 2625 2596 .bInterfaceProtocol = 0, 2626 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2597 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2627 2598 /* Syntek (Samsung Q310) */ 2628 2599 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2629 2600 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2632 2603 .bInterfaceClass = USB_CLASS_VIDEO, 2633 2604 .bInterfaceSubClass = 1, 2634 2605 .bInterfaceProtocol = 0, 2635 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2606 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2636 2607 /* Syntek (Packard Bell EasyNote MX52 */ 2637 2608 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2638 2609 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2641 2612 .bInterfaceClass = USB_CLASS_VIDEO, 2642 2613 .bInterfaceSubClass = 1, 2643 2614 .bInterfaceProtocol = 0, 2644 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2615 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2645 2616 /* Syntek (Asus F9SG) */ 2646 2617 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2647 2618 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2650 2621 .bInterfaceClass = USB_CLASS_VIDEO, 2651 2622 .bInterfaceSubClass = 1, 2652 2623 .bInterfaceProtocol = 0, 2653 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2624 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2654 2625 /* Syntek (Asus U3S) */ 2655 2626 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2656 2627 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2659 2630 .bInterfaceClass = USB_CLASS_VIDEO, 2660 2631 .bInterfaceSubClass = 1, 2661 2632 .bInterfaceProtocol = 0, 2662 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2633 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2663 2634 /* Syntek (JAOtech Smart Terminal) */ 2664 2635 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2665 2636 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2668 2639 .bInterfaceClass = USB_CLASS_VIDEO, 2669 2640 .bInterfaceSubClass = 1, 2670 2641 .bInterfaceProtocol = 0, 2671 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2642 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2672 2643 /* Miricle 307K */ 2673 2644 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2674 2645 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2677 2648 .bInterfaceClass = USB_CLASS_VIDEO, 2678 2649 .bInterfaceSubClass = 1, 2679 2650 .bInterfaceProtocol = 0, 2680 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2651 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2681 2652 /* Lenovo Thinkpad SL400/SL500 */ 2682 2653 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2683 2654 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2686 2657 .bInterfaceClass = USB_CLASS_VIDEO, 2687 2658 .bInterfaceSubClass = 1, 2688 2659 .bInterfaceProtocol = 0, 2689 - .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2660 + .driver_info = (kernel_ulong_t)&uvc_quirk_stream_no_fid }, 2690 2661 /* Aveo Technology USB 2.0 Camera */ 2691 2662 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2692 2663 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2695 2666 .bInterfaceClass = USB_CLASS_VIDEO, 2696 2667 .bInterfaceSubClass = 1, 2697 2668 .bInterfaceProtocol = 0, 2698 - .driver_info = UVC_QUIRK_PROBE_MINMAX 2699 - | UVC_QUIRK_PROBE_EXTRAFIELDS }, 2669 + .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_MINMAX 2670 + | UVC_QUIRK_PROBE_EXTRAFIELDS) }, 2700 2671 /* Aveo Technology USB 2.0 Camera (Tasco USB Microscope) */ 2701 2672 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2702 2673 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2713 2684 .bInterfaceClass = USB_CLASS_VIDEO, 2714 2685 .bInterfaceSubClass = 1, 2715 2686 .bInterfaceProtocol = 0, 2716 - .driver_info = UVC_QUIRK_PROBE_EXTRAFIELDS }, 2687 + .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_EXTRAFIELDS) }, 2717 2688 /* Manta MM-353 Plako */ 2718 2689 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2719 2690 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2722 2693 .bInterfaceClass = USB_CLASS_VIDEO, 2723 2694 .bInterfaceSubClass = 1, 2724 2695 .bInterfaceProtocol = 0, 2725 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2696 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2726 2697 /* FSC WebCam V30S */ 2727 2698 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2728 2699 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2731 2702 .bInterfaceClass = USB_CLASS_VIDEO, 2732 2703 .bInterfaceSubClass = 1, 2733 2704 .bInterfaceProtocol = 0, 2734 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2705 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2735 2706 /* Arkmicro unbranded */ 2736 2707 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2737 2708 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2740 2711 .bInterfaceClass = USB_CLASS_VIDEO, 2741 2712 .bInterfaceSubClass = 1, 2742 2713 .bInterfaceProtocol = 0, 2743 - .driver_info = UVC_QUIRK_PROBE_DEF }, 2714 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_def }, 2744 2715 /* The Imaging Source USB CCD cameras */ 2745 2716 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2746 2717 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2759 2730 .bInterfaceClass = USB_CLASS_VIDEO, 2760 2731 .bInterfaceSubClass = 1, 2761 2732 .bInterfaceProtocol = 0, 2762 - .driver_info = UVC_QUIRK_STATUS_INTERVAL }, 2733 + .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_STATUS_INTERVAL) }, 2763 2734 /* MSI StarCam 370i */ 2764 2735 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2765 2736 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2768 2739 .bInterfaceClass = USB_CLASS_VIDEO, 2769 2740 .bInterfaceSubClass = 1, 2770 2741 .bInterfaceProtocol = 0, 2771 - .driver_info = UVC_QUIRK_PROBE_MINMAX }, 2742 + .driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax }, 2772 2743 /* SiGma Micro USB Web Camera */ 2773 2744 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2774 2745 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2777 2748 .bInterfaceClass = USB_CLASS_VIDEO, 2778 2749 .bInterfaceSubClass = 1, 2779 2750 .bInterfaceProtocol = 0, 2780 - .driver_info = UVC_QUIRK_PROBE_MINMAX 2781 - | UVC_QUIRK_IGNORE_SELECTOR_UNIT }, 2751 + .driver_info = UVC_QUIRK_INFO(UVC_QUIRK_PROBE_MINMAX 2752 + | UVC_QUIRK_IGNORE_SELECTOR_UNIT) }, 2782 2753 /* Oculus VR Positional Tracker DK2 */ 2783 2754 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2784 2755 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2787 2758 .bInterfaceClass = USB_CLASS_VIDEO, 2788 2759 .bInterfaceSubClass = 1, 2789 2760 .bInterfaceProtocol = 0, 2790 - .driver_info = UVC_QUIRK_FORCE_Y8 }, 2761 + .driver_info = (kernel_ulong_t)&uvc_quirk_force_y8 }, 2791 2762 /* Oculus VR Rift Sensor */ 2792 2763 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2793 2764 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2796 2767 .bInterfaceClass = USB_CLASS_VENDOR_SPEC, 2797 2768 .bInterfaceSubClass = 1, 2798 2769 .bInterfaceProtocol = 0, 2799 - .driver_info = UVC_QUIRK_FORCE_Y8 }, 2770 + .driver_info = (kernel_ulong_t)&uvc_quirk_force_y8 }, 2800 2771 /* Generic USB Video Class */ 2801 2772 { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_UNDEFINED) }, 2802 2773 { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_15) },