| // SPDX-License-Identifier: GPL-2.0+ |
| /* |
| * (C) Copyright 2015 Google, Inc |
| */ |
| |
| #include <common.h> |
| |
| DECLARE_GLOBAL_DATA_PTR; |
| |
| #if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG) |
| #include <usb.h> |
| #include <usb/dwc2_udc.h> |
| |
| static struct dwc2_plat_otg_data rv1108_otg_data = { |
| .rx_fifo_sz = 512, |
| .np_tx_fifo_sz = 16, |
| .tx_fifo_sz = 128, |
| }; |
| |
| int board_usb_init(int index, enum usb_init_type init) |
| { |
| const void *blob = gd->fdt_blob; |
| bool matched = false; |
| int node, phy_node; |
| u32 grf_phy_offset; |
| const char *mode; |
| |
| /* find the usb_otg node */ |
| node = fdt_node_offset_by_compatible(blob, -1, "rockchip,rk3066-usb"); |
| while (node > 0) { |
| mode = fdt_getprop(blob, node, "dr_mode", NULL); |
| if (mode && strcmp(mode, "otg") == 0) { |
| matched = true; |
| break; |
| } |
| |
| node = fdt_node_offset_by_compatible(blob, node, |
| "rockchip,rk3066-usb"); |
| } |
| |
| if (!matched) { |
| debug("usb_otg device not found\n"); |
| return -ENODEV; |
| } |
| |
| rv1108_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg"); |
| |
| node = fdtdec_lookup_phandle(blob, node, "phys"); |
| if (node <= 0) { |
| debug("phys node not found\n"); |
| return -ENODEV; |
| } |
| |
| phy_node = fdt_parent_offset(blob, node); |
| if (phy_node <= 0) { |
| debug("usb phy node not found\n"); |
| return -ENODEV; |
| } |
| |
| rv1108_otg_data.phy_of_node = phy_node; |
| grf_phy_offset = fdtdec_get_addr(blob, node, "reg"); |
| |
| /* find the grf node */ |
| node = fdt_node_offset_by_compatible(blob, -1, |
| "rockchip,rv1108-grf"); |
| if (node <= 0) { |
| debug("grf node not found\n"); |
| return -ENODEV; |
| } |
| |
| rv1108_otg_data.regs_phy = grf_phy_offset + fdtdec_get_addr(blob, node, |
| "reg"); |
| |
| return dwc2_udc_probe(&rv1108_otg_data); |
| } |
| |
| int board_usb_cleanup(int index, enum usb_init_type init) |
| { |
| return 0; |
| } |
| #endif |