usb: gadget: always update HS/SS descriptors and create a copy of them
[deliverable/linux.git] / drivers / usb / gadget / config.c
index e3a98929d3463d50ad395be7bf7fe08c92dfc983..34e12fc52c23d45fa2148212938242bb05b777f3 100644 (file)
@@ -19,7 +19,7 @@
 
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
-
+#include <linux/usb/composite.h>
 
 /**
  * usb_descriptor_fillbuf - fill buffer with descriptors
@@ -158,3 +158,40 @@ usb_copy_descriptors(struct usb_descriptor_header **src)
        return ret;
 }
 EXPORT_SYMBOL_GPL(usb_copy_descriptors);
+
+int usb_assign_descriptors(struct usb_function *f,
+               struct usb_descriptor_header **fs,
+               struct usb_descriptor_header **hs,
+               struct usb_descriptor_header **ss)
+{
+       struct usb_gadget *g = f->config->cdev->gadget;
+
+       if (fs) {
+               f->fs_descriptors = usb_copy_descriptors(fs);
+               if (!f->fs_descriptors)
+                       goto err;
+       }
+       if (hs && gadget_is_dualspeed(g)) {
+               f->hs_descriptors = usb_copy_descriptors(hs);
+               if (!f->hs_descriptors)
+                       goto err;
+       }
+       if (ss && gadget_is_superspeed(g)) {
+               f->ss_descriptors = usb_copy_descriptors(ss);
+               if (!f->ss_descriptors)
+                       goto err;
+       }
+       return 0;
+err:
+       usb_free_all_descriptors(f);
+       return -ENOMEM;
+}
+EXPORT_SYMBOL_GPL(usb_assign_descriptors);
+
+void usb_free_all_descriptors(struct usb_function *f)
+{
+       usb_free_descriptors(f->fs_descriptors);
+       usb_free_descriptors(f->hs_descriptors);
+       usb_free_descriptors(f->ss_descriptors);
+}
+EXPORT_SYMBOL_GPL(usb_free_all_descriptors);
This page took 0.024888 seconds and 5 git commands to generate.