diff options
Diffstat (limited to 'drivers/usb/gadget/multi.c')
-rw-r--r-- | drivers/usb/gadget/multi.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c index 13fa622f01..6385c16186 100644 --- a/drivers/usb/gadget/multi.c +++ b/drivers/usb/gadget/multi.c @@ -234,6 +234,11 @@ static struct usb_composite_driver multi_driver = { int usb_multi_register(struct f_multi_opts *opts) { + if (gadget_multi_opts) { + pr_err("USB multi gadget already registered\n"); + return -EBUSY; + } + gadget_multi_opts = opts; return usb_composite_probe(&multi_driver); @@ -241,8 +246,22 @@ int usb_multi_register(struct f_multi_opts *opts) void usb_multi_unregister(void) { - if (gadget_multi_opts) - usb_composite_unregister(&multi_driver); + if (!gadget_multi_opts) + return; + + usb_composite_unregister(&multi_driver); + if (gadget_multi_opts->release) + gadget_multi_opts->release(gadget_multi_opts); gadget_multi_opts = NULL; } + +void usb_multi_opts_release(struct f_multi_opts *opts) +{ + if (opts->fastboot_opts.files) + file_list_free(opts->fastboot_opts.files); + if (opts->dfu_opts.files) + file_list_free(opts->dfu_opts.files); + + free(opts); +} |