xref: /rk3399_rockchip-uboot/board/rockchip/evb_rk3588/evb_rk3588.c (revision 3e6af0e752c8f8d88b43672fb393f1a0a092a229)
1b5d2ca4dSJoseph Chen /*
2b5d2ca4dSJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
3b5d2ca4dSJoseph Chen  *
4b5d2ca4dSJoseph Chen  * (C) Copyright 2021 Rockchip Electronics Co., Ltd
5b5d2ca4dSJoseph Chen  */
6b5d2ca4dSJoseph Chen 
7b5d2ca4dSJoseph Chen #include <common.h>
8b5d2ca4dSJoseph Chen #include <dwc3-uboot.h>
9b5d2ca4dSJoseph Chen #include <usb.h>
106883e291Swilliam.wu #include <linux/usb/phy-rockchip-usbdp.h>
116883e291Swilliam.wu #include <asm/io.h>
126883e291Swilliam.wu #include <rockusb.h>
13b5d2ca4dSJoseph Chen 
14b5d2ca4dSJoseph Chen DECLARE_GLOBAL_DATA_PTR;
15b5d2ca4dSJoseph Chen 
16b5d2ca4dSJoseph Chen #ifdef CONFIG_USB_DWC3
176883e291Swilliam.wu #define CRU_BASE		0xfd7c0000
186883e291Swilliam.wu #define CRU_SOFTRST_CON42	0x0aa8
19*3e6af0e7SFrank Wang #define U3PHY_BASE		0xfed80000
206883e291Swilliam.wu 
21b5d2ca4dSJoseph Chen static struct dwc3_device dwc3_device_data = {
226883e291Swilliam.wu 	.maximum_speed = USB_SPEED_SUPER,
23b5d2ca4dSJoseph Chen 	.base = 0xfc000000,
24b5d2ca4dSJoseph Chen 	.dr_mode = USB_DR_MODE_PERIPHERAL,
25b5d2ca4dSJoseph Chen 	.index = 0,
26b5d2ca4dSJoseph Chen 	.dis_u2_susphy_quirk = 1,
276883e291Swilliam.wu 	.dis_u1u2_quirk = 1,
28b5d2ca4dSJoseph Chen 	.usb2_phyif_utmi_width = 16,
29b5d2ca4dSJoseph Chen };
30b5d2ca4dSJoseph Chen 
usb_gadget_handle_interrupts(int index)316883e291Swilliam.wu int usb_gadget_handle_interrupts(int index)
32b5d2ca4dSJoseph Chen {
33b5d2ca4dSJoseph Chen 	dwc3_uboot_handle_interrupt(0);
34b5d2ca4dSJoseph Chen 	return 0;
35b5d2ca4dSJoseph Chen }
36b5d2ca4dSJoseph Chen 
rkusb_usb3_capable(void)376883e291Swilliam.wu bool rkusb_usb3_capable(void)
386883e291Swilliam.wu {
396883e291Swilliam.wu 	return true;
406883e291Swilliam.wu }
416883e291Swilliam.wu 
usb_reset_otg_controller(void)426883e291Swilliam.wu static void usb_reset_otg_controller(void)
436883e291Swilliam.wu {
446883e291Swilliam.wu 	writel(0x00100010, CRU_BASE + CRU_SOFTRST_CON42);
456883e291Swilliam.wu 	mdelay(1);
466883e291Swilliam.wu 	writel(0x00100000, CRU_BASE + CRU_SOFTRST_CON42);
476883e291Swilliam.wu 	mdelay(1);
486883e291Swilliam.wu }
496883e291Swilliam.wu 
board_usb_init(int index,enum usb_init_type init)50b5d2ca4dSJoseph Chen int board_usb_init(int index, enum usb_init_type init)
51b5d2ca4dSJoseph Chen {
526883e291Swilliam.wu 	u32 ret = 0;
536883e291Swilliam.wu 
546883e291Swilliam.wu 	usb_reset_otg_controller();
556883e291Swilliam.wu 
566883e291Swilliam.wu #if defined(CONFIG_SUPPORT_USBPLUG)
576883e291Swilliam.wu 	dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
586883e291Swilliam.wu 
596883e291Swilliam.wu 	if (rkusb_switch_usb3_enabled()) {
606883e291Swilliam.wu 		dwc3_device_data.maximum_speed = USB_SPEED_SUPER;
61*3e6af0e7SFrank Wang 		ret = rockchip_u3phy_uboot_init(U3PHY_BASE);
626883e291Swilliam.wu 		if (ret) {
636883e291Swilliam.wu 			rkusb_force_to_usb2(true);
646883e291Swilliam.wu 			dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
656883e291Swilliam.wu 		}
666883e291Swilliam.wu 	}
676883e291Swilliam.wu #else
68*3e6af0e7SFrank Wang 	ret = rockchip_u3phy_uboot_init(U3PHY_BASE);
696883e291Swilliam.wu 	if (ret) {
706883e291Swilliam.wu 		rkusb_force_to_usb2(true);
716883e291Swilliam.wu 		dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
726883e291Swilliam.wu 	}
736883e291Swilliam.wu #endif
746883e291Swilliam.wu 
75b5d2ca4dSJoseph Chen 	return dwc3_uboot_init(&dwc3_device_data);
76b5d2ca4dSJoseph Chen }
776883e291Swilliam.wu 
786883e291Swilliam.wu #if defined(CONFIG_SUPPORT_USBPLUG)
board_usb_cleanup(int index,enum usb_init_type init)796883e291Swilliam.wu int board_usb_cleanup(int index, enum usb_init_type init)
806883e291Swilliam.wu {
816883e291Swilliam.wu 	dwc3_uboot_exit(index);
826883e291Swilliam.wu 	return 0;
836883e291Swilliam.wu }
846883e291Swilliam.wu #endif
856883e291Swilliam.wu 
86b5d2ca4dSJoseph Chen #endif
87