mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
usb: gadget: add isochronous support to gadget zero
Add two isochronous endpoints to the gadget zero source/sink function. They are enabled by selecting alternate interface 1, so by default they are not enabled. Module parameters for setting all the isoc endpoint characteristics are also provided. Signed-off-by: Pratyush Anand <pratyush.anand@st.com> Signed-off-by: Paul Zimmerman <paulz@synopsys.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
committed by
Felipe Balbi
parent
20c5e74c7b
commit
b4036ccdd2
@@ -286,7 +286,7 @@ static void disable_loopback(struct f_loopback *loop)
|
|||||||
struct usb_composite_dev *cdev;
|
struct usb_composite_dev *cdev;
|
||||||
|
|
||||||
cdev = loop->function.config->cdev;
|
cdev = loop->function.config->cdev;
|
||||||
disable_endpoints(cdev, loop->in_ep, loop->out_ep);
|
disable_endpoints(cdev, loop->in_ep, loop->out_ep, NULL, NULL);
|
||||||
VDBG(cdev, "%s disabled\n", loop->function.name);
|
VDBG(cdev, "%s disabled\n", loop->function.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,7 +329,7 @@ fail0:
|
|||||||
* than 'buflen' bytes each.
|
* than 'buflen' bytes each.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < qlen && result == 0; i++) {
|
for (i = 0; i < qlen && result == 0; i++) {
|
||||||
req = alloc_ep_req(ep);
|
req = alloc_ep_req(ep, 0);
|
||||||
if (req) {
|
if (req) {
|
||||||
req->complete = loopback_complete;
|
req->complete = loopback_complete;
|
||||||
result = usb_ep_queue(ep, req, GFP_ATOMIC);
|
result = usb_ep_queue(ep, req, GFP_ATOMIC);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -13,10 +13,11 @@ extern unsigned buflen;
|
|||||||
extern const struct usb_descriptor_header *otg_desc[];
|
extern const struct usb_descriptor_header *otg_desc[];
|
||||||
|
|
||||||
/* common utilities */
|
/* common utilities */
|
||||||
struct usb_request *alloc_ep_req(struct usb_ep *ep);
|
struct usb_request *alloc_ep_req(struct usb_ep *ep, int len);
|
||||||
void free_ep_req(struct usb_ep *ep, struct usb_request *req);
|
void free_ep_req(struct usb_ep *ep, struct usb_request *req);
|
||||||
void disable_endpoints(struct usb_composite_dev *cdev,
|
void disable_endpoints(struct usb_composite_dev *cdev,
|
||||||
struct usb_ep *in, struct usb_ep *out);
|
struct usb_ep *in, struct usb_ep *out,
|
||||||
|
struct usb_ep *iso_in, struct usb_ep *iso_out);
|
||||||
|
|
||||||
/* configuration-specific linkup */
|
/* configuration-specific linkup */
|
||||||
int sourcesink_add(struct usb_composite_dev *cdev, bool autoresume);
|
int sourcesink_add(struct usb_composite_dev *cdev, bool autoresume);
|
||||||
|
|||||||
@@ -72,7 +72,7 @@
|
|||||||
|
|
||||||
static const char longname[] = "Gadget Zero";
|
static const char longname[] = "Gadget Zero";
|
||||||
|
|
||||||
unsigned buflen = 4096;
|
unsigned buflen = 4096; /* only used for bulk endpoints */
|
||||||
module_param(buflen, uint, 0);
|
module_param(buflen, uint, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -170,14 +170,17 @@ static struct usb_gadget_strings *dev_strings[] = {
|
|||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
struct usb_request *alloc_ep_req(struct usb_ep *ep)
|
struct usb_request *alloc_ep_req(struct usb_ep *ep, int len)
|
||||||
{
|
{
|
||||||
struct usb_request *req;
|
struct usb_request *req;
|
||||||
|
|
||||||
req = usb_ep_alloc_request(ep, GFP_ATOMIC);
|
req = usb_ep_alloc_request(ep, GFP_ATOMIC);
|
||||||
if (req) {
|
if (req) {
|
||||||
req->length = buflen;
|
if (len)
|
||||||
req->buf = kmalloc(buflen, GFP_ATOMIC);
|
req->length = len;
|
||||||
|
else
|
||||||
|
req->length = buflen;
|
||||||
|
req->buf = kmalloc(req->length, GFP_ATOMIC);
|
||||||
if (!req->buf) {
|
if (!req->buf) {
|
||||||
usb_ep_free_request(ep, req);
|
usb_ep_free_request(ep, req);
|
||||||
req = NULL;
|
req = NULL;
|
||||||
@@ -206,10 +209,15 @@ static void disable_ep(struct usb_composite_dev *cdev, struct usb_ep *ep)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void disable_endpoints(struct usb_composite_dev *cdev,
|
void disable_endpoints(struct usb_composite_dev *cdev,
|
||||||
struct usb_ep *in, struct usb_ep *out)
|
struct usb_ep *in, struct usb_ep *out,
|
||||||
|
struct usb_ep *iso_in, struct usb_ep *iso_out)
|
||||||
{
|
{
|
||||||
disable_ep(cdev, in);
|
disable_ep(cdev, in);
|
||||||
disable_ep(cdev, out);
|
disable_ep(cdev, out);
|
||||||
|
if (iso_in)
|
||||||
|
disable_ep(cdev, iso_in);
|
||||||
|
if (iso_out)
|
||||||
|
disable_ep(cdev, iso_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
@@ -311,7 +319,6 @@ static int __init zero_bind(struct usb_composite_dev *cdev)
|
|||||||
device_desc.bcdDevice = cpu_to_le16(0x9999);
|
device_desc.bcdDevice = cpu_to_le16(0x9999);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
INFO(cdev, "%s, version: " DRIVER_VERSION "\n", longname);
|
INFO(cdev, "%s, version: " DRIVER_VERSION "\n", longname);
|
||||||
|
|
||||||
snprintf(manufacturer, sizeof manufacturer, "%s %s with %s",
|
snprintf(manufacturer, sizeof manufacturer, "%s %s with %s",
|
||||||
|
|||||||
Reference in New Issue
Block a user