Merge tag 'late-dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[firefly-linux-kernel-4.4.55.git] / drivers / usb / gadget / f_midi.c
index 8ed1259fe80d0f91bff200abf9d7b6c11966af5a..263e721c2694cdcdc9968d0a7c8f1c5957e16e75 100644 (file)
@@ -414,7 +414,7 @@ static void f_midi_unbind(struct usb_configuration *c, struct usb_function *f)
        kfree(midi->id);
        midi->id = NULL;
 
-       usb_free_descriptors(f->descriptors);
+       usb_free_all_descriptors(f);
        kfree(midi);
 }
 
@@ -881,19 +881,25 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f)
         * both speeds
         */
        /* copy descriptors, and track endpoint copies */
+       f->fs_descriptors = usb_copy_descriptors(midi_function);
+       if (!f->fs_descriptors)
+               goto fail_f_midi;
+
        if (gadget_is_dualspeed(c->cdev->gadget)) {
-               c->highspeed = true;
                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)