@@ -2343,9 +2343,35 @@ static int cdns3_gadget_udc_start(struct usb_gadget *gadget,
2343
2343
{
2344
2344
struct cdns3_device * priv_dev = gadget_to_cdns3_device (gadget );
2345
2345
unsigned long flags ;
2346
+ enum usb_device_speed max_speed = driver -> max_speed ;
2346
2347
2347
2348
spin_lock_irqsave (& priv_dev -> lock , flags );
2348
2349
priv_dev -> gadget_driver = driver ;
2350
+
2351
+ /* limit speed if necessary */
2352
+ max_speed = min (driver -> max_speed , gadget -> max_speed );
2353
+
2354
+ switch (max_speed ) {
2355
+ case USB_SPEED_FULL :
2356
+ writel (USB_CONF_SFORCE_FS , & priv_dev -> regs -> usb_conf );
2357
+ writel (USB_CONF_USB3DIS , & priv_dev -> regs -> usb_conf );
2358
+ break ;
2359
+ case USB_SPEED_HIGH :
2360
+ writel (USB_CONF_USB3DIS , & priv_dev -> regs -> usb_conf );
2361
+ break ;
2362
+ case USB_SPEED_SUPER :
2363
+ break ;
2364
+ default :
2365
+ dev_err (priv_dev -> dev ,
2366
+ "invalid maximum_speed parameter %d\n" ,
2367
+ max_speed );
2368
+ /* fall through */
2369
+ case USB_SPEED_UNKNOWN :
2370
+ /* default to superspeed */
2371
+ max_speed = USB_SPEED_SUPER ;
2372
+ break ;
2373
+ }
2374
+
2349
2375
cdns3_gadget_config (priv_dev );
2350
2376
spin_unlock_irqrestore (& priv_dev -> lock , flags );
2351
2377
return 0 ;
@@ -2575,12 +2601,7 @@ static int cdns3_gadget_start(struct cdns3 *cdns)
2575
2601
/* Check the maximum_speed parameter */
2576
2602
switch (max_speed ) {
2577
2603
case USB_SPEED_FULL :
2578
- writel (USB_CONF_SFORCE_FS , & priv_dev -> regs -> usb_conf );
2579
- writel (USB_CONF_USB3DIS , & priv_dev -> regs -> usb_conf );
2580
- break ;
2581
2604
case USB_SPEED_HIGH :
2582
- writel (USB_CONF_USB3DIS , & priv_dev -> regs -> usb_conf );
2583
- break ;
2584
2605
case USB_SPEED_SUPER :
2585
2606
break ;
2586
2607
default :
0 commit comments