@@ -203,7 +203,42 @@ static void mtu3_intr_enable(struct mtu3 *mtu)
203
203
mtu3_writel (mbase , U3D_DEV_LINK_INTR_ENABLE , SSUSB_DEV_SPEED_CHG_INTR );
204
204
}
205
205
206
- static void mtu3_set_speed (struct mtu3 * mtu );
206
+ void mtu3_set_speed (struct mtu3 * mtu , enum usb_device_speed speed )
207
+ {
208
+ void __iomem * mbase = mtu -> mac_base ;
209
+
210
+ if (speed > mtu -> max_speed )
211
+ speed = mtu -> max_speed ;
212
+
213
+ switch (speed ) {
214
+ case USB_SPEED_FULL :
215
+ /* disable U3 SS function */
216
+ mtu3_clrbits (mbase , U3D_USB3_CONFIG , USB3_EN );
217
+ /* disable HS function */
218
+ mtu3_clrbits (mbase , U3D_POWER_MANAGEMENT , HS_ENABLE );
219
+ break ;
220
+ case USB_SPEED_HIGH :
221
+ mtu3_clrbits (mbase , U3D_USB3_CONFIG , USB3_EN );
222
+ /* HS/FS detected by HW */
223
+ mtu3_setbits (mbase , U3D_POWER_MANAGEMENT , HS_ENABLE );
224
+ break ;
225
+ case USB_SPEED_SUPER :
226
+ mtu3_clrbits (mtu -> ippc_base , SSUSB_U3_CTRL (0 ),
227
+ SSUSB_U3_PORT_SSP_SPEED );
228
+ break ;
229
+ case USB_SPEED_SUPER_PLUS :
230
+ mtu3_setbits (mtu -> ippc_base , SSUSB_U3_CTRL (0 ),
231
+ SSUSB_U3_PORT_SSP_SPEED );
232
+ break ;
233
+ default :
234
+ dev_err (mtu -> dev , "invalid speed: %s\n" ,
235
+ usb_speed_string (speed ));
236
+ return ;
237
+ }
238
+
239
+ mtu -> speed = speed ;
240
+ dev_dbg (mtu -> dev , "set speed: %s\n" , usb_speed_string (speed ));
241
+ }
207
242
208
243
/* CSR registers will be reset to default value if port is disabled */
209
244
static void mtu3_csr_init (struct mtu3 * mtu )
@@ -225,8 +260,6 @@ static void mtu3_csr_init(struct mtu3 *mtu)
225
260
mtu3_setbits (mbase , U3D_U3U2_SWITCH_CTRL , SOFTCON_CLR_AUTO_EN );
226
261
}
227
262
228
- mtu3_set_speed (mtu );
229
-
230
263
/* delay about 0.1us from detecting reset to send chirp-K */
231
264
mtu3_clrbits (mbase , U3D_LINK_RESET_INFO , WTCHRP_MSK );
232
265
/* enable automatical HWRW from L1 */
@@ -280,13 +313,13 @@ void mtu3_ep_stall_set(struct mtu3_ep *mep, bool set)
280
313
281
314
void mtu3_dev_on_off (struct mtu3 * mtu , int is_on )
282
315
{
283
- if (mtu -> is_u3_ip && mtu -> max_speed >= USB_SPEED_SUPER )
316
+ if (mtu -> is_u3_ip && mtu -> speed >= USB_SPEED_SUPER )
284
317
mtu3_ss_func_set (mtu , is_on );
285
318
else
286
319
mtu3_hs_softconn_set (mtu , is_on );
287
320
288
321
dev_info (mtu -> dev , "gadget (%s) pullup D%s\n" ,
289
- usb_speed_string (mtu -> max_speed ), is_on ? "+" : "-" );
322
+ usb_speed_string (mtu -> speed ), is_on ? "+" : "-" );
290
323
}
291
324
292
325
void mtu3_start (struct mtu3 * mtu )
@@ -299,6 +332,7 @@ void mtu3_start(struct mtu3 *mtu)
299
332
mtu3_clrbits (mtu -> ippc_base , U3D_SSUSB_IP_PW_CTRL2 , SSUSB_IP_DEV_PDN );
300
333
301
334
mtu3_csr_init (mtu );
335
+ mtu3_set_speed (mtu , mtu -> speed );
302
336
303
337
/* Initialize the default interrupts */
304
338
mtu3_intr_enable (mtu );
@@ -569,28 +603,6 @@ static void mtu3_mem_free(struct mtu3 *mtu)
569
603
kfree (mtu -> ep_array );
570
604
}
571
605
572
- static void mtu3_set_speed (struct mtu3 * mtu )
573
- {
574
- void __iomem * mbase = mtu -> mac_base ;
575
-
576
- if (mtu -> max_speed == USB_SPEED_FULL ) {
577
- /* disable U3 SS function */
578
- mtu3_clrbits (mbase , U3D_USB3_CONFIG , USB3_EN );
579
- /* disable HS function */
580
- mtu3_clrbits (mbase , U3D_POWER_MANAGEMENT , HS_ENABLE );
581
- } else if (mtu -> max_speed == USB_SPEED_HIGH ) {
582
- mtu3_clrbits (mbase , U3D_USB3_CONFIG , USB3_EN );
583
- /* HS/FS detected by HW */
584
- mtu3_setbits (mbase , U3D_POWER_MANAGEMENT , HS_ENABLE );
585
- } else if (mtu -> max_speed == USB_SPEED_SUPER ) {
586
- mtu3_clrbits (mtu -> ippc_base , SSUSB_U3_CTRL (0 ),
587
- SSUSB_U3_PORT_SSP_SPEED );
588
- }
589
-
590
- dev_info (mtu -> dev , "max_speed: %s\n" ,
591
- usb_speed_string (mtu -> max_speed ));
592
- }
593
-
594
606
static void mtu3_regs_init (struct mtu3 * mtu )
595
607
{
596
608
void __iomem * mbase = mtu -> mac_base ;
@@ -780,6 +792,8 @@ static void mtu3_check_params(struct mtu3 *mtu)
780
792
if (!mtu -> is_u3_ip && (mtu -> max_speed > USB_SPEED_HIGH ))
781
793
mtu -> max_speed = USB_SPEED_HIGH ;
782
794
795
+ mtu -> speed = mtu -> max_speed ;
796
+
783
797
dev_info (mtu -> dev , "max_speed: %s\n" ,
784
798
usb_speed_string (mtu -> max_speed ));
785
799
}
0 commit comments