diff mbox series

[U-Boot,v4,06/10] dm: usb: create a new UCLASS ID for USB gadget devices

Message ID 1543485170-15478-7-git-send-email-jjhiblot@ti.com
State Accepted
Commit 0131162439508801b9f8a330fa731f04273c9337
Delegated to: Lukasz Majewski
Headers show
Series Improvements for the dwc3_generic driver | expand

Commit Message

Jean-Jacques Hiblot Nov. 29, 2018, 9:52 a.m. UTC
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>

---

Changes in v4: None
Changes in v3: None
Changes in v2: None

 board/sunxi/board.c                 |  2 +-
 drivers/usb/dwc3/dwc3-generic.c     |  2 +-
 drivers/usb/gadget/ether.c          |  2 +-
 drivers/usb/gadget/udc/Makefile     |  4 +++
 drivers/usb/gadget/udc/udc-core.c   | 41 --------------------------
 drivers/usb/gadget/udc/udc-uclass.c | 58 +++++++++++++++++++++++++++++++++++++
 drivers/usb/musb-new/omap2430.c     |  2 +-
 drivers/usb/musb-new/sunxi.c        |  2 +-
 include/dm/uclass-id.h              |  1 +
 9 files changed, 68 insertions(+), 46 deletions(-)
 create mode 100644 drivers/usb/gadget/udc/udc-uclass.c

Comments

Simon Glass Dec. 11, 2018, 1:03 a.m. UTC | #1
Hi Jean-Jacques,

On Thu, 29 Nov 2018 at 02:54, Jean-Jacques Hiblot <jjhiblot@ti.com> wrote:
>
> 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>
>
> ---
>
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
>
>  board/sunxi/board.c                 |  2 +-
>  drivers/usb/dwc3/dwc3-generic.c     |  2 +-
>  drivers/usb/gadget/ether.c          |  2 +-
>  drivers/usb/gadget/udc/Makefile     |  4 +++
>  drivers/usb/gadget/udc/udc-core.c   | 41 --------------------------
>  drivers/usb/gadget/udc/udc-uclass.c | 58 +++++++++++++++++++++++++++++++++++++
>  drivers/usb/musb-new/omap2430.c     |  2 +-
>  drivers/usb/musb-new/sunxi.c        |  2 +-
>  include/dm/uclass-id.h              |  1 +
>  9 files changed, 68 insertions(+), 46 deletions(-)
>  create mode 100644 drivers/usb/gadget/udc/udc-uclass.c

We should have a test for this, with a sandbox driver for this uclass,
as we have done for UCLASS_USB.

Regards,
Simon
Jagan Teki Dec. 18, 2018, 12:08 p.m. UTC | #2
On Thu, Nov 29, 2018 at 3:30 PM Jean-Jacques Hiblot <jjhiblot@ti.com> wrote:
>
> 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>
>
> ---
>
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
>
>  board/sunxi/board.c                 |  2 +-
>  drivers/usb/dwc3/dwc3-generic.c     |  2 +-
>  drivers/usb/gadget/ether.c          |  2 +-
>  drivers/usb/gadget/udc/Makefile     |  4 +++
>  drivers/usb/gadget/udc/udc-core.c   | 41 --------------------------
>  drivers/usb/gadget/udc/udc-uclass.c | 58 +++++++++++++++++++++++++++++++++++++
>  drivers/usb/musb-new/omap2430.c     |  2 +-
>  drivers/usb/musb-new/sunxi.c        |  2 +-
>  include/dm/uclass-id.h              |  1 +
>  9 files changed, 68 insertions(+), 46 deletions(-)
>  create mode 100644 drivers/usb/gadget/udc/udc-uclass.c
>
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index 64ccbc7..9b36cc7 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -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);

This is breaking sunxi boards which uses gadget mode.

U-Boot 2019.01-rc2 (Dec 18 2018 - 17:31:53 +0530) Allwinner Technology

CPU:   Allwinner H3 (SUN8I 1680)
Model: Banana Pi BPI-M2-Plus
DRAM:  1 GiB
Error binding driver 'sunxi-musb': -96
Some drivers failed to bind
Error binding driver 'generic_simple_bus': -96
Some drivers failed to bind
initcall sequence 7dfd127c failed at call 4a00c3a3 (err=-96)
### ERROR ### Please RESET the board ###
Adam Ford Dec. 18, 2018, 1:22 p.m. UTC | #3
On Tue, Dec 18, 2018 at 6:08 AM Jagan Teki <jagan@amarulasolutions.com> wrote:
>
> On Thu, Nov 29, 2018 at 3:30 PM Jean-Jacques Hiblot <jjhiblot@ti.com> wrote:
> >
> > 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>
> >
> > ---
> >
> > Changes in v4: None
> > Changes in v3: None
> > Changes in v2: None
> >
> >  board/sunxi/board.c                 |  2 +-
> >  drivers/usb/dwc3/dwc3-generic.c     |  2 +-
> >  drivers/usb/gadget/ether.c          |  2 +-
> >  drivers/usb/gadget/udc/Makefile     |  4 +++
> >  drivers/usb/gadget/udc/udc-core.c   | 41 --------------------------
> >  drivers/usb/gadget/udc/udc-uclass.c | 58 +++++++++++++++++++++++++++++++++++++
> >  drivers/usb/musb-new/omap2430.c     |  2 +-
> >  drivers/usb/musb-new/sunxi.c        |  2 +-
> >  include/dm/uclass-id.h              |  1 +
> >  9 files changed, 68 insertions(+), 46 deletions(-)
> >  create mode 100644 drivers/usb/gadget/udc/udc-uclass.c
> >
> > diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> > index 64ccbc7..9b36cc7 100644
> > --- a/board/sunxi/board.c
> > +++ b/board/sunxi/board.c
> > @@ -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);
>
> This is breaking sunxi boards which uses gadget mode.
>
> U-Boot 2019.01-rc2 (Dec 18 2018 - 17:31:53 +0530) Allwinner Technology
>
> CPU:   Allwinner H3 (SUN8I 1680)
> Model: Banana Pi BPI-M2-Plus
> DRAM:  1 GiB
> Error binding driver 'sunxi-musb': -96
> Some drivers failed to bind
> Error binding driver 'generic_simple_bus': -96
> Some drivers failed to bind
> initcall sequence 7dfd127c failed at call 4a00c3a3 (err=-96)
> ### ERROR ### Please RESET the board ###

I got a similar error when I tried to port the work done for the
gadget mode to the omap2420 glue.  I don't know if they're related,
but the messages are the same (-96). I ended up just ignoring the
generic device all together and used the #ifdef to load either host or
gadget in the patch I submitted for the omap2430 glue.  If this gets
resolved, I might re-evaluate how I did the patch.

adam
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
Jean-Jacques Hiblot Dec. 19, 2018, 10:31 a.m. UTC | #4
On 18/12/2018 13:08, Jagan Teki wrote:
> On Thu, Nov 29, 2018 at 3:30 PM Jean-Jacques Hiblot <jjhiblot@ti.com> wrote:
>> 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>
>>
>> ---
>>
>> Changes in v4: None
>> Changes in v3: None
>> Changes in v2: None
>>
>>   board/sunxi/board.c                 |  2 +-
>>   drivers/usb/dwc3/dwc3-generic.c     |  2 +-
>>   drivers/usb/gadget/ether.c          |  2 +-
>>   drivers/usb/gadget/udc/Makefile     |  4 +++
>>   drivers/usb/gadget/udc/udc-core.c   | 41 --------------------------
>>   drivers/usb/gadget/udc/udc-uclass.c | 58 +++++++++++++++++++++++++++++++++++++
>>   drivers/usb/musb-new/omap2430.c     |  2 +-
>>   drivers/usb/musb-new/sunxi.c        |  2 +-
>>   include/dm/uclass-id.h              |  1 +
>>   9 files changed, 68 insertions(+), 46 deletions(-)
>>   create mode 100644 drivers/usb/gadget/udc/udc-uclass.c
>>
>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>> index 64ccbc7..9b36cc7 100644
>> --- a/board/sunxi/board.c
>> +++ b/board/sunxi/board.c
>> @@ -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);
> This is breaking sunxi boards which uses gadget mode.
>
> U-Boot 2019.01-rc2 (Dec 18 2018 - 17:31:53 +0530) Allwinner Technology
>
> CPU:   Allwinner H3 (SUN8I 1680)
> Model: Banana Pi BPI-M2-Plus
> DRAM:  1 GiB
> Error binding driver 'sunxi-musb': -96
> Some drivers failed to bind

Can you try with DM_USB_GADGET enabled ?

JJ


> Error binding driver 'generic_simple_bus': -96
> Some drivers failed to bind
> initcall sequence 7dfd127c failed at call 4a00c3a3 (err=-96)
> ### ERROR ### Please RESET the board ###
>
Jean-Jacques Hiblot Dec. 19, 2018, 10:34 a.m. UTC | #5
On 19/12/2018 11:31, Jean-Jacques Hiblot wrote:
>
> On 18/12/2018 13:08, Jagan Teki wrote:
>> On Thu, Nov 29, 2018 at 3:30 PM Jean-Jacques Hiblot <jjhiblot@ti.com> 
>> wrote:
>>> 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>
>>>
>>> ---
>>>
>>> Changes in v4: None
>>> Changes in v3: None
>>> Changes in v2: None
>>>
>>>   board/sunxi/board.c                 |  2 +-
>>>   drivers/usb/dwc3/dwc3-generic.c     |  2 +-
>>>   drivers/usb/gadget/ether.c          |  2 +-
>>>   drivers/usb/gadget/udc/Makefile     |  4 +++
>>>   drivers/usb/gadget/udc/udc-core.c   | 41 --------------------------
>>>   drivers/usb/gadget/udc/udc-uclass.c | 58 
>>> +++++++++++++++++++++++++++++++++++++
>>>   drivers/usb/musb-new/omap2430.c     |  2 +-
>>>   drivers/usb/musb-new/sunxi.c        |  2 +-
>>>   include/dm/uclass-id.h              |  1 +
>>>   9 files changed, 68 insertions(+), 46 deletions(-)
>>>   create mode 100644 drivers/usb/gadget/udc/udc-uclass.c
>>>
>>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>>> index 64ccbc7..9b36cc7 100644
>>> --- a/board/sunxi/board.c
>>> +++ b/board/sunxi/board.c
>>> @@ -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);
>> This is breaking sunxi boards which uses gadget mode.
>>
>> U-Boot 2019.01-rc2 (Dec 18 2018 - 17:31:53 +0530) Allwinner Technology
>>
>> CPU:   Allwinner H3 (SUN8I 1680)
>> Model: Banana Pi BPI-M2-Plus
>> DRAM:  1 GiB
>> Error binding driver 'sunxi-musb': -96
>> Some drivers failed to bind
>
> Can you try with DM_USB_GADGET enabled ?

The reasoning is that UCLASS_DRIVER(usb_gadget_generic) is defined if 
and only if DM_USB_GADGET is enabled.

>
> JJ
>
>
>> Error binding driver 'generic_simple_bus': -96
>> Some drivers failed to bind
>> initcall sequence 7dfd127c failed at call 4a00c3a3 (err=-96)
>> ### ERROR ### Please RESET the board ###
>>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
Adam Ford Dec. 19, 2018, 1:02 p.m. UTC | #6
On Wed, Dec 19, 2018 at 4:34 AM Jean-Jacques Hiblot <jjhiblot@ti.com> wrote:
>
>
> On 19/12/2018 11:31, Jean-Jacques Hiblot wrote:
> >
> > On 18/12/2018 13:08, Jagan Teki wrote:
> >> On Thu, Nov 29, 2018 at 3:30 PM Jean-Jacques Hiblot <jjhiblot@ti.com>
> >> wrote:
> >>> 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>
> >>>
> >>> ---
> >>>
> >>> Changes in v4: None
> >>> Changes in v3: None
> >>> Changes in v2: None
> >>>
> >>>   board/sunxi/board.c                 |  2 +-
> >>>   drivers/usb/dwc3/dwc3-generic.c     |  2 +-
> >>>   drivers/usb/gadget/ether.c          |  2 +-
> >>>   drivers/usb/gadget/udc/Makefile     |  4 +++
> >>>   drivers/usb/gadget/udc/udc-core.c   | 41 --------------------------
> >>>   drivers/usb/gadget/udc/udc-uclass.c | 58
> >>> +++++++++++++++++++++++++++++++++++++
> >>>   drivers/usb/musb-new/omap2430.c     |  2 +-
> >>>   drivers/usb/musb-new/sunxi.c        |  2 +-
> >>>   include/dm/uclass-id.h              |  1 +
> >>>   9 files changed, 68 insertions(+), 46 deletions(-)
> >>>   create mode 100644 drivers/usb/gadget/udc/udc-uclass.c
> >>>
> >>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> >>> index 64ccbc7..9b36cc7 100644
> >>> --- a/board/sunxi/board.c
> >>> +++ b/board/sunxi/board.c
> >>> @@ -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);
> >> This is breaking sunxi boards which uses gadget mode.
> >>
> >> U-Boot 2019.01-rc2 (Dec 18 2018 - 17:31:53 +0530) Allwinner Technology
> >>
> >> CPU:   Allwinner H3 (SUN8I 1680)
> >> Model: Banana Pi BPI-M2-Plus
> >> DRAM:  1 GiB
> >> Error binding driver 'sunxi-musb': -96
> >> Some drivers failed to bind
> >
> > Can you try with DM_USB_GADGET enabled ?
>
> The reasoning is that UCLASS_DRIVER(usb_gadget_generic) is defined if
> and only if DM_USB_GADGET is enabled.

I tried this when trying to port to the omap2430 glue, and got the
same -96 error when using the MISC class driver and I enabled
DM_USB_GADGET.

adam
>
> >
> > JJ
> >
> >
> >> Error binding driver 'generic_simple_bus': -96
> >> Some drivers failed to bind
> >> initcall sequence 7dfd127c failed at call 4a00c3a3 (err=-96)
> >> ### ERROR ### Please RESET the board ###
> >>
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot@lists.denx.de
> > https://lists.denx.de/listinfo/u-boot
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
diff mbox series

Patch

diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index 64ccbc7..9b36cc7 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -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;
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 681b5c7..7375660 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -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,
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 5a9ffd7..3b3d9af 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -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;
diff --git a/drivers/usb/gadget/udc/Makefile b/drivers/usb/gadget/udc/Makefile
index 449339f..38ac2dd 100644
--- a/drivers/usb/gadget/udc/Makefile
+++ b/drivers/usb/gadget/udc/Makefile
@@ -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
diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c
index 34bea27..62b4778 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -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
index 0000000..0620518
--- /dev/null
+++ b/drivers/usb/gadget/udc/udc-uclass.c
@@ -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",
+};
diff --git a/drivers/usb/musb-new/omap2430.c b/drivers/usb/musb-new/omap2430.c
index 58aed72..32743aa 100644
--- a/drivers/usb/musb-new/omap2430.c
+++ b/drivers/usb/musb-new/omap2430.c
@@ -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,
diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c
index 6cf9826..d7170a3 100644
--- a/drivers/usb/musb-new/sunxi.c
+++ b/drivers/usb/musb-new/sunxi.c
@@ -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,
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index c91dca1..1601100 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -92,6 +92,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 */