diff options
Diffstat (limited to 'drivers/usb/gadget/udc/udc-uclass.c')
-rw-r--r-- | drivers/usb/gadget/udc/udc-uclass.c | 57 |
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 |