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