summaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/multi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/multi.c')
-rw-r--r--drivers/usb/gadget/multi.c23
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);
+}