mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-22 18:09:03 +09:00
![Jean-Jacques Hiblot](/assets/img/avatar_default.png)
commit 801f1fa442
"dm: usb: udc: Use SEQ_ALIAS to index the USB gadget
ports" changed the way the udevice if found. It uses the alias to find
a udevice for a given USB port number. In the commit log it was stated
that if no alias is provided, the bind order will be used instead. However
it doesn't work. Fixing this by adding a call to uclass_get_device() if
uclass_get_device_by_seq() fails.
Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Tested-by: Vignesh R <vigneshr@ti.com>
65 lines
1.4 KiB
C
65 lines
1.4 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
|
|
* Written by Jean-Jacques Hiblot <jjhiblot@ti.com>
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <dm.h>
|
|
#include <dm/device-internal.h>
|
|
#include <linux/usb/gadget.h>
|
|
|
|
#if CONFIG_IS_ENABLED(DM_USB_GADGET)
|
|
#define MAX_UDC_DEVICES 4
|
|
static struct udevice *dev_array[MAX_UDC_DEVICES];
|
|
int usb_gadget_initialize(int index)
|
|
{
|
|
int ret;
|
|
struct udevice *dev = NULL;
|
|
|
|
if (index < 0 || index >= ARRAY_SIZE(dev_array))
|
|
return -EINVAL;
|
|
if (dev_array[index])
|
|
return 0;
|
|
ret = uclass_get_device_by_seq(UCLASS_USB_GADGET_GENERIC, 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;
|
|
}
|
|
}
|
|
dev_array[index] = dev;
|
|
return 0;
|
|
}
|
|
|
|
int usb_gadget_release(int index)
|
|
{
|
|
#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
|
|
int ret;
|
|
if (index < 0 || index >= ARRAY_SIZE(dev_array))
|
|
return -EINVAL;
|
|
|
|
ret = device_remove(dev_array[index], DM_REMOVE_NORMAL);
|
|
if (!ret)
|
|
dev_array[index] = NULL;
|
|
return ret;
|
|
#else
|
|
return -ENOTSUPP;
|
|
#endif
|
|
}
|
|
|
|
int usb_gadget_handle_interrupts(int index)
|
|
{
|
|
if (index < 0 || index >= ARRAY_SIZE(dev_array))
|
|
return -EINVAL;
|
|
return dm_usb_gadget_handle_interrupts(dev_array[index]);
|
|
}
|
|
#endif
|
|
|
|
UCLASS_DRIVER(usb_gadget_generic) = {
|
|
.id = UCLASS_USB_GADGET_GENERIC,
|
|
.name = "usb",
|
|
.flags = DM_UC_FLAG_SEQ_ALIAS,
|
|
};
|