summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/udc/udc-core.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2019-11-08 14:05:07 -0500
committerTom Rini <trini@konsulko.com>2019-11-08 14:05:07 -0500
commita4b7485e2f311b1319b1b9cd59f5666536e24a28 (patch)
tree45e234a7fa285e3eb2c6a31d52b1e27cd86f4e92 /drivers/usb/gadget/udc/udc-core.c
parentfb6dc1fd58fc3209f833ddcd155fe1b276e7a335 (diff)
parente0891bb679200a8cc73c3b3d98ba40c02c31b850 (diff)
Merge branch 'master' of git://git.denx.de/u-boot-usb
- Assorted fixes
Diffstat (limited to 'drivers/usb/gadget/udc/udc-core.c')
-rw-r--r--drivers/usb/gadget/udc/udc-core.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c
index 62b47781dd..8d1d90e3e3 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -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;