dm: usb: create a new UCLASS ID for USB gadget devices
UCLASS_USB_DEV_GENERIC was meant for USB devices connected to host controllers, not gadget devices. Adding a new UCLASS for gadget devices alone. Also move the generic DM code for USB gadgets in a separate file for clarity. Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
This commit is contained in:
parent
d648a50c0a
commit
0131162439
@ -663,7 +663,7 @@ int g_dnl_board_usb_cable_connected(void)
|
||||
struct phy phy;
|
||||
int ret;
|
||||
|
||||
ret = uclass_get_device(UCLASS_USB_DEV_GENERIC, 0, &dev);
|
||||
ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, 0, &dev);
|
||||
if (ret) {
|
||||
pr_err("%s: Cannot find USB device\n", __func__);
|
||||
return ret;
|
||||
|
@ -72,7 +72,7 @@ static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev)
|
||||
|
||||
U_BOOT_DRIVER(dwc3_generic_peripheral) = {
|
||||
.name = "dwc3-generic-peripheral",
|
||||
.id = UCLASS_USB_DEV_GENERIC,
|
||||
.id = UCLASS_USB_GADGET_GENERIC,
|
||||
.ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
|
||||
.probe = dwc3_generic_peripheral_probe,
|
||||
.remove = dwc3_generic_peripheral_remove,
|
||||
|
@ -2671,7 +2671,7 @@ int usb_ether_init(void)
|
||||
struct udevice *usb_dev;
|
||||
int ret;
|
||||
|
||||
ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &usb_dev);
|
||||
ret = uclass_first_device(UCLASS_USB_GADGET_GENERIC, &usb_dev);
|
||||
if (!usb_dev || ret) {
|
||||
pr_err("No USB device found\n");
|
||||
return ret;
|
||||
|
@ -2,4 +2,8 @@
|
||||
#
|
||||
# USB peripheral controller drivers
|
||||
|
||||
ifndef CONFIG_$(SPL_)DM_USB_GADGET
|
||||
obj-$(CONFIG_USB_DWC3_GADGET) += udc-core.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_$(SPL_)DM_USB_GADGET) += udc-uclass.o udc-core.o
|
||||
|
@ -352,44 +352,3 @@ EXPORT_SYMBOL_GPL(usb_gadget_unregister_driver);
|
||||
MODULE_DESCRIPTION("UDC Framework");
|
||||
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
#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(UCLASS_USB_DEV_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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
|
58
drivers/usb/gadget/udc/udc-uclass.c
Normal file
58
drivers/usb/gadget/udc/udc-uclass.c
Normal file
@ -0,0 +1,58 @@
|
||||
// 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>
|
||||
|
||||
#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(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]);
|
||||
}
|
||||
|
||||
UCLASS_DRIVER(usb_gadget_generic) = {
|
||||
.id = UCLASS_USB_GADGET_GENERIC,
|
||||
.name = "usb_gadget_generic",
|
||||
};
|
@ -263,7 +263,7 @@ U_BOOT_DRIVER(omap2430_musb) = {
|
||||
#ifdef CONFIG_USB_MUSB_HOST
|
||||
.id = UCLASS_USB,
|
||||
#else
|
||||
.id = UCLASS_USB_DEV_GENERIC,
|
||||
.id = UCLASS_USB_GADGET_GENERIC,
|
||||
#endif
|
||||
.of_match = omap2430_musb_ids,
|
||||
.ofdata_to_platdata = omap2430_musb_ofdata_to_platdata,
|
||||
|
@ -535,7 +535,7 @@ U_BOOT_DRIVER(usb_musb) = {
|
||||
#ifdef CONFIG_USB_MUSB_HOST
|
||||
.id = UCLASS_USB,
|
||||
#else
|
||||
.id = UCLASS_USB_DEV_GENERIC,
|
||||
.id = UCLASS_USB_GADGET_GENERIC,
|
||||
#endif
|
||||
.of_match = sunxi_musb_ids,
|
||||
.probe = musb_usb_probe,
|
||||
|
@ -93,6 +93,7 @@ enum uclass_id {
|
||||
UCLASS_USB, /* USB bus */
|
||||
UCLASS_USB_DEV_GENERIC, /* USB generic device */
|
||||
UCLASS_USB_HUB, /* USB hub */
|
||||
UCLASS_USB_GADGET_GENERIC, /* USB generic device */
|
||||
UCLASS_VIDEO, /* Video or LCD device */
|
||||
UCLASS_VIDEO_BRIDGE, /* Video bridge, e.g. DisplayPort to LVDS */
|
||||
UCLASS_VIDEO_CONSOLE, /* Text console driver for video device */
|
||||
|
Loading…
Reference in New Issue
Block a user