]> git.ipfire.org Git - thirdparty/u-boot.git/blob - drivers/usb/gadget/udc/udc-uclass.c
3e433129ace73fc565b80a17b5081666697d3438
[thirdparty/u-boot.git] / drivers / usb / gadget / udc / udc-uclass.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
4 * Written by Jean-Jacques Hiblot <jjhiblot@ti.com>
5 */
6
7 #define LOG_CATEGORY UCLASS_USB_GADGET_GENERIC
8
9 #include <common.h>
10 #include <dm.h>
11 #include <dm/device-internal.h>
12 #include <linux/printk.h>
13 #include <linux/usb/gadget.h>
14
15 #if CONFIG_IS_ENABLED(DM_USB_GADGET)
16 int udc_device_get_by_index(int index, struct udevice **udev)
17 {
18 struct udevice *dev = NULL;
19 int ret;
20
21 ret = uclass_get_device_by_seq(UCLASS_USB_GADGET_GENERIC, index, &dev);
22 if (!ret && dev) {
23 *udev = dev;
24 return 0;
25 }
26
27 ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, index, &dev);
28 if (!ret && dev) {
29 *udev = dev;
30 return 0;
31 }
32
33 pr_err("No USB device found\n");
34 return -ENODEV;
35 }
36
37 int udc_device_put(struct udevice *udev)
38 {
39 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
40 return device_remove(udev, DM_REMOVE_NORMAL);
41 #else
42 return -ENOSYS;
43 #endif
44 }
45 #else
46 /* Backwards hardware compatibility -- switch to DM_USB_GADGET */
47 static int legacy_index;
48 int udc_device_get_by_index(int index, struct udevice **udev)
49 {
50 legacy_index = index;
51 return board_usb_init(index, USB_INIT_DEVICE);
52 }
53
54 int udc_device_put(struct udevice *udev)
55 {
56 return board_usb_cleanup(legacy_index, USB_INIT_DEVICE);
57 }
58 #endif
59
60 #if CONFIG_IS_ENABLED(DM)
61 UCLASS_DRIVER(usb_gadget_generic) = {
62 .id = UCLASS_USB_GADGET_GENERIC,
63 .name = "usb",
64 .flags = DM_UC_FLAG_SEQ_ALIAS,
65 };
66 #endif