120828bbaSJean-Jacques Hiblot // SPDX-License-Identifier: GPL-2.0+ 220828bbaSJean-Jacques Hiblot /* 320828bbaSJean-Jacques Hiblot * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com 420828bbaSJean-Jacques Hiblot * Written by Jean-Jacques Hiblot <jjhiblot@ti.com> 520828bbaSJean-Jacques Hiblot */ 620828bbaSJean-Jacques Hiblot 720828bbaSJean-Jacques Hiblot #include <common.h> 820828bbaSJean-Jacques Hiblot #include <dm.h> 920828bbaSJean-Jacques Hiblot #include <dm/device-internal.h> 1020828bbaSJean-Jacques Hiblot #include <linux/usb/gadget.h> 1120828bbaSJean-Jacques Hiblot 129e4d0540SJean-Jacques Hiblot #if CONFIG_IS_ENABLED(DM_USB_GADGET) 1320828bbaSJean-Jacques Hiblot #define MAX_UDC_DEVICES 4 1420828bbaSJean-Jacques Hiblot static struct udevice *dev_array[MAX_UDC_DEVICES]; usb_gadget_initialize(int index)1520828bbaSJean-Jacques Hiblotint usb_gadget_initialize(int index) 1620828bbaSJean-Jacques Hiblot { 1720828bbaSJean-Jacques Hiblot int ret; 1820828bbaSJean-Jacques Hiblot struct udevice *dev = NULL; 1920828bbaSJean-Jacques Hiblot 2020828bbaSJean-Jacques Hiblot if (index < 0 || index >= ARRAY_SIZE(dev_array)) 2120828bbaSJean-Jacques Hiblot return -EINVAL; 2220828bbaSJean-Jacques Hiblot if (dev_array[index]) 2320828bbaSJean-Jacques Hiblot return 0; 24152ba509SJean-Jacques Hiblot ret = uclass_get_device_by_seq(UCLASS_USB_GADGET_GENERIC, index, &dev); 2520828bbaSJean-Jacques Hiblot if (!dev || ret) { 26*95dc2be9SJean-Jacques Hiblot ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, index, &dev); 27*95dc2be9SJean-Jacques Hiblot if (!dev || ret) { 2820828bbaSJean-Jacques Hiblot pr_err("No USB device found\n"); 2920828bbaSJean-Jacques Hiblot return -ENODEV; 3020828bbaSJean-Jacques Hiblot } 31*95dc2be9SJean-Jacques Hiblot } 3220828bbaSJean-Jacques Hiblot dev_array[index] = dev; 3320828bbaSJean-Jacques Hiblot return 0; 3420828bbaSJean-Jacques Hiblot } 3520828bbaSJean-Jacques Hiblot usb_gadget_release(int index)3620828bbaSJean-Jacques Hiblotint usb_gadget_release(int index) 3720828bbaSJean-Jacques Hiblot { 3820828bbaSJean-Jacques Hiblot #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE) 3920828bbaSJean-Jacques Hiblot int ret; 4020828bbaSJean-Jacques Hiblot if (index < 0 || index >= ARRAY_SIZE(dev_array)) 4120828bbaSJean-Jacques Hiblot return -EINVAL; 4220828bbaSJean-Jacques Hiblot 4320828bbaSJean-Jacques Hiblot ret = device_remove(dev_array[index], DM_REMOVE_NORMAL); 4420828bbaSJean-Jacques Hiblot if (!ret) 4520828bbaSJean-Jacques Hiblot dev_array[index] = NULL; 4620828bbaSJean-Jacques Hiblot return ret; 4720828bbaSJean-Jacques Hiblot #else 4820828bbaSJean-Jacques Hiblot return -ENOTSUPP; 4920828bbaSJean-Jacques Hiblot #endif 5020828bbaSJean-Jacques Hiblot } 5120828bbaSJean-Jacques Hiblot usb_gadget_handle_interrupts(int index)5220828bbaSJean-Jacques Hiblotint usb_gadget_handle_interrupts(int index) 5320828bbaSJean-Jacques Hiblot { 5420828bbaSJean-Jacques Hiblot if (index < 0 || index >= ARRAY_SIZE(dev_array)) 5520828bbaSJean-Jacques Hiblot return -EINVAL; 5620828bbaSJean-Jacques Hiblot return dm_usb_gadget_handle_interrupts(dev_array[index]); 5720828bbaSJean-Jacques Hiblot } 589e4d0540SJean-Jacques Hiblot #endif 5920828bbaSJean-Jacques Hiblot 6020828bbaSJean-Jacques Hiblot UCLASS_DRIVER(usb_gadget_generic) = { 6120828bbaSJean-Jacques Hiblot .id = UCLASS_USB_GADGET_GENERIC, 62152ba509SJean-Jacques Hiblot .name = "usb", 63152ba509SJean-Jacques Hiblot .flags = DM_UC_FLAG_SEQ_ALIAS, 6420828bbaSJean-Jacques Hiblot }; 65