xref: /rk3399_rockchip-uboot/board/rockchip/evb_rk3528/evb_rk3528.c (revision 9863b7ebb87dd9cd7793d3e792ebe89d223619e7)
1c6f7c1a3SJoseph Chen /*
2c6f7c1a3SJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
3c6f7c1a3SJoseph Chen  *
4c6f7c1a3SJoseph Chen  * (C) Copyright 2020 Rockchip Electronics Co., Ltd
5c6f7c1a3SJoseph Chen  */
6c6f7c1a3SJoseph Chen 
7c6f7c1a3SJoseph Chen #include <common.h>
8c6f7c1a3SJoseph Chen #include <dwc3-uboot.h>
9c6f7c1a3SJoseph Chen #include <usb.h>
103c16a07dSwilliam.wu #include <linux/usb/phy-rockchip-naneng-combphy.h>
113c16a07dSwilliam.wu #include <asm/io.h>
123c16a07dSwilliam.wu #include <rockusb.h>
13c6f7c1a3SJoseph Chen 
14c6f7c1a3SJoseph Chen DECLARE_GLOBAL_DATA_PTR;
15c6f7c1a3SJoseph Chen 
16c6f7c1a3SJoseph Chen #ifdef CONFIG_USB_DWC3
173c16a07dSwilliam.wu #define CRU_BASE		0xff4a0000
183c16a07dSwilliam.wu #define CRU_SOFTRST_CON33	0x0a84
19*9863b7ebSFrank Wang #define U3PHY_BASE		0xffdc0000
203c16a07dSwilliam.wu 
21c6f7c1a3SJoseph Chen static struct dwc3_device dwc3_device_data = {
223c16a07dSwilliam.wu 	.maximum_speed = USB_SPEED_SUPER,
23c6f7c1a3SJoseph Chen 	.base = 0xfe500000,
24c6f7c1a3SJoseph Chen 	.dr_mode = USB_DR_MODE_PERIPHERAL,
25c6f7c1a3SJoseph Chen 	.index = 0,
26c6f7c1a3SJoseph Chen 	.dis_u2_susphy_quirk = 1,
273c16a07dSwilliam.wu 	.dis_u1u2_quirk = 1,
28c6f7c1a3SJoseph Chen 	.usb2_phyif_utmi_width = 16,
29c6f7c1a3SJoseph Chen };
30c6f7c1a3SJoseph Chen 
usb_gadget_handle_interrupts(int index)313c16a07dSwilliam.wu int usb_gadget_handle_interrupts(int index)
32c6f7c1a3SJoseph Chen {
33c6f7c1a3SJoseph Chen 	dwc3_uboot_handle_interrupt(0);
34c6f7c1a3SJoseph Chen 	return 0;
35c6f7c1a3SJoseph Chen }
36c6f7c1a3SJoseph Chen 
rkusb_usb3_capable(void)373c16a07dSwilliam.wu bool rkusb_usb3_capable(void)
383c16a07dSwilliam.wu {
393c16a07dSwilliam.wu 	return true;
403c16a07dSwilliam.wu }
413c16a07dSwilliam.wu 
usb_reset_otg_controller(void)423c16a07dSwilliam.wu static void usb_reset_otg_controller(void)
433c16a07dSwilliam.wu {
443c16a07dSwilliam.wu 	writel(0x00020002, CRU_BASE + CRU_SOFTRST_CON33);
453c16a07dSwilliam.wu 	mdelay(1);
463c16a07dSwilliam.wu 	writel(0x00020000, CRU_BASE + CRU_SOFTRST_CON33);
473c16a07dSwilliam.wu 	mdelay(1);
483c16a07dSwilliam.wu }
493c16a07dSwilliam.wu 
board_usb_init(int index,enum usb_init_type init)50c6f7c1a3SJoseph Chen int board_usb_init(int index, enum usb_init_type init)
51c6f7c1a3SJoseph Chen {
523c16a07dSwilliam.wu 	u32 ret = 0;
533c16a07dSwilliam.wu 
543c16a07dSwilliam.wu 	usb_reset_otg_controller();
553c16a07dSwilliam.wu 
563c16a07dSwilliam.wu #if defined(CONFIG_SUPPORT_USBPLUG)
573c16a07dSwilliam.wu 	dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
583c16a07dSwilliam.wu 
593c16a07dSwilliam.wu 	if (rkusb_switch_usb3_enabled()) {
603c16a07dSwilliam.wu 		dwc3_device_data.maximum_speed = USB_SPEED_SUPER;
61*9863b7ebSFrank Wang 		ret = rockchip_combphy_usb3_uboot_init(U3PHY_BASE);
623c16a07dSwilliam.wu 		if (ret) {
633c16a07dSwilliam.wu 			rkusb_force_to_usb2(true);
643c16a07dSwilliam.wu 			dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
653c16a07dSwilliam.wu 		}
663c16a07dSwilliam.wu 	}
673c16a07dSwilliam.wu #else
68*9863b7ebSFrank Wang 	ret = rockchip_combphy_usb3_uboot_init(U3PHY_BASE);
693c16a07dSwilliam.wu 	if (ret) {
703c16a07dSwilliam.wu 		rkusb_force_to_usb2(true);
713c16a07dSwilliam.wu 		dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
723c16a07dSwilliam.wu 	}
733c16a07dSwilliam.wu #endif
743c16a07dSwilliam.wu 
75c6f7c1a3SJoseph Chen 	return dwc3_uboot_init(&dwc3_device_data);
76c6f7c1a3SJoseph Chen }
773c16a07dSwilliam.wu 
783c16a07dSwilliam.wu #if defined(CONFIG_SUPPORT_USBPLUG)
board_usb_cleanup(int index,enum usb_init_type init)793c16a07dSwilliam.wu int board_usb_cleanup(int index, enum usb_init_type init)
803c16a07dSwilliam.wu {
813c16a07dSwilliam.wu 	dwc3_uboot_exit(index);
823c16a07dSwilliam.wu 	return 0;
833c16a07dSwilliam.wu }
843c16a07dSwilliam.wu #endif
853c16a07dSwilliam.wu 
86c6f7c1a3SJoseph Chen #endif
87