xref: /rk3399_rockchip-uboot/drivers/usb/gadget/udc/udc-uclass.c (revision 1a4f6af8bfd44c8ae6e87a81ff125eed47042cc5)
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 Hiblot int 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 Hiblot int 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 Hiblot int 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