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