On 7/22/24 10:47 AM, Zixun LI wrote:
Add driver model support by using the uclass UCLASS_USB_GADGET_GENERIC.
Disable local usb_gadget_register_driver()/usb_gadget_unregister_driver()
implementation which is implemented in udc-core.c when DM_USB_GADGET
is enabled.
Compared to Linux driver only supported devices' DT bindings are included
(sorted as Linux driver)
Signed-off-by: Zixun LI <z...@ogga.fr>
---
drivers/usb/gadget/atmel_usba_udc.c | 128 ++++++++++++++++++++++++++++
1 file changed, 128 insertions(+)
diff --git a/drivers/usb/gadget/atmel_usba_udc.c
b/drivers/usb/gadget/atmel_usba_udc.c
index 48d66d9774..664d33f525 100644
--- a/drivers/usb/gadget/atmel_usba_udc.c
+++ b/drivers/usb/gadget/atmel_usba_udc.c
@@ -8,10 +8,13 @@
*/
#include <clk.h>
+#include <dm.h>
#include <log.h>
#include <malloc.h>
#include <asm/gpio.h>
#include <asm/hardware.h>
+#include <dm/device_compat.h>
+#include <dm/devres.h>
#include <linux/bitops.h>
#include <linux/errno.h>
#include <linux/list.h>
@@ -19,6 +22,10 @@
#include <linux/usb/gadget.h>
#include <linux/usb/atmel_usba_udc.h>
+#if CONFIG_IS_ENABLED(DM_USB_GADGET)
+#include <mach/atmel_usba_udc.h>
+#endif /* CONFIG_IS_ENABLED(DM_USB_GADGET) */
+
#include "atmel_usba_udc.h"
static struct usba_udc *controller;
@@ -1200,6 +1207,7 @@ int dm_usb_gadget_handle_interrupts(struct udevice *dev)
return usba_udc_irq(udc);
}
+#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
int usb_gadget_register_driver(struct usb_gadget_driver *driver)
{
struct usba_udc *udc = controller;
@@ -1245,6 +1253,49 @@ int usb_gadget_unregister_driver(struct
usb_gadget_driver *driver)
return 0;
}
+#else /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
+
+static int usba_gadget_start(struct usb_gadget *g,
+ struct usb_gadget_driver *driver)
+{
+ struct usba_udc *udc = controller;
+
+ if (!driver || !driver->bind || !driver->setup) {
+ log_err("bad parameter\n");
This check is unnecessary, please remove.
+ return -EINVAL;
+ }
+
+ if (udc->driver) {
This check is unnecessary, please remove.
+ log_err("UDC already has a gadget driver\n");
+ return -EBUSY;
+ }
+
+ usba_enable(udc);
+
+ udc->driver = driver;
+
+ return 0;
+}
The rest looks pretty good, thanks !