usb: udc: Introduce ->udc_set_speed() method
[oweals/u-boot.git] / drivers / usb / gadget / udc / udc-core.c
index 62b47781ddcc51a6f19638a17b26e1e7b326f098..8d1d90e3e39fa7f425ca414e9c8e8bf55205c57f 100644 (file)
@@ -267,6 +267,27 @@ EXPORT_SYMBOL_GPL(usb_del_gadget_udc);
 
 /* ------------------------------------------------------------------------- */
 
+/**
+ * usb_gadget_udc_set_speed - tells usb device controller speed supported by
+ *    current driver
+ * @udc: The device we want to set maximum speed
+ * @speed: The maximum speed to allowed to run
+ *
+ * This call is issued by the UDC Class driver before calling
+ * usb_gadget_udc_start() in order to make sure that we don't try to
+ * connect on speeds the gadget driver doesn't support.
+ */
+static inline void usb_gadget_udc_set_speed(struct usb_udc *udc,
+                                           enum usb_device_speed speed)
+{
+       if (udc->gadget->ops->udc_set_speed) {
+               enum usb_device_speed s;
+
+               s = min(speed, udc->gadget->max_speed);
+               udc->gadget->ops->udc_set_speed(udc->gadget, s);
+       }
+}
+
 static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *driver)
 {
        int ret;
@@ -276,6 +297,8 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri
 
        udc->driver = driver;
 
+       usb_gadget_udc_set_speed(udc, driver->speed);
+
        ret = driver->bind(udc->gadget);
        if (ret)
                goto err1;