// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com * Written by Jean-Jacques Hiblot <jjhiblot@ti.com> */ #define LOG_CATEGORY UCLASS_USB_GADGET_GENERIC #include <common.h> #include <dm.h> #include <dm/device-internal.h> #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 ret; struct udevice *dev = NULL; 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; } } dev_array[index] = dev; return 0; } int usb_gadget_release(int index) { #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; #else return -ENOSYS; #endif } int usb_gadget_handle_interrupts(int index) { if (index < 0 || index >= ARRAY_SIZE(dev_array)) return -EINVAL; return dm_usb_gadget_handle_interrupts(dev_array[index]); } #endif UCLASS_DRIVER(usb_gadget_generic) = { .id = UCLASS_USB_GADGET_GENERIC, .name = "usb", .flags = DM_UC_FLAG_SEQ_ALIAS, };