xref: /rk3399_rockchip-uboot/board/rockchip/evb_rk3576/evb_rk3576.c (revision 3e6af0e752c8f8d88b43672fb393f1a0a092a229)
1bf72c9c9SXuhui Lin /*
2bf72c9c9SXuhui Lin  * SPDX-License-Identifier:     GPL-2.0+
3bf72c9c9SXuhui Lin  *
4bf72c9c9SXuhui Lin  * (C) Copyright 2023 Rockchip Electronics Co., Ltd
5bf72c9c9SXuhui Lin  */
6bf72c9c9SXuhui Lin 
7bf72c9c9SXuhui Lin #include <common.h>
8bf72c9c9SXuhui Lin #include <dwc3-uboot.h>
9bf72c9c9SXuhui Lin #include <usb.h>
102d578b2cSWilliam Wu #include <linux/usb/phy-rockchip-usbdp.h>
112d578b2cSWilliam Wu #include <asm/io.h>
122d578b2cSWilliam Wu #include <rockusb.h>
13bf72c9c9SXuhui Lin 
14bf72c9c9SXuhui Lin DECLARE_GLOBAL_DATA_PTR;
15bf72c9c9SXuhui Lin 
16bf72c9c9SXuhui Lin #ifdef CONFIG_USB_DWC3
172d578b2cSWilliam Wu #define CRU_BASE		0x27200000
182d578b2cSWilliam Wu #define CRU_SOFTRST_CON47	0x0abc
19*3e6af0e7SFrank Wang #define U3PHY_BASE		0x2b010000
202d578b2cSWilliam Wu 
21bf72c9c9SXuhui Lin static struct dwc3_device dwc3_device_data = {
222d578b2cSWilliam Wu 	.maximum_speed = USB_SPEED_SUPER,
23bf72c9c9SXuhui Lin 	.base = 0x23000000,
24bf72c9c9SXuhui Lin 	.dr_mode = USB_DR_MODE_PERIPHERAL,
25bf72c9c9SXuhui Lin 	.index = 0,
26bf72c9c9SXuhui Lin 	.dis_u2_susphy_quirk = 1,
272d578b2cSWilliam Wu 	.dis_u1u2_quirk = 1,
28bf72c9c9SXuhui Lin 	.usb2_phyif_utmi_width = 16,
29bf72c9c9SXuhui Lin };
30bf72c9c9SXuhui Lin 
usb_gadget_handle_interrupts(int index)312d578b2cSWilliam Wu int usb_gadget_handle_interrupts(int index)
32bf72c9c9SXuhui Lin {
33bf72c9c9SXuhui Lin 	dwc3_uboot_handle_interrupt(0);
34bf72c9c9SXuhui Lin 	return 0;
35bf72c9c9SXuhui Lin }
36bf72c9c9SXuhui Lin 
rkusb_usb3_capable(void)372d578b2cSWilliam Wu bool rkusb_usb3_capable(void)
382d578b2cSWilliam Wu {
392d578b2cSWilliam Wu 	return true;
402d578b2cSWilliam Wu }
412d578b2cSWilliam Wu 
usb_reset_otg_controller(void)422d578b2cSWilliam Wu static void usb_reset_otg_controller(void)
432d578b2cSWilliam Wu {
442d578b2cSWilliam Wu 	writel(0x00200020, CRU_BASE + CRU_SOFTRST_CON47);
452d578b2cSWilliam Wu 	mdelay(1);
462d578b2cSWilliam Wu 	writel(0x00200000, CRU_BASE + CRU_SOFTRST_CON47);
472d578b2cSWilliam Wu 	mdelay(1);
482d578b2cSWilliam Wu }
492d578b2cSWilliam Wu 
board_usb_init(int index,enum usb_init_type init)50bf72c9c9SXuhui Lin int board_usb_init(int index, enum usb_init_type init)
51bf72c9c9SXuhui Lin {
522d578b2cSWilliam Wu 	u32 ret = 0;
532d578b2cSWilliam Wu 
542d578b2cSWilliam Wu 	usb_reset_otg_controller();
552d578b2cSWilliam Wu 
562d578b2cSWilliam Wu #if defined(CONFIG_SUPPORT_USBPLUG)
572d578b2cSWilliam Wu 	dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
582d578b2cSWilliam Wu 
592d578b2cSWilliam Wu 	if (rkusb_switch_usb3_enabled()) {
602d578b2cSWilliam Wu 		dwc3_device_data.maximum_speed = USB_SPEED_SUPER;
61*3e6af0e7SFrank Wang 		ret = rockchip_u3phy_uboot_init(U3PHY_BASE);
622d578b2cSWilliam Wu 		if (ret) {
632d578b2cSWilliam Wu 			rkusb_force_to_usb2(true);
642d578b2cSWilliam Wu 			dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
652d578b2cSWilliam Wu 		}
662d578b2cSWilliam Wu 	}
672d578b2cSWilliam Wu #else
68*3e6af0e7SFrank Wang 	ret = rockchip_u3phy_uboot_init(U3PHY_BASE);
692d578b2cSWilliam Wu 	if (ret) {
702d578b2cSWilliam Wu 		rkusb_force_to_usb2(true);
712d578b2cSWilliam Wu 		dwc3_device_data.maximum_speed = USB_SPEED_HIGH;
722d578b2cSWilliam Wu 	}
732d578b2cSWilliam Wu #endif
742d578b2cSWilliam Wu 
75bf72c9c9SXuhui Lin 	return dwc3_uboot_init(&dwc3_device_data);
76bf72c9c9SXuhui Lin }
772d578b2cSWilliam Wu 
782d578b2cSWilliam Wu #if defined(CONFIG_SUPPORT_USBPLUG)
board_usb_cleanup(int index,enum usb_init_type init)792d578b2cSWilliam Wu int board_usb_cleanup(int index, enum usb_init_type init)
802d578b2cSWilliam Wu {
812d578b2cSWilliam Wu 	dwc3_uboot_exit(index);
822d578b2cSWilliam Wu 	return 0;
832d578b2cSWilliam Wu }
842d578b2cSWilliam Wu #endif
852d578b2cSWilliam Wu 
86bf72c9c9SXuhui Lin #endif
87