xref: /rk3399_rockchip-uboot/board/rockchip/evb_rk3568/evb_rk3568.c (revision 9863b7ebb87dd9cd7793d3e792ebe89d223619e7)
17e26af38SJoseph Chen /*
27e26af38SJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
37e26af38SJoseph Chen  *
47e26af38SJoseph Chen  * (C) Copyright 2020 Rockchip Electronics Co., Ltd
57e26af38SJoseph Chen  */
67e26af38SJoseph Chen 
77e26af38SJoseph Chen #include <common.h>
819111912SRen Jianing #include <dwc3-uboot.h>
919111912SRen Jianing #include <usb.h>
10e63a27f7SWilliam Wu #include <linux/usb/phy-rockchip-naneng-combphy.h>
11e63a27f7SWilliam Wu #include <asm/io.h>
12e63a27f7SWilliam Wu #include <asm/arch-rockchip/cpu.h>
13e63a27f7SWilliam Wu #include <rockusb.h>
147e26af38SJoseph Chen 
157e26af38SJoseph Chen DECLARE_GLOBAL_DATA_PTR;
167e26af38SJoseph Chen 
1719111912SRen Jianing #ifdef CONFIG_USB_DWC3
18e63a27f7SWilliam Wu #define CRU_BASE		0xfdd20000
19e63a27f7SWilliam Wu #define CRU_SOFTRST_CON09	0x0424
20*9863b7ebSFrank Wang #define U3PHY_BASE		0xfe820000
21e63a27f7SWilliam Wu 
2219111912SRen Jianing static struct dwc3_device dwc3_device_data = {
23e63a27f7SWilliam Wu 	.maximum_speed = USB_SPEED_SUPER,
2419111912SRen Jianing 	.base = 0xfcc00000,
2519111912SRen Jianing 	.dr_mode = USB_DR_MODE_PERIPHERAL,
2619111912SRen Jianing 	.index = 0,
2719111912SRen Jianing 	.dis_u2_susphy_quirk = 1,
28e63a27f7SWilliam Wu 	.dis_u1u2_quirk = 1,
2919111912SRen Jianing 	.usb2_phyif_utmi_width = 16,
3019111912SRen Jianing };
3119111912SRen Jianing 
usb_gadget_handle_interrupts(int index)32e63a27f7SWilliam Wu int usb_gadget_handle_interrupts(int index)
3319111912SRen Jianing {
3419111912SRen Jianing 	dwc3_uboot_handle_interrupt(0);
3519111912SRen Jianing 	return 0;
3619111912SRen Jianing }
3719111912SRen Jianing 
rkusb_usb3_capable(void)38e63a27f7SWilliam Wu bool rkusb_usb3_capable(void)
39e63a27f7SWilliam Wu {
40e63a27f7SWilliam Wu 	return true;
41e63a27f7SWilliam Wu }
42e63a27f7SWilliam Wu 
usb_reset_otg_controller(void)43e63a27f7SWilliam Wu static void usb_reset_otg_controller(void)
44e63a27f7SWilliam Wu {
45e63a27f7SWilliam Wu 	writel(0x00100010, CRU_BASE + CRU_SOFTRST_CON09);
46e63a27f7SWilliam Wu 	mdelay(1);
47e63a27f7SWilliam Wu 	writel(0x00100000, CRU_BASE + CRU_SOFTRST_CON09);
48e63a27f7SWilliam Wu 	mdelay(1);
49e63a27f7SWilliam Wu }
50e63a27f7SWilliam Wu 
board_usb_init(int index,enum usb_init_type init)5119111912SRen Jianing int board_usb_init(int index, enum usb_init_type init)
5219111912SRen Jianing {
53e63a27f7SWilliam Wu 	u32 ret = 0;
54e63a27f7SWilliam Wu 
55e63a27f7SWilliam Wu 	usb_reset_otg_controller();
56e63a27f7SWilliam Wu 
57e63a27f7SWilliam Wu #if defined(CONFIG_SUPPORT_USBPLUG)
58e63a27f7SWilliam Wu 	dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
59e63a27f7SWilliam Wu 
60e63a27f7SWilliam Wu 	if (rkusb_switch_usb3_enabled()) {
61e63a27f7SWilliam Wu 		dwc3_device_data.maximum_speed = USB_SPEED_SUPER;
62*9863b7ebSFrank Wang 		ret = rockchip_combphy_usb3_uboot_init(U3PHY_BASE);
63e63a27f7SWilliam Wu 		if (ret) {
64e63a27f7SWilliam Wu 			rkusb_force_to_usb2(true);
65e63a27f7SWilliam Wu 			dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
66e63a27f7SWilliam Wu 		}
67e63a27f7SWilliam Wu 	}
68e63a27f7SWilliam Wu #else
69e63a27f7SWilliam Wu 	if (soc_is_rk3566()) {
70e63a27f7SWilliam Wu 		rkusb_force_to_usb2(true);
71e63a27f7SWilliam Wu 		dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
72e63a27f7SWilliam Wu 	} else {
73*9863b7ebSFrank Wang 		ret = rockchip_combphy_usb3_uboot_init(U3PHY_BASE);
74e63a27f7SWilliam Wu 		if (ret) {
75e63a27f7SWilliam Wu 			rkusb_force_to_usb2(true);
76e63a27f7SWilliam Wu 			dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
77e63a27f7SWilliam Wu 		}
78e63a27f7SWilliam Wu 	}
79e63a27f7SWilliam Wu #endif
8019111912SRen Jianing 	return dwc3_uboot_init(&dwc3_device_data);
8119111912SRen Jianing }
82e63a27f7SWilliam Wu 
83e63a27f7SWilliam Wu #if defined(CONFIG_SUPPORT_USBPLUG)
board_usb_cleanup(int index,enum usb_init_type init)84e63a27f7SWilliam Wu int board_usb_cleanup(int index, enum usb_init_type init)
85e63a27f7SWilliam Wu {
86e63a27f7SWilliam Wu 	dwc3_uboot_exit(index);
87e63a27f7SWilliam Wu 	return 0;
88e63a27f7SWilliam Wu }
89e63a27f7SWilliam Wu #endif
90e63a27f7SWilliam Wu 
9119111912SRen Jianing #endif
92