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 14static struct udevice *dev_array[MAX_UDC_DEVICES]; 15int 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 ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, index, &dev); 27 if (!dev || ret) { 28 pr_err("No USB device found\n"); 29 return -ENODEV; 30 } 31 } 32 dev_array[index] = dev; 33 return 0; 34} 35 36int usb_gadget_release(int index) 37{ 38#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE) 39 int ret; 40 if (index < 0 || index >= ARRAY_SIZE(dev_array)) 41 return -EINVAL; 42 43 ret = device_remove(dev_array[index], DM_REMOVE_NORMAL); 44 if (!ret) 45 dev_array[index] = NULL; 46 return ret; 47#else 48 return -ENOTSUPP; 49#endif 50} 51 52int usb_gadget_handle_interrupts(int index) 53{ 54 if (index < 0 || index >= ARRAY_SIZE(dev_array)) 55 return -EINVAL; 56 return dm_usb_gadget_handle_interrupts(dev_array[index]); 57} 58#endif 59 60UCLASS_DRIVER(usb_gadget_generic) = { 61 .id = UCLASS_USB_GADGET_GENERIC, 62 .name = "usb", 63 .flags = DM_UC_FLAG_SEQ_ALIAS, 64}; 65