udc-core provides usb_gadget_register_driver() now, and it only knows
controllers that called usb_add_gadget_udc(). at91_udc never does, so no
gadget works there.

at91_udc_ops already has udc_start and udc_stop, so only the registration
is missing.

taurus and smartweb call at91_udc_probe() from board code and there is no
udevice to use as the parent, so pass NULL. udc-core only stores the
pointer.

Signed-off-by: Anders Roxell <[email protected]>
---
 drivers/usb/gadget/at91_udc.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c
index 5b0c55d59c8d..ee2af2d699ff 100644
--- a/drivers/usb/gadget/at91_udc.c
+++ b/drivers/usb/gadget/at91_udc.c
@@ -1494,6 +1494,16 @@ int at91_udc_probe(struct at91_udc_data *pdata)
        /* Clear all pending interrupts - UDP may be used by bootloader. */
        at91_udp_write(udc, AT91_UDP_ICR, 0xffffffff);
 
+       /*
+        * The boards call this from board code, there is no udevice to hang
+        * the gadget on, so pass NULL as the parent.
+        */
+       retval = usb_add_gadget_udc(NULL, &udc->gadget);
+       if (retval) {
+               pr_err("failed to register udc: %d\n", retval);
+               return retval;
+       }
+
        INFO("%s version %s\n", driver_name, DRIVER_VERSION);
        return 0;
 }
-- 
2.53.0

Reply via email to