The Oculus Rift Sensors (DK2 and CV1) allow to configure their sensor chips
directly via I2C commands using extension unit controls. The processing and
camera unit controls do not function at all.

Signed-off-by: Philipp Zabel <philipp.za...@gmail.com>
---
 drivers/media/usb/uvc/uvc_ctrl.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
index 1d60321a6777..738edb81bc0a 100644
--- a/drivers/media/usb/uvc/uvc_ctrl.c
+++ b/drivers/media/usb/uvc/uvc_ctrl.c
@@ -2213,6 +2213,10 @@ int uvc_ctrl_init_device(struct uvc_device *dev)
 {
        struct uvc_entity *entity;
        unsigned int i;
+       const struct usb_device_id xu_only[] = {
+               { USB_DEVICE(0x2833, 0x0201) },
+               { USB_DEVICE(0x2833, 0x0211) },
+       };
 
        /* Walk the entities list and instantiate controls */
        list_for_each_entry(entity, &dev->entities, list) {
@@ -2220,6 +2224,16 @@ int uvc_ctrl_init_device(struct uvc_device *dev)
                unsigned int bControlSize = 0, ncontrols;
                __u8 *bmControls = NULL;
 
+               /* Oculus Sensors only handle extension unit controls */
+               if (UVC_ENTITY_TYPE(entity) != UVC_VC_EXTENSION_UNIT) {
+                       for (i = 0; i < ARRAY_SIZE(xu_only); i++) {
+                               if (usb_match_one_id(dev->intf, &xu_only[i]))
+                                       break;
+                       }
+                       if (i != ARRAY_SIZE(xu_only))
+                               continue;
+               }
+
                if (UVC_ENTITY_TYPE(entity) == UVC_VC_EXTENSION_UNIT) {
                        bmControls = entity->extension.bmControls;
                        bControlSize = entity->extension.bControlSize;
-- 
2.13.2

Reply via email to