dm: usb: create a new UCLASS ID for USB gadget devices
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Thu, 29 Nov 2018 09:52:46 +0000 (10:52 +0100)
committerMarek Vasut <marex@denx.de>
Fri, 7 Dec 2018 15:31:45 +0000 (16:31 +0100)
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>
board/sunxi/board.c
drivers/usb/dwc3/dwc3-generic.c
drivers/usb/gadget/ether.c
drivers/usb/gadget/udc/Makefile
drivers/usb/gadget/udc/udc-core.c
drivers/usb/gadget/udc/udc-uclass.c [new file with mode: 0644]
drivers/usb/musb-new/omap2430.c
drivers/usb/musb-new/sunxi.c
include/dm/uclass-id.h

index 64ccbc7245f5746079d1b1c458d720c1d10e132f..9b36cc76de5d5080d1ec25e3264ed4fd35f2bfbd 100644 (file)
@@ -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;
index 681b5c73da42bb00aabd8e40d80454a724c2a1e1..7375660fa83e00b98090b144ddf879c9b35f7e78 100644 (file)
@@ -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,
index 5a9ffd71204a9de94d24f914a6227851b3bc90c1..3b3d9af681034d73a869e30b1dad278ffa61c4c5 100644 (file)
@@ -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;
index 449339f2c44343a8a4e7070a7918d3125ff8472b..38ac2dd475e544ca66659a30b2a1e16552086a03 100644 (file)
@@ -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
index 34bea27ad8de63dacc9da737ae26cdb899b0cfd4..62b47781ddcc51a6f19638a17b26e1e7b326f098 100644 (file)
@@ -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
diff --git a/drivers/usb/gadget/udc/udc-uclass.c b/drivers/usb/gadget/udc/udc-uclass.c
new file mode 100644 (file)
index 0000000..0620518
--- /dev/null
@@ -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",
+};
index 58aed72b7d36931528fca86893f3f6e464de030b..32743aa72c55f28e1022bc1b4151b6c42acd8d04 100644 (file)
@@ -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,
index 6cf9826cda182f0a9a83c1a6f22f9df2729b230f..d7170a3078c4c4007c9058af0df60029f100f5f7 100644 (file)
@@ -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,
index 62d9e2f404aad3cb0fc49649f8a40b04a61949b4..314fff4a81f03d6df078bc1c541876dfe85454b0 100644 (file)
@@ -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 */