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