mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
dm: usb: udc: Factor out plain udevice handler functions
Pull the functionality of UDC uclass that operates on plain udevice and does not use this dev_array array into separate functions and expose those functions, so that as much code as possible can be switched over to these functions and the dev_array can be dropped. Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com> Signed-off-by: Marek Vasut <marex@denx.de>
This commit is contained in:
parent
2fe4b54556
commit
a1fa8bbb90
3 changed files with 68 additions and 8 deletions
|
@ -7,4 +7,4 @@ obj-$(CONFIG_USB_DWC3_GADGET) += udc-core.o
|
|||
endif
|
||||
|
||||
obj-$(CONFIG_$(SPL_)DM_USB_GADGET) += udc-core.o
|
||||
obj-$(CONFIG_$(SPL_)DM) += udc-uclass.o
|
||||
obj-y += udc-uclass.o
|
||||
|
|
|
@ -14,6 +14,37 @@
|
|||
#if CONFIG_IS_ENABLED(DM_USB_GADGET)
|
||||
#define MAX_UDC_DEVICES 4
|
||||
static struct udevice *dev_array[MAX_UDC_DEVICES];
|
||||
|
||||
int udc_device_get_by_index(int index, struct udevice **udev)
|
||||
{
|
||||
struct udevice *dev = NULL;
|
||||
int ret;
|
||||
|
||||
ret = uclass_get_device_by_seq(UCLASS_USB_GADGET_GENERIC, index, &dev);
|
||||
if (!ret && dev) {
|
||||
*udev = dev;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, index, &dev);
|
||||
if (!ret && dev) {
|
||||
*udev = dev;
|
||||
return 0;
|
||||
}
|
||||
|
||||
pr_err("No USB device found\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
int udc_device_put(struct udevice *udev)
|
||||
{
|
||||
#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
|
||||
return device_remove(udev, DM_REMOVE_NORMAL);
|
||||
#else
|
||||
return -ENOSYS;
|
||||
#endif
|
||||
}
|
||||
|
||||
int usb_gadget_initialize(int index)
|
||||
{
|
||||
int ret;
|
||||
|
@ -23,13 +54,10 @@ int usb_gadget_initialize(int index)
|
|||
return -EINVAL;
|
||||
if (dev_array[index])
|
||||
return 0;
|
||||
ret = uclass_get_device_by_seq(UCLASS_USB_GADGET_GENERIC, index, &dev);
|
||||
ret = udc_device_get_by_index(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;
|
||||
}
|
||||
pr_err("No USB device found\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
dev_array[index] = dev;
|
||||
return 0;
|
||||
|
@ -42,7 +70,7 @@ int usb_gadget_release(int index)
|
|||
if (index < 0 || index >= ARRAY_SIZE(dev_array))
|
||||
return -EINVAL;
|
||||
|
||||
ret = device_remove(dev_array[index], DM_REMOVE_NORMAL);
|
||||
ret = device_remove(dev_array[index]);
|
||||
if (!ret)
|
||||
dev_array[index] = NULL;
|
||||
return ret;
|
||||
|
@ -57,10 +85,25 @@ int usb_gadget_handle_interrupts(int index)
|
|||
return -EINVAL;
|
||||
return dm_usb_gadget_handle_interrupts(dev_array[index]);
|
||||
}
|
||||
#else
|
||||
/* Backwards hardware compatibility -- switch to DM_USB_GADGET */
|
||||
static int legacy_index;
|
||||
int udc_device_get_by_index(int index, struct udevice **udev)
|
||||
{
|
||||
legacy_index = index;
|
||||
return board_usb_init(index, USB_INIT_DEVICE);
|
||||
}
|
||||
|
||||
int udc_device_put(struct udevice *udev)
|
||||
{
|
||||
return board_usb_cleanup(legacy_index, USB_INIT_DEVICE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CONFIG_IS_ENABLED(DM)
|
||||
UCLASS_DRIVER(usb_gadget_generic) = {
|
||||
.id = UCLASS_USB_GADGET_GENERIC,
|
||||
.name = "usb",
|
||||
.flags = DM_UC_FLAG_SEQ_ALIAS,
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -970,6 +970,23 @@ extern void usb_ep_autoconfig_reset(struct usb_gadget *);
|
|||
|
||||
extern int usb_gadget_handle_interrupts(int index);
|
||||
|
||||
/**
|
||||
* udc_device_get_by_index() - Get UDC udevice by index
|
||||
* @index: UDC device index
|
||||
* @udev: UDC udevice matching the index (if found)
|
||||
*
|
||||
* Return: 0 if Ok, -ve on error
|
||||
*/
|
||||
int udc_device_get_by_index(int index, struct udevice **udev);
|
||||
|
||||
/**
|
||||
* udc_device_put() - Put UDC udevice
|
||||
* @udev: UDC udevice
|
||||
*
|
||||
* Return: 0 if Ok, -ve on error
|
||||
*/
|
||||
int udc_device_put(struct udevice *udev);
|
||||
|
||||
#if CONFIG_IS_ENABLED(DM_USB_GADGET)
|
||||
int usb_gadget_initialize(int index);
|
||||
int usb_gadget_release(int index);
|
||||
|
|
Loading…
Reference in a new issue