blob: 3c683cb8acb000c184ed5983b895a72820954da5 [file] [log] [blame]
Otavio Salvador303cbd22018-11-30 11:34:15 -02001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * (C) Copyright 2015 Google, Inc
4 */
5
6#include <common.h>
7
8DECLARE_GLOBAL_DATA_PTR;
9
10#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG)
11#include <usb.h>
12#include <usb/dwc2_udc.h>
13
Kever Yang6c9a9df2019-07-22 20:02:00 +080014static struct dwc2_plat_otg_data otg_data = {
Otavio Salvador303cbd22018-11-30 11:34:15 -020015 .rx_fifo_sz = 512,
16 .np_tx_fifo_sz = 16,
17 .tx_fifo_sz = 128,
18};
19
20int board_usb_init(int index, enum usb_init_type init)
21{
Kever Yang6c9a9df2019-07-22 20:02:00 +080022 int node;
Otavio Salvador303cbd22018-11-30 11:34:15 -020023 const char *mode;
Kever Yang6c9a9df2019-07-22 20:02:00 +080024 bool matched = false;
25 const void *blob = gd->fdt_blob;
Otavio Salvador303cbd22018-11-30 11:34:15 -020026
27 /* find the usb_otg node */
Kever Yang6c9a9df2019-07-22 20:02:00 +080028 node = fdt_node_offset_by_compatible(blob, -1, "snps,dwc2");
29
Otavio Salvador303cbd22018-11-30 11:34:15 -020030 while (node > 0) {
31 mode = fdt_getprop(blob, node, "dr_mode", NULL);
32 if (mode && strcmp(mode, "otg") == 0) {
33 matched = true;
34 break;
35 }
36
Kever Yang6c9a9df2019-07-22 20:02:00 +080037 node = fdt_node_offset_by_compatible(blob, node, "snps,dwc2");
Otavio Salvador303cbd22018-11-30 11:34:15 -020038 }
Otavio Salvador303cbd22018-11-30 11:34:15 -020039 if (!matched) {
Kever Yang6c9a9df2019-07-22 20:02:00 +080040 debug("Not found usb_otg device\n");
Otavio Salvador303cbd22018-11-30 11:34:15 -020041 return -ENODEV;
42 }
Kever Yang6c9a9df2019-07-22 20:02:00 +080043 otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
Otavio Salvador303cbd22018-11-30 11:34:15 -020044
Kever Yang6c9a9df2019-07-22 20:02:00 +080045 return dwc2_udc_probe(&otg_data);
Otavio Salvador303cbd22018-11-30 11:34:15 -020046}
47
48int board_usb_cleanup(int index, enum usb_init_type init)
49{
50 return 0;
51}
52#endif