summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-07-17 08:28:37 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2014-07-22 08:11:25 +0200
commit14a72d425891ccd5e15e0305d753d91b8d9c8c2c (patch)
treeadd3584d6be08a89559109f1cf1ec25f27d51e3c /drivers
parent057a57448debbb942babf0a307294a9022863760 (diff)
downloadbarebox-14a72d425891ccd5e15e0305d753d91b8d9c8c2c.tar.gz
barebox-14a72d425891ccd5e15e0305d753d91b8d9c8c2c.tar.xz
USB: gadget: DFU: Move stuff to dfu_bind
When we want to create a composite device dfu_bind_config will not be called for a composite device. Move the initialisation needed by both the composite device and the single function device from dfu_bind_config to dfu_bind. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/gadget/dfu.c74
1 files changed, 36 insertions, 38 deletions
diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c
index 1db1932709..56601babad 100644
--- a/drivers/usb/gadget/dfu.c
+++ b/drivers/usb/gadget/dfu.c
@@ -167,6 +167,8 @@ static struct usb_gadget_strings *dfu_strings[] = {
NULL,
};
+static void dn_complete(struct usb_ep *ep, struct usb_request *req);
+
static int
dfu_bind(struct usb_configuration *c, struct usb_function *f)
{
@@ -174,13 +176,45 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f)
struct usb_descriptor_header **header;
struct usb_interface_descriptor *desc;
struct file_list_entry *fentry;
+ struct f_dfu *dfu = container_of(f, struct f_dfu, func);
int i;
int status;
+ status = usb_string_id(c->cdev);
+ if (status < 0)
+ return status;
+
+ dfu_string_defs = xzalloc(sizeof(struct usb_string) * (dfu_files->num_entries + 2));
+ dfu_string_defs[0].s = "Generic DFU";
+ dfu_string_defs[0].id = status;
+ i = 0;
+ file_list_for_each_entry(dfu_files, fentry) {
+ dfu_string_defs[i + 1].s = fentry->name;
+ status = usb_string_id(c->cdev);
+ if (status < 0)
+ goto out;
+ dfu_string_defs[i + 1].id = status;
+ i++;
+ }
+ dfu_string_defs[i + 1].s = NULL;
+ dfu_string_table.strings = dfu_string_defs;
+
+ dfu->dfu_state = DFU_STATE_appIDLE;
+ dfu->dfu_status = DFU_STATUS_OK;
+
+ dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0);
+ if (!dfu->dnreq) {
+ printf("usb_ep_alloc_request failed\n");
+ goto out;
+ }
+ dfu->dnreq->buf = dma_alloc(CONFIG_USBD_DFU_XFER_SIZE);
+ dfu->dnreq->complete = dn_complete;
+ dfu->dnreq->zero = 0;
+
/* allocate instance-specific interface IDs, and patch descriptors */
status = usb_interface_id(c, f);
if (status < 0)
- return status;
+ goto out;
header = xzalloc(sizeof(void *) * (dfu_files->num_entries + 2));
desc = xzalloc(sizeof(struct usb_interface_descriptor) * dfu_files->num_entries);
@@ -215,8 +249,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f)
return 0;
out:
- free(desc);
- free(header);
+ free(dfu_string_defs);
if (status)
ERROR(cdev, "%s/%p: can't bind, err %d\n", f->name, f, status);
@@ -233,7 +266,6 @@ dfu_unbind(struct usb_configuration *c, struct usb_function *f)
dma_free(dfu->dnreq->buf);
usb_ep_free_request(c->cdev->gadget->ep0, dfu->dnreq);
- free(dfu);
}
static int dfu_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
@@ -624,9 +656,7 @@ static int dfu_bind_config(struct usb_configuration *c)
{
struct f_dfu *dfu;
struct usb_function *func;
- struct file_list_entry *fentry;
int status;
- int i;
/* config description */
status = usb_string_id(c->cdev);
@@ -634,31 +664,9 @@ static int dfu_bind_config(struct usb_configuration *c)
return status;
strings_dev[STRING_DESCRIPTION_IDX].id = status;
- status = usb_string_id(c->cdev);
- if (status < 0)
- return status;
-
/* allocate and initialize one new instance */
dfu = xzalloc(sizeof *dfu);
- dfu->dfu_state = DFU_STATE_appIDLE;
- dfu->dfu_status = DFU_STATUS_OK;
-
- dfu_string_defs = xzalloc(sizeof(struct usb_string) * (dfu_files->num_entries + 2));
- dfu_string_defs[0].s = "Generic DFU";
- dfu_string_defs[0].id = status;
- i = 0;
- file_list_for_each_entry(dfu_files, fentry) {
- dfu_string_defs[i + 1].s = fentry->name;
- status = usb_string_id(c->cdev);
- if (status < 0)
- goto out;
- dfu_string_defs[i + 1].id = status;
- i++;
- }
- dfu_string_defs[i + 1].s = NULL;
- dfu_string_table.strings = dfu_string_defs;
-
func = &dfu->func;
func->name = "DFU";
func->strings = dfu_strings;
@@ -669,15 +677,6 @@ static int dfu_bind_config(struct usb_configuration *c)
func->setup = dfu_setup;
func->disable = dfu_disable;
- dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0);
- if (!dfu->dnreq) {
- printf("usb_ep_alloc_request failed\n");
- goto out;
- }
- dfu->dnreq->buf = dma_alloc(CONFIG_USBD_DFU_XFER_SIZE);
- dfu->dnreq->complete = dn_complete;
- dfu->dnreq->zero = 0;
-
status = usb_add_function(c, func);
if (status)
goto out;
@@ -685,7 +684,6 @@ static int dfu_bind_config(struct usb_configuration *c)
return 0;
out:
free(dfu);
- free(dfu_string_defs);
return status;
}