|
@@ -1055,6 +1055,23 @@ static inline void usb_gadget_udc_stop(struct usb_udc *udc)
|
|
|
udc->gadget->ops->udc_stop(udc->gadget);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 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)
|
|
|
+ udc->gadget->ops->udc_set_speed(udc->gadget, speed);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* usb_udc_release - release the usb_udc struct
|
|
|
* @dev: the dev member within usb_udc
|
|
@@ -1288,6 +1305,9 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri
|
|
|
udc->dev.driver = &driver->driver;
|
|
|
udc->gadget->dev.driver = &driver->driver;
|
|
|
|
|
|
+ if (driver->max_speed < udc->gadget->max_speed)
|
|
|
+ usb_gadget_udc_set_speed(udc, driver->max_speed);
|
|
|
+
|
|
|
ret = driver->bind(udc->gadget, driver);
|
|
|
if (ret)
|
|
|
goto err1;
|