Commit b4036ccd authored by Paul Zimmerman's avatar Paul Zimmerman Committed by Felipe Balbi

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: default avatarPratyush Anand <pratyush.anand@st.com>
Signed-off-by: default avatarPaul Zimmerman <paulz@synopsys.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 20c5e74c
...@@ -286,7 +286,7 @@ static void disable_loopback(struct f_loopback *loop) ...@@ -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 @@ enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop) ...@@ -329,7 +329,7 @@ enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop)
* 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);
......
This diff is collapsed.
...@@ -13,10 +13,11 @@ extern unsigned buflen; ...@@ -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 @@ ...@@ -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[] = { ...@@ -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) ...@@ -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) ...@@ -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",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment