aboutsummaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/udc/udc-uclass.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/udc/udc-uclass.c')
-rw-r--r--drivers/usb/gadget/udc/udc-uclass.c57
1 files changed, 28 insertions, 29 deletions
diff --git a/drivers/usb/gadget/udc/udc-uclass.c b/drivers/usb/gadget/udc/udc-uclass.c
index de8861829c..9dfae08313 100644
--- a/drivers/usb/gadget/udc/udc-uclass.c
+++ b/drivers/usb/gadget/udc/udc-uclass.c
@@ -12,55 +12,54 @@
#include <linux/usb/gadget.h>
#if CONFIG_IS_ENABLED(DM_USB_GADGET)
-#define MAX_UDC_DEVICES 4
-static struct udevice *dev_array[MAX_UDC_DEVICES];
-int usb_gadget_initialize(int index)
+int udc_device_get_by_index(int index, struct udevice **udev)
{
- int ret;
struct udevice *dev = NULL;
+ int ret;
- if (index < 0 || index >= ARRAY_SIZE(dev_array))
- return -EINVAL;
- if (dev_array[index])
- return 0;
ret = uclass_get_device_by_seq(UCLASS_USB_GADGET_GENERIC, index, &dev);
- if (!dev || ret) {
- ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, index, &dev);
- if (!dev || ret) {
- pr_err("No USB device found\n");
- return -ENODEV;
- }
+ if (!ret && dev) {
+ *udev = dev;
+ return 0;
+ }
+
+ ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, index, &dev);
+ if (!ret && dev) {
+ *udev = dev;
+ return 0;
}
- dev_array[index] = dev;
- return 0;
+
+ pr_err("No USB device found\n");
+ return -ENODEV;
}
-int usb_gadget_release(int index)
+int udc_device_put(struct udevice *udev)
{
#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
- int ret;
- if (index < 0 || index >= ARRAY_SIZE(dev_array))
- return -EINVAL;
-
- ret = device_remove(dev_array[index], DM_REMOVE_NORMAL);
- if (!ret)
- dev_array[index] = NULL;
- return ret;
+ return device_remove(udev, DM_REMOVE_NORMAL);
#else
return -ENOSYS;
#endif
}
+#else
+/* Backwards hardware compatibility -- switch to DM_USB_GADGET */
+static int legacy_index;
+int udc_device_get_by_index(int index, struct udevice **udev)
+{
+ legacy_index = index;
+ return board_usb_init(index, USB_INIT_DEVICE);
+}
-int usb_gadget_handle_interrupts(int index)
+int udc_device_put(struct udevice *udev)
{
- if (index < 0 || index >= ARRAY_SIZE(dev_array))
- return -EINVAL;
- return dm_usb_gadget_handle_interrupts(dev_array[index]);
+ return board_usb_cleanup(legacy_index, USB_INIT_DEVICE);
}
#endif
+#if CONFIG_IS_ENABLED(DM)
UCLASS_DRIVER(usb_gadget_generic) = {
.id = UCLASS_USB_GADGET_GENERIC,
.name = "usb",
.flags = DM_UC_FLAG_SEQ_ALIAS,
};
+#endif