mirror of https://gitee.com/openkylin/linux.git
usb: gadget: uvc: Merge the SS/HS/FS control endpoint descriptors
The descriptors are identical, there's no need to have several copies of them. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Tested-by: Bhupesh Sharma <bhupesh.sharma@st.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
ee6a4d870b
commit
48eee0b41a
|
@ -104,7 +104,7 @@ static struct usb_interface_descriptor uvc_control_intf __initdata = {
|
||||||
.iInterface = 0,
|
.iInterface = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct usb_endpoint_descriptor uvc_fs_control_ep __initdata = {
|
static struct usb_endpoint_descriptor uvc_control_ep __initdata = {
|
||||||
.bLength = USB_DT_ENDPOINT_SIZE,
|
.bLength = USB_DT_ENDPOINT_SIZE,
|
||||||
.bDescriptorType = USB_DT_ENDPOINT,
|
.bDescriptorType = USB_DT_ENDPOINT,
|
||||||
.bEndpointAddress = USB_DIR_IN,
|
.bEndpointAddress = USB_DIR_IN,
|
||||||
|
@ -113,6 +113,15 @@ static struct usb_endpoint_descriptor uvc_fs_control_ep __initdata = {
|
||||||
.bInterval = 8,
|
.bInterval = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct usb_ss_ep_comp_descriptor uvc_ss_control_comp __initdata = {
|
||||||
|
.bLength = sizeof(uvc_ss_control_comp),
|
||||||
|
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
|
||||||
|
/* The following 3 values can be tweaked if necessary. */
|
||||||
|
.bMaxBurst = 0,
|
||||||
|
.bmAttributes = 0,
|
||||||
|
.wBytesPerInterval = cpu_to_le16(UVC_STATUS_MAX_PACKET_SIZE),
|
||||||
|
};
|
||||||
|
|
||||||
static struct uvc_control_endpoint_descriptor uvc_control_cs_ep __initdata = {
|
static struct uvc_control_endpoint_descriptor uvc_control_cs_ep __initdata = {
|
||||||
.bLength = UVC_DT_CONTROL_ENDPOINT_SIZE,
|
.bLength = UVC_DT_CONTROL_ENDPOINT_SIZE,
|
||||||
.bDescriptorType = USB_DT_CS_ENDPOINT,
|
.bDescriptorType = USB_DT_CS_ENDPOINT,
|
||||||
|
@ -144,7 +153,7 @@ static struct usb_interface_descriptor uvc_streaming_intf_alt1 __initdata = {
|
||||||
.iInterface = 0,
|
.iInterface = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct usb_endpoint_descriptor uvc_fs_streaming_ep = {
|
static struct usb_endpoint_descriptor uvc_fs_streaming_ep __initdata = {
|
||||||
.bLength = USB_DT_ENDPOINT_SIZE,
|
.bLength = USB_DT_ENDPOINT_SIZE,
|
||||||
.bDescriptorType = USB_DT_ENDPOINT,
|
.bDescriptorType = USB_DT_ENDPOINT,
|
||||||
.bEndpointAddress = USB_DIR_IN,
|
.bEndpointAddress = USB_DIR_IN,
|
||||||
|
@ -153,7 +162,7 @@ static struct usb_endpoint_descriptor uvc_fs_streaming_ep = {
|
||||||
.bInterval = 1,
|
.bInterval = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct usb_endpoint_descriptor uvc_hs_streaming_ep = {
|
static struct usb_endpoint_descriptor uvc_hs_streaming_ep __initdata = {
|
||||||
.bLength = USB_DT_ENDPOINT_SIZE,
|
.bLength = USB_DT_ENDPOINT_SIZE,
|
||||||
.bDescriptorType = USB_DT_ENDPOINT,
|
.bDescriptorType = USB_DT_ENDPOINT,
|
||||||
.bEndpointAddress = USB_DIR_IN,
|
.bEndpointAddress = USB_DIR_IN,
|
||||||
|
@ -162,27 +171,6 @@ static struct usb_endpoint_descriptor uvc_hs_streaming_ep = {
|
||||||
.bInterval = 1,
|
.bInterval = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* super speed support */
|
|
||||||
static struct usb_endpoint_descriptor uvc_ss_control_ep __initdata = {
|
|
||||||
.bLength = USB_DT_ENDPOINT_SIZE,
|
|
||||||
.bDescriptorType = USB_DT_ENDPOINT,
|
|
||||||
|
|
||||||
.bEndpointAddress = USB_DIR_IN,
|
|
||||||
.bmAttributes = USB_ENDPOINT_XFER_INT,
|
|
||||||
.wMaxPacketSize = cpu_to_le16(UVC_STATUS_MAX_PACKET_SIZE),
|
|
||||||
.bInterval = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct usb_ss_ep_comp_descriptor uvc_ss_control_comp __initdata = {
|
|
||||||
.bLength = sizeof(uvc_ss_control_comp),
|
|
||||||
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
|
|
||||||
|
|
||||||
/* the following 3 values can be tweaked if necessary */
|
|
||||||
.bMaxBurst = 0,
|
|
||||||
.bmAttributes = 0,
|
|
||||||
.wBytesPerInterval = cpu_to_le16(UVC_STATUS_MAX_PACKET_SIZE),
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct usb_endpoint_descriptor uvc_ss_streaming_ep __initdata = {
|
static struct usb_endpoint_descriptor uvc_ss_streaming_ep __initdata = {
|
||||||
.bLength = USB_DT_ENDPOINT_SIZE,
|
.bLength = USB_DT_ENDPOINT_SIZE,
|
||||||
.bDescriptorType = USB_DT_ENDPOINT,
|
.bDescriptorType = USB_DT_ENDPOINT,
|
||||||
|
@ -193,11 +181,10 @@ static struct usb_endpoint_descriptor uvc_ss_streaming_ep __initdata = {
|
||||||
.bInterval = 4,
|
.bInterval = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct usb_ss_ep_comp_descriptor uvc_ss_streaming_comp = {
|
static struct usb_ss_ep_comp_descriptor uvc_ss_streaming_comp __initdata = {
|
||||||
.bLength = sizeof(uvc_ss_streaming_comp),
|
.bLength = sizeof(uvc_ss_streaming_comp),
|
||||||
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
|
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
|
||||||
|
/* The following 3 values can be tweaked if necessary. */
|
||||||
/* the following 3 values can be tweaked if necessary */
|
|
||||||
.bMaxBurst = 0,
|
.bMaxBurst = 0,
|
||||||
.bmAttributes = 0,
|
.bmAttributes = 0,
|
||||||
.wBytesPerInterval = cpu_to_le16(1024),
|
.wBytesPerInterval = cpu_to_le16(1024),
|
||||||
|
@ -454,7 +441,6 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
|
||||||
const struct uvc_descriptor_header * const *uvc_streaming_cls;
|
const struct uvc_descriptor_header * const *uvc_streaming_cls;
|
||||||
const struct usb_descriptor_header * const *uvc_streaming_std;
|
const struct usb_descriptor_header * const *uvc_streaming_std;
|
||||||
const struct usb_descriptor_header * const *src;
|
const struct usb_descriptor_header * const *src;
|
||||||
static struct usb_endpoint_descriptor *uvc_control_ep;
|
|
||||||
struct usb_descriptor_header **dst;
|
struct usb_descriptor_header **dst;
|
||||||
struct usb_descriptor_header **hdr;
|
struct usb_descriptor_header **hdr;
|
||||||
unsigned int control_size;
|
unsigned int control_size;
|
||||||
|
@ -468,14 +454,12 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
|
||||||
uvc_control_desc = uvc->desc.ss_control;
|
uvc_control_desc = uvc->desc.ss_control;
|
||||||
uvc_streaming_cls = uvc->desc.ss_streaming;
|
uvc_streaming_cls = uvc->desc.ss_streaming;
|
||||||
uvc_streaming_std = uvc_ss_streaming;
|
uvc_streaming_std = uvc_ss_streaming;
|
||||||
uvc_control_ep = &uvc_ss_control_ep;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_SPEED_HIGH:
|
case USB_SPEED_HIGH:
|
||||||
uvc_control_desc = uvc->desc.fs_control;
|
uvc_control_desc = uvc->desc.fs_control;
|
||||||
uvc_streaming_cls = uvc->desc.hs_streaming;
|
uvc_streaming_cls = uvc->desc.hs_streaming;
|
||||||
uvc_streaming_std = uvc_hs_streaming;
|
uvc_streaming_std = uvc_hs_streaming;
|
||||||
uvc_control_ep = &uvc_fs_control_ep;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_SPEED_FULL:
|
case USB_SPEED_FULL:
|
||||||
|
@ -483,7 +467,6 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
|
||||||
uvc_control_desc = uvc->desc.fs_control;
|
uvc_control_desc = uvc->desc.fs_control;
|
||||||
uvc_streaming_cls = uvc->desc.fs_streaming;
|
uvc_streaming_cls = uvc->desc.fs_streaming;
|
||||||
uvc_streaming_std = uvc_fs_streaming;
|
uvc_streaming_std = uvc_fs_streaming;
|
||||||
uvc_control_ep = &uvc_fs_control_ep;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,6 +477,7 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
|
||||||
* Class-specific UVC control descriptors
|
* Class-specific UVC control descriptors
|
||||||
* uvc_control_ep
|
* uvc_control_ep
|
||||||
* uvc_control_cs_ep
|
* uvc_control_cs_ep
|
||||||
|
* uvc_ss_control_comp (for SS only)
|
||||||
* uvc_streaming_intf_alt0
|
* uvc_streaming_intf_alt0
|
||||||
* Class-specific UVC streaming descriptors
|
* Class-specific UVC streaming descriptors
|
||||||
* uvc_{fs|hs}_streaming
|
* uvc_{fs|hs}_streaming
|
||||||
|
@ -503,7 +487,7 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
|
||||||
control_size = 0;
|
control_size = 0;
|
||||||
streaming_size = 0;
|
streaming_size = 0;
|
||||||
bytes = uvc_iad.bLength + uvc_control_intf.bLength
|
bytes = uvc_iad.bLength + uvc_control_intf.bLength
|
||||||
+ uvc_control_ep->bLength + uvc_control_cs_ep.bLength
|
+ uvc_control_ep.bLength + uvc_control_cs_ep.bLength
|
||||||
+ uvc_streaming_intf_alt0.bLength;
|
+ uvc_streaming_intf_alt0.bLength;
|
||||||
|
|
||||||
if (speed == USB_SPEED_SUPER) {
|
if (speed == USB_SPEED_SUPER) {
|
||||||
|
@ -549,7 +533,7 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
|
||||||
uvc_control_header->bInCollection = 1;
|
uvc_control_header->bInCollection = 1;
|
||||||
uvc_control_header->baInterfaceNr[0] = uvc->streaming_intf;
|
uvc_control_header->baInterfaceNr[0] = uvc->streaming_intf;
|
||||||
|
|
||||||
UVC_COPY_DESCRIPTOR(mem, dst, uvc_control_ep);
|
UVC_COPY_DESCRIPTOR(mem, dst, &uvc_control_ep);
|
||||||
if (speed == USB_SPEED_SUPER)
|
if (speed == USB_SPEED_SUPER)
|
||||||
UVC_COPY_DESCRIPTOR(mem, dst, &uvc_ss_control_comp);
|
UVC_COPY_DESCRIPTOR(mem, dst, &uvc_ss_control_comp);
|
||||||
|
|
||||||
|
@ -619,7 +603,7 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
|
||||||
uvc_fs_streaming_ep.bInterval = streaming_interval;
|
uvc_fs_streaming_ep.bInterval = streaming_interval;
|
||||||
|
|
||||||
/* Allocate endpoints. */
|
/* Allocate endpoints. */
|
||||||
ep = usb_ep_autoconfig(cdev->gadget, &uvc_fs_control_ep);
|
ep = usb_ep_autoconfig(cdev->gadget, &uvc_control_ep);
|
||||||
if (!ep) {
|
if (!ep) {
|
||||||
INFO(cdev, "Unable to allocate control EP\n");
|
INFO(cdev, "Unable to allocate control EP\n");
|
||||||
goto error;
|
goto error;
|
||||||
|
|
Loading…
Reference in New Issue