@@ -203,7 +203,42 @@ static void mtu3_intr_enable(struct mtu3 *mtu)
203203 mtu3_writel (mbase , U3D_DEV_LINK_INTR_ENABLE , SSUSB_DEV_SPEED_CHG_INTR );
204204}
205205
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+ }
207242
208243/* CSR registers will be reset to default value if port is disabled */
209244static void mtu3_csr_init (struct mtu3 * mtu )
@@ -225,8 +260,6 @@ static void mtu3_csr_init(struct mtu3 *mtu)
225260 mtu3_setbits (mbase , U3D_U3U2_SWITCH_CTRL , SOFTCON_CLR_AUTO_EN );
226261 }
227262
228- mtu3_set_speed (mtu );
229-
230263 /* delay about 0.1us from detecting reset to send chirp-K */
231264 mtu3_clrbits (mbase , U3D_LINK_RESET_INFO , WTCHRP_MSK );
232265 /* enable automatical HWRW from L1 */
@@ -280,13 +313,13 @@ void mtu3_ep_stall_set(struct mtu3_ep *mep, bool set)
280313
281314void mtu3_dev_on_off (struct mtu3 * mtu , int is_on )
282315{
283- if (mtu -> is_u3_ip && mtu -> max_speed >= USB_SPEED_SUPER )
316+ if (mtu -> is_u3_ip && mtu -> speed >= USB_SPEED_SUPER )
284317 mtu3_ss_func_set (mtu , is_on );
285318 else
286319 mtu3_hs_softconn_set (mtu , is_on );
287320
288321 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 ? "+" : "-" );
290323}
291324
292325void mtu3_start (struct mtu3 * mtu )
@@ -299,6 +332,7 @@ void mtu3_start(struct mtu3 *mtu)
299332 mtu3_clrbits (mtu -> ippc_base , U3D_SSUSB_IP_PW_CTRL2 , SSUSB_IP_DEV_PDN );
300333
301334 mtu3_csr_init (mtu );
335+ mtu3_set_speed (mtu , mtu -> speed );
302336
303337 /* Initialize the default interrupts */
304338 mtu3_intr_enable (mtu );
@@ -569,28 +603,6 @@ static void mtu3_mem_free(struct mtu3 *mtu)
569603 kfree (mtu -> ep_array );
570604}
571605
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-
594606static void mtu3_regs_init (struct mtu3 * mtu )
595607{
596608 void __iomem * mbase = mtu -> mac_base ;
@@ -780,6 +792,8 @@ static void mtu3_check_params(struct mtu3 *mtu)
780792 if (!mtu -> is_u3_ip && (mtu -> max_speed > USB_SPEED_HIGH ))
781793 mtu -> max_speed = USB_SPEED_HIGH ;
782794
795+ mtu -> speed = mtu -> max_speed ;
796+
783797 dev_info (mtu -> dev , "max_speed: %s\n" ,
784798 usb_speed_string (mtu -> max_speed ));
785799}
0 commit comments