]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
usb: gadget: Introduce handle_interrupts ops to USB_GADGET_GENERIC uclass
authorMarek Vasut <marek.vasut+renesas@mailbox.org>
Fri, 14 Jun 2024 00:51:16 +0000 (02:51 +0200)
committerMattijs Korpershoek <mkorpershoek@baylibre.com>
Fri, 5 Jul 2024 12:06:05 +0000 (14:06 +0200)
Introduce .ops for USB_GADGET_GENERIC uclass. The first new ops is
.handle_interrupts which must be implemented by DM capable USB gadget
controller drivers and must implement interrupt handling similar to
dm_usb_gadget_handle_interrupts(). This patch currently provides weak
dm_usb_gadget_handle_interrupts() implementation which is overridden by
the drivers, but this will be removed once conversion to handle_interrupts
callback is complete.

Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Tested-by: Alexander Sverdlin <alexander.sverdlin@siemens.com>
Tested-by: Mattijs Korpershoek <mkorpershoek@baylibre.com> # vim3
Link: https://lore.kernel.org/r/20240614005309.34433-2-marek.vasut+renesas@mailbox.org
[mkorpershoek: fixed trivial typo in commit message]
Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
drivers/usb/gadget/udc/udc-uclass.c
include/linux/usb/gadget.h

index 5dc23a55bb58b1c546e1e14ea164fa57ae4c900a..2320039fe3b441f6e35689d351284ed2d8c96e23 100644 (file)
 #include <linux/usb/gadget.h>
 
 #if CONFIG_IS_ENABLED(DM_USB_GADGET)
+static inline const struct usb_gadget_generic_ops *
+usb_gadget_generic_dev_ops(struct udevice *dev)
+{
+       return (const struct usb_gadget_generic_ops *)dev->driver->ops;
+}
+
+__weak int dm_usb_gadget_handle_interrupts(struct udevice *dev)
+{
+       const struct usb_gadget_generic_ops *ops;
+
+       ops = usb_gadget_generic_dev_ops(dev);
+       if (!ops)
+               return -EFAULT;
+       if (!ops->handle_interrupts)
+               return -ENOSYS;
+
+       return ops->handle_interrupts(dev);
+}
+
 int udc_device_get_by_index(int index, struct udevice **udev)
 {
        struct udevice *dev = NULL;
@@ -54,6 +73,11 @@ int udc_device_put(struct udevice *udev)
 {
        return board_usb_cleanup(legacy_index, USB_INIT_DEVICE);
 }
+
+__weak int dm_usb_gadget_handle_interrupts(struct udevice *dev)
+{
+       return 0;
+}
 #endif
 
 #if CONFIG_IS_ENABLED(DM)
index 36572be89e6c9fdcc370e902e37035c429fbaf29..cf2161603d65eb5dff5864643c7d9a3433baa740 100644 (file)
@@ -970,6 +970,14 @@ extern void usb_ep_autoconfig_reset(struct usb_gadget *);
 
 extern int dm_usb_gadget_handle_interrupts(struct udevice *);
 
+/**
+ * struct usb_gadget_generic_ops - The functions that a gadget driver must implement.
+ * @handle_interrupts: Handle UDC interrupts.
+ */
+struct usb_gadget_generic_ops {
+       int (*handle_interrupts)(struct udevice *udevice);
+};
+
 /**
  * udc_device_get_by_index() - Get UDC udevice by index
  * @index: UDC device index