]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dm: usb: udc: Factor out plain udevice handler functions
authorMarek Vasut <marex@denx.de>
Fri, 1 Sep 2023 09:49:47 +0000 (11:49 +0200)
committerMarek Vasut <marex@denx.de>
Fri, 15 Sep 2023 21:38:01 +0000 (23:38 +0200)
Pull the functionality of UDC uclass that operates on plain udevice
and does not use this dev_array array into separate functions and
expose those functions, so that as much code as possible can be
switched over to these functions and the dev_array can be dropped.

Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Signed-off-by: Marek Vasut <marex@denx.de>
drivers/usb/gadget/udc/Makefile
drivers/usb/gadget/udc/udc-uclass.c
include/linux/usb/gadget.h

index 95dbf0c82ee4246eddbd76d42b40ccbdcd8ac37a..467c566f6d3e2a4f4dd44455755013a09140c25c 100644 (file)
@@ -7,4 +7,4 @@ obj-$(CONFIG_USB_DWC3_GADGET)   += udc-core.o
 endif
 
 obj-$(CONFIG_$(SPL_)DM_USB_GADGET)     += udc-core.o
-obj-$(CONFIG_$(SPL_)DM) += udc-uclass.o
+obj-y += udc-uclass.o
index de8861829c73451ef6be10ccde035546d453a14d..b4271b4be9f31a380299f571bf1a134ffb83516e 100644 (file)
 #if CONFIG_IS_ENABLED(DM_USB_GADGET)
 #define MAX_UDC_DEVICES 4
 static struct udevice *dev_array[MAX_UDC_DEVICES];
+
+int udc_device_get_by_index(int index, struct udevice **udev)
+{
+       struct udevice *dev = NULL;
+       int ret;
+
+       ret = uclass_get_device_by_seq(UCLASS_USB_GADGET_GENERIC, index, &dev);
+       if (!ret && dev) {
+               *udev = dev;
+               return 0;
+       }
+
+       ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, index, &dev);
+       if (!ret && dev) {
+               *udev = dev;
+               return 0;
+       }
+
+       pr_err("No USB device found\n");
+       return -ENODEV;
+}
+
+int udc_device_put(struct udevice *udev)
+{
+#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
+       return device_remove(udev, DM_REMOVE_NORMAL);
+#else
+       return -ENOSYS;
+#endif
+}
+
 int usb_gadget_initialize(int index)
 {
        int ret;
@@ -23,13 +54,10 @@ int usb_gadget_initialize(int index)
                return -EINVAL;
        if (dev_array[index])
                return 0;
-       ret = uclass_get_device_by_seq(UCLASS_USB_GADGET_GENERIC, index, &dev);
+       ret = udc_device_get_by_index(index, &dev);
        if (!dev || ret) {
-               ret = uclass_get_device(UCLASS_USB_GADGET_GENERIC, index, &dev);
-               if (!dev || ret) {
-                       pr_err("No USB device found\n");
-                       return -ENODEV;
-               }
+               pr_err("No USB device found\n");
+               return -ENODEV;
        }
        dev_array[index] = dev;
        return 0;
@@ -42,7 +70,7 @@ int usb_gadget_release(int index)
        if (index < 0 || index >= ARRAY_SIZE(dev_array))
                return -EINVAL;
 
-       ret = device_remove(dev_array[index], DM_REMOVE_NORMAL);
+       ret = device_remove(dev_array[index]);
        if (!ret)
                dev_array[index] = NULL;
        return ret;
@@ -57,10 +85,25 @@ int usb_gadget_handle_interrupts(int index)
                return -EINVAL;
        return dm_usb_gadget_handle_interrupts(dev_array[index]);
 }
+#else
+/* Backwards hardware compatibility -- switch to DM_USB_GADGET */
+static int legacy_index;
+int udc_device_get_by_index(int index, struct udevice **udev)
+{
+       legacy_index = index;
+       return board_usb_init(index, USB_INIT_DEVICE);
+}
+
+int udc_device_put(struct udevice *udev)
+{
+       return board_usb_cleanup(legacy_index, USB_INIT_DEVICE);
+}
 #endif
 
+#if CONFIG_IS_ENABLED(DM)
 UCLASS_DRIVER(usb_gadget_generic) = {
        .id             = UCLASS_USB_GADGET_GENERIC,
        .name           = "usb",
        .flags          = DM_UC_FLAG_SEQ_ALIAS,
 };
+#endif
index b3f4b8d134c155f5550f7e881cbfc965596f9f24..3ef41e89fefb6ca496de1a8e59f278d3025b98dd 100644 (file)
@@ -970,6 +970,23 @@ extern void usb_ep_autoconfig_reset(struct usb_gadget *);
 
 extern int usb_gadget_handle_interrupts(int index);
 
+/**
+ * udc_device_get_by_index() - Get UDC udevice by index
+ * @index: UDC device index
+ * @udev: UDC udevice matching the index (if found)
+ *
+ * Return: 0 if Ok, -ve on error
+ */
+int udc_device_get_by_index(int index, struct udevice **udev);
+
+/**
+ * udc_device_put() - Put UDC udevice
+ * @udev: UDC udevice
+ *
+ * Return: 0 if Ok, -ve on error
+ */
+int udc_device_put(struct udevice *udev);
+
 #if CONFIG_IS_ENABLED(DM_USB_GADGET)
 int usb_gadget_initialize(int index);
 int usb_gadget_release(int index);