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