
From: Li Jun jun.li@nxp.com
If one of functions is not super speed capable, we need force the udc to be high speed, this is an equivalent implementation of usb_gadget_udc_set_speed() in kernel but simple, which set the gadget max_speed to be high speed, so afterwards when start gadget duc can set the HW to be USB 2.0 mode.
Reviewed-by: Ye Li ye.li@nxp.com Reviewed-by: Peter Chen peter.chen@nxp.com Tested-by: faqiang.zhu faqiang.zhu@nxp.com Signed-off-by: Li Jun jun.li@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- drivers/usb/gadget/composite.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index abb42db6bd..5e7f488cfb 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -532,6 +532,19 @@ int usb_add_config(struct usb_composite_dev *cdev, } }
+ /* + * If one function of config is not super speed capable, + * force the gadget to be high speed so controller driver + * can init HW to be USB 2.0 + */ + if (gadget_is_superspeed(cdev->gadget)) { + list_for_each_entry(f, &config->functions, list) { + if (!f->ss_descriptors) + cdev->gadget->max_speed = + USB_SPEED_HIGH; + } + } + usb_ep_autoconfig_reset(cdev->gadget);
os_desc_config = config;