blob: 062051857a9aaa7aa9ae7e76149908e202ffab21 [file] [log] [blame]
Jean-Jacques Hiblot9dc0d5c2018-11-29 10:52:46 +01001// 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#include <common.h>
8#include <dm.h>
9#include <dm/device-internal.h>
10#include <linux/usb/gadget.h>
11
12#define MAX_UDC_DEVICES 4
13static struct udevice *dev_array[MAX_UDC_DEVICES];
14int usb_gadget_initialize(int index)
15{
16 int ret;
17 struct udevice *dev = NULL;
18
19 if (index < 0 || index >= ARRAY_SIZE(dev_array))
20 return -EINVAL;
21 if (dev_array[index])
22 return 0;
23 ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, index, &dev);
24 if (!dev || ret) {
25 pr_err("No USB device found\n");
26 return -ENODEV;
27 }
28 dev_array[index] = dev;
29 return 0;
30}
31
32int usb_gadget_release(int index)
33{
34#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
35 int ret;
36 if (index < 0 || index >= ARRAY_SIZE(dev_array))
37 return -EINVAL;
38
39 ret = device_remove(dev_array[index], DM_REMOVE_NORMAL);
40 if (!ret)
41 dev_array[index] = NULL;
42 return ret;
43#else
44 return -ENOTSUPP;
45#endif
46}
47
48int usb_gadget_handle_interrupts(int index)
49{
50 if (index < 0 || index >= ARRAY_SIZE(dev_array))
51 return -EINVAL;
52 return dm_usb_gadget_handle_interrupts(dev_array[index]);
53}
54
55UCLASS_DRIVER(usb_gadget_generic) = {
56 .id = UCLASS_USB_GADGET_GENERIC,
57 .name = "usb_gadget_generic",
58};