void *mem;
 
        switch (speed) {
+       case USB_SPEED_SUPER_PLUS:
        case USB_SPEED_SUPER:
                uvc_control_desc = uvc->desc.ss_control;
                uvc_streaming_cls = uvc->desc.ss_streaming;
                bytes += uvc_interrupt_ep.bLength + uvc_interrupt_cs_ep.bLength;
                n_desc += 2;
 
-               if (speed == USB_SPEED_SUPER) {
+               if (speed == USB_SPEED_SUPER ||
+                   speed == USB_SPEED_SUPER_PLUS) {
                        bytes += uvc_ss_interrupt_comp.bLength;
                        n_desc += 1;
                }
 
        if (uvc->enable_interrupt_ep) {
                UVC_COPY_DESCRIPTOR(mem, dst, &uvc_interrupt_ep);
-               if (speed == USB_SPEED_SUPER)
+               if (speed == USB_SPEED_SUPER ||
+                   speed == USB_SPEED_SUPER_PLUS)
                        UVC_COPY_DESCRIPTOR(mem, dst, &uvc_ss_interrupt_comp);
 
                UVC_COPY_DESCRIPTOR(mem, dst, &uvc_interrupt_cs_ep);
                goto error;
        }
 
+       f->ssp_descriptors = uvc_copy_descriptors(uvc, USB_SPEED_SUPER_PLUS);
+       if (IS_ERR(f->ssp_descriptors)) {
+               ret = PTR_ERR(f->ssp_descriptors);
+               f->ssp_descriptors = NULL;
+               goto error;
+       }
+
        /* Preallocate control endpoint request. */
        uvc->control_req = usb_ep_alloc_request(cdev->gadget->ep0, GFP_KERNEL);
        uvc->control_buf = kmalloc(UVC_MAX_REQUEST_SIZE, GFP_KERNEL);