.name           = "g_audio",
        .dev            = &device_desc,
        .strings        = audio_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = __exit_p(audio_unbind),
 };
 
 
        .name           = "g_cdc",
        .dev            = &device_desc,
        .strings        = dev_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = __exit_p(cdc_unbind),
 };
 
 
                driver->iProduct = driver->name;
        composite_driver.function =  (char *) driver->name;
        composite_driver.driver.name = driver->name;
+       composite_driver.speed = min((u8)composite_driver.speed,
+                                    (u8)driver->max_speed);
        composite = driver;
        composite_gadget_bind = bind;
 
 
        .name           = "g_ether",
        .dev            = &device_desc,
        .strings        = dev_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = __exit_p(eth_unbind),
 };
 
 
        .name           = DRIVER_NAME,
        .dev            = &gfs_dev_desc,
        .strings        = gfs_dev_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = gfs_unbind,
        .iProduct       = DRIVER_DESC,
 };
 
        .name           = "g_hid",
        .dev            = &device_desc,
        .strings        = dev_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = __exit_p(hid_unbind),
 };
 
 
        .name           = "g_mass_storage",
        .dev            = &msg_device_desc,
        .iProduct       = DRIVER_DESC,
+       .max_speed      = USB_SPEED_HIGH,
        .needs_serial   = 1,
 };
 
 
        .name           = "g_multi",
        .dev            = &device_desc,
        .strings        = dev_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = __exit_p(multi_unbind),
        .iProduct       = DRIVER_DESC,
        .needs_serial   = 1,
 
        .name           = "g_ncm",
        .dev            = &device_desc,
        .strings        = dev_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = __exit_p(gncm_unbind),
 };
 
 
        .name           = "g_nokia",
        .dev            = &device_desc,
        .strings        = dev_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = __exit_p(nokia_unbind),
 };
 
 
        .name           = "g_serial",
        .dev            = &device_desc,
        .strings        = dev_strings,
+       .max_speed      = USB_SPEED_HIGH,
 };
 
 static int __init init(void)
 
        .name           = "g_webcam",
        .dev            = &webcam_device_descriptor,
        .strings        = webcam_device_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = webcam_unbind,
 };
 
 
        .name           = "zero",
        .dev            = &device_desc,
        .strings        = dev_strings,
+       .max_speed      = USB_SPEED_HIGH,
        .unbind         = zero_unbind,
        .suspend        = zero_suspend,
        .resume         = zero_resume,
 
  *     identifiers.
  * @strings: tables of strings, keyed by identifiers assigned during bind()
  *     and language IDs provided in control requests
+ * @max_speed: Highest speed the driver supports.
  * @needs_serial: set to 1 if the gadget needs userspace to provide
  *     a serial number.  If one is not provided, warning will be printed.
  * @unbind: Reverses bind; called as a side effect of unregistering
        const char                              *iManufacturer;
        const struct usb_device_descriptor      *dev;
        struct usb_gadget_strings               **strings;
+       enum usb_device_speed                   max_speed;
        unsigned                needs_serial:1;
 
        int                     (*unbind)(struct usb_composite_dev *);