mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 22:51:37 +00:00
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
9 changed files with 68 additions and 46 deletions
|
@ -663,7 +663,7 @@ int g_dnl_board_usb_cable_connected(void)
|
||||||
struct phy phy;
|
struct phy phy;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = uclass_get_device(UCLASS_USB_DEV_GENERIC, 0, &dev);
|
ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, 0, &dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("%s: Cannot find USB device\n", __func__);
|
pr_err("%s: Cannot find USB device\n", __func__);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -72,7 +72,7 @@ static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev)
|
||||||
|
|
||||||
U_BOOT_DRIVER(dwc3_generic_peripheral) = {
|
U_BOOT_DRIVER(dwc3_generic_peripheral) = {
|
||||||
.name = "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,
|
.ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
|
||||||
.probe = dwc3_generic_peripheral_probe,
|
.probe = dwc3_generic_peripheral_probe,
|
||||||
.remove = dwc3_generic_peripheral_remove,
|
.remove = dwc3_generic_peripheral_remove,
|
||||||
|
|
|
@ -2671,7 +2671,7 @@ int usb_ether_init(void)
|
||||||
struct udevice *usb_dev;
|
struct udevice *usb_dev;
|
||||||
int ret;
|
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) {
|
if (!usb_dev || ret) {
|
||||||
pr_err("No USB device found\n");
|
pr_err("No USB device found\n");
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -2,4 +2,8 @@
|
||||||
#
|
#
|
||||||
# USB peripheral controller drivers
|
# USB peripheral controller drivers
|
||||||
|
|
||||||
|
ifndef CONFIG_$(SPL_)DM_USB_GADGET
|
||||||
obj-$(CONFIG_USB_DWC3_GADGET) += udc-core.o
|
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_DESCRIPTION("UDC Framework");
|
||||||
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
|
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
|
||||||
MODULE_LICENSE("GPL v2");
|
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
|
#ifdef CONFIG_USB_MUSB_HOST
|
||||||
.id = UCLASS_USB,
|
.id = UCLASS_USB,
|
||||||
#else
|
#else
|
||||||
.id = UCLASS_USB_DEV_GENERIC,
|
.id = UCLASS_USB_GADGET_GENERIC,
|
||||||
#endif
|
#endif
|
||||||
.of_match = omap2430_musb_ids,
|
.of_match = omap2430_musb_ids,
|
||||||
.ofdata_to_platdata = omap2430_musb_ofdata_to_platdata,
|
.ofdata_to_platdata = omap2430_musb_ofdata_to_platdata,
|
||||||
|
|
|
@ -535,7 +535,7 @@ U_BOOT_DRIVER(usb_musb) = {
|
||||||
#ifdef CONFIG_USB_MUSB_HOST
|
#ifdef CONFIG_USB_MUSB_HOST
|
||||||
.id = UCLASS_USB,
|
.id = UCLASS_USB,
|
||||||
#else
|
#else
|
||||||
.id = UCLASS_USB_DEV_GENERIC,
|
.id = UCLASS_USB_GADGET_GENERIC,
|
||||||
#endif
|
#endif
|
||||||
.of_match = sunxi_musb_ids,
|
.of_match = sunxi_musb_ids,
|
||||||
.probe = musb_usb_probe,
|
.probe = musb_usb_probe,
|
||||||
|
|
|
@ -93,6 +93,7 @@ enum uclass_id {
|
||||||
UCLASS_USB, /* USB bus */
|
UCLASS_USB, /* USB bus */
|
||||||
UCLASS_USB_DEV_GENERIC, /* USB generic device */
|
UCLASS_USB_DEV_GENERIC, /* USB generic device */
|
||||||
UCLASS_USB_HUB, /* USB hub */
|
UCLASS_USB_HUB, /* USB hub */
|
||||||
|
UCLASS_USB_GADGET_GENERIC, /* USB generic device */
|
||||||
UCLASS_VIDEO, /* Video or LCD device */
|
UCLASS_VIDEO, /* Video or LCD device */
|
||||||
UCLASS_VIDEO_BRIDGE, /* Video bridge, e.g. DisplayPort to LVDS */
|
UCLASS_VIDEO_BRIDGE, /* Video bridge, e.g. DisplayPort to LVDS */
|
||||||
UCLASS_VIDEO_CONSOLE, /* Text console driver for video device */
|
UCLASS_VIDEO_CONSOLE, /* Text console driver for video device */
|
||||||
|
|
Loading…
Add table
Reference in a new issue