summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2012-10-22 22:15:03 +0200
committerFelipe Balbi <balbi@ti.com>2012-10-31 15:05:37 +0200
commit7f2a9268b458b693160f02f0df2bafb83e128750 (patch)
tree532d952fb1edc86db2ceccd9498d857ab2dc4e99
parentd185039f7982eb82cf8d03b6fb6689587ca5af24 (diff)
usb: gadget: midi: make FS and HS available
This function works only on FS or HS. If the gadget is HS capable only HS descriptors are assigned. If we plug it to an 1.1 host it won't work because we have only 2.0 descriptors. This patch changes the behavior to provide both sets. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r--drivers/usb/gadget/f_midi.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/usb/gadget/f_midi.c b/drivers/usb/gadget/f_midi.c
index b978c5d15cb4..b265ee8fa5aa 100644
--- a/drivers/usb/gadget/f_midi.c
+++ b/drivers/usb/gadget/f_midi.c
@@ -882,18 +882,24 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f)
* both speeds
*/
/* copy descriptors, and track endpoint copies */
+ f->descriptors = usb_copy_descriptors(midi_function);
+ if (!f->descriptors)
+ goto fail_f_midi;
if (gadget_is_dualspeed(c->cdev->gadget)) {
bulk_in_desc.wMaxPacketSize = cpu_to_le16(512);
bulk_out_desc.wMaxPacketSize = cpu_to_le16(512);
f->hs_descriptors = usb_copy_descriptors(midi_function);
- } else {
- f->descriptors = usb_copy_descriptors(midi_function);
+ if (!f->hs_descriptors)
+ goto fail_f_midi;
}
kfree(midi_function);
return 0;
+fail_f_midi:
+ kfree(midi_function);
+ usb_free_descriptors(f->hs_descriptors);
fail:
/* we might as well release our claims on endpoints */
if (midi->out_ep)